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-changelog

[Xen-changelog] Replace memory_op subcommands reserved_phys_area and map

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] Replace memory_op subcommands reserved_phys_area and map_shared_info
From: Xen patchbot -unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Fri, 10 Mar 2006 18:30:07 +0000
Delivery-date: Fri, 10 Mar 2006 18:30:56 +0000
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID e408a374840c44a2f3d0e649cd1339aaf60ed5ea
# Parent  c5286130a96e684545f5ce3a75255eb6b97d3f8e
Replace memory_op subcommands reserved_phys_area and map_shared_info
with new subcommand add_to_physmap.

This changes the domain0 tools interface, but only when building
shadow-translate-mode guests.

Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>

diff -r c5286130a96e -r e408a374840c tools/libxc/xc_linux_build.c
--- a/tools/libxc/xc_linux_build.c      Fri Mar 10 13:27:24 2006
+++ b/tools/libxc/xc_linux_build.c      Fri Mar 10 15:00:36 2006
@@ -863,8 +863,7 @@
 
     if ( shadow_mode_enabled )
     {
-        struct xen_reserved_phys_area xrpa;
-        struct xen_map_shared_info xmsi;
+        struct xen_add_to_physmap xatp;
 
         /* Enable shadow translate mode */
         if ( xc_shadow_control(xc_handle, dom,
@@ -875,25 +874,35 @@
             goto error_out;
         }
 
-        /* Find the shared info frame.  It's guaranteed to be at the
-           start of the PFN hole. */
-        xrpa.domid = dom;
-        xrpa.idx   = 0;
-        rc = xc_memory_op(xc_handle, XENMEM_reserved_phys_area, &xrpa);
-        if ( rc != 0 )
-        {
-            PERROR("Cannot find shared info pfn");
-            goto error_out;
-        }
-
         guest_shared_info_mfn = (vsharedinfo_start-dsi.v_start) >> PAGE_SHIFT;
-        xmsi.domid = dom;
-        xmsi.pfn = guest_shared_info_mfn;
-        rc = xc_memory_op(xc_handle, XENMEM_map_shared_info, &xmsi);
+
+        /* Map shared info frame into guest physmap. */
+        xatp.domid = dom;
+        xatp.space = XENMAPSPACE_shared_info;
+        xatp.idx   = 0;
+        xatp.gpfn  = guest_shared_info_mfn;
+        rc = xc_memory_op(xc_handle, XENMEM_add_to_physmap, &xatp);
         if ( rc != 0 )
         {
             PERROR("Cannot map shared info pfn");
             goto error_out;
+        }
+
+        /* Map grant table frames into guest physmap. */
+        for ( i = 0; ; i++ )
+        {
+            xatp.domid = dom;
+            xatp.space = XENMAPSPACE_grant_table;
+            xatp.idx   = i;
+            xatp.gpfn  = nr_pages + i;
+            rc = xc_memory_op(xc_handle, XENMEM_add_to_physmap, &xatp);
+            if ( rc != 0 )
+            {
+                if ( errno == EINVAL )
+                    break; /* done all grant tables */
+                PERROR("Cannot map grant table pfn");
+                goto error_out;
+            }
         }
     }
     else
diff -r c5286130a96e -r e408a374840c tools/libxc/xc_private.c
--- a/tools/libxc/xc_private.c  Fri Mar 10 13:27:24 2006
+++ b/tools/libxc/xc_private.c  Fri Mar 10 15:00:36 2006
@@ -231,8 +231,8 @@
             goto out1;
         }
         break;
