WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH 5 of 5] Add support for mapping grant references in H

To: <xen-devel@xxxxxxxxxxxxxxxxxxx>
Subject: [Xen-devel] [PATCH 5 of 5] Add support for mapping grant references in HVM domains to unmodified_drivers/linux-2.6
From: <steven.smith@xxxxxxxxxxxxx>
Date: Tue, 19 May 2009 12:27:07 +0100
Delivery-date: Tue, 19 May 2009 04:25:09 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <patchbomb.1242732422@xxxxxxxxxxxxxxxxxxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Steven Smith <steven.smith@xxxxxxxxxxxxx>
# Date 1242731493 -3600
# Node ID db464ab112d4b6095a966c09c7065c91f2d6930e
# Parent  c6126a51b5094529933790ba166778bfb8c3d9de
Add support for mapping grant references in HVM domains to 
unmodified_drivers/linux-2.6.
I've not tried to give it the same API as the PV grant map interface,
because the underlying mechanism is too different for that to be very
comfortable.

Also add a couple of very simple modules to
unmodified_drivers/linux-2.6 which can be used to test mapping grants
into HVM domains.  These are about as brain-dead as it's possible to
be, but they do demonstrate the basic functionality.

Signed-off-by: Steven Smith <steven.smith@xxxxxxxxxx>

diff -r c6126a51b509 -r db464ab112d4 unmodified_drivers/linux-2.6/Makefile
--- a/unmodified_drivers/linux-2.6/Makefile     Tue May 19 12:11:33 2009 +0100
+++ b/unmodified_drivers/linux-2.6/Makefile     Tue May 19 12:11:33 2009 +0100
@@ -5,3 +5,5 @@
 obj-m += blkfront/
 obj-m += netfront/
 obj-m += scsifront/
+
+obj-m += test-gntmap.o test-gntoffer.o
diff -r c6126a51b509 -r db464ab112d4 
unmodified_drivers/linux-2.6/platform-pci/Kbuild
--- a/unmodified_drivers/linux-2.6/platform-pci/Kbuild  Tue May 19 12:11:33 
2009 +0100
+++ b/unmodified_drivers/linux-2.6/platform-pci/Kbuild  Tue May 19 12:11:33 
2009 +0100
@@ -7,7 +7,7 @@
 xen-platform-pci-objs := evtchn.o platform-pci.o gnttab.o xen_support.o
 xen-platform-pci-objs += features.o platform-compat.o
 xen-platform-pci-objs += reboot.o machine_reboot.o
-xen-platform-pci-objs += panic-handler.o
+xen-platform-pci-objs += panic-handler.o gntmap.o
 
 xen-platform-pci-objs += ../xenbus/xenbus_comms.o
 xen-platform-pci-objs += ../xenbus/xenbus_xs.o
diff -r c6126a51b509 -r db464ab112d4 
unmodified_drivers/linux-2.6/platform-pci/gntmap.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/unmodified_drivers/linux-2.6/platform-pci/gntmap.c        Tue May 19 
12:11:33 2009 +0100
@@ -0,0 +1,56 @@
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <xen/interface/xen.h>
+#include <xen/interface/grant_table.h>
+#include <xen/interface/hvm/hvm_op.h>
+#include <asm/hypervisor.h>
+
+#include "platform-pci.h"
+#include "gntmap.h"
+
+int gntmap_map_grant(struct gntmap_detail *res,
+                    domid_t domid,
+                    grant_ref_t gref,
+                    int readonly)
+{
+       unsigned long pa;
+       struct xen_hvm_map_grant_ref op;
+       int rc;
+       void *va;
+
+       memset(res, 0, sizeof(*res));
+
+       pa = alloc_xen_mmio(PAGE_SIZE);
+
+       va = ioremap(pa, PAGE_SIZE);
+       if (!va)
+               return -ENOMEM;
+
+       op.domid = domid;
+       op.gref = gref;
+       op.pfn = pa >> PAGE_SHIFT;
+       op.flags = GNTMAP_host_map | (readonly ? GNTMAP_readonly : 0);
+       rc = HYPERVISOR_hvm_op(HVMOP_map_grant_ref, &op);
+       if (rc < 0) {
+               iounmap(va);
+               return rc;
+       }
+       res->phys_addr = pa;
+       res->handle = op.handle;
+       res->va = va;
+       return 0;
+}
+
+void gntmap_unmap_grant(struct gntmap_detail *detail)
+{
+       struct xen_hvm_unmap_grant_ref op;
+       int rc;
+
+       iounmap(detail->va);
+       op.handle = detail->handle;
+       rc = HYPERVISOR_hvm_op(HVMOP_unmap_grant_ref, &op);
+       BUG_ON(rc);
+}
+
+EXPORT_SYMBOL_GPL(gntmap_map_grant);
+EXPORT_SYMBOL_GPL(gntmap_unmap_grant);
diff -r c6126a51b509 -r db464ab112d4 
unmodified_drivers/linux-2.6/platform-pci/gntmap.h
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/unmodified_drivers/linux-2.6/platform-pci/gntmap.h        Tue May 19 
12:11:33 2009 +0100
@@ -0,0 +1,20 @@
+#ifndef GNTMAP_H__
+#define GNTMAP_H__
+
+#include <xen/interface/xen.h>
+#include <xen/interface/grant_table.h>
+
+struct gntmap_detail {
+       unsigned long phys_addr;
+       void *va;
+       grant_handle_t handle;
+};
+
+int gntmap_map_grant(struct gntmap_detail *res,
+                    domid_t domid,
+                    grant_ref_t gref,
+                    int readonly);
+
+void gntmap_unmap_grant(struct gntmap_detail *detail);
+
+#endif /* !GNTMAP_H__ */
diff -r c6126a51b509 -r db464ab112d4 
unmodified_drivers/linux-2.6/platform-pci/platform-pci.c
--- a/unmodified_drivers/linux-2.6/platform-pci/platform-pci.c  Tue May 19 
12:11:33 2009 +0100
+++ b/unmodified_drivers/linux-2.6/platform-pci/platform-pci.c  Tue May 19 
12:11:33 2009 +0100
@@ -36,7 +36,9 @@
 #include <asm/uaccess.h>
 #include <asm/hypervisor.h>
 #include <asm/pgtable.h>
