[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH 5/7] libxc: implement gntshr for minios



Signed-off-by: Marek Marczykowski <marmarek@xxxxxxxxxxxxxxxxxxxxxx>
---
 tools/libxc/xc_minios.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 71 insertions(+)

diff --git a/tools/libxc/xc_minios.c b/tools/libxc/xc_minios.c
index dec4d73..eeaf966 100644
--- a/tools/libxc/xc_minios.c
+++ b/tools/libxc/xc_minios.c
@@ -26,6 +26,7 @@
 #include <mini-os/mm.h>
 #include <mini-os/lib.h>
 #include <mini-os/gntmap.h>
+#include <mini-os/gnttab.h>
 #include <mini-os/events.h>
 #include <mini-os/wait.h>
 #include <sys/mman.h>
@@ -519,6 +520,74 @@ static struct xc_osdep_ops minios_gnttab_ops = {
     },
 };
 
+static xc_osdep_handle minios_gntshr_open(xc_gntshr *xcg)
+{
+    return (xc_osdep_handle)0;
+}
+
+static int minios_gntshr_close(xc_gntshr *xcg, xc_osdep_handle h)
+{
+    return 0;
+}
+
+static void *minios_gntshr_share_pages(xc_gntshr *xch, xc_osdep_handle h,
+                                      uint32_t domid, int count,
+                                      uint32_t *refs, int writable,
+                                      uint32_t notify_offset,
+                                      evtchn_port_t notify_port)
+{
+    int i, mfn;
+    void *area = NULL;
+
+    if (notify_offset != -1 || notify_port != -1) {
+        printf("minios_gntshr_share_pages: notify not implemented\n");
+        errno = ENOSYS;
+        return NULL;
+    }
+
+    area = memalign(XC_PAGE_SIZE, count * XC_PAGE_SIZE);
+
+    if (!area) {
+        PERROR("minios_gntshr_share_pages: alloc failed");
+        return NULL;
+    }
+
+    for (i = 0; i < count; i++) {
+        mfn = virtual_to_mfn(area + i*XC_PAGE_SIZE);
+        refs[i] = gnttab_grant_access(domid, mfn, !writable);
+    }
+
+    return area;
+}
+
+static int minios_gntshr_munmap(xc_gntshr *xcg, xc_osdep_handle h,
+                               void *start_address, uint32_t count)
+{
+    int i;
+    uint32_t gref;
+
+    for (i = 0; i < count; i++) {
+        gref = gnttab_find_grant_of_page(start_address + i * PAGE_SIZE);
+        if (!gref) {
+            errno = EINVAL;
+            return -1;
+        }
+        gnttab_end_access(gref);
+    }
+
+    return 0;
+}
+
+static struct xc_osdep_ops minios_gntshr_ops = {
+    .open = &minios_gntshr_open,
+    .close = &minios_gntshr_close,
+
+    .u.gntshr = {
+        .share_pages = &minios_gntshr_share_pages,
+        .munmap = &minios_gntshr_munmap,
+    },
+};
+
 static struct xc_osdep_ops *minios_osdep_init(xc_interface *xch, enum 
xc_osdep_type type)
 {
     switch ( type )
@@ -529,6 +598,8 @@ static struct xc_osdep_ops *minios_osdep_init(xc_interface 
*xch, enum xc_osdep_t
         return &minios_evtchn_ops;
     case XC_OSDEP_GNTTAB:
         return &minios_gnttab_ops;
+    case XC_OSDEP_GNTSHR:
+        return &minios_gntshr_ops;
     default:
         return NULL;
     }
-- 
1.8.1.4


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.