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

[Xen-devel] [PATCH] tools/libxc: Improve the *_FIELD() macros



The {GET,SET,MEMCPY,MEMSET_ARRAY}_FIELD() macros previously required
'dinfo->guest_width' to exist in scope, which is somewhat antisocial, and
makes them awkward to use in other contexts.

Update these macros to take guest width as a parameter, and in all cases pass
dinfo->guest_width.

Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
CC: Ian Campbell <Ian.Campbell@xxxxxxxxxx>
CC: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx>
---
 tools/libxc/xc_domain_restore.c |   54 ++++++++++++++++++++-------------------
 tools/libxc/xc_domain_save.c    |   24 +++++++++--------
 tools/libxc/xc_resume.c         |    4 +--
 tools/libxc/xg_save_restore.h   |   14 +++++-----
 4 files changed, 50 insertions(+), 46 deletions(-)

diff --git a/tools/libxc/xc_domain_restore.c b/tools/libxc/xc_domain_restore.c
index b80f867..f33b2b2 100644
--- a/tools/libxc/xc_domain_restore.c
+++ b/tools/libxc/xc_domain_restore.c
@@ -317,7 +317,7 @@ static xen_pfn_t *load_p2m_frame_list(
                 tot_bytes -= chunk_bytes;
                 chunk_bytes = 0;
 
-                if ( GET_FIELD(&ctxt, vm_assist) 
+                if ( GET_FIELD(&ctxt, vm_assist, dinfo->guest_width)
                      & (1UL << VMASST_TYPE_pae_extended_cr3) )
                     *pae_extended_cr3 = 1;
             }
@@ -2054,7 +2054,9 @@ int xc_domain_restore(xc_interface *xch, int io_fd, 
uint32_t dom,
         DPRINTF("read VCPU %d\n", i);
 
         if ( !new_ctxt_format )
-            SET_FIELD(ctxt, flags, GET_FIELD(ctxt, flags) | VGCF_online);
+            SET_FIELD(ctxt, flags,
+                      GET_FIELD(ctxt, flags, dinfo->guest_width) | VGCF_online,
+                      dinfo->guest_width);
 
         if ( i == 0 )
         {
@@ -2068,7 +2070,7 @@ int xc_domain_restore(xc_interface *xch, int io_fd, 
uint32_t dom,
              * xc_domain_save and therefore the PFN is found in the
              * edx register.
              */
-            pfn = GET_FIELD(ctxt, user_regs.edx);
+            pfn = GET_FIELD(ctxt, user_regs.edx, dinfo->guest_width);
             if ( (pfn >= dinfo->p2m_size) ||
                  (pfn_type[pfn] != XEN_DOMCTL_PFINFO_NOTAB) )
             {
@@ -2076,7 +2078,7 @@ int xc_domain_restore(xc_interface *xch, int io_fd, 
uint32_t dom,
                 goto out;
             }
             mfn = ctx->p2m[pfn];
-            SET_FIELD(ctxt, user_regs.edx, mfn);
+            SET_FIELD(ctxt, user_regs.edx, mfn, dinfo->guest_width);
             start_info = xc_map_foreign_range(
                 xch, dom, PAGE_SIZE, PROT_READ | PROT_WRITE, mfn);
             if ( start_info == NULL )
@@ -2085,39 +2087,39 @@ int xc_domain_restore(xc_interface *xch, int io_fd, 
uint32_t dom,
                 goto out;
             }
 
-            SET_FIELD(start_info, nr_pages, dinfo->p2m_size);
-            SET_FIELD(start_info, shared_info, shared_info_frame<<PAGE_SHIFT);
-            SET_FIELD(start_info, flags, 0);
-            if ( GET_FIELD(start_info, store_mfn) > dinfo->p2m_size )
+            SET_FIELD(start_info, nr_pages, dinfo->p2m_size, 
dinfo->guest_width);
+            SET_FIELD(start_info, shared_info, shared_info_frame<<PAGE_SHIFT, 
dinfo->guest_width);
+            SET_FIELD(start_info, flags, 0, dinfo->guest_width);
+            if ( GET_FIELD(start_info, store_mfn, dinfo->guest_width) > 
dinfo->p2m_size )
             {
                 ERROR("Suspend record xenstore frame number is bad");
                 munmap(start_info, PAGE_SIZE);
                 goto out;
             }
-            *store_mfn = ctx->p2m[GET_FIELD(start_info, store_mfn)];
-            SET_FIELD(start_info, store_mfn, *store_mfn);
-            SET_FIELD(start_info, store_evtchn, store_evtchn);
-            if ( GET_FIELD(start_info, console.domU.mfn) > dinfo->p2m_size )
+            *store_mfn = ctx->p2m[GET_FIELD(start_info, store_mfn, 
dinfo->guest_width)];
+            SET_FIELD(start_info, store_mfn, *store_mfn, dinfo->guest_width);
+            SET_FIELD(start_info, store_evtchn, store_evtchn, 
dinfo->guest_width);
+            if ( GET_FIELD(start_info, console.domU.mfn, dinfo->guest_width) > 
dinfo->p2m_size )
             {
                 ERROR("Suspend record console frame number is bad");
                 munmap(start_info, PAGE_SIZE);
                 goto out;
             }
-            *console_mfn = ctx->p2m[GET_FIELD(start_info, console.domU.mfn)];
-            SET_FIELD(start_info, console.domU.mfn, *console_mfn);
-            SET_FIELD(start_info, console.domU.evtchn, console_evtchn);
+            *console_mfn = ctx->p2m[GET_FIELD(start_info, console.domU.mfn, 
dinfo->guest_width)];
+            SET_FIELD(start_info, console.domU.mfn, *console_mfn, 
dinfo->guest_width);
+            SET_FIELD(start_info, console.domU.evtchn, console_evtchn, 
dinfo->guest_width);
             munmap(start_info, PAGE_SIZE);
         }
         /* Uncanonicalise each GDT frame number. */
-        if ( GET_FIELD(ctxt, gdt_ents) > 8192 )
+        if ( GET_FIELD(ctxt, gdt_ents, dinfo->guest_width) > 8192 )
         {
             ERROR("GDT entry count out of range");
             goto out;
         }
 
-        for ( j = 0; (512*j) < GET_FIELD(ctxt, gdt_ents); j++ )
+        for ( j = 0; (512*j) < GET_FIELD(ctxt, gdt_ents, dinfo->guest_width); 
j++ )
         {
-            pfn = GET_FIELD(ctxt, gdt_frames[j]);
+            pfn = GET_FIELD(ctxt, gdt_frames[j], dinfo->guest_width);
             if ( (pfn >= dinfo->p2m_size) ||
                  (pfn_type[pfn] != XEN_DOMCTL_PFINFO_NOTAB) )
             {
@@ -2125,10 +2127,10 @@ int xc_domain_restore(xc_interface *xch, int io_fd, 
uint32_t dom,
                       j, (unsigned long)pfn);
                 goto out;
             }
-            SET_FIELD(ctxt, gdt_frames[j], ctx->p2m[pfn]);
+            SET_FIELD(ctxt, gdt_frames[j], ctx->p2m[pfn], dinfo->guest_width);
         }
         /* Uncanonicalise the page table base pointer. */
-        pfn = UNFOLD_CR3(GET_FIELD(ctxt, ctrlreg[3]));
+        pfn = UNFOLD_CR3(GET_FIELD(ctxt, ctrlreg[3], dinfo->guest_width));
 
         if ( pfn >= dinfo->p2m_size )
         {
@@ -2145,7 +2147,7 @@ int xc_domain_restore(xc_interface *xch, int io_fd, 
uint32_t dom,
                   (unsigned long)ctx->pt_levels<<XEN_DOMCTL_PFINFO_LTAB_SHIFT);
             goto out;
         }
-        SET_FIELD(ctxt, ctrlreg[3], FOLD_CR3(ctx->p2m[pfn]));
+        SET_FIELD(ctxt, ctrlreg[3], FOLD_CR3(ctx->p2m[pfn]), 
dinfo->guest_width);
 
         /* Guest pagetable (x86/64) stored in otherwise-unused CR1. */
         if ( (ctx->pt_levels == 4) && (ctxt->x64.ctrlreg[1] & 1) )
@@ -2235,16 +2237,16 @@ int xc_domain_restore(xc_interface *xch, int io_fd, 
uint32_t dom,
     }
 
     /* restore saved vcpu_info and arch specific info */
-    MEMCPY_FIELD(new_shared_info, old_shared_info, vcpu_info);
-    MEMCPY_FIELD(new_shared_info, old_shared_info, arch);
+    MEMCPY_FIELD(new_shared_info, old_shared_info, vcpu_info, 
dinfo->guest_width);
+    MEMCPY_FIELD(new_shared_info, old_shared_info, arch, dinfo->guest_width);
 
     /* clear any pending events and the selector */
-    MEMSET_ARRAY_FIELD(new_shared_info, evtchn_pending, 0);
+    MEMSET_ARRAY_FIELD(new_shared_info, evtchn_pending, 0, dinfo->guest_width);
     for ( i = 0; i < XEN_LEGACY_MAX_VCPUS; i++ )
-           SET_FIELD(new_shared_info, vcpu_info[i].evtchn_pending_sel, 0);
+           SET_FIELD(new_shared_info, vcpu_info[i].evtchn_pending_sel, 0, 
dinfo->guest_width);
 
     /* mask event channels */
-    MEMSET_ARRAY_FIELD(new_shared_info, evtchn_mask, 0xff);
+    MEMSET_ARRAY_FIELD(new_shared_info, evtchn_mask, 0xff, dinfo->guest_width);
 
     /* leave wallclock time. set by hypervisor */
     munmap(new_shared_info, PAGE_SIZE);
diff --git a/tools/libxc/xc_domain_save.c b/tools/libxc/xc_domain_save.c
index 778cbde..6ea8540 100644
--- a/tools/libxc/xc_domain_save.c
+++ b/tools/libxc/xc_domain_save.c
@@ -389,12 +389,12 @@ static void *map_frame_list_list(xc_interface *xch, 
uint32_t dom,
     int count = 100;
     void *p;
     struct domain_info_context *dinfo = &ctx->dinfo;
-    uint64_t fll = GET_FIELD(shinfo, arch.pfn_to_mfn_frame_list_list);
+    uint64_t fll = GET_FIELD(shinfo, arch.pfn_to_mfn_frame_list_list, 
dinfo->guest_width);
 
     while ( count-- && (fll == 0) )
     {
         usleep(10000);
-        fll = GET_FIELD(shinfo, arch.pfn_to_mfn_frame_list_list);
+        fll = GET_FIELD(shinfo, arch.pfn_to_mfn_frame_list_list, 
dinfo->guest_width);
     }
 
     if ( fll == 0 )
@@ -1914,14 +1914,14 @@ int xc_domain_save(xc_interface *xch, int io_fd, 
uint32_t dom, uint32_t max_iter
      * reason==SHUTDOWN_suspend and is therefore found in the edx
      * register.
      */
-    mfn = GET_FIELD(&ctxt, user_regs.edx);
+    mfn = GET_FIELD(&ctxt, user_regs.edx, dinfo->guest_width);
     if ( !MFN_IS_IN_PSEUDOPHYS_MAP(mfn) )
     {
         errno = ERANGE;
         ERROR("Suspend record is not in range of pseudophys map");
         goto out;
     }
-    SET_FIELD(&ctxt, user_regs.edx, mfn_to_pfn(mfn));
+    SET_FIELD(&ctxt, user_regs.edx, mfn_to_pfn(mfn), dinfo->guest_width);
 
     for ( i = 0; i <= info.max_vcpu_id; i++ )
     {
@@ -1935,28 +1935,30 @@ int xc_domain_save(xc_interface *xch, int io_fd, 
uint32_t dom, uint32_t max_iter
         }
 
         /* Canonicalise each GDT frame number. */
-        for ( j = 0; (512*j) < GET_FIELD(&ctxt, gdt_ents); j++ )
+        for ( j = 0; (512*j) < GET_FIELD(&ctxt, gdt_ents, dinfo->guest_width); 
j++ )
         {
-            mfn = GET_FIELD(&ctxt, gdt_frames[j]);
+            mfn = GET_FIELD(&ctxt, gdt_frames[j], dinfo->guest_width);
             if ( !MFN_IS_IN_PSEUDOPHYS_MAP(mfn) )
             {
                 errno = ERANGE;
                 ERROR("GDT frame is not in range of pseudophys map");
                 goto out;
             }
-            SET_FIELD(&ctxt, gdt_frames[j], mfn_to_pfn(mfn));
+            SET_FIELD(&ctxt, gdt_frames[j], mfn_to_pfn(mfn), 
dinfo->guest_width);
         }
 
         /* Canonicalise the page table base pointer. */
-        if ( !MFN_IS_IN_PSEUDOPHYS_MAP(UNFOLD_CR3(
-                                           GET_FIELD(&ctxt, ctrlreg[3]))) )
+        if ( !MFN_IS_IN_PSEUDOPHYS_MAP(
+                 UNFOLD_CR3(GET_FIELD(&ctxt, ctrlreg[3], dinfo->guest_width))) 
)
         {
             errno = ERANGE;
             ERROR("PT base is not in range of pseudophys map");
             goto out;
         }
         SET_FIELD(&ctxt, ctrlreg[3], 
-            FOLD_CR3(mfn_to_pfn(UNFOLD_CR3(GET_FIELD(&ctxt, ctrlreg[3])))));
+                  FOLD_CR3(mfn_to_pfn(UNFOLD_CR3(
+                                          GET_FIELD(&ctxt, ctrlreg[3], 
dinfo->guest_width)
+                                          ))), dinfo->guest_width);
 
         /* Guest pagetable (x86/64) stored in otherwise-unused CR1. */
         if ( (ctx->pt_levels == 4) && ctxt.x64.ctrlreg[1] )
@@ -2065,7 +2067,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t 
dom, uint32_t max_iter
      */
     memcpy(page, live_shinfo, PAGE_SIZE);
     SET_FIELD(((shared_info_any_t *)page), 
-              arch.pfn_to_mfn_frame_list_list, 0);
+              arch.pfn_to_mfn_frame_list_list, 0, dinfo->guest_width);
     if ( wrexact(io_fd, page, PAGE_SIZE) )
     {
         PERROR("Error when writing to state file (1)");
diff --git a/tools/libxc/xc_resume.c b/tools/libxc/xc_resume.c
index e423814..2f851a9 100644
--- a/tools/libxc/xc_resume.c
+++ b/tools/libxc/xc_resume.c
@@ -74,7 +74,7 @@ static int modify_returncode(xc_interface *xch, uint32_t 
domid)
     if ( (rc = xc_vcpu_getcontext(xch, domid, 0, &ctxt)) != 0 )
         return rc;
 
-    SET_FIELD(&ctxt, user_regs.eax, 1);
+    SET_FIELD(&ctxt, user_regs.eax, 1, dinfo->guest_width);
 
     if ( (rc = xc_vcpu_setcontext(xch, domid, 0, &ctxt)) != 0 )
         return rc;
@@ -202,7 +202,7 @@ static int xc_domain_resume_any(xc_interface *xch, uint32_t 
domid)
         goto out;
     }
 
-    mfn = GET_FIELD(&ctxt, user_regs.edx);
+    mfn = GET_FIELD(&ctxt, user_regs.edx, dinfo->guest_width);
 
     start_info = xc_map_foreign_range(xch, domid, PAGE_SIZE,
                                       PROT_READ | PROT_WRITE, mfn);
diff --git a/tools/libxc/xg_save_restore.h b/tools/libxc/xg_save_restore.h
index 69ea64e..aa93c13 100644
--- a/tools/libxc/xg_save_restore.h
+++ b/tools/libxc/xg_save_restore.h
@@ -360,10 +360,10 @@ static inline int get_platform_info(xc_interface *xch, 
uint32_t dom,
 #define is_mapped(pfn_type) (!((pfn_type) & 0x80000000UL))
 
 
-#define GET_FIELD(_p, _f) ((dinfo->guest_width==8) ? ((_p)->x64._f) : 
((_p)->x32._f))
+#define GET_FIELD(_p, _f, _w) (((_w) == 8) ? ((_p)->x64._f) : ((_p)->x32._f))
 
-#define SET_FIELD(_p, _f, _v) do {              \
-    if (dinfo->guest_width == 8)                \
+#define SET_FIELD(_p, _f, _v, _w) do {          \
+    if ((_w) == 8)                              \
         (_p)->x64._f = (_v);                    \
     else                                        \
         (_p)->x32._f = (_v);                    \
@@ -379,15 +379,15 @@ static inline int get_platform_info(xc_interface *xch, 
uint32_t dom,
               ? ((uint64_t)(_c)) << 12                                  \
               : (((uint32_t)(_c) << 12) | ((uint32_t)(_c) >> 20))))
 
-#define MEMCPY_FIELD(_d, _s, _f) do {                              \
-    if (dinfo->guest_width == 8)                                   \
+#define MEMCPY_FIELD(_d, _s, _f, _w) do {                          \
+    if ((_w) == 8)                                                 \
         memcpy(&(_d)->x64._f, &(_s)->x64._f,sizeof((_d)->x64._f)); \
     else                                                           \
         memcpy(&(_d)->x32._f, &(_s)->x32._f,sizeof((_d)->x32._f)); \
 } while (0)
 
-#define MEMSET_ARRAY_FIELD(_p, _f, _v) do {                        \
-    if (dinfo->guest_width == 8)                                   \
+#define MEMSET_ARRAY_FIELD(_p, _f, _v, _w) do {                    \
+    if ((_w) == 8)                                                 \
         memset(&(_p)->x64._f[0], (_v), sizeof((_p)->x64._f));      \
     else                                                           \
         memset(&(_p)->x32._f[0], (_v), sizeof((_p)->x32._f));      \
-- 
1.7.10.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®.