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] implement xc_map_foreign_bulk for minios

To: xen-devel@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-devel] [PATCH] implement xc_map_foreign_bulk for minios
From: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
Date: Thu, 14 Jan 2010 17:33:03 +0000
Delivery-date: Thu, 14 Jan 2010 09:32:03 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
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
User-agent: Alpine 2.00 (DEB 1167 2008-08-23)
Hi all,
this patch provides an implementation of xc_map_foreign_bulk for minios.
In order to do so it modifies map_frames_ex and do_map_frames to take an
int *err as parameter and return any error that way.

Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>

---

diff -r 4327d8110e59 extras/mini-os/arch/ia64/mm.c
--- a/extras/mini-os/arch/ia64/mm.c     Thu Jan 14 15:40:35 2010 +0000
+++ b/extras/mini-os/arch/ia64/mm.c     Thu Jan 14 16:00:04 2010 +0000
@@ -137,17 +137,17 @@
 
 /* Helper function used in gnttab.c. */
 void do_map_frames(unsigned long addr,
-        unsigned long *f, unsigned long n, unsigned long stride,
-       unsigned long increment, domid_t id, int may_fail, unsigned long prot)
+    const unsigned long *f, unsigned long n, unsigned long stride,
+       unsigned long increment, domid_t id, int *err, unsigned long prot)
 {
        /* TODO */
        ASSERT(0);
 }
 
 void*
-map_frames_ex(unsigned long* frames, unsigned long n, unsigned long stride,
+map_frames_ex(const unsigned long* frames, unsigned long n, unsigned long 
stride,
        unsigned long increment, unsigned long alignment, domid_t id,
-       int may_fail, unsigned long prot)
+       int *err, unsigned long prot)
 {
         /* TODO: incomplete! */
         ASSERT(n == 1 || (stride == 0 && increment == 1));
diff -r 4327d8110e59 extras/mini-os/arch/x86/ioremap.c
--- a/extras/mini-os/arch/x86/ioremap.c Thu Jan 14 15:40:35 2010 +0000
+++ b/extras/mini-os/arch/x86/ioremap.c Thu Jan 14 16:00:04 2010 +0000
@@ -53,7 +53,7 @@
         }
     }   
     va = (unsigned long)map_frames_ex(&mfns, num_pages, 0, 1, 1,
-                                      DOMID_IO, 0, prot);
+                                      DOMID_IO, NULL, prot);
     return (void *)(va + offset);
     
 mfn_invalid:
diff -r 4327d8110e59 extras/mini-os/arch/x86/mm.c
--- a/extras/mini-os/arch/x86/mm.c      Thu Jan 14 15:40:35 2010 +0000
+++ b/extras/mini-os/arch/x86/mm.c      Thu Jan 14 16:00:04 2010 +0000
@@ -568,10 +568,9 @@
  */
 #define MAP_BATCH ((STACK_SIZE / 2) / sizeof(mmu_update_t))
 void do_map_frames(unsigned long va,
-                   unsigned long *mfns, unsigned long n, 
+                   const unsigned long *mfns, unsigned long n, 
                    unsigned long stride, unsigned long incr, 
-                   domid_t id, int may_fail,
-                   unsigned long prot)
+                   domid_t id, int *err, unsigned long prot)
 {
     pgentry_t *pgt = NULL;
     unsigned long done = 0;
@@ -585,12 +584,14 @@
     }
     DEBUG("va=%p n=0x%lx, mfns[0]=0x%lx stride=0x%lx incr=0x%lx prot=0x%lx\n",
           va, n, mfns[0], stride, incr, prot);
- 
+
+    if ( err )
+        memset(err, 0x00, n * sizeof(int));
     while ( done < n )
     {
         unsigned long todo;
 
-        if ( may_fail )
+        if ( err )
             todo = 1;
         else
             todo = n - done;
@@ -615,8 +616,8 @@
             rc = HYPERVISOR_mmu_update(mmu_updates, todo, NULL, id);
             if ( rc < 0 )
             {
-                if (may_fail)
-                    mfns[done * stride] |= 0xF0000000;
+                if (err)
+                    err[done * stride] = rc;
                 else {
                     printk("Map %ld (%lx, ...) at %p failed: %d.\n",
                            todo, mfns[done * stride] + done * incr, va, rc);
@@ -632,17 +633,17 @@
  * Map an array of MFNs contiguous into virtual address space. Virtual
  * addresses are allocated from the on demand area.
  */
-void *map_frames_ex(unsigned long *mfns, unsigned long n, 
+void *map_frames_ex(const unsigned long *mfns, unsigned long n, 
                     unsigned long stride, unsigned long incr,
                     unsigned long alignment,
-                    domid_t id, int may_fail, unsigned long prot)
+                    domid_t id, int *err, unsigned long prot)
 {
     unsigned long va = allocate_ondemand(n, alignment);
 
     if ( !va )
         return NULL;
 
-    do_map_frames(va, mfns, n, stride, incr, id, may_fail, prot);
+    do_map_frames(va, mfns, n, stride, incr, id, err, prot);
 
     return (void *)va;
 }
diff -r 4327d8110e59 extras/mini-os/include/ia64/arch_mm.h
--- a/extras/mini-os/include/ia64/arch_mm.h     Thu Jan 14 15:40:35 2010 +0000
+++ b/extras/mini-os/include/ia64/arch_mm.h     Thu Jan 14 16:00:04 2010 +0000
@@ -35,9 +35,9 @@
 #define virt_to_mfn(x) virt_to_pfn(x)
 #define virtual_to_mfn(x)      (ia64_tpa((uint64_t)(x)) >> PAGE_SHIFT)
 
-#define map_frames(f, n) map_frames_ex(f, n, 1, 0, 1, DOMID_SELF, 0, 0)
+#define map_frames(f, n) map_frames_ex(f, n, 1, 0, 1, DOMID_SELF, NULL, 0)
 /* TODO */
-#define map_zero(n, a) map_frames_ex(NULL, n, 0, 0, a, DOMID_SELF, 0, 0)
+#define map_zero(n, a) map_frames_ex(NULL, n, 0, 0, a, DOMID_SELF, NULL, 0)
 #define do_map_zero(start, n) ASSERT(n == 0)
 
 #endif /* __ARCH_MM_H__ */
diff -r 4327d8110e59 extras/mini-os/include/mm.h
--- a/extras/mini-os/include/mm.h       Thu Jan 14 15:40:35 2010 +0000
+++ b/extras/mini-os/include/mm.h       Thu Jan 14 16:00:04 2010 +0000
@@ -65,12 +65,12 @@
 
 unsigned long allocate_ondemand(unsigned long n, unsigned long alignment);
 /* map f[i*stride]+i*increment for i in 0..n-1, aligned on alignment pages */
-void *map_frames_ex(unsigned long *f, unsigned long n, unsigned long stride,
+void *map_frames_ex(const unsigned long *f, unsigned long n, unsigned long 
stride,
        unsigned long increment, unsigned long alignment, domid_t id,
-       int may_fail, unsigned long prot);
+       int *err, unsigned long prot);
 void do_map_frames(unsigned long addr,
-        unsigned long *f, unsigned long n, unsigned long stride,
-       unsigned long increment, domid_t id, int may_fail, unsigned long prot);
+        const unsigned long *f, unsigned long n, unsigned long stride,
+       unsigned long increment, domid_t id, int *err, unsigned long prot);
 int unmap_frames(unsigned long va, unsigned long num_frames);
 unsigned long alloc_contig_pages(int order, unsigned int addr_bits);
 #ifdef HAVE_LIBC
diff -r 4327d8110e59 extras/mini-os/include/x86/arch_mm.h
--- a/extras/mini-os/include/x86/arch_mm.h      Thu Jan 14 15:40:35 2010 +0000
+++ b/extras/mini-os/include/x86/arch_mm.h      Thu Jan 14 16:00:04 2010 +0000
@@ -224,9 +224,9 @@
 })
 #define virtual_to_mfn(_virt)     pte_to_mfn(virtual_to_pte(_virt))
 
-#define map_frames(f, n) map_frames_ex(f, n, 1, 0, 1, DOMID_SELF, 0, L1_PROT)
-#define map_zero(n, a) map_frames_ex(&mfn_zero, n, 0, 0, a, DOMID_SELF, 0, 
L1_PROT_RO)
-#define do_map_zero(start, n) do_map_frames(start, &mfn_zero, n, 0, 0, 
DOMID_SELF, 0, L1_PROT_RO)
+#define map_frames(f, n) map_frames_ex(f, n, 1, 0, 1, DOMID_SELF, NULL, 
L1_PROT)
+#define map_zero(n, a) map_frames_ex(&mfn_zero, n, 0, 0, a, DOMID_SELF, NULL, 
L1_PROT_RO)
+#define do_map_zero(start, n) do_map_frames(start, &mfn_zero, n, 0, 0, 
DOMID_SELF, NULL, L1_PROT_RO)
 
 pgentry_t *need_pgt(unsigned long addr);
 int mfn_is_ram(unsigned long mfn);
