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

[Xen-devel] [PATCH v2 12/12] xenctx: Add optional fCPU.



From: Don Slutz <Don@xxxxxxxxxxxxxxx>

This can be used to dump the normal ctx for an HVM DomU by passing
-1 to fCPU.

If only some of the vCPUs in a HVM DomU, you need to ask for ask for
the on line CPU number, not the expected vCPU number; fCPU can be
used for this.

Signed-off-by: Don Slutz <Don@xxxxxxxxxxxxxxx>
---
 tools/xentrace/xenctx.c |   39 ++++++++++++++++++++++++++++-----------
 1 files changed, 28 insertions(+), 11 deletions(-)

diff --git a/tools/xentrace/xenctx.c b/tools/xentrace/xenctx.c
index d3cbb22..a7a791a 100644
--- a/tools/xentrace/xenctx.c
+++ b/tools/xentrace/xenctx.c
@@ -1125,7 +1125,7 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int 
vcpu, int width, guest
 }
 #endif
 
-static void dump_ctx(int vcpu, guest_word_t mem_addr, guest_word_t stk_addr)
+static void dump_ctx(int vcpu, int fcpu, guest_word_t mem_addr, guest_word_t 
stk_addr)
 {
     vcpu_guest_context_any_t ctx;
 #if defined(__i386__) || defined(__x86_64__)
@@ -1139,11 +1139,11 @@ static void dump_ctx(int vcpu, guest_word_t mem_addr, 
guest_word_t stk_addr)
 
 #if defined(__i386__) || defined(__x86_64__)
     {
-        if (xenctx.dominfo.hvm) {
+        if (fcpu >= 0 && xenctx.dominfo.hvm) {
             xen_capabilities_info_t xen_caps = "";
             if (xc_domain_hvm_getcontext_partial(
                     xenctx.xc_handle, xenctx.domid, HVM_SAVE_CODE(CPU),
-                    vcpu, &cpuctx, sizeof cpuctx) != 0) {
+                    fcpu, &cpuctx, sizeof cpuctx) != 0) {
                 perror("xc_domain_hvm_getcontext_partial");
                 return;
             }
@@ -1175,7 +1175,7 @@ static void dump_ctx(int vcpu, guest_word_t mem_addr, 
guest_word_t stk_addr)
     } else {
         if (!stk_addr) {
 #if defined(__i386__) || defined(__x86_64__)
-            if (xenctx.dominfo.hvm && ctxt_word_size == 8) {
+            if (fcpu >= 0 && xenctx.dominfo.hvm && ctxt_word_size == 8) {
                 if (guest_word_size == 4) {
                     if ((((uint32_t)ctx.x64.user_regs.eip) != cpuctx.rip) ||
                         (((uint32_t)ctx.x64.user_regs.esp) != cpuctx.rsp) ||
@@ -1229,12 +1229,22 @@ static void dump_all_vcpus(guest_word_t mem_addr, 
guest_word_t stk_addr)
 {
     xc_vcpuinfo_t vinfo;
     int vcpu;
+    int fcpu = 0;
+
     for (vcpu = 0; vcpu <= xenctx.dominfo.max_vcpu_id; vcpu++)
     {
         if ( xc_vcpu_getinfo(xenctx.xc_handle, xenctx.domid, vcpu, &vinfo) )
             continue;
-        if ( vinfo.online )
-            dump_ctx(vcpu, mem_addr, stk_addr);
+        if ( vinfo.online ) {
+            printf("vcpu=%d(%d)\n", vcpu, fcpu);
+            dump_ctx(vcpu, fcpu, mem_addr, stk_addr);
+            fcpu++;
+            printf("\n");
+        } else {
+            printf("vcpu=%d offline\n", vcpu);
+            dump_ctx(vcpu, -1, mem_addr, stk_addr);
+            printf("\n");
+        }
     }
 }
 
@@ -1242,7 +1252,7 @@ static void usage(void)
 {
     printf("usage:\n\n");
 
-    printf("  xenctx [options] <DOMAIN> [VCPU]\n\n");
+    printf("  xenctx [options] <DOMAIN> [VCPU] [fCPU]\n\n");
 
     printf("options:\n");
     printf("  -f, --frame-pointers\n");
@@ -1285,6 +1295,7 @@ int main(int argc, char **argv)
     guest_word_t stk_addr = 0;
 
     int vcpu = 0;
+    int fcpu = 0;
 
     while ((ch = getopt_long(argc, argv, sopts, lopts, NULL)) != -1) {
         switch(ch) {
@@ -1326,8 +1337,8 @@ int main(int argc, char **argv)
 
     argv += optind; argc -= optind;
 
-    if (argc < 1 || argc > 2) {
-        printf("usage: xenctx [options] <domid> <optional vcpu>\n");
+    if (argc < 1 || argc > 3) {
+        printf("usage: xenctx [options] <domid> <optional vcpu> <optional 
fcpu>\n");
         exit(-1);
     }
 
@@ -1337,8 +1348,14 @@ int main(int argc, char **argv)
             exit(-1);
     }
 
-    if (argc == 2)
+    if (argc == 2) {
         vcpu = atoi(argv[1]);
+        fcpu = vcpu;
+    }
+
+    if (argc == 3) {
+        fcpu = atoi(argv[2]);
+    }
 
     if (symbol_table)
         read_symbol_table(symbol_table);
@@ -1367,7 +1384,7 @@ int main(int argc, char **argv)
     if (xenctx.all_vcpus)
         dump_all_vcpus(mem_addr, stk_addr);
     else
-        dump_ctx(vcpu, mem_addr, stk_addr);
+        dump_ctx(vcpu, fcpu, mem_addr, stk_addr);
 
     if (xenctx.self_paused) {
         ret = xc_domain_unpause(xenctx.xc_handle, xenctx.domid);
-- 
1.7.1


_______________________________________________
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®.