|
@@ -0,0 +1,91 @@
|
|
|
|
+/******************************************************************************
|
|
|
|
+ * grant_table.c
|
|
|
|
+ * x86 specific part
|
|
|
|
+ *
|
|
|
|
+ * Granting foreign access to our memory reservation.
|
|
|
|
+ *
|
|
|
|
+ * Copyright (c) 2005-2006, Christopher Clark
|
|
|
|
+ * Copyright (c) 2004-2005, K A Fraser
|
|
|
|
+ * Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp>
|
|
|
|
+ * VA Linux Systems Japan. Split out x86 specific part.
|
|
|
|
+ *
|
|
|
|
+ * This program is free software; you can redistribute it and/or
|
|
|
|
+ * modify it under the terms of the GNU General Public License version 2
|
|
|
|
+ * as published by the Free Software Foundation; or, when distributed
|
|
|
|
+ * separately from the Linux kernel or incorporated into other
|
|
|
|
+ * software packages, subject to the following license:
|
|
|
|
+ *
|
|
|
|
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
|
|
+ * of this source file (the "Software"), to deal in the Software without
|
|
|
|
+ * restriction, including without limitation the rights to use, copy, modify,
|
|
|
|
+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
|
|
|
|
+ * and to permit persons to whom the Software is furnished to do so, subject to
|
|
|
|
+ * the following conditions:
|
|
|
|
+ *
|
|
|
|
+ * The above copyright notice and this permission notice shall be included in
|
|
|
|
+ * all copies or substantial portions of the Software.
|
|
|
|
+ *
|
|
|
|
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
|
|
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
|
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
|
|
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
|
|
+ * IN THE SOFTWARE.
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+#include <linux/sched.h>
|
|
|
|
+#include <linux/mm.h>
|
|
|
|
+#include <linux/vmalloc.h>
|
|
|
|
+
|
|
|
|
+#include <xen/interface/xen.h>
|
|
|
|
+#include <xen/page.h>
|
|
|
|
+#include <xen/grant_table.h>
|
|
|
|
+
|
|
|
|
+#include <asm/pgtable.h>
|
|
|
|
+
|
|
|
|
+static int map_pte_fn(pte_t *pte, struct page *pmd_page,
|
|
|
|
+ unsigned long addr, void *data)
|
|
|
|
+{
|
|
|
|
+ unsigned long **frames = (unsigned long **)data;
|
|
|
|
+
|
|
|
|
+ set_pte_at(&init_mm, addr, pte, mfn_pte((*frames)[0], PAGE_KERNEL));
|
|
|
|
+ (*frames)++;
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static int unmap_pte_fn(pte_t *pte, struct page *pmd_page,
|
|
|
|
+ unsigned long addr, void *data)
|
|
|
|
+{
|
|
|
|
+
|
|
|
|
+ set_pte_at(&init_mm, addr, pte, __pte(0));
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+int arch_gnttab_map_shared(unsigned long *frames, unsigned long nr_gframes,
|
|
|
|
+ unsigned long max_nr_gframes,
|
|
|
|
+ struct grant_entry **__shared)
|
|
|
|
+{
|
|
|
|
+ int rc;
|
|
|
|
+ struct grant_entry *shared = *__shared;
|
|
|
|
+
|
|
|
|
+ if (shared == NULL) {
|
|
|
|
+ struct vm_struct *area =
|
|
|
|
+ xen_alloc_vm_area(PAGE_SIZE * max_nr_gframes);
|
|
|
|
+ BUG_ON(area == NULL);
|
|
|
|
+ shared = area->addr;
|
|
|
|
+ *__shared = shared;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ rc = apply_to_page_range(&init_mm, (unsigned long)shared,
|
|
|
|
+ PAGE_SIZE * nr_gframes,
|
|
|
|
+ map_pte_fn, &frames);
|
|
|
|
+ return rc;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void arch_gnttab_unmap_shared(struct grant_entry *shared,
|
|
|
|
+ unsigned long nr_gframes)
|
|
|
|
+{
|
|
|
|
+ apply_to_page_range(&init_mm, (unsigned long)shared,
|
|
|
|
+ PAGE_SIZE * nr_gframes, unmap_pte_fn, NULL);
|
|
|
|
+}
|