]> xenbits.xensource.com Git - xen.git/commitdiff
tools/libxenforeignmemory: add xenforeignmemory_map2 function
authorIgor Druzhinin <igor.druzhinin@citrix.com>
Wed, 28 Jun 2017 19:27:08 +0000 (20:27 +0100)
committerWei Liu <wei.liu2@citrix.com>
Fri, 30 Jun 2017 14:27:05 +0000 (15:27 +0100)
The new function repeats the behavior of the first version
except it has an extended list of arguments which are subsequently
passed to mmap() call.

This is needed for QEMU depriviledging.

Signed-off-by: Igor Druzhinin <igor.druzhinin@citrix.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
Acked-by: Wei Liu <wei.liu2@citrix.com>
tools/libs/foreignmemory/Makefile
tools/libs/foreignmemory/compat.c
tools/libs/foreignmemory/core.c
tools/libs/foreignmemory/freebsd.c
tools/libs/foreignmemory/include/xenforeignmemory.h
tools/libs/foreignmemory/libxenforeignmemory.map
tools/libs/foreignmemory/linux.c
tools/libs/foreignmemory/minios.c
tools/libs/foreignmemory/netbsd.c
tools/libs/foreignmemory/private.h
tools/libs/foreignmemory/solaris.c

index 2f2caa1f5ce526f7ec724c77656b87641fd41cdc..5e93ee7d9593501a0f985a453f5046c317b349f5 100644 (file)
@@ -2,7 +2,7 @@ XEN_ROOT = $(CURDIR)/../../..
 include $(XEN_ROOT)/tools/Rules.mk
 
 MAJOR    = 1
-MINOR    = 1
+MINOR    = 2
 SHLIB_LDFLAGS += -Wl,--version-script=libxenforeignmemory.map
 
 CFLAGS   += -Werror -Wmissing-prototypes
index b79ec1a9e7ea7ef8e22e35464dfcf3965d8e7134..5f730ca919d670de43cd1581a131224a856a050d 100644 (file)
@@ -21,8 +21,8 @@
 
 #include "private.h"
 
-void *osdep_xenforeignmemory_map(xenforeignmemory_handle *fmem,
-                                 uint32_t dom, int prot, size_t num,
+void *osdep_xenforeignmemory_map(xenforeignmemory_handle *fmem, uint32_t dom,
+                                 void *addr, int prot, int flags, size_t num,
                                  const xen_pfn_t arr[/*num*/], int err[/*num*/])
 {
     xen_pfn_t *pfn;
@@ -41,7 +41,7 @@ void *osdep_xenforeignmemory_map(xenforeignmemory_handle *fmem,
     }
 
     memcpy(pfn, arr, num * sizeof(*arr));
-    ret = osdep_map_foreign_batch(fmem, dom, prot, pfn, num);
+    ret = osdep_map_foreign_batch(fmem, dom, addr, prot, flags, pfn, num);
 
     if (ret) {
         for (i = 0; i < num; ++i)
index 0ebd4293b1fc0172d4d641545dabe79ec75a0488..a6897dc56186a1f02980b06e29a07da731beda82 100644 (file)
@@ -63,10 +63,10 @@ int xenforeignmemory_close(xenforeignmemory_handle *fmem)
     return rc;
 }
 
-void *xenforeignmemory_map(xenforeignmemory_handle *fmem,
-                           uint32_t dom, int prot,
-                           size_t num,
-                           const xen_pfn_t arr[/*num*/], int err[/*num*/])
+void *xenforeignmemory_map2(xenforeignmemory_handle *fmem,
+                            uint32_t dom, void *addr,
+                            int prot, int flags, size_t num,
+                            const xen_pfn_t arr[/*num*/], int err[/*num*/])
 {
     void *ret;
     int *err_to_free = NULL;
@@ -77,7 +77,7 @@ void *xenforeignmemory_map(xenforeignmemory_handle *fmem,
     if ( err == NULL )
         return NULL;
 
-    ret = osdep_xenforeignmemory_map(fmem, dom, prot, num, arr, err);
+    ret = osdep_xenforeignmemory_map(fmem, dom, addr, prot, flags, num, arr, err);
 
     if ( ret && err_to_free )
     {
@@ -100,6 +100,14 @@ void *xenforeignmemory_map(xenforeignmemory_handle *fmem,
     return ret;
 }
 
+void *xenforeignmemory_map(xenforeignmemory_handle *fmem,
+                           uint32_t dom, int prot,
+                           size_t num,
+                           const xen_pfn_t arr[/*num*/], int err[/*num*/])
+{
+    return xenforeignmemory_map2(fmem, dom, NULL, prot, 0, num, arr, err);
+}
+
 int xenforeignmemory_unmap(xenforeignmemory_handle *fmem,
                            void *addr, size_t num)
 {
index f6cd08c4c0b1466b9b1046e195c5ae9fc4c12704..dec447485aeba53c26eb76c9bb68c580fe02fbc2 100644 (file)
@@ -55,16 +55,15 @@ int osdep_xenforeignmemory_close(xenforeignmemory_handle *fmem)
 }
 
 void *osdep_xenforeignmemory_map(xenforeignmemory_handle *fmem,
-                                 uint32_t dom, int prot,
-                                 size_t num,
+                                 uint32_t dom, void *addr,
+                                 int prot, int flags, size_t num,
                                  const xen_pfn_t arr[/*num*/], int err[/*num*/])
 {
     int fd = fmem->fd;
     privcmd_mmapbatch_t ioctlx;
-    void *addr;
     int rc;
 
-    addr = mmap(NULL, num << PAGE_SHIFT, prot, MAP_SHARED, fd, 0);
+    addr = mmap(addr, num << PAGE_SHIFT, prot, flags | MAP_SHARED, fd, 0);
     if ( addr == MAP_FAILED )
     {
         PERROR("xc_map_foreign_bulk: mmap failed");
index d5be6481de6c0c52b30b3f71b4a555aa19604450..f4814c390fded4aeb89c3e2f0245e0bdeb8accc1 100644 (file)
@@ -107,6 +107,18 @@ void *xenforeignmemory_map(xenforeignmemory_handle *fmem, uint32_t dom,
                            int prot, size_t pages,
                            const xen_pfn_t arr[/*pages*/], int err[/*pages*/]);
 
+/*
+ * Almost like the previous one but also accepts two additional parameters:
+ *
+ * @addr is used as a hint address for foreign map placement (see mmap(2)).
+ * @flags is a set of additional flags as for mmap(2). Not all of the flag
+ * combinations are possible due to implementation details on different
+ * platforms.
+ */
+void *xenforeignmemory_map2(xenforeignmemory_handle *fmem, uint32_t dom,
+                            void *addr, int prot, int flags, size_t pages,
+                            const xen_pfn_t arr[/*pages*/], int err[/*pages*/]);
+
 /*
  * Unmap a mapping previous created with xenforeignmemory_map().
  *
index 41a88998e30417daadcd6feac3b622a8f9540047..716ecaf15c7a29efb1fc67abe38d58282c5b95b6 100644 (file)
@@ -10,3 +10,7 @@ VERS_1.1 {
        global:
                xenforeignmemory_restrict;
 } VERS_1.0;
+VERS_1.2 {
+       global:
+               xenforeignmemory_map2;
+} VERS_1.1;
index 320bb212fd7cf150a1f8bcf80b291d77dfc0ffd8..374e45aed5c17dec16b032dbd0ee8a28ff1d5d3e 100644 (file)
@@ -142,17 +142,16 @@ out:
 }
 
 void *osdep_xenforeignmemory_map(xenforeignmemory_handle *fmem,
-                                 uint32_t dom, int prot,
-                                 size_t num,
+                                 uint32_t dom, void *addr,
+                                 int prot, int flags, size_t num,
                                  const xen_pfn_t arr[/*num*/], int err[/*num*/])
 {
     int fd = fmem->fd;
     privcmd_mmapbatch_v2_t ioctlx;
-    void *addr;
     size_t i;
     int rc;
 
-    addr = mmap(NULL, num << PAGE_SHIFT, prot, MAP_SHARED,
+    addr = mmap(addr, num << PAGE_SHIFT, prot, flags | MAP_SHARED,
                 fd, 0);
     if ( addr == MAP_FAILED )
     {
index 2dd491066305419649fa4dae6eaa8cdf612c53cb..75f340122e003c942ac821f331abe22d029db79e 100644 (file)
@@ -40,8 +40,8 @@ int osdep_xenforeignmemory_close(xenforeignmemory_handle *fmem)
 }
 
 void *osdep_xenforeignmemory_map(xenforeignmemory_handle *fmem,
-                                 uint32_t dom, int prot,
-                                 size_t num,
+                                 uint32_t dom, void *addr,
+                                 int prot, int flags, size_t num,
                                  const xen_pfn_t arr[/*num*/], int err[/*num*/])
 {
     unsigned long pt_prot = 0;
index af3a1a4a0d8dc3044cb2757d0e7121c95cac0def..9bf95ef4f0e3db39d3f53e447abb1a8fbcc90ec6 100644 (file)
@@ -67,12 +67,12 @@ int osdep_xenforeignmemory_close(xenforeignmemory_handle *fmem)
 }
 
 void *osdep_map_foreign_batch(xenforeignmem_handle *fmem, uint32_t dom,
-                              int prot, xen_pfn_t *arr, int num)
+                              void *addr, int prot, int flags,
+                              xen_pfn_t *arr, int num)
 {
     int fd = fmem->fd;
     privcmd_mmapbatch_t ioctlx;
-    void *addr;
-    addr = mmap(NULL, num*XC_PAGE_SIZE, prot, MAP_ANON | MAP_SHARED, -1, 0);
+    addr = mmap(addr, num*XC_PAGE_SIZE, prot, flags | MAP_ANON | MAP_SHARED, -1, 0);
     if ( addr == MAP_FAILED ) {
         PERROR("osdep_map_foreign_batch: mmap failed");
         return NULL;
index ed7ec7a43fd30317fddca7b90b2d8cf06ac975b0..c5c07cc4c4f0fed47bfc3a6411fc0dc41f733986 100644 (file)
@@ -26,8 +26,8 @@ int osdep_xenforeignmemory_open(xenforeignmemory_handle *fmem);
 int osdep_xenforeignmemory_close(xenforeignmemory_handle *fmem);
 
 void *osdep_xenforeignmemory_map(xenforeignmemory_handle *fmem,
-                                 uint32_t dom, int prot,
-                                 size_t num,
+                                 uint32_t dom, void *addr,
+                                 int prot, int flags, size_t num,
                                  const xen_pfn_t arr[num], int err[num]);
 int osdep_xenforeignmemory_unmap(xenforeignmemory_handle *fmem,
                                  void *addr, size_t num);
@@ -38,7 +38,8 @@ int osdep_xenforeignmemory_restrict(xenforeignmemory_handle *fmem,
 #if defined(__NetBSD__) || defined(__sun__)
 /* Strictly compat for those two only only */
 void *compat_mapforeign_batch(xenforeignmem_handle *fmem, uint32_t dom,
-                              int prot, xen_pfn_t *arr, int num);
+                              void *addr, int prot, int flags,
+                              xen_pfn_t *arr, int num);
 #endif
 
 #define PERROR(_f...) \
index fe7bb45e9e7336b05af466ef1bb2275252e247c0..a33decb4aeca7991f8c1c1baa6e684b3c28765a3 100644 (file)
@@ -68,12 +68,11 @@ int osdep_xenforeignmemory_close(xenforeignmemory_handle *fmem)
 }
 
 void *osdep_map_foreign_batch(xenforeignmem_handle *fmem, uint32_t dom,
-                              int prot, xen_pfn_t *arr, int num)
+                              void *addr, int prot, int flags, xen_pfn_t *arr, int num)
 {
     int fd = fmem->fd;
     privcmd_mmapbatch_t ioctlx;
-    void *addr;
-    addr = mmap(NULL, num*XC_PAGE_SIZE, prot, MAP_SHARED, fd, 0);
+    addr = mmap(addr, num*XC_PAGE_SIZE, prot, flags | MAP_SHARED, fd, 0);
     if ( addr == MAP_FAILED )
         return NULL;