-    case XENMEM_reserved_phys_area:
-        if ( mlock(arg, sizeof(struct xen_reserved_phys_area)) )
+    case XENMEM_add_to_physmap:
+        if ( mlock(arg, sizeof(struct xen_add_to_physmap)) )
         {
             PERROR("Could not mlock");
             goto out1;
@@ -277,8 +277,8 @@
         safe_munlock(xmml->extent_start,
                      xmml->max_extents * sizeof(unsigned long));
         break;
-    case XENMEM_reserved_phys_area:
-        safe_munlock(arg, sizeof(struct xen_reserved_phys_area));
+    case XENMEM_add_to_physmap:
+        safe_munlock(arg, sizeof(struct xen_add_to_physmap));
         break;
     case XENMEM_translate_gpfn_list:
             safe_munlock(trans->mfn_list, trans->nr_gpfns * sizeof(long));
diff -r c5286130a96e -r e408a374840c xen/arch/x86/mm.c
--- a/xen/arch/x86/mm.c Fri Mar 10 13:27:24 2006
+++ b/xen/arch/x86/mm.c Fri Mar 10 15:00:36 2006
@@ -234,6 +234,8 @@
     if ( page_get_owner(page) == d )
         return;
 
+    set_gpfn_from_mfn(page_to_mfn(page), INVALID_M2P_ENTRY);
+
     spin_lock(&d->page_alloc_lock);
 
     /* The incremented type count pins as writable or read-only. */
@@ -2817,81 +2819,54 @@
 
 long arch_memory_op(int op, GUEST_HANDLE(void) arg)
 {
-    unsigned long pfn;
-    struct domain *d;
-    unsigned int i;
-
     switch ( op )
     {
-    case XENMEM_reserved_phys_area: {
-        struct xen_reserved_phys_area xrpa;
-
-        if ( copy_from_guest(&xrpa, arg, 1) )
+    case XENMEM_add_to_physmap:
+    {
+        struct xen_add_to_physmap xatp;
+        unsigned long mfn = 0, gpfn;
+        struct domain *d;
+
+        if ( copy_from_guest(&xatp, arg, 1) )
             return -EFAULT;
 
-        /* No guest has more than one reserved area. */
-        if ( xrpa.idx != 0 )
+        if ( (d = find_domain_by_id(xatp.domid)) == NULL )
             return -ESRCH;
 
-        if ( (d = find_domain_by_id(xrpa.domid)) == NULL )
-            return -ESRCH;
-
-        /* Only initialised translated guests have a reserved area. */
-        if ( !shadow_mode_translate(d) || (d->max_pages == 0) )
-        {
-            put_domain(d);
-            return -ESRCH;
-        }
-
-        LOCK_BIGLOCK(d);
-        if ( d->arch.first_reserved_pfn == 0 )
-        {
-            d->arch.first_reserved_pfn = pfn = d->max_pages;
-            for ( i = 0; i < NR_GRANT_FRAMES; i++ )
-                guest_physmap_add_page(
-                    d, pfn + i, gnttab_shared_mfn(d, d->grant_table, i));
-        }
-        UNLOCK_BIGLOCK(d);
-
-        xrpa.first_gpfn = d->arch.first_reserved_pfn;
-        xrpa.nr_gpfns   = NR_GRANT_FRAMES;
-
-        put_domain(d);
-
-        if ( copy_to_guest(arg, &xrpa, 1) )
-            return -EFAULT;
-
-        break;
-    }
-
-    case XENMEM_map_shared_info: {
-        struct xen_map_shared_info xmsi;
-
-        if ( copy_from_guest(&xmsi, arg, 1) )
-            return -EFAULT;
-
-        if ( (d = find_domain_by_id(xmsi.domid)) == NULL )
-            return -ESRCH;
-
-        /* Only initialised translated guests can set the shared_info
-         * mapping. */
-        if ( !shadow_mode_translate(d) || (d->max_pages == 0) )
-        {
-            put_domain(d);
-            return -ESRCH;
-        }
-
-        if ( xmsi.pfn > d->max_pages ) {
+        switch ( xatp.space )
+        {
+        case XENMAPSPACE_shared_info:
+            if ( xatp.idx == 0 )
+                mfn = virt_to_mfn(d->shared_info);
+            break;
+        case XENMAPSPACE_grant_table:
+            if ( xatp.idx < NR_GRANT_FRAMES )
+                mfn = virt_to_mfn(d->grant_table->shared) + xatp.idx;
+            break;
+        default:
+            break;
+        }
+        
+        if ( !shadow_mode_translate(d) || (mfn == 0) )
+        {
             put_domain(d);
             return -EINVAL;
         }
 
         LOCK_BIGLOCK(d);
+
         /* Remove previously mapped page if it was present. */
-        if ( mfn_valid(gmfn_to_mfn(d, xmsi.pfn)) )
-            guest_remove_page(d, xmsi.pfn);
-        guest_physmap_add_page(d, xmsi.pfn,
-                               virt_to_maddr(d->shared_info) >> PAGE_SHIFT);
+        if ( mfn_valid(gmfn_to_mfn(d, xatp.gpfn)) )
+            guest_remove_page(d, xatp.gpfn);
+
+        /* Unmap from old location, if any. */
+        gpfn = get_gpfn_from_mfn(mfn);
+        if ( gpfn != INVALID_M2P_ENTRY )
+            guest_physmap_remove_page(d, gpfn, mfn);
+
+        /* Map at new location. */
+        guest_physmap_add_page(d, xatp.gpfn, mfn);
+
         UNLOCK_BIGLOCK(d);
 
         put_domain(d);
diff -r c5286130a96e -r e408a374840c xen/include/asm-x86/grant_table.h
--- a/xen/include/asm-x86/grant_table.h Fri Mar 10 13:27:24 2006
+++ b/xen/include/asm-x86/grant_table.h Fri Mar 10 15:00:36 2006
@@ -26,9 +26,6 @@
         share_xen_page_with_guest(                                       \
             virt_to_page((char *)(t)->shared + ((i) * PAGE_SIZE)),       \
             (d), XENSHARE_writable);                                     \
-        set_gpfn_from_mfn(                                               \
-            (virt_to_maddr((t)->shared) >> PAGE_SHIFT) + (i),            \
-            INVALID_M2P_ENTRY);                                          \
     } while ( 0 )
 
 #define gnttab_shared_mfn(d, t, i)                      \
diff -r c5286130a96e -r e408a374840c xen/include/asm-x86/page.h
--- a/xen/include/asm-x86/page.h        Fri Mar 10 13:27:24 2006
+++ b/xen/include/asm-x86/page.h        Fri Mar 10 15:00:36 2006
@@ -190,6 +190,10 @@
 /* Shorthand versions of the above functions. */
 #define __pa(x)             (virt_to_maddr(x))
 #define __va(x)             (maddr_to_virt(x))
+
+/* Convert between Xen-heap virtual addresses and machine frame numbers. */
+#define virt_to_mfn(va)     (virt_to_maddr(va) >> PAGE_SHIFT)
+#define mfn_to_virt(mfn)    (maddr_to_virt(mfn << PAGE_SHIFT))
 
 /* Convert between machine frame numbers and page-info structures. */
 #define mfn_to_page(mfn)    (frame_table + (mfn))
diff -r c5286130a96e -r e408a374840c xen/include/public/memory.h
--- a/xen/include/public/memory.h       Fri Mar 10 13:27:24 2006
+++ b/xen/include/public/memory.h       Fri Mar 10 15:00:36 2006
@@ -97,25 +97,27 @@
 DEFINE_GUEST_HANDLE(xen_machphys_mfn_list_t);
 
 /*
- * Returns the base and size of the specified reserved 'RAM hole' in the
- * specified guest's pseudophysical address space.
- * arg == addr of xen_reserved_phys_area_t.
+ * Sets the GPFN at which a particular page appears in the specified guest's
+ * pseudophysical address space.
+ * arg == addr of xen_add_to_physmap_t.
  */
-#define XENMEM_reserved_phys_area   7
-typedef struct xen_reserved_phys_area {
-    /* Which domain to report about? */
+#define XENMEM_add_to_physmap      7
+typedef struct xen_add_to_physmap {
+    /* Which domain to change the mapping for. */
     domid_t domid;
 
-    /*
-     * Which reserved area to report? Out-of-range request reports
-     * -ESRCH. Currently no architecture will have more than one reserved area.
-     */
-    unsigned int idx;
+    /* Source mapping space. */
+#define XENMAPSPACE_shared_info 0 /* shared info page */
+#define XENMAPSPACE_grant_table 1 /* grant table page */
+    unsigned int space;
 
-    /* Base and size of the specified reserved area. */
-    unsigned long first_gpfn, nr_gpfns;
-} xen_reserved_phys_area_t;
-DEFINE_GUEST_HANDLE(xen_reserved_phys_area_t);
+    /* Index into source mapping space. */
+    unsigned long idx;
+
+    /* GPFN where the source mapping page should appear. */
+    unsigned long gpfn;
+} xen_add_to_physmap_t;
+DEFINE_GUEST_HANDLE(xen_add_to_physmap_t);
 
 /*
  * Translates a list of domain-specific GPFNs into MFNs. Returns a -ve error
@@ -140,21 +142,6 @@
 } xen_translate_gpfn_list_t;
 DEFINE_GUEST_HANDLE(xen_translate_gpfn_list_t);
 
-/*
- * Sets the GPFN at which the shared_info_page appears in the specified
- * guest's pseudophysical address space.
- * arg == addr of xen_map_shared_info_t.
- */
-#define XENMEM_map_shared_info      9
-typedef struct xen_map_shared_info {
-    /* Which domain to change the mapping for. */
-    domid_t domid;
-
-    /* GPFN where the shared_info_page should appear. */
-    unsigned long pfn;
-} xen_map_shared_info_t;
-DEFINE_GUEST_HANDLE(xen_map_shared_info_t);
-
 #endif /* __XEN_PUBLIC_MEMORY_H__ */
 
 /*

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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] Replace memory_op subcommands reserved_phys_area and map_shared_info, Xen patchbot -unstable <=