+#include <xen/interface/xen.h>
 #include <xen/interface/memory.h>
+#include <xen/interface/grant_table.h>
 #include <xen/interface/hvm/params.h>
 #include <xen/features.h>
 #include <xen/evtchn.h>
diff -r c6126a51b509 -r db464ab112d4 unmodified_drivers/linux-2.6/test-gntmap.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/unmodified_drivers/linux-2.6/test-gntmap.c        Tue May 19 12:11:33 
2009 +0100
@@ -0,0 +1,59 @@
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include "platform-pci/gntmap.h"
+
+static int remote_domid;
+static int remote_gref;
+static int readonly;
+
+module_param(remote_domid, int, S_IRUGO);
+module_param(remote_gref, int, S_IRUGO);
+module_param(readonly, int, S_IRUGO);
+
+int
+main(void)
+{
+       struct gntmap_detail detail;
+       int rc;
+       unsigned long *ptr;
+       unsigned x;
+
+       rc = gntmap_map_grant(&detail, remote_domid, remote_gref, readonly);
+       if (rc < 0) {
+               printk(KERN_ERR "cannot map %d::%d, readonly %d\n",
+                      remote_domid, remote_gref, readonly);
+               return rc;
+       }
+       ptr = detail.va;
+       for (x = 0; x < PAGE_SIZE / sizeof(unsigned long);) {
+#if BITS_PER_LONG == 32
+               printk(KERN_INFO
+                      "%08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
+                      ptr[x],
+                      ptr[x+1],
+                      ptr[x+2],
+                      ptr[x+3],
+                      ptr[x+4],
+                      ptr[x+5],
+                      ptr[x+6],
+                      ptr[x+7]);
+               x += 8;
+#else
+               printk(KERN_INFO
+                      "%016lx %016lx %016lx %016lx\n",
+                      ptr[x],
+                      ptr[x+1],
+                      ptr[x+2],
+                      ptr[x+3]);
+               x += 4;
+#endif
+       }
+       gntmap_unmap_grant(&detail);
+
+       /* Make the load fail */
+       return -EINVAL;
+}
+
+module_init(main);
+
+MODULE_LICENSE("GPL");
diff -r c6126a51b509 -r db464ab112d4 
unmodified_drivers/linux-2.6/test-gntoffer.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/unmodified_drivers/linux-2.6/test-gntoffer.c      Tue May 19 12:11:33 
2009 +0100
@@ -0,0 +1,36 @@
+#include <linux/kernel.h>
+#include <linux/module.h>
+
+#include <xen/interface/xen.h>
+#include <xen/interface/grant_table.h>
+#include <xen/gnttab.h>
+
+static int remote_domid;
+module_param(remote_domid, int, S_IRUGO);
+
+static int gref;
+static void *buf;
+
+int main(void)
+{
+       buf = (void *)get_zeroed_page(GFP_KERNEL);
+       if (!buf) {
+               printk(KERN_ERR "can't get a free page\n");
+               return -ENOMEM;
+       }
+       memset(buf, 0x92, PAGE_SIZE);
+       gref = gnttab_grant_foreign_access(remote_domid, virt_to_mfn(buf), 0);
+       printk(KERN_INFO "gref is %d\n", gref);
+       return 0;
+}
+
+void finish(void)
+{
+       gnttab_end_foreign_access(gref, 0);
+       free_page((unsigned long)buf);
+}
+
+module_init(main);
+module_exit(finish);
+
+MODULE_LICENSE("GPL");
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
<Prev in Thread] Current Thread [Next in Thread>