diff -r 4327d8110e59 extras/mini-os/lib/sys.c
--- a/extras/mini-os/lib/sys.c  Thu Jan 14 15:40:35 2010 +0000
+++ b/extras/mini-os/lib/sys.c  Thu Jan 14 16:00:04 2010 +0000
@@ -1254,10 +1254,10 @@
         return map_zero(n, 1);
     else if (files[fd].type == FTYPE_XC) {
         unsigned long zero = 0;
-        return map_frames_ex(&zero, n, 0, 0, 1, DOMID_SELF, 0, 0);
+        return map_frames_ex(&zero, n, 0, 0, 1, DOMID_SELF, NULL, 0);
     } else if (files[fd].type == FTYPE_MEM) {
         unsigned long first_mfn = offset >> PAGE_SHIFT;
-        return map_frames_ex(&first_mfn, n, 0, 1, 1, DOMID_IO, 0, 
_PAGE_PRESENT|_PAGE_RW);
+        return map_frames_ex(&first_mfn, n, 0, 1, 1, DOMID_IO, NULL, 
_PAGE_PRESENT|_PAGE_RW);
     } else ASSERT(0);
 }
 
diff -r 4327d8110e59 tools/libxc/xc_minios.c
--- a/tools/libxc/xc_minios.c   Thu Jan 14 15:40:35 2010 +0000
+++ b/tools/libxc/xc_minios.c   Thu Jan 14 16:00:04 2010 +0000
@@ -44,8 +44,8 @@
     return 0;
 }
 
-void *xc_map_foreign_batch(int xc_handle, uint32_t dom, int prot,
-                           xen_pfn_t *arr, int num)
+void *xc_map_foreign_bulk(int xc_handle, uint32_t dom, int prot,
+                          const xen_pfn_t *arr, int *err, unsigned int num)
 {
     unsigned long pt_prot = 0;
 #ifdef __ia64__
@@ -56,7 +56,31 @@
     if (prot & PROT_WRITE)
        pt_prot = L1_PROT;
 #endif
-    return map_frames_ex(arr, num, 1, 0, 1, dom, 1, pt_prot);
+    return map_frames_ex(arr, num, 1, 0, 1, dom, err, pt_prot);    
+}
+
+void *xc_map_foreign_batch(int xc_handle, uint32_t dom, int prot,
+                           xen_pfn_t *arr, int num)
+{
+    unsigned long pt_prot = 0;
+    int err[num];
+    int i;
+    unsigned long addr;
+
+#ifdef __ia64__
+    /* TODO */
+#else
+    if (prot & PROT_READ)
+       pt_prot = L1_PROT_RO;
+    if (prot & PROT_WRITE)
+       pt_prot = L1_PROT;
+#endif
+    addr = (unsigned long) map_frames_ex(arr, num, 1, 0, 1, dom, err, pt_prot);
+    for (i = 0; i < num; i++) {
+        if (err[i])
+            arr[i] |= 0xF0000000;
+    }
+    return (void *) addr;
 }
 
 void *xc_map_foreign_range(int xc_handle, uint32_t dom,
@@ -73,7 +97,7 @@
        pt_prot = L1_PROT;
 #endif
     assert(!(size % getpagesize()));
-    return map_frames_ex(&mfn, size / getpagesize(), 0, 1, 1, dom, 0, pt_prot);
+    return map_frames_ex(&mfn, size / getpagesize(), 0, 1, 1, dom, NULL, 
pt_prot);
 }
 
 void *xc_map_foreign_ranges(int xc_handle, uint32_t dom,
@@ -100,7 +124,7 @@
         for (j = 0; j < chunksize / PAGE_SIZE; j++)
             mfns[n++] = entries[i].mfn + j;
 
-    ret = map_frames_ex(mfns, n, 1, 0, 1, dom, 0, pt_prot);
+    ret = map_frames_ex(mfns, n, 1, 0, 1, dom, NULL, pt_prot);
     free(mfns);
     return ret;
 }

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

<Prev in Thread] Current Thread [Next in Thread>