grant-table.c 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. /******************************************************************************
  2. * grant_table.c
  3. * x86 specific part
  4. *
  5. * Granting foreign access to our memory reservation.
  6. *
  7. * Copyright (c) 2005-2006, Christopher Clark
  8. * Copyright (c) 2004-2005, K A Fraser
  9. * Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp>
  10. * VA Linux Systems Japan. Split out x86 specific part.
  11. *
  12. * This program is free software; you can redistribute it and/or
  13. * modify it under the terms of the GNU General Public License version 2
  14. * as published by the Free Software Foundation; or, when distributed
  15. * separately from the Linux kernel or incorporated into other
  16. * software packages, subject to the following license:
  17. *
  18. * Permission is hereby granted, free of charge, to any person obtaining a copy
  19. * of this source file (the "Software"), to deal in the Software without
  20. * restriction, including without limitation the rights to use, copy, modify,
  21. * merge, publish, distribute, sublicense, and/or sell copies of the Software,
  22. * and to permit persons to whom the Software is furnished to do so, subject to
  23. * the following conditions:
  24. *
  25. * The above copyright notice and this permission notice shall be included in
  26. * all copies or substantial portions of the Software.
  27. *
  28. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  29. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  30. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  31. * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  32. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  33. * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  34. * IN THE SOFTWARE.
  35. */
  36. #include <linux/sched.h>
  37. #include <linux/mm.h>
  38. #include <linux/vmalloc.h>
  39. #include <xen/interface/xen.h>
  40. #include <xen/page.h>
  41. #include <xen/grant_table.h>
  42. #include <asm/pgtable.h>
  43. static int map_pte_fn(pte_t *pte, struct page *pmd_page,
  44. unsigned long addr, void *data)
  45. {
  46. unsigned long **frames = (unsigned long **)data;
  47. set_pte_at(&init_mm, addr, pte, mfn_pte((*frames)[0], PAGE_KERNEL));
  48. (*frames)++;
  49. return 0;
  50. }
  51. static int unmap_pte_fn(pte_t *pte, struct page *pmd_page,
  52. unsigned long addr, void *data)
  53. {
  54. set_pte_at(&init_mm, addr, pte, __pte(0));
  55. return 0;
  56. }
  57. int arch_gnttab_map_shared(unsigned long *frames, unsigned long nr_gframes,
  58. unsigned long max_nr_gframes,
  59. struct grant_entry **__shared)
  60. {
  61. int rc;
  62. struct grant_entry *shared = *__shared;
  63. if (shared == NULL) {
  64. struct vm_struct *area =
  65. xen_alloc_vm_area(PAGE_SIZE * max_nr_gframes);
  66. BUG_ON(area == NULL);
  67. shared = area->addr;
  68. *__shared = shared;
  69. }
  70. rc = apply_to_page_range(&init_mm, (unsigned long)shared,
  71. PAGE_SIZE * nr_gframes,
  72. map_pte_fn, &frames);
  73. return rc;
  74. }
  75. void arch_gnttab_unmap_shared(struct grant_entry *shared,
  76. unsigned long nr_gframes)
  77. {
  78. apply_to_page_range(&init_mm, (unsigned long)shared,
  79. PAGE_SIZE * nr_gframes, unmap_pte_fn, NULL);
  80. }