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

[Xen-devel] [PATCH v8 17/20] xenctx: Allow output for offline vcpu when specified.



xc_domain_hvm_getcontext_partial() will fail to get data for an
offline cpu.  Switch back to PV mode of calculating ctxt_word_size
and guest_word_size in the case.

Do this change to xc_translate_foreign_address() also.  In order to
handle 32bit PAE mode, use the hvm way not the pv way to do the
cr3 handling.

Signed-off-by: Don Slutz <dslutz@xxxxxxxxxxx>
---
v8:  Also change xc_translate_foreign_address() to work.

 tools/libxc/xc_pagetab.c | 46 +++++++++++++++++++++++++++++++++++++++-------
 tools/xentrace/xenctx.c  |  6 ++++++
 2 files changed, 45 insertions(+), 7 deletions(-)

diff --git a/tools/libxc/xc_pagetab.c b/tools/libxc/xc_pagetab.c
index 8525967..9d3349f 100644
--- a/tools/libxc/xc_pagetab.c
+++ b/tools/libxc/xc_pagetab.c
@@ -41,15 +41,47 @@ unsigned long xc_translate_foreign_address(xc_interface 
*xch, uint32_t dom,
 
     /* What kind of paging are we dealing with? */
     if (dominfo.hvm) {
-        struct hvm_hw_cpu ctx;
+        struct hvm_hw_cpu hvm_ctx;
         if (xc_domain_hvm_getcontext_partial(xch, dom,
                                              HVM_SAVE_CODE(CPU), vcpu,
-                                             &ctx, sizeof ctx) != 0)
-            return 0;
-        if (!(ctx.cr0 & CR0_PG))
-            return virt >> PAGE_SHIFT;
-        pt_levels = (ctx.msr_efer&EFER_LMA) ? 4 : (ctx.cr4&CR4_PAE) ? 3 : 2;
-        paddr = ctx.cr3 & ((pt_levels == 3) ? ~0x1full : ~0xfffull);
+                                             &hvm_ctx, sizeof hvm_ctx) != 0)
+        {
+            unsigned int gwidth;
+            vcpu_guest_context_any_t ctx;
+
+            if ( errno != EBADSLT )
+                return 0;
+            /*
+             * Offline CPU, use xc_vcpu_getcontext() if possible
+             */
+            if ( xc_vcpu_getcontext(xch, dom, vcpu, &ctx) != 0 )
+                return 0;
+            if ( xc_domain_get_guest_width(xch, dom, &gwidth) != 0 )
+                return 0;
+            if ( gwidth == 8 )
+            {
+                if ( !(ctx.x64.ctrlreg[0] & CR0_PG) )
+                    return virt >> PAGE_SHIFT;
+                pt_levels = 4;
+                paddr = ctx.x64.ctrlreg[3] & ~0xfffull;
+            }
+            else
+            {
+                if ( !(ctx.x32.ctrlreg[0] & CR0_PG) )
+                    return virt >> PAGE_SHIFT;
+                pt_levels = (ctx.x32.ctrlreg[4] & CR4_PAE) ? 3 : 2;
+                paddr = ctx.x32.ctrlreg[3] & ((pt_levels == 3) ?
+                                              ~0x1full : ~0xfffull);
+            }
+        }
+        else
+        {
+            if ( !(hvm_ctx.cr0 & CR0_PG) )
+                return virt >> PAGE_SHIFT;
+            pt_levels = (hvm_ctx.msr_efer & EFER_LMA) ?
+                4 : (hvm_ctx.cr4 & CR4_PAE) ? 3 : 2;
+            paddr = hvm_ctx.cr3 & ((pt_levels == 3) ? ~0x1full : ~0xfffull);
+        }
     } else {
         unsigned int gwidth;
         vcpu_guest_context_any_t ctx;
diff --git a/tools/xentrace/xenctx.c b/tools/xentrace/xenctx.c
index 1ab837e..9aed57e 100644
--- a/tools/xentrace/xenctx.c
+++ b/tools/xentrace/xenctx.c
@@ -1010,6 +1010,11 @@ static void dump_ctx(int vcpu)
             if (xc_domain_hvm_getcontext_partial(
                     xenctx.xc_handle, xenctx.domid, HVM_SAVE_CODE(CPU),
                     vcpu, &cpuctx, sizeof cpuctx) != 0) {
+                if ( errno == EBADSLT )
+                {
+                    printf("Note: vcpu%d offline:\n\n", vcpu);
+                    goto vcpu_off_line;
+                }
                 perror("xc_domain_hvm_getcontext_partial");
                 return;
             }
@@ -1023,6 +1028,7 @@ static void dump_ctx(int vcpu)
             ctxt_word_size = (strstr(xen_caps, "xen-3.0-x86_64")) ? 8 : 4;
         } else {
             unsigned int gw;
+ vcpu_off_line:
             if ( !xc_domain_get_guest_width(xenctx.xc_handle, xenctx.domid, 
&gw) )
                 ctxt_word_size = guest_word_size = gw;
         }
-- 
1.8.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®.