|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2 09/12] xenctx: Add -m <maddr> option to dump memory at maddr.
From: Don Slutz <Don@xxxxxxxxxxxxxxx>
Signed-off-by: Don Slutz <Don@xxxxxxxxxxxxxxx>
---
tools/xentrace/xenctx.c | 126 ++++++++++++++++++++++++++++++++++++++++------
1 files changed, 109 insertions(+), 17 deletions(-)
diff --git a/tools/xentrace/xenctx.c b/tools/xentrace/xenctx.c
index 233f537..d6f8482 100644
--- a/tools/xentrace/xenctx.c
+++ b/tools/xentrace/xenctx.c
@@ -609,6 +609,33 @@ static guest_word_t read_stack_word(guest_word_t *src, int
width)
return word;
}
+static guest_word_t read_mem_word(vcpu_guest_context_any_t *ctx, int vcpu,
guest_word_t virt, int width)
+{
+ if ((virt & 7) == 0) {
+ guest_word_t *p = map_page(ctx, vcpu, virt);
+
+ if (p)
+ return read_stack_word(p, width);
+ else
+ return -1;
+ } else {
+ guest_word_t word = -1;
+ char *src, *dst;
+ int i;
+
+ dst = (char*)&word;
+ for(i = 0; i < width; i++) {
+ src = map_page(ctx, vcpu, virt + i);
+ if (src)
+ *dst++ = *src;
+ else
+ return word;
+ }
+ return word;
+ }
+}
+
+
static void print_stack_word(guest_word_t word, int width)
{
if (width == 4)
@@ -617,6 +644,58 @@ static void print_stack_word(guest_word_t word, int width)
printf(FMT_64B_WORD, word);
}
+#define BYTES_PER_LINE 16
+
+static void print_mem(vcpu_guest_context_any_t *ctx, int vcpu, int width,
guest_word_t mem_addr)
+{
+ guest_word_t instr;
+ guest_word_t instr_start;
+ guest_word_t word;
+ guest_word_t ascii[BYTES_PER_LINE/4];
+ unsigned char *bytep;
+ int i;
+
+ instr_start = mem_addr;
+ instr = mem_addr;
+ printf("Memory (addr %08llx)\n", instr);
+ for (i=1; i<10; i++) {
+ int j = 0;
+ int k;
+
+ print_stack_word(instr, width);
+ printf(":");
+ while(instr < instr_start + i*BYTES_PER_LINE) {
+ void *p = map_page(ctx, vcpu, instr);
+ if (!p)
+ return;
+ word = read_mem_word(ctx, vcpu, instr, width);
+ ascii[j++] = word;
+ printf(" ");
+ print_stack_word(word, width);
+ instr += width;
+ }
+ printf(" ");
+ for (k = j; k < BYTES_PER_LINE/width; k++)
+ printf("%s ", width == 8
+ ? " "
+ : " ");
+ for (k = 0; k < j; k++) {
+ int l;
+
+ bytep = (unsigned char*)&ascii[k];
+ for (l = 0; l < width; l++) {
+ if ((*bytep < 127) && (*bytep >= 32))
+ printf("%c", *bytep);
+ else
+ printf(".");
+ bytep++;
+ }
+ }
+ printf("\n");
+ }
+ printf("\n");
+}
+
static int print_code(vcpu_guest_context_any_t *ctx, int vcpu)
{
guest_word_t instr;
@@ -640,8 +719,6 @@ static int print_code(vcpu_guest_context_any_t *ctx, int
vcpu)
return 0;
}
-#define BYTES_PER_LINE 16
-
static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width,
guest_word_t stk_addr)
{
guest_word_t stk_addr_start = stack_pointer(ctx);
@@ -787,7 +864,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 stk_addr)
+static void dump_ctx(int vcpu, guest_word_t mem_addr, guest_word_t stk_addr)
{
vcpu_guest_context_any_t ctx;
@@ -826,21 +903,29 @@ static void dump_ctx(int vcpu, guest_word_t stk_addr)
}
#endif
- if (!stk_addr) {
- print_ctx(&ctx);
- }
+ if (mem_addr) {
+ print_mem(&ctx, vcpu, guest_word_size, mem_addr);
#ifndef NO_TRANSLATION
- if (!stk_addr) {
- print_code(&ctx, vcpu);
- if (is_kernel_text(instr_pointer(&ctx)))
+ if (stk_addr)
print_stack(&ctx, vcpu, guest_word_size, stk_addr);
+#endif
} else {
- print_stack(&ctx, vcpu, guest_word_size, stk_addr);
- }
+ if (!stk_addr) {
+ print_ctx(&ctx);
+ }
+#ifndef NO_TRANSLATION
+ if (!stk_addr) {
+ print_code(&ctx, vcpu);
+ if (is_kernel_text(instr_pointer(&ctx)))
+ print_stack(&ctx, vcpu, guest_word_size, stk_addr);
+ } else {
+ print_stack(&ctx, vcpu, guest_word_size, stk_addr);
+ }
#endif
+ }
}
-static void dump_all_vcpus(guest_word_t stk_addr)
+static void dump_all_vcpus(guest_word_t mem_addr, guest_word_t stk_addr)
{
xc_vcpuinfo_t vinfo;
int vcpu;
@@ -849,7 +934,7 @@ static void dump_all_vcpus(guest_word_t stk_addr)
if ( xc_vcpu_getinfo(xenctx.xc_handle, xenctx.domid, vcpu, &vinfo) )
continue;
if ( vinfo.online )
- dump_ctx(vcpu, stk_addr);
+ dump_ctx(vcpu, mem_addr, stk_addr);
}
}
@@ -868,6 +953,8 @@ static void usage(void)
printf(" -S, --stack-trace print a complete stack trace.\n");
printf(" -k kaddr, --kernel-start=kaddr\n");
printf(" set user/kernel split at kaddr. (default
0xc0000000)\n");
+ printf(" -m maddr, --memory=maddr\n");
+ printf(" dump memory at maddr.\n");
printf(" -d daddr, --dump-as-stack=daddr\n");
printf(" dump memory as a stack at daddr.\n");
printf(" -a, --all display more registers\n");
@@ -879,13 +966,14 @@ int main(int argc, char **argv)
{
int ch;
int ret;
- static const char *sopts = "fs:hak:SCd:2";
+ static const char *sopts = "fs:hak:SCm:d:2";
static const struct option lopts[] = {
{"stack-trace", 0, NULL, 'S'},
{"symbol-table", 1, NULL, 's'},
{"frame-pointers", 0, NULL, 'f'},
{"kernel-start", 1, NULL, 'k'},
{"two-pages", 0, NULL, '2'},
+ {"memory", 1, NULL, 'm'},
{"dump-as-stack", 1, NULL, 'd'},
{"all", 0, NULL, 'a'},
{"all-vcpus", 0, NULL, 'C'},
@@ -893,6 +981,7 @@ int main(int argc, char **argv)
{0, 0, 0, 0}
};
const char *symbol_table = NULL;
+ guest_word_t mem_addr = 0;
guest_word_t stk_addr = 0;
int vcpu = 0;
@@ -920,6 +1009,9 @@ int main(int argc, char **argv)
case 'k':
kernel_start = strtoull(optarg, NULL, 0);
break;
+ case 'm':
+ mem_addr = strtoull(optarg, NULL, 0);
+ break;
case 'd':
stk_addr = strtoull(optarg, NULL, 0);
break;
@@ -952,7 +1044,7 @@ int main(int argc, char **argv)
read_symbol_table(symbol_table);
xenctx.xc_handle = xc_interface_open(0,0,0); /* for accessing control
interface */
- if (xenctx.xc_handle < 0) {
+ if (!xenctx.xc_handle) {
perror("xc_interface_open");
exit(-1);
}
@@ -973,9 +1065,9 @@ int main(int argc, char **argv)
}
if (xenctx.all_vcpus)
- dump_all_vcpus(stk_addr);
+ dump_all_vcpus(mem_addr, stk_addr);
else
- dump_ctx(vcpu, stk_addr);
+ dump_ctx(vcpu, 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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |