Skip to contentSkip to conversation

xenctx: Many changes.

PATCH Superseded Don Slutz 4 participants 77 messages Mar 20, 2014 – Mar 27, 2014

v5 of 10 Superseded Latest is v10 →

lore
Share & tools
lore

Don Slutz

author
#0 lore raw

v5 cover xenctx: Many changes.

Add more functionality to xenctx.

Change from v4 to v5:
Jan Beulich:
#13 "xenctx: Add convert of more registers to symbols":
Add reg_is_addr_mask.
#14 "xenctx: Add output of vcpu value and state for":
Change vcpu=3 to vcpu3. Drop online.

George Dunlap:
#1 "xenctx: clean up usage output":
Reviewed-by
#2 "xenctx: Clean up stack trace when hypercall_page not":
Acked-by
#3 "xenctx: Add -n (--display-stack-pages) option to":
Adjust option to -n, --display-stack-pages. Adjust usage message.
#4 "xenctx: Add command line options -b":
Add defaults to disply. Accept MAX for -l.
#5 "xenctx: Add command line option -D":
Add comment, move printf.
#6 "xenctx: Add command line option -t":
Reviewed-by
#7 "xenctx: Change print_symbol to do the space before.":
Acked-by
#8 "xenctx: More info on failed to map page.":
Acked-by
#9 "xenctx: Add command line option -T (--tag-trace)":
Adjust option name, usage.
#10 "xenctx: Add -m (--memory) <maddr> option to dump":
Remove extra #ifndef. Make common routine print_lines().

Added
#16 "xenctx: Allow output for offline vcpu when" #17 "xenctx: Fixup options checking."

Change from v3 to v4:
Dropped patches:
v3 #2 "xenctx: Correct check for xc_interface_open failing (prevents SIGSEGV)"
Simular code already in master
v3 #16 "MAINTAINERS: Add XENCTX maintainer"
Way too soon for this.

Most: re-sytled all adds or changes to be in CODING_STYLE.

#1 "xenctx: clean up usage output":
Changed from kaddr to KADDR.

Jan Beulich:
v3 #4 "xenctx: Add -2 (--two-pages) option to switch stack size to 8KiB"
Converted to
#3 "xenctx: Add -m (--multiple_pages) option to output larger stack"

#10 "xenctx: Add -M <maddr> option to dump memory at"
Changed from -m to -M

Added #15 "xenctx: Fix handling of !guest_protected_mode"

Dropped forever:

v1 patch #11 "xenctx: Dump registers via hvm info if available"

This was a hack to work around a bug fix that is in 4.4.0

Change from v2 to v3:
Added patches #1, #2, #5, and #16.
v3 #1 "xenctx: clean up usage output":
Move all usage cleanup into it's own patch/
v3 #2 "xenctx: Correct check for xc_interface_open failing (prevents SIGSEGV)":
Move xenctx.xc_handle out of patch v2 #9 ""
v3 #5 "xenctx: Add command line options -b and -l":
Redo to stack dump output size adjustments
into commanle line options.
v3 #16 "MAINTAINERS: Add XENCTX maintainer":
Declare this I maintain xenctx, and drop George Dunlap.

Unchanged (other then their number)
v3 #3 "xenctx: Clean up stack trace when hypercall_page not in symbol table" v3 #8 "xenctx: Change print_symbol to do the space before."
v3 #9 "xenctx: More info on failed to map page."

Mostly from Jan Beulich:
v3 #4 "xenctx: Add -2 (--two-pages) option to switch stack size to 8KiB":
* Dropped extra change about i < 10.
* Move add to usage to the end.
v3 #6 "xenctx: Add command line option -D (--decode-as-ascii)":
v3 #7 "xenctx: Add command line option -t (--tag-stack-dump)":
v3 #10 "xenctx: Add command line option -T (--tag-call-trace)":
* Add command line option to control this.
* More info in commit message.
v3 #11 "xenctx: Add -m <maddr> option to dump memory at maddr.":
* Reworked option handling to allow multiple actions to work.
* Add check for NO_TRANSLATION where needed.
* Support -b and -l.
v3 #12 "xenctx: Add -d <daddr> option to dump memory at daddr as a stack.":
* Do this patch after -m patch.
* Reworked option handling to allow multiple actions to work.
* Add check for NO_TRANSLATION where needed.
* More info in commit message.
v3 #13 "xenctx: change is_kernel_text() into kernel_addr().":
* new name is kernel_addr().
* Use kernel_start if set.
* Remove other changes.
v3 #14 "xenctx: Add convert of more registers to symbols":
* Extract just the symbol printing code from "xenctx: Dump registers via hvm info if available"
v3 #15 "xenctx: Add output of vcpu value and state for --all-vcpus":
* Extract just the vcpu printing code from "xenctx: xenctx: Add optional fCPU"

v1 patch #11 "xenctx: Dump registers via hvm info if available" has
been defered to the "merge xenctx and xen_hvmctx" patch set.

v1 patch #12 "xenctx: Add optional fCPU" has been dropped.

Change from v1 to v2:
title was: xenctx: Add an option to output more registers. Processed review comments.
Jan Beulich:
Split 1 change into 12.
Switch to enum for is_kernel_text(), renamed to is_kernel_addr(). Renamed vars like memAddr to mem_addr.
Ian Campbell:
More on is_kernel_text().

Don Slutz (17):
xenctx: clean up usage output
xenctx: Clean up stack trace when hypercall_page not in symbol table
xenctx: Add -n (--display-stack-pages) option to output larger stack
xenctx: Add command line options -b (--bytes-per-line) and -l

    (--lines)

xenctx: Add command line option -D (--decode-as-ascii)
xenctx: Add command line option -t (--tag-stack-dump)
xenctx: Change print_symbol to do the space before.
xenctx: More info on failed to map page.
xenctx: Add command line option -T (--tag-trace)
xenctx: Add -m (--memory) <maddr> option to dump memory at maddr.
xenctx: Add -d (--dump-as-stack) <daddr> option to dump memory at
daddr as a stack.
xenctx: change is_kernel_text() into kernel_addr().
xenctx: Add convert of more registers to symbols
xenctx: Add output of vcpu value and state for --all-vcpus
xenctx: Fix handling of !guest_protected_mode
xenctx: Allow output for offline vcpu when specified.
xenctx: Fixup options checking.

 tools/xentrace/xenctx.c | 577 +++++++++++++++++++++++++++++++++++++++---------
 1 file changed, 477 insertions(+), 100 deletions(-)
Signature · 1 line
1.8.4
author
#1 lore raw

PATCH v5 1/17 xenctx: clean up usage output

Fix usage formatting to be all the same.

Fix usage display of default --kernel-start for 64 bit.

---
 tools/xentrace/xenctx.c | 17 +++++++++--------
 1 file changed, 9 insertions(+), 8 deletions(-)
tools/xentrace/xenctx.c +9 -8
index 7275a00..97c6197 100644
@@ -823,15 +823,16 @@ static void usage(void)
 
     printf("options:\n");
     printf("  -f, --frame-pointers\n");
-    printf("                    assume the kernel was compiled with\n");
-    printf("                    frame pointers.\n");
+    printf("                     assume the kernel was compiled with\n");
+    printf("                     frame pointers.\n");
     printf("  -s SYMTAB, --symbol-table=SYMTAB\n");
-    printf("                    read symbol table from SYMTAB.\n");
-    printf("  -S --stack-trace  print a complete stack trace.\n");
-    printf("  -k, --kernel-start\n");
-    printf("                    set user/kernel split. (default 0xc0000000)\n");
-    printf("  -a --all          display more registers\n");
-    printf("  -C --all-vcpus    print info for all vcpus\n");
+    printf("                     read symbol table from SYMTAB.\n");
+    printf("  -S, --stack-trace  print a complete stack trace.\n");
+    printf("  -k KADDR, --kernel-start=KADDR\n");
+    printf("                     set user/kernel split. (default 0x"FMT_32B_WORD")\n",
+        kernel_start);
+    printf("  -a, --all          display more registers\n");
+    printf("  -C, --all-vcpus    print info for all vcpus\n");
 }
 
 int main(int argc, char **argv)
Signature · 1 line
1.8.4
author
#3 lore raw

PATCH v5 2/17 xenctx: Clean up stack trace when hypercall_page not in symbol table

In reply to Don Slutz

From: Don Slutz <[email protected]>

Before:

Call Trace:
  [<ffffffff8006b2b0>] default_idle+0x29  <--
  [<ffffffff80048d19>] cpu_idle+0x95
  [<ffffffff803e7801>] start_kernel+0x220
  [<0000000000000000>] startup_64+0x80000000
  [<ffffffff803e722f>] x86_64_start_kernel+0x22f
  [<0000000000000000>] startup_64+0x80000000
  [<0000000000000000>] startup_64+0x80000000
  [<0000000000000000>] startup_64+0x80000000
  [<0000000000000000>] startup_64+0x80000000

After:

Call Trace:
  [<ffffffff8006b2b0>] default_idle+0x29  <--
  [<ffffffff80048d19>] cpu_idle+0x95
  [<ffffffff803e7801>] start_kernel+0x220
  [<ffffffff803e722f>] x86_64_start_kernel+0x22f
---
 tools/xentrace/xenctx.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)
tools/xentrace/xenctx.c +3 -2
index 97c6197..42a47f3 100644
@@ -85,8 +85,9 @@ static int is_kernel_text(guest_word_t addr)
     if (addr >= kernel_stext &&
         addr <= kernel_etext)
         return 1;
-    if (addr >= kernel_hypercallpage &&
-        addr <= kernel_hypercallpage + 4096)
+    if ( kernel_hypercallpage &&
+         (addr >= kernel_hypercallpage &&
+          addr <= kernel_hypercallpage + 4096) )
         return 1;
     if (addr >= kernel_sinittext &&
         addr <= kernel_einittext)
Signature · 1 line
1.8.4
author
#4 lore raw

PATCH v5 3/17 xenctx: Add -n (--display-stack-pages) option to output larger stack

In reply to Don Slutz

From: Don Slutz <[email protected]>

Important: This is the stack size to display not the configured stack size.

Note: use with caution (easy to get garbage).

Below is various pictures of a configured 3 page stack, and where the SP currently is. Each box is a page.

       +------------------+
       |                  |
       |                  |
       |                  |
       |                  |
       |                  |
       +------------------+
       |                  |
       |                  |
       |                  |
       |                  |
       |                  |
       +------------------+
       |                  |
       |                  |
       |                  |
SP --> |                  |
       |                  |
       +------------------+

Display using "-n 1" since the used stack pages is 1.

       +------------------+
       |                  |
       |                  |
       |                  |
       |                  |
       |                  |
       +------------------+
       |                  |
SP --> |                  |
       |                  |
       |                  |
       |                  |
       +------------------+
       |                  |
       |                  |
       |                  |
       |                  |
       |                  |
       +------------------+

Display using "-n 2" since the used stack pages is 2.

       +------------------+
       |                  |
       |                  |
       |                  |
       |                  |
SP --> |                  |
       +------------------+
       |                  |
       |                  |
       |                  |
       |                  |
       |                  |
       +------------------+
       |                  |
       |                  |
       |                  |
       |                  |
       |                  |
       +------------------+

Display using "-n 3" since the used stack pages is 3.

---
v5: Adjust option to -n, --display-stack-pages. Adjust usage message.

 tools/xentrace/xenctx.c | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)
tools/xentrace/xenctx.c +11 -1
index 42a47f3..caa8899 100644
@@ -35,6 +35,7 @@ static struct xenctx {
     int frame_ptrs;
     int stack_trace;
     int disp_all;
+    int multiple_pages;
     int all_vcpus;
     int self_paused;
     xc_dominfo_t dominfo;
@@ -664,6 +665,8 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width)
 
     stack_limit = ((stack_pointer(ctx) + XC_PAGE_SIZE)
                    & ~((guest_word_t) XC_PAGE_SIZE - 1));
+    if ( xenctx.multiple_pages > 1 )
+        stack_limit += (xenctx.multiple_pages - 1) * XC_PAGE_SIZE;
     printf("\n");
     printf("Stack:\n");
     for (i=1; i<5 && stack < stack_limit; i++) {
@@ -834,18 +837,22 @@ static void usage(void)
         kernel_start);
     printf("  -a, --all          display more registers\n");
     printf("  -C, --all-vcpus    print info for all vcpus\n");
+    printf("  -n PAGES, --display-stack-pages=PAGES\n");
+    printf("                     Display N pages from the stack pointer.\n");
+    printf("                     Note: use with caution (easy to get garbage).\n");
 }
 
 int main(int argc, char **argv)
 {
     int ch;
     int ret;
-    static const char *sopts = "fs:hak:SC";
+    static const char *sopts = "fs:hak:SCn:";
     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'},
+        {"display-stack-pages", 0, NULL, 'n'},
         {"all", 0, NULL, 'a'},
         {"all-vcpus", 0, NULL, 'C'},
         {"help", 0, NULL, 'h'},
@@ -869,6 +876,9 @@ int main(int argc, char **argv)
         case 'a':
             xenctx.disp_all = 1;
             break;
+        case 'n':
+            xenctx.multiple_pages = strtol(optarg, NULL, 0);
+            break;
         case 'C':
             xenctx.all_vcpus = 1;
             break;
Signature · 1 line
1.8.4
#5 lore raw

Re: [PATCH v5 03/17] xenctx: Add -n (--display-stack-pages) option to output larger stack

Quoted 30 lines · Don Slutz

From: Don Slutz <[email protected]>

Important: This is the stack size to display not the configured stack size.

Note: use with caution (easy to get garbage).

Below is various pictures of a configured 3 page stack, and where the SP currently is. Each box is a page.

       +------------------+
       |                  |
       |                  |
       |                  |
       |                  |
       |                  |
       +------------------+
       |                  |
       |                  |
       |                  |
       |                  |
       |                  |
       +------------------+
       |                  |
       |                  |
       |                  |
SP --> |                  |
       |                  |
       +------------------+
Quoted 1 line

Display using "-n 1" since the used stack pages is 1.

Like George I am also confused by what these diagrams are trying to show me, and even having read your response to him I'm confused.

Why is the SP moving around in these pictures? I understood that this option was changing what was considered to be the limit of the stack, not the stack pointer itself, so shouldn't it be the base of the stack which is moving around?

Perhaps if you had the diagram once and along side it had columns showing what is printed for each -n value as a range

e.g.
None -n 1
+------------------+ +
| | |
| | |
| | |
| | |
| | |
+------------------+ + |
| | | |

SP --> |                  |     +        +
       |                  |
       |                  |
       |                  |
       +------------------+

(or whatever the reality is)

[...]

Quoted 1 line

Out of date?

Quoted 19 lines

---
v5: Adjust option to -n, --display-stack-pages. Adjust usage message.

 tools/xentrace/xenctx.c | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)
tools/xentrace/xenctx.c +1 -0
index 42a47f3..caa8899 100644
@@ -35,6 +35,7 @@ static struct xenctx {
     int frame_ptrs;
     int stack_trace;
     int disp_all;
+    int multiple_pages;
     int all_vcpus;
     int self_paused;
     xc_dominfo_t dominfo;

tools/xentrace/xenctx.c static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width) · line 669

Quoted 5 lines
tools/xentrace/xenctx.c +2 -0
@@ -664,6 +665,8 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width)
 
     stack_limit = ((stack_pointer(ctx) + XC_PAGE_SIZE)
                    & ~((guest_word_t) XC_PAGE_SIZE - 1));
+    if ( xenctx.multiple_pages > 1 )
+        stack_limit += (xenctx.multiple_pages - 1) * XC_PAGE_SIZE;

"multiple_pages" sounds like a boolean to me, you seem to use it as "extra_pages", but why not just call it nr_stack_pages, initialise it to 1 and override it with --display-stack-pages.

Ian.

author
#6 lore raw

Re: [PATCH v5 03/17] xenctx: Add -n (--display-stack-pages) option to output larger stack

Quoted 31 lines · Ian Campbell
Quoted 30 lines · Don Slutz

From: Don Slutz <[email protected]>

Important: This is the stack size to display not the configured stack size.

Note: use with caution (easy to get garbage).

Below is various pictures of a configured 3 page stack, and where the SP currently is. Each box is a page.

        +------------------+
        |                  |
        |                  |
        |                  |
        |                  |
        |                  |
        +------------------+
        |                  |
        |                  |
        |                  |
        |                  |
        |                  |
        +------------------+
        |                  |
        |                  |
        |                  |
SP --> |                  |
        |                  |
        +------------------+
Quoted 3 lines
Quoted 1 line

Display using "-n 1" since the used stack pages is 1.

Like George I am also confused by what these diagrams are trying to show me, and even having read your response to him I'm confused.

Let me try again.

Here is real output for a kernel with 4 page stacks:

tools/xentrace/xenctx -s ~/zzm 4 -n 1
rip: ffffffff81346876 io_serial_in+0x16
flags: 00000002 nz
rsp: ffff8800385a5ab8
rax: 000000000000006f rcx: 0000000000000000 rdx: 00000000000003fd
rbx: ffffffff81ff8f00 rsi: 0000000000000005 rdi: ffffffff81ff8f00
rbp: ffff8800385a5ab8 r8: ffffffff81c03a10 r9: 0000000000000080
r10: 0000000000000005 r11: 0000000000000046 r12: 000000000000270f
r13: 0000000000000020 r14: 0000000000000025 r15: ffffffff81346f20
cs: 0010 ss: 0018 ds: 0000 es: 0000
fs: 0000 @ 00007f07972f3700
gs: 0000 @ ffff88000b400000/0000000000000000/
Code (instr addr ffffffff81346876)
48 89 e5 0f 1f 44 00 00 0f b6 4f 41 0f b7 57 08 d3 e6 01 f2 ec <0f> b6 c0 c9 c3 0f 1f 44 00 00 55

Stack:
 ffff8800385a5ae8 ffffffff81346e64 ffffffff81ff8f00 0000000000000072
 0000000000000064 0000000000000025 ffff8800385a5b08 ffffffff81346f46
 ffffffff81e3e430 ffffffff81ff8f00 ffff8800385a5b48 ffffffff813428de
 ffffffff8100bc0e 0000000000000000 ffffffff81ff8f00 0000000000000001
 0000000000000064 ffffffff81e3e40c ffff8800385a5b98 ffffffff813472ad

Call Trace:
  [<ffffffff81346876>] io_serial_in+0x16 <--
  [<ffffffff81346e64>] wait_for_xmitr+0x24
  [<ffffffff81346f46>] serial8250_console_putchar+0x26
  [<ffffffff813428de>] uart_console_write+0x3e
  [<ffffffff8100bc0e>] apic_timer_interrupt+0xe
  [<ffffffff813472ad>] serial8250_console_write+0xbd
  [<ffffffff8106b8f5>] __call_console_drivers+0x75
  [<ffffffff8106b95a>] _call_console_drivers+0x4a
  [<ffffffff8106be6e>] release_console_sem+0x4e
  [<ffffffff8106c628>] vprintk+0x248
  [<ffffffff814fd363>] printk+0x41

tools/xentrace/xenctx -s ~/zzm 4 -n 2
rip: ffffffff81346876 io_serial_in+0x16
flags: 00000002 nz
rsp: ffff8800385a5ab8
rax: 000000000000006f rcx: 0000000000000000 rdx: 00000000000003fd
rbx: ffffffff81ff8f00 rsi: 0000000000000005 rdi: ffffffff81ff8f00
rbp: ffff8800385a5ab8 r8: ffffffff81c03a10 r9: 0000000000000080
r10: 0000000000000005 r11: 0000000000000046 r12: 000000000000270f
r13: 0000000000000020 r14: 0000000000000025 r15: ffffffff81346f20
cs: 0010 ss: 0018 ds: 0000 es: 0000
fs: 0000 @ 00007f07972f3700
gs: 0000 @ ffff88000b400000/0000000000000000/
Code (instr addr ffffffff81346876)
48 89 e5 0f 1f 44 00 00 0f b6 4f 41 0f b7 57 08 d3 e6 01 f2 ec <0f> b6 c0 c9 c3 0f 1f 44 00 00 55

Stack:
 ffff8800385a5ae8 ffffffff81346e64 ffffffff81ff8f00 0000000000000072
 0000000000000064 0000000000000025 ffff8800385a5b08 ffffffff81346f46
 ffffffff81e3e430 ffffffff81ff8f00 ffff8800385a5b48 ffffffff813428de
 ffffffff8100bc0e 0000000000000000 ffffffff81ff8f00 0000000000000001
 0000000000000064 ffffffff81e3e40c ffff8800385a5b98 ffffffff813472ad

Call Trace:
  [<ffffffff81346876>] io_serial_in+0x16 <--
  [<ffffffff81346e64>] wait_for_xmitr+0x24
  [<ffffffff81346f46>] serial8250_console_putchar+0x26
  [<ffffffff813428de>] uart_console_write+0x3e
  [<ffffffff8100bc0e>] apic_timer_interrupt+0xe
  [<ffffffff813472ad>] serial8250_console_write+0xbd
  [<ffffffff8106b8f5>] __call_console_drivers+0x75
  [<ffffffff8106b95a>] _call_console_drivers+0x4a
  [<ffffffff8106be6e>] release_console_sem+0x4e
  [<ffffffff8106c628>] vprintk+0x248
  [<ffffffff814fd363>] printk+0x41

tools/xentrace/xenctx -s ~/zzm 4 -n 3
rip: ffffffff81346876 io_serial_in+0x16
flags: 00000002 nz
rsp: ffff8800385a5ab8
rax: 000000000000006f rcx: 0000000000000000 rdx: 00000000000003fd
rbx: ffffffff81ff8f00 rsi: 0000000000000005 rdi: ffffffff81ff8f00
rbp: ffff8800385a5ab8 r8: ffffffff81c03a10 r9: 0000000000000080
r10: 0000000000000005 r11: 0000000000000046 r12: 000000000000270f
r13: 0000000000000020 r14: 0000000000000025 r15: ffffffff81346f20
cs: 0010 ss: 0018 ds: 0000 es: 0000
fs: 0000 @ 00007f07972f3700
gs: 0000 @ ffff88000b400000/0000000000000000/
Code (instr addr ffffffff81346876)
48 89 e5 0f 1f 44 00 00 0f b6 4f 41 0f b7 57 08 d3 e6 01 f2 ec <0f> b6 c0 c9 c3 0f 1f 44 00 00 55

Stack:
 ffff8800385a5ae8 ffffffff81346e64 ffffffff81ff8f00 0000000000000072
 0000000000000064 0000000000000025 ffff8800385a5b08 ffffffff81346f46
 ffffffff81e3e430 ffffffff81ff8f00 ffff8800385a5b48 ffffffff813428de
 ffffffff8100bc0e 0000000000000000 ffffffff81ff8f00 0000000000000001
 0000000000000064 ffffffff81e3e40c ffff8800385a5b98 ffffffff813472ad

Call Trace:
  [<ffffffff81346876>] io_serial_in+0x16 <--
  [<ffffffff81346e64>] wait_for_xmitr+0x24
  [<ffffffff81346f46>] serial8250_console_putchar+0x26
  [<ffffffff813428de>] uart_console_write+0x3e
  [<ffffffff8100bc0e>] apic_timer_interrupt+0xe
  [<ffffffff813472ad>] serial8250_console_write+0xbd
  [<ffffffff8106b8f5>] __call_console_drivers+0x75
  [<ffffffff8106b95a>] _call_console_drivers+0x4a
  [<ffffffff8106be6e>] release_console_sem+0x4e
  [<ffffffff8106c628>] vprintk+0x248
  [<ffffffff814fd363>] printk+0x41
  [<ffffffff8100204c>] do_one_initcall+0x3c
  [<ffffffff810b0eb1>] sys_init_module+0xe1
  [<ffffffff8100b0f2>] system_call_fastpath+0x16

As you can see from above, only the last 3 lines show up for "-n 3"

Quoted 5 lines

Why is the SP moving around in these pictures? I understood that this option was changing what was considered to be the limit of the stack, not the stack pointer itself, so shouldn't it be the base of the stack which is moving around?

These are pictures of the same stack at 3 different times. And as you can see from above, this option does change the stack limit.

Quoted 15 lines

Perhaps if you had the diagram once and along side it had columns showing what is printed for each -n value as a range

e.g.
None -n 1
+------------------+ +
| | |
| | |
| | |
| | |
| | |
+------------------+ + |
| | | |
SP --> | | + +

Quoted 8 lines
        |                  |
        |                  |
        |                  |
        +------------------+

(or whatever the reality is)

[...]

I will add this. And some statement about each picture is for a different time.

Quoted 2 lines
Quoted 1 line

Out of date?

Yes, and no. Both email continue to work. I will update it.

Quoted 20 lines
Quoted 20 lines

---
v5: Adjust option to -n, --display-stack-pages. Adjust usage message.

  tools/xentrace/xenctx.c | 12 +++++++++++-
  1 file changed, 11 insertions(+), 1 deletion(-)
tools/xentrace/xenctx.c +1 -0
index 42a47f3..caa8899 100644
@@ -35,6 +35,7 @@ static struct xenctx {
      int frame_ptrs;
      int stack_trace;
      int disp_all;
+    int multiple_pages;
      int all_vcpus;
      int self_paused;
      xc_dominfo_t dominfo;
@@ -664,6 +665,8 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width)
 
Quoted 7 lines

tools/xentrace/xenctx.c static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width) · line 669

Quoted 4 lines
tools/xentrace/xenctx.c +2 -0
      stack_limit = ((stack_pointer(ctx) + XC_PAGE_SIZE)
                     & ~((guest_word_t) XC_PAGE_SIZE - 1));
+    if ( xenctx.multiple_pages > 1 )
+        stack_limit += (xenctx.multiple_pages - 1) * XC_PAGE_SIZE;

"multiple_pages" sounds like a boolean to me, you seem to use it as "extra_pages", but why not just call it nr_stack_pages, initialise it to 1 and override it with --display-stack-pages.

I will adjust the internal name also. No idea why I did not do so when to option name was changed.

-Don Slutz

Quoted 2 lines

Ian.

#7 lore raw

Re: [PATCH v5 03/17] xenctx: Add -n (--display-stack-pages) option to output larger stack

Quoted 1 line · Don Slutz

As you can see from above, only the last 3 lines show up for "-n 3"

OK.

Quoted 9 lines
Quoted 5 lines

Why is the SP moving around in these pictures? I understood that this option was changing what was considered to be the limit of the stack, not the stack pointer itself, so shouldn't it be the base of the stack which is moving around?

These are pictures of the same stack at 3 different times. And as you can see
from above, this option does change the stack limit.

There was no stack limit shown on your diagrams, only a stack pointer which was mysteriously changing. The SP is an actual register which is a property of the VM, changing it based on a xenctx surely doesn't make sense! (also it is not moving by page sized increments, which is odd even for the base, which ought to point at a page boundary surely).

Quoted 19 lines
Quoted 19 lines

Perhaps if you had the diagram once and along side it had columns showing what is printed for each -n value as a range

e.g.
None -n 1
+------------------+ +
| | |
| | |
| | |
| | |
| | |
+------------------+ + |
| | | |
SP --> | | + +

        |                  |
        |                  |
        |                  |
        +------------------+
Quoted 6 lines
Quoted 3 lines

(or whatever the reality is)

[...]

I will add this. And some statement about each picture is for a different time.

Wait, what? Each picture is for a different time? How is that useful?

The point of these diagrams is surely to illustrate the effect of what using this option would be at some fixed "snapshot" in time, adding a second axis of variation to the pictures is just confusing.

Ian.

author
#8 lore raw

Re: [PATCH v5 03/17] xenctx: Add -n (--display-stack-pages) option to output larger stack

Quoted 41 lines · Ian Campbell
Quoted 1 line · Don Slutz

As you can see from above, only the last 3 lines show up for "-n 3"

OK.

Quoted 7 lines
Quoted 4 lines

Why is the SP moving around in these pictures? I understood that this option was changing what was considered to be the limit of the stack, not the stack pointer itself, so shouldn't it be the base of the stack which is moving around?

These are pictures of the same stack at 3 different times. And as you can see
from above, this option does change the stack limit.

There was no stack limit shown on your diagrams, only a stack pointer which was mysteriously changing. The SP is an actual register which is a property of the VM, changing it based on a xenctx surely doesn't make sense! (also it is not moving by page sized increments, which is odd even for the base, which ought to point at a page boundary surely).

Quoted 19 lines
Quoted 19 lines

Perhaps if you had the diagram once and along side it had columns showing what is printed for each -n value as a range

e.g.
None -n 1
+------------------+ +
| | |
| | |
| | |
| | |
| | |
+------------------+ + |
| | | |
SP --> | | + +

         |                  |
         |                  |
         |                  |
         +------------------+
Quoted 5 lines
Quoted 3 lines

(or whatever the reality is)

[...]

I will add this. And some statement about each picture is for a different time.

Quoted 8 lines

Wait, what? Each picture is for a different time? How is that useful?

The point of these diagrams is surely to illustrate the effect of what using this option would be at some fixed "snapshot" in time, adding a second axis of variation to the pictures is just confusing.

Ian.

Ok, will adjust to just 1 picture.

-Don Slutz

author
#9 lore raw

PATCH v5 4/17 xenctx: Add command line options -b (--bytes-per-line) and -l (--lines)

In reply to Don Slutz

-b <bytes>, --bytes-per-line <bytes>
change the number of bytes per line output for Stack. (default 32) Note: rounded to native size (4 or 8 bytes).
-l <lines>, --lines <lines>
change the number of lines output for Stack. (default 5) Can be specified as MAX. Note: Fewer lines will be output if Stack limit reached.

---
v5: Add defaults to disply. Accept MAX for -l.

 tools/xentrace/xenctx.c | 79 +++++++++++++++++++++++++++++++++++++++++--------
 1 file changed, 67 insertions(+), 12 deletions(-)
tools/xentrace/xenctx.c +67 -12
index caa8899..f540b61 100644
@@ -23,12 +23,16 @@
 #include <string.h>
 #include <inttypes.h>
 #include <getopt.h>
+#include <limits.h>
 
 #include "xenctrl.h"
 #include <xen/foreign/x86_32.h>
 #include <xen/foreign/x86_64.h>
 #include <xen/hvm/save.h>
 
+#define DEFAULT_BYTES_PER_LINE 32
+#define DEFAULT_LINES 5
+
 static struct xenctx {
     xc_interface *xc_handle;
     int domid;
@@ -36,6 +40,8 @@ static struct xenctx {
     int stack_trace;
     int disp_all;
     int multiple_pages;
+    int bytes_per_line;
+    int lines;
     int all_vcpus;
     int self_paused;
     xc_dominfo_t dominfo;
@@ -62,6 +68,8 @@ typedef uint64_t guest_word_t;
 #define FMT_64B_WORD "%016lx"
 #endif
 
+#define MAX_BYTES_PER_LINE 128
+
 struct symbol {
     guest_word_t address;
     char *name;
@@ -663,25 +671,33 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width)
     guest_word_t *p;
     int i;
 
+    if ( width )
+        xenctx.bytes_per_line = ((xenctx.bytes_per_line + width - 1) / width) * width;
     stack_limit = ((stack_pointer(ctx) + XC_PAGE_SIZE)
                    & ~((guest_word_t) XC_PAGE_SIZE - 1));
     if ( xenctx.multiple_pages > 1 )
         stack_limit += (xenctx.multiple_pages - 1) * XC_PAGE_SIZE;
     printf("\n");
-    printf("Stack:\n");
-    for (i=1; i<5 && stack < stack_limit; i++) {
-        while(stack < stack_limit && stack < stack_pointer(ctx) + i*32) {
-            p = map_page(ctx, vcpu, stack);
-            if (!p)
-                return -1;
-            word = read_stack_word(p, width);
-            printf(" ");
-            print_stack_word(word, width);
-            stack += width;
+    if ( xenctx.lines )
+    {
+        printf("Stack:\n");
+        for (i = 1; i < xenctx.lines + 1 && stack < stack_limit; i++)
+        {
+            while ( stack < stack_limit &&
+                    stack < stack_pointer(ctx) + i * xenctx.bytes_per_line )
+            {
+                p = map_page(ctx, vcpu, stack);
+                if ( !p )
+                    return -1;
+                word = read_stack_word(p, width);
+                printf(" ");
+                print_stack_word(word, width);
+                stack += width;
+            }
+            printf("\n");
         }
         printf("\n");
     }
-    printf("\n");
 
     if(xenctx.stack_trace)
         printf("Stack Trace:\n");
@@ -840,19 +856,30 @@ static void usage(void)
     printf("  -n PAGES, --display-stack-pages=PAGES\n");
     printf("                     Display N pages from the stack pointer.\n");
     printf("                     Note: use with caution (easy to get garbage).\n");
+    printf("  -b <bytes>, --bytes-per-line <bytes>\n");
+    printf("                     change the number of bytes per line output for Stack.\n");
+    printf("                     (default %d) Note: rounded to native size (4 or 8 bytes).\n",
+           DEFAULT_BYTES_PER_LINE);
+    printf("  -l <lines>, --lines <lines>\n");
+    printf("                     change the number of lines output for Stack. (default %d)\n",
+           DEFAULT_LINES);
+    printf("                     Can be specified as MAX.  Note: Fewer lines will be output\n");
+    printf("                     if Stack limit reached.\n");
 }
 
 int main(int argc, char **argv)
 {
     int ch;
     int ret;
-    static const char *sopts = "fs:hak:SCn:";
+    static const char *sopts = "fs:hak:SCn:b:l:";
     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'},
         {"display-stack-pages", 0, NULL, 'n'},
+        {"bytes-per-line", 1, NULL, 'b'},
+        {"lines", 1, NULL, 'l'},
         {"all", 0, NULL, 'a'},
         {"all-vcpus", 0, NULL, 'C'},
         {"help", 0, NULL, 'h'},
@@ -862,6 +889,9 @@ int main(int argc, char **argv)
 
     int vcpu = 0;
 
+    xenctx.bytes_per_line = DEFAULT_BYTES_PER_LINE;
+    xenctx.lines = DEFAULT_LINES;
+
     while ((ch = getopt_long(argc, argv, sopts, lopts, NULL)) != -1) {
         switch(ch) {
         case 'f':
@@ -879,6 +909,31 @@ int main(int argc, char **argv)
         case 'n':
             xenctx.multiple_pages = strtol(optarg, NULL, 0);
             break;
+        case 'b':
+            xenctx.bytes_per_line = strtol(optarg, NULL, 0);
+            if ( xenctx.bytes_per_line < 4 ||
+                 xenctx.bytes_per_line > MAX_BYTES_PER_LINE )
+            {
+                fprintf(stderr,
+                        "%s: Unsupported value for --bytes-per-line. Needs to be 4 <= <bytes> <= %d\n",
+                        argv[0], MAX_BYTES_PER_LINE);
+                exit(-1);
+            }
+            break;
+        case 'l':
+            if ( !strcmp(optarg, "all") || !strcmp(optarg, "ALL") ||
+                 !strcmp(optarg, "max") || !strcmp(optarg, "MAX") )
+                xenctx.lines = INT_MAX;
+            else
+                xenctx.lines = strtol(optarg, NULL, 0);
+            if ( xenctx.lines < 0 )
+            {
+                fprintf(stderr,
+                        "%s: Unsupported value for --lines. Needs to be >= 0\n",
+                        argv[0]);
+                exit(-1);
+            }
+            break;
         case 'C':
             xenctx.all_vcpus = 1;
             break;
Signature · 1 line
1.8.4
#10 lore raw

Re: [PATCH v5 04/17] xenctx: Add command line options -b (--bytes-per-line) and -l (--lines)

Quoted 3 lines · Don Slutz

-b <bytes>, --bytes-per-line <bytes>
change the number of bytes per line output for Stack. (default 32) Note: rounded to native size (4 or 8 bytes).

I can just about see a use for this.

Quoted 4 lines

-l <lines>, --lines <lines>
change the number of lines output for Stack. (default 5) Can be specified as MAX. Note: Fewer lines will be output if Stack limit reached.

What is this useful for which "less", "head" or "tail" can't achieve?

In both cases though it seems to make the code more complicated for what seems to be a not all that useful increase in functionality.

Quoted 2 lines

---

Ian.

author
#11 lore raw

Re: [PATCH v5 04/17] xenctx: Add command line options -b (--bytes-per-line) and -l (--lines)

Quoted 5 lines · Ian Campbell
Quoted 3 lines · Don Slutz

-b <bytes>, --bytes-per-line <bytes>
change the number of bytes per line output for Stack. (default 32) Note: rounded to native size (4 or 8 bytes).

I can just about see a use for this.

This is much more useful when used with --decode-as-ascii or when you have a wide "terminal".

Quoted 5 lines
Quoted 4 lines

-l <lines>, --lines <lines>
change the number of lines output for Stack. (default 5) Can be specified as MAX. Note: Fewer lines will be output if Stack limit reached.

What is this useful for which "less", "head" or "tail" can't achieve?

By default only part of the stack is dumped:

tools/xentrace/xenctx -s ~/zzm 4 -n 2
rip: ffffffff81346876 io_serial_in+0x16
flags: 00000002 nz
rsp: ffff8800385a5ab8
rax: 000000000000006f rcx: 0000000000000000 rdx: 00000000000003fd
rbx: ffffffff81ff8f00 rsi: 0000000000000005 rdi: ffffffff81ff8f00
rbp: ffff8800385a5ab8 r8: ffffffff81c03a10 r9: 0000000000000080
r10: 0000000000000005 r11: 0000000000000046 r12: 000000000000270f
r13: 0000000000000020 r14: 0000000000000025 r15: ffffffff81346f20
cs: 0010 ss: 0018 ds: 0000 es: 0000
fs: 0000 @ 00007f07972f3700
gs: 0000 @ ffff88000b400000/0000000000000000/
Code (instr addr ffffffff81346876)
48 89 e5 0f 1f 44 00 00 0f b6 4f 41 0f b7 57 08 d3 e6 01 f2 ec <0f> b6 c0 c9 c3 0f 1f 44 00 00 55

Stack:
 ffff8800385a5ae8 ffffffff81346e64 ffffffff81ff8f00 0000000000000072
 0000000000000064 0000000000000025 ffff8800385a5b08 ffffffff81346f46
 ffffffff81e3e430 ffffffff81ff8f00 ffff8800385a5b48 ffffffff813428de
 ffffffff8100bc0e 0000000000000000 ffffffff81ff8f00 0000000000000001
 0000000000000064 ffffffff81e3e40c ffff8800385a5b98 ffffffff813472ad

Call Trace:
  [<ffffffff81346876>] io_serial_in+0x16 <--
  [<ffffffff81346e64>] wait_for_xmitr+0x24
  [<ffffffff81346f46>] serial8250_console_putchar+0x26
  [<ffffffff813428de>] uart_console_write+0x3e
  [<ffffffff8100bc0e>] apic_timer_interrupt+0xe
  [<ffffffff813472ad>] serial8250_console_write+0xbd
  [<ffffffff8106b8f5>] __call_console_drivers+0x75
  [<ffffffff8106b95a>] _call_console_drivers+0x4a
  [<ffffffff8106be6e>] release_console_sem+0x4e
  [<ffffffff8106c628>] vprintk+0x248
  [<ffffffff814fd363>] printk+0x41

Here is the same data with a bigger -l (domU is paused):

tools/xentrace/xenctx -s ~/zzm 4 -n 2 -l 10
rip: ffffffff81346876 io_serial_in+0x16
flags: 00000002 nz
rsp: ffff8800385a5ab8
rax: 000000000000006f rcx: 0000000000000000 rdx: 00000000000003fd
rbx: ffffffff81ff8f00 rsi: 0000000000000005 rdi: ffffffff81ff8f00
rbp: ffff8800385a5ab8 r8: ffffffff81c03a10 r9: 0000000000000080
r10: 0000000000000005 r11: 0000000000000046 r12: 000000000000270f
r13: 0000000000000020 r14: 0000000000000025 r15: ffffffff81346f20
cs: 0010 ss: 0018 ds: 0000 es: 0000
fs: 0000 @ 00007f07972f3700
gs: 0000 @ ffff88000b400000/0000000000000000/
Code (instr addr ffffffff81346876)
48 89 e5 0f 1f 44 00 00 0f b6 4f 41 0f b7 57 08 d3 e6 01 f2 ec <0f> b6 c0 c9 c3 0f 1f 44 00 00 55

Stack:
 ffff8800385a5ae8 ffffffff81346e64 ffffffff81ff8f00 0000000000000072
 0000000000000064 0000000000000025 ffff8800385a5b08 ffffffff81346f46
 ffffffff81e3e430 ffffffff81ff8f00 ffff8800385a5b48 ffffffff813428de
 ffffffff8100bc0e 0000000000000000 ffffffff81ff8f00 0000000000000001
 0000000000000064 ffffffff81e3e40c ffff8800385a5b98 ffffffff813472ad
 00000000385a5cd8 0000000000000006 ffff8800385a5c08 ffffffff81affa00
 ffffffff81c03800 000000000001696c 0000000000000064 0000000000000046
 ffff8800385a5bc8 ffffffff8106b8f5 00000000000169d0 ffffffff81e2797c
 00000000000169d0 00000000000169d0 ffff8800385a5be8 ffffffff8106b95a
 206465697272616d 00000000fffff167 ffff8800385a5c28 ffffffff8106be6e

Call Trace:
  [<ffffffff81346876>] io_serial_in+0x16 <--
  [<ffffffff81346e64>] wait_for_xmitr+0x24
  [<ffffffff81346f46>] serial8250_console_putchar+0x26
  [<ffffffff813428de>] uart_console_write+0x3e
  [<ffffffff8100bc0e>] apic_timer_interrupt+0xe
  [<ffffffff813472ad>] serial8250_console_write+0xbd
  [<ffffffff8106b8f5>] __call_console_drivers+0x75
  [<ffffffff8106b95a>] _call_console_drivers+0x4a
  [<ffffffff8106be6e>] release_console_sem+0x4e
  [<ffffffff8106c628>] vprintk+0x248
  [<ffffffff814fd363>] printk+0x41

"less", "head" or "tail" are unable to change xenctx, only control what you see of xenctx's output.

Quoted 3 lines

In both cases though it seems to make the code more complicated for what seems to be a not all that useful increase in functionality.

It is true that using the existing -S:

tools/xentrace/xenctx -s ~/zzm 4 -S
rip: ffffffff81346876 io_serial_in+0x16
flags: 00000002 nz
rsp: ffff8800385a5ab8
rax: 000000000000006f rcx: 0000000000000000 rdx: 00000000000003fd
rbx: ffffffff81ff8f00 rsi: 0000000000000005 rdi: ffffffff81ff8f00
rbp: ffff8800385a5ab8 r8: ffffffff81c03a10 r9: 0000000000000080
r10: 0000000000000005 r11: 0000000000000046 r12: 000000000000270f
r13: 0000000000000020 r14: 0000000000000025 r15: ffffffff81346f20
cs: 0010 ss: 0018 ds: 0000 es: 0000
fs: 0000 @ 00007f07972f3700
gs: 0000 @ ffff88000b400000/0000000000000000/
Code (instr addr ffffffff81346876)
48 89 e5 0f 1f 44 00 00 0f b6 4f 41 0f b7 57 08 d3 e6 01 f2 ec <0f> b6 c0 c9 c3 0f 1f 44 00 00 55

Stack:
 ffff8800385a5ae8 ffffffff81346e64 ffffffff81ff8f00 0000000000000072
 0000000000000064 0000000000000025 ffff8800385a5b08 ffffffff81346f46
 ffffffff81e3e430 ffffffff81ff8f00 ffff8800385a5b48 ffffffff813428de
 ffffffff8100bc0e 0000000000000000 ffffffff81ff8f00 0000000000000001
 0000000000000064 ffffffff81e3e40c ffff8800385a5b98 ffffffff813472ad

Stack Trace:
* [<ffffffff81346876>] io_serial_in+0x16 <--

    ffff8800385a5ae8
  [<ffffffff81346e64>] wait_for_xmitr+0x24
    ffffffff81ff8f00
    0000000000000072
    0000000000000064
    0000000000000025
    ffff8800385a5b08
  [<ffffffff81346f46>] serial8250_console_putchar+0x26
    ffffffff81e3e430
    ffffffff81ff8f00
    ffff8800385a5b48
  [<ffffffff813428de>] uart_console_write+0x3e
  [<ffffffff8100bc0e>] apic_timer_interrupt+0xe
    0000000000000000
    ffffffff81ff8f00
    0000000000000001
    0000000000000064
    ffffffff81e3e40c
    ffff8800385a5b98
  [<ffffffff813472ad>] serial8250_console_write+0xbd
    00000000385a5cd8
    0000000000000006
    ffff8800385a5c08
    ffffffff81affa00
    ffffffff81c03800
    000000000001696c
    0000000000000064
    0000000000000046
    ffff8800385a5bc8
  [<ffffffff8106b8f5>] __call_console_drivers+0x75
    00000000000169d0
    ffffffff81e2797c
    00000000000169d0
    00000000000169d0
    ffff8800385a5be8
  [<ffffffff8106b95a>] _call_console_drivers+0x4a
    206465697272616d
    00000000fffff167
    ffff8800385a5c28
  [<ffffffff8106be6e>] release_console_sem+0x4e
    ffff8800385a5c18
    ffff8800385a5c6d
    ffffffff81ea7b24
    0000000000000064
    ffff8800385a5c58
    0000000000000034
    ffff8800385a5cc8
  [<ffffffff8106c628>] vprintk+0x248
    ffff8800385a5c98
    0000000000000246
    7420666f00000000
    ffff8800385a5ca8
    ffff8800385a5c68
    343931206e692072
    7365727065722035
    ffff8800385a5ca8
    0000000000002710
    0000000000002710
    ffffffff81c03a10
    00000000d863e02e
    ffff8800385a5d28
    ffff8800385a5d38
    000000000000003b
    00000000021b9010
    00007f07972b1010
    0000000000000003
    ffff8800385a5d28
  [<ffffffff814fd363>] printk+0x41
    6874202c00000010
    ffff8800385a5d38
    ffff8800385a5cf8
    656e696863616d20
    616820796c6e6f20
    ffff8800385a5d38
    0000000000002710
    0000000000002710
    ffffffff81c03a10
    0000000000000080
    ffff8800385a5db8
    ffffffffa00a919d
    696261706163206e
    6977202c7974696c
    20612074756f6874
    206c6172746e6563
    742079726f6d656d
    2065726f7473206f
    736d6172676f7270
    74616420646e6120
    754a206e49202e61
    2c3534393120656e
    6f76206e686f4a20
    6e616d75654e206e
    000000007570206e
    00000000d863e02e
    ffff8800385a5dc8
    000000000000003a
    ffff8800385a5e48
    ffffffffa00a91e8
    2064656873696c62
    2072657061702061
    64656c7469746e65
    2074737269462720
    666f207466617264
    726f706572206120
    656874206f742074
    2c27434156444520
    6820657265687720
    6e696c74756f2065
    6565726874206465
    6320636973616220
    000000006f706d6f
    00000000d863e02e
    ffff8800385a5e58
    0000000000000039
    ffff8800385a5ed8
    ffffffffa00a91e8
    6f662073746e656e
    726f747320612072
    72676f72702d6465
    75706d6f63206d61
    293128203a726574
    726f6d656d206120
    6961746e6f632079
    746f6220676e696e
    6120617461642068
    7274736e6920646e
    3b736e6f69746375
    6320612029322820
    0000000075636c61
    00000000d863e02e
    ffff8800385a5ee8
    0000000000000038
    ffff8800385a5f68
    ffffffffa00a91e8
    7520676e6974616c
    617061632074696e
    7020666f20656c62
    6e696d726f667265
    612068746f622067
    6974656d68746972
    6f6c20646e612063
    706f206c61636967
    736e6f6974617265
    20656874206e6f20
    6e61202c61746164
    2061202933282064
    00000000746e6f63
    00000000d863e02e
    ffff8800385a5f78
    0000000000000037
    ffff8800385a5ff8
    ffffffffa00a91e8
    74696e75206c6f72
    65746e69206f7420
    6e69207465727072
    6f69746375727473
    65726f747320736e
    6d656d206e692064
    20646e612079726f
    63656e20656b616d
    6120797261737365
    202e736e6f697463
    2073692073696854
    63206f7320656874
    00000000656c6c61
    00000000d863e02e
    ffff8800385a6008
    0000000000000036
    ffff8800385a6088

And other tools, you can reformat this output into what -l gives.

It is not that each change makes a big difference, that happens when several are used at one time:

tools/xentrace/xenctx -s ~/zzm 4 -l 200 -D -t -b 64
rip: ffffffff81346876 io_serial_in+0x16
flags: 00000002 nz
rsp: ffff8800385a5ab8
rax: 000000000000006f rcx: 0000000000000000 rdx: 00000000000003fd
rbx: ffffffff81ff8f00 rsi: 0000000000000005 rdi: ffffffff81ff8f00
rbp: ffff8800385a5ab8 r8: ffffffff81c03a10 r9: 0000000000000080
r10: 0000000000000005 r11: 0000000000000046 r12: 000000000000270f
r13: 0000000000000020 r14: 0000000000000025 r15: ffffffff81346f20
cs: 0010 ss: 0018 ds: 0000 es: 0000
fs: 0000 @ 00007f07972f3700
gs: 0000 @ ffff88000b400000/0000000000000000/
Code (instr addr ffffffff81346876)
48 89 e5 0f 1f 44 00 00 0f b6 4f 41 0f b7 57 08 d3 e6 01 f2 ec <0f> b6 c0 c9 c3 0f 1f 44 00 00 55

Stack:
ffff8800385a5ab8: ffff8800385a5ae8 ffffffff81346e64 ffffffff81ff8f00 0000000000000072 0000000000000064 0000000000000025 ffff8800385a5b08 ffffffff81346f46 .ZZ8....dn4.............r.......d.......%........[Z8....Fo4.....
ffff8800385a5af8: ffffffff81e3e430 ffffffff81ff8f00 ffff8800385a5b48 ffffffff813428de ffffffff8100bc0e 0000000000000000 ffffffff81ff8f00 0000000000000001 0...............H[Z8.....(4.....................................
ffff8800385a5b38: 0000000000000064 ffffffff81e3e40c ffff8800385a5b98 ffffffff813472ad 00000000385a5cd8 0000000000000006 ffff8800385a5c08 ffffffff81affa00 d................[Z8.....r4......\Z8.............\Z8............
ffff8800385a5b78: ffffffff81c03800 000000000001696c 0000000000000064 0000000000000046 ffff8800385a5bc8 ffffffff8106b8f5 00000000000169d0 ffffffff81e2797c .8......li......d.......F........[Z8.............i......|y......
ffff8800385a5bb8: 00000000000169d0 00000000000169d0 ffff8800385a5be8 ffffffff8106b95a 206465697272616d 00000000fffff167 ffff8800385a5c28 ffffffff8106be6e  .i.......i.......[Z8....Z.......married g.......(\Z8....n.......
ffff8800385a5bf8: ffff8800385a5c18 ffff8800385a5c6d ffffffff81ea7b24 0000000000000064 ffff8800385a5c58 0000000000000034 ffff8800385a5cc8 ffffffff8106c628 .\Z8....m\Z8....${......d.......X\Z8....4........\Z8....(.......
ffff8800385a5c38: ffff8800385a5c98 0000000000000246 7420666f00000000 ffff8800385a5ca8 ffff8800385a5c68 343931206e692072 7365727065722035 ffff8800385a5ca8  .\Z8....F...........of t.\Z8....h\Z8....r in 1945 repres.\Z8....
ffff8800385a5c78: 0000000000002710 0000000000002710 ffffffff81c03a10 00000000d863e02e ffff8800385a5d28 ffff8800385a5d38 000000000000003b 00000000021b9010 .'.......'.......:........c.....(]Z8....8]Z8....;...............
ffff8800385a5cb8: 00007f07972b1010 0000000000000003 ffff8800385a5d28 ffffffff814fd363 6874202c00000010 ffff8800385a5d38 ffff8800385a5cf8 656e696863616d20  ..+.............(]Z8....c.O........., th8]Z8.....\Z8.... machine
ffff8800385a5cf8: 616820796c6e6f20 ffff8800385a5d38 0000000000002710 0000000000002710 ffffffff81c03a10 0000000000000080 ffff8800385a5db8 ffffffffa00a919d   only ha8]Z8.....'.......'.......:...............]Z8............
ffff8800385a5d38: 696261706163206e 6977202c7974696c 20612074756f6874 206c6172746e6563 742079726f6d656d 2065726f7473206f 736d6172676f7270 74616420646e6120  n capability, without a central memory to store programs and dat
ffff8800385a5d78: 754a206e49202e61 2c3534393120656e 6f76206e686f4a20 6e616d75654e206e 000000007570206e 00000000d863e02e ffff8800385a5dc8 000000000000003a  a. In June 1945, John von Neumann pu......c......]Z8....:.......
ffff8800385a5db8: ffff8800385a5e48 ffffffffa00a91e8 2064656873696c62 2072657061702061 64656c7469746e65 2074737269462720 666f207466617264 726f706572206120  H^Z8............blished a paper entitled 'First draft of a repor
ffff8800385a5df8: 656874206f742074 2c27434156444520 6820657265687720 6e696c74756f2065 6565726874206465 6320636973616220 000000006f706d6f 00000000d863e02e  t to the EDVAC', where he outlined three basic compo......c.....
ffff8800385a5e38: ffff8800385a5e58 0000000000000039 ffff8800385a5ed8 ffffffffa00a91e8 6f662073746e656e 726f747320612072 72676f72702d6465 75706d6f63206d61  X^Z8....9........^Z8............nents for a stored-program compu
ffff8800385a5e78: 293128203a726574 726f6d656d206120 6961746e6f632079 746f6220676e696e 6120617461642068 7274736e6920646e 3b736e6f69746375 6320612029322820  ter: (1) a memory containing both data and instructions; (2) a c
ffff8800385a5eb8: 0000000075636c61 00000000d863e02e ffff8800385a5ee8 0000000000000038 ffff8800385a5f68 ffffffffa00a91e8 7520676e6974616c 617061632074696e alcu......c......^Z8....8.......h_Z8............lating unit capa
ffff8800385a5ef8: 7020666f20656c62 6e696d726f667265 612068746f622067 6974656d68746972 6f6c20646e612063 706f206c61636967 736e6f6974617265 20656874206e6f20  ble of performing both arithmetic and logical operations on the
ffff8800385a5f38: 6e61202c61746164 2061202933282064 00000000746e6f63 00000000d863e02e ffff8800385a5f78 0000000000000037 ffff8800385a5ff8 ffffffffa00a91e8  data, and (3) a cont......c.....x_Z8....7........_Z8............
ffff8800385a5f78: 74696e75206c6f72 65746e69206f7420 6e69207465727072 6f69746375727473 65726f747320736e 6d656d206e692064 20646e612079726f 63656e20656b616d  rol unit to interpret instructions stored in memory and make nec
ffff8800385a5fb8: 6120797261737365 202e736e6f697463 2073692073696854 63206f7320656874 00000000656c6c61 00000000d863e02e ffff8800385a6008 0000000000000036  essary actions. This is the so calle......c......`Z8....6.......
ffff8800385a5ff8: ffff8800385a6088 .`Z8....

Call Trace:
  [<ffffffff81346876>] io_serial_in+0x16 <--
  [<ffffffff81346e64>] wait_for_xmitr+0x24
  [<ffffffff81346f46>] serial8250_console_putchar+0x26
  [<ffffffff813428de>] uart_console_write+0x3e
  [<ffffffff8100bc0e>] apic_timer_interrupt+0xe
  [<ffffffff813472ad>] serial8250_console_write+0xbd
  [<ffffffff8106b8f5>] __call_console_drivers+0x75
  [<ffffffff8106b95a>] _call_console_drivers+0x4a
  [<ffffffff8106be6e>] release_console_sem+0x4e
  [<ffffffff8106c628>] vprintk+0x248
  [<ffffffff814fd363>] printk+0x41

-Don Slutz

Quoted 4 lines
Quoted 2 lines

---

Ian.

author
#12 lore raw

Re: [PATCH v5 04/17] xenctx: Add command line options -b (--bytes-per-line) and -l (--lines)

Grrr. Line wrapping strikes again.
-Don Slutz

Quoted 378 lines · Don Slutz
Quoted 7 lines · Ian Campbell
Quoted 5 lines · Don Slutz

-b <bytes>, --bytes-per-line <bytes>
change the number of bytes per line output for
Stack.
(default 32) Note: rounded to native size (4
or 8 bytes).

I can just about see a use for this.

This is much more useful when used with --decode-as-ascii or when you have a wide "terminal".

Quoted 7 lines
Quoted 6 lines

-l <lines>, --lines <lines>
change the number of lines output for Stack.
(default 5)
Can be specified as MAX. Note: Fewer lines
will be output
if Stack limit reached.

What is this useful for which "less", "head" or "tail" can't achieve?

By default only part of the stack is dumped:

tools/xentrace/xenctx -s ~/zzm 4 -n 2
rip: ffffffff81346876 io_serial_in+0x16
flags: 00000002 nz
rsp: ffff8800385a5ab8
rax: 000000000000006f rcx: 0000000000000000 rdx: 00000000000003fd
rbx: ffffffff81ff8f00 rsi: 0000000000000005 rdi: ffffffff81ff8f00
rbp: ffff8800385a5ab8 r8: ffffffff81c03a10 r9: 0000000000000080
r10: 0000000000000005 r11: 0000000000000046 r12: 000000000000270f
r13: 0000000000000020 r14: 0000000000000025 r15: ffffffff81346f20
cs: 0010 ss: 0018 ds: 0000 es: 0000
fs: 0000 @ 00007f07972f3700
gs: 0000 @ ffff88000b400000/0000000000000000/
Code (instr addr ffffffff81346876)
48 89 e5 0f 1f 44 00 00 0f b6 4f 41 0f b7 57 08 d3 e6 01 f2 ec <0f> b6 c0 c9 c3 0f 1f 44 00 00 55

Stack:
 ffff8800385a5ae8 ffffffff81346e64 ffffffff81ff8f00 0000000000000072
 0000000000000064 0000000000000025 ffff8800385a5b08 ffffffff81346f46
 ffffffff81e3e430 ffffffff81ff8f00 ffff8800385a5b48 ffffffff813428de
 ffffffff8100bc0e 0000000000000000 ffffffff81ff8f00 0000000000000001
 0000000000000064 ffffffff81e3e40c ffff8800385a5b98 ffffffff813472ad

Call Trace:
  [<ffffffff81346876>] io_serial_in+0x16 <--
  [<ffffffff81346e64>] wait_for_xmitr+0x24
  [<ffffffff81346f46>] serial8250_console_putchar+0x26
  [<ffffffff813428de>] uart_console_write+0x3e
  [<ffffffff8100bc0e>] apic_timer_interrupt+0xe
  [<ffffffff813472ad>] serial8250_console_write+0xbd
  [<ffffffff8106b8f5>] __call_console_drivers+0x75
  [<ffffffff8106b95a>] _call_console_drivers+0x4a
  [<ffffffff8106be6e>] release_console_sem+0x4e
  [<ffffffff8106c628>] vprintk+0x248
  [<ffffffff814fd363>] printk+0x41

Here is the same data with a bigger -l (domU is paused):

tools/xentrace/xenctx -s ~/zzm 4 -n 2 -l 10
rip: ffffffff81346876 io_serial_in+0x16
flags: 00000002 nz
rsp: ffff8800385a5ab8
rax: 000000000000006f rcx: 0000000000000000 rdx: 00000000000003fd
rbx: ffffffff81ff8f00 rsi: 0000000000000005 rdi: ffffffff81ff8f00
rbp: ffff8800385a5ab8 r8: ffffffff81c03a10 r9: 0000000000000080
r10: 0000000000000005 r11: 0000000000000046 r12: 000000000000270f
r13: 0000000000000020 r14: 0000000000000025 r15: ffffffff81346f20
cs: 0010 ss: 0018 ds: 0000 es: 0000
fs: 0000 @ 00007f07972f3700
gs: 0000 @ ffff88000b400000/0000000000000000/
Code (instr addr ffffffff81346876)
48 89 e5 0f 1f 44 00 00 0f b6 4f 41 0f b7 57 08 d3 e6 01 f2 ec <0f> b6 c0 c9 c3 0f 1f 44 00 00 55

Stack:
 ffff8800385a5ae8 ffffffff81346e64 ffffffff81ff8f00 0000000000000072
 0000000000000064 0000000000000025 ffff8800385a5b08 ffffffff81346f46
 ffffffff81e3e430 ffffffff81ff8f00 ffff8800385a5b48 ffffffff813428de
 ffffffff8100bc0e 0000000000000000 ffffffff81ff8f00 0000000000000001
 0000000000000064 ffffffff81e3e40c ffff8800385a5b98 ffffffff813472ad
 00000000385a5cd8 0000000000000006 ffff8800385a5c08 ffffffff81affa00
 ffffffff81c03800 000000000001696c 0000000000000064 0000000000000046
 ffff8800385a5bc8 ffffffff8106b8f5 00000000000169d0 ffffffff81e2797c
 00000000000169d0 00000000000169d0 ffff8800385a5be8 ffffffff8106b95a
 206465697272616d 00000000fffff167 ffff8800385a5c28 ffffffff8106be6e

Call Trace:
  [<ffffffff81346876>] io_serial_in+0x16 <--
  [<ffffffff81346e64>] wait_for_xmitr+0x24
  [<ffffffff81346f46>] serial8250_console_putchar+0x26
  [<ffffffff813428de>] uart_console_write+0x3e
  [<ffffffff8100bc0e>] apic_timer_interrupt+0xe
  [<ffffffff813472ad>] serial8250_console_write+0xbd
  [<ffffffff8106b8f5>] __call_console_drivers+0x75
  [<ffffffff8106b95a>] _call_console_drivers+0x4a
  [<ffffffff8106be6e>] release_console_sem+0x4e
  [<ffffffff8106c628>] vprintk+0x248
  [<ffffffff814fd363>] printk+0x41

"less", "head" or "tail" are unable to change xenctx, only control what you see of xenctx's output.

Quoted 3 lines

In both cases though it seems to make the code more complicated for what seems to be a not all that useful increase in functionality.

It is true that using the existing -S:

tools/xentrace/xenctx -s ~/zzm 4 -S
rip: ffffffff81346876 io_serial_in+0x16
flags: 00000002 nz
rsp: ffff8800385a5ab8
rax: 000000000000006f rcx: 0000000000000000 rdx: 00000000000003fd
rbx: ffffffff81ff8f00 rsi: 0000000000000005 rdi: ffffffff81ff8f00
rbp: ffff8800385a5ab8 r8: ffffffff81c03a10 r9: 0000000000000080
r10: 0000000000000005 r11: 0000000000000046 r12: 000000000000270f
r13: 0000000000000020 r14: 0000000000000025 r15: ffffffff81346f20
cs: 0010 ss: 0018 ds: 0000 es: 0000
fs: 0000 @ 00007f07972f3700
gs: 0000 @ ffff88000b400000/0000000000000000/
Code (instr addr ffffffff81346876)
48 89 e5 0f 1f 44 00 00 0f b6 4f 41 0f b7 57 08 d3 e6 01 f2 ec <0f> b6 c0 c9 c3 0f 1f 44 00 00 55

Stack:
 ffff8800385a5ae8 ffffffff81346e64 ffffffff81ff8f00 0000000000000072
 0000000000000064 0000000000000025 ffff8800385a5b08 ffffffff81346f46
 ffffffff81e3e430 ffffffff81ff8f00 ffff8800385a5b48 ffffffff813428de
 ffffffff8100bc0e 0000000000000000 ffffffff81ff8f00 0000000000000001
 0000000000000064 ffffffff81e3e40c ffff8800385a5b98 ffffffff813472ad

Stack Trace:
* [<ffffffff81346876>] io_serial_in+0x16 <--

    ffff8800385a5ae8
  [<ffffffff81346e64>] wait_for_xmitr+0x24
    ffffffff81ff8f00
    0000000000000072
    0000000000000064
    0000000000000025
    ffff8800385a5b08
  [<ffffffff81346f46>] serial8250_console_putchar+0x26
    ffffffff81e3e430
    ffffffff81ff8f00
    ffff8800385a5b48
  [<ffffffff813428de>] uart_console_write+0x3e
  [<ffffffff8100bc0e>] apic_timer_interrupt+0xe
    0000000000000000
    ffffffff81ff8f00
    0000000000000001
    0000000000000064
    ffffffff81e3e40c
    ffff8800385a5b98
  [<ffffffff813472ad>] serial8250_console_write+0xbd
    00000000385a5cd8
    0000000000000006
    ffff8800385a5c08
    ffffffff81affa00
    ffffffff81c03800
    000000000001696c
    0000000000000064
    0000000000000046
    ffff8800385a5bc8
  [<ffffffff8106b8f5>] __call_console_drivers+0x75
    00000000000169d0
    ffffffff81e2797c
    00000000000169d0
    00000000000169d0
    ffff8800385a5be8
  [<ffffffff8106b95a>] _call_console_drivers+0x4a
    206465697272616d
    00000000fffff167
    ffff8800385a5c28
  [<ffffffff8106be6e>] release_console_sem+0x4e
    ffff8800385a5c18
    ffff8800385a5c6d
    ffffffff81ea7b24
    0000000000000064
    ffff8800385a5c58
    0000000000000034
    ffff8800385a5cc8
  [<ffffffff8106c628>] vprintk+0x248
    ffff8800385a5c98
    0000000000000246
    7420666f00000000
    ffff8800385a5ca8
    ffff8800385a5c68
    343931206e692072
    7365727065722035
    ffff8800385a5ca8
    0000000000002710
    0000000000002710
    ffffffff81c03a10
    00000000d863e02e
    ffff8800385a5d28
    ffff8800385a5d38
    000000000000003b
    00000000021b9010
    00007f07972b1010
    0000000000000003
    ffff8800385a5d28
  [<ffffffff814fd363>] printk+0x41
    6874202c00000010
    ffff8800385a5d38
    ffff8800385a5cf8
    656e696863616d20
    616820796c6e6f20
    ffff8800385a5d38
    0000000000002710
    0000000000002710
    ffffffff81c03a10
    0000000000000080
    ffff8800385a5db8
    ffffffffa00a919d
    696261706163206e
    6977202c7974696c
    20612074756f6874
    206c6172746e6563
    742079726f6d656d
    2065726f7473206f
    736d6172676f7270
    74616420646e6120
    754a206e49202e61
    2c3534393120656e
    6f76206e686f4a20
    6e616d75654e206e
    000000007570206e
    00000000d863e02e
    ffff8800385a5dc8
    000000000000003a
    ffff8800385a5e48
    ffffffffa00a91e8
    2064656873696c62
    2072657061702061
    64656c7469746e65
    2074737269462720
    666f207466617264
    726f706572206120
    656874206f742074
    2c27434156444520
    6820657265687720
    6e696c74756f2065
    6565726874206465
    6320636973616220
    000000006f706d6f
    00000000d863e02e
    ffff8800385a5e58
    0000000000000039
    ffff8800385a5ed8
    ffffffffa00a91e8
    6f662073746e656e
    726f747320612072
    72676f72702d6465
    75706d6f63206d61
    293128203a726574
    726f6d656d206120
    6961746e6f632079
    746f6220676e696e
    6120617461642068
    7274736e6920646e
    3b736e6f69746375
    6320612029322820
    0000000075636c61
    00000000d863e02e
    ffff8800385a5ee8
    0000000000000038
    ffff8800385a5f68
    ffffffffa00a91e8
    7520676e6974616c
    617061632074696e
    7020666f20656c62
    6e696d726f667265
    612068746f622067
    6974656d68746972
    6f6c20646e612063
    706f206c61636967
    736e6f6974617265
    20656874206e6f20
    6e61202c61746164
    2061202933282064
    00000000746e6f63
    00000000d863e02e
    ffff8800385a5f78
    0000000000000037
    ffff8800385a5ff8
    ffffffffa00a91e8
    74696e75206c6f72
    65746e69206f7420
    6e69207465727072
    6f69746375727473
    65726f747320736e
    6d656d206e692064
    20646e612079726f
    63656e20656b616d
    6120797261737365
    202e736e6f697463
    2073692073696854
    63206f7320656874
    00000000656c6c61
    00000000d863e02e
    ffff8800385a6008
    0000000000000036
    ffff8800385a6088

And other tools, you can reformat this output into what -l gives.

It is not that each change makes a big difference, that happens when several are used at one time:

tools/xentrace/xenctx -s ~/zzm 4 -l 200 -D -t -b 64
rip: ffffffff81346876 io_serial_in+0x16
flags: 00000002 nz
rsp: ffff8800385a5ab8
rax: 000000000000006f rcx: 0000000000000000 rdx: 00000000000003fd
rbx: ffffffff81ff8f00 rsi: 0000000000000005 rdi: ffffffff81ff8f00
rbp: ffff8800385a5ab8 r8: ffffffff81c03a10 r9: 0000000000000080
r10: 0000000000000005 r11: 0000000000000046 r12: 000000000000270f
r13: 0000000000000020 r14: 0000000000000025 r15: ffffffff81346f20
cs: 0010 ss: 0018 ds: 0000 es: 0000
fs: 0000 @ 00007f07972f3700
gs: 0000 @ ffff88000b400000/0000000000000000/
Code (instr addr ffffffff81346876)
48 89 e5 0f 1f 44 00 00 0f b6 4f 41 0f b7 57 08 d3 e6 01 f2 ec <0f> b6 c0 c9 c3 0f 1f 44 00 00 55

Stack:
ffff8800385a5ab8: ffff8800385a5ae8 ffffffff81346e64 ffffffff81ff8f00 0000000000000072 0000000000000064 0000000000000025 ffff8800385a5b08 ffffffff81346f46 .ZZ8....dn4.............r.......d.......%........[Z8....Fo4.....
ffff8800385a5af8: ffffffff81e3e430 ffffffff81ff8f00 ffff8800385a5b48 ffffffff813428de ffffffff8100bc0e 0000000000000000 ffffffff81ff8f00 0000000000000001 0...............H[Z8.....(4.....................................
ffff8800385a5b38: 0000000000000064 ffffffff81e3e40c ffff8800385a5b98 ffffffff813472ad 00000000385a5cd8 0000000000000006 ffff8800385a5c08 ffffffff81affa00 d................[Z8.....r4......\Z8.............\Z8............
ffff8800385a5b78: ffffffff81c03800 000000000001696c 0000000000000064 0000000000000046 ffff8800385a5bc8 ffffffff8106b8f5 00000000000169d0 ffffffff81e2797c .8......li......d.......F........[Z8.............i......|y......
ffff8800385a5bb8: 00000000000169d0 00000000000169d0 ffff8800385a5be8 ffffffff8106b95a 206465697272616d 00000000fffff167 ffff8800385a5c28 ffffffff8106be6e .i.......i.......[Z8....Z.......married g.......(\Z8....n.......
ffff8800385a5bf8: ffff8800385a5c18 ffff8800385a5c6d ffffffff81ea7b24 0000000000000064 ffff8800385a5c58 0000000000000034 ffff8800385a5cc8 ffffffff8106c628 .\Z8....m\Z8....${......d.......X\Z8....4........\Z8....(.......
ffff8800385a5c38: ffff8800385a5c98 0000000000000246 7420666f00000000 ffff8800385a5ca8 ffff8800385a5c68 343931206e692072 7365727065722035 ffff8800385a5ca8 .\Z8....F...........of t.\Z8....h\Z8....r in 1945 repres.\Z8....
ffff8800385a5c78: 0000000000002710 0000000000002710 ffffffff81c03a10 00000000d863e02e ffff8800385a5d28 ffff8800385a5d38 000000000000003b 00000000021b9010 .'.......'.......:........c.....(]Z8....8]Z8....;...............
ffff8800385a5cb8: 00007f07972b1010 0000000000000003 ffff8800385a5d28 ffffffff814fd363 6874202c00000010 ffff8800385a5d38 ffff8800385a5cf8 656e696863616d20 ..+.............(]Z8....c.O........., th8]Z8.....\Z8.... machine
ffff8800385a5cf8: 616820796c6e6f20 ffff8800385a5d38 0000000000002710 0000000000002710 ffffffff81c03a10 0000000000000080 ffff8800385a5db8 ffffffffa00a919d   only ha8]Z8.....'.......'.......:...............]Z8............
ffff8800385a5d38: 696261706163206e 6977202c7974696c 20612074756f6874 206c6172746e6563 742079726f6d656d 2065726f7473206f 736d6172676f7270 74616420646e6120  n capability, without a central memory to store programs and dat
ffff8800385a5d78: 754a206e49202e61 2c3534393120656e 6f76206e686f4a20 6e616d75654e206e 000000007570206e 00000000d863e02e ffff8800385a5dc8 000000000000003a  a. In June 1945, John von Neumann pu......c......]Z8....:.......
ffff8800385a5db8: ffff8800385a5e48 ffffffffa00a91e8 2064656873696c62 2072657061702061 64656c7469746e65 2074737269462720 666f207466617264 726f706572206120 H^Z8............blished a paper entitled 'First draft of a repor
ffff8800385a5df8: 656874206f742074 2c27434156444520 6820657265687720 6e696c74756f2065 6565726874206465 6320636973616220 000000006f706d6f 00000000d863e02e  t to the EDVAC', where he outlined three basic compo......c.....
ffff8800385a5e38: ffff8800385a5e58 0000000000000039 ffff8800385a5ed8 ffffffffa00a91e8 6f662073746e656e 726f747320612072 72676f72702d6465 75706d6f63206d61 X^Z8....9........^Z8............nents for a stored-program compu
ffff8800385a5e78: 293128203a726574 726f6d656d206120 6961746e6f632079 746f6220676e696e 6120617461642068 7274736e6920646e 3b736e6f69746375 6320612029322820  ter: (1) a memory containing both data and instructions; (2) a c
ffff8800385a5eb8: 0000000075636c61 00000000d863e02e ffff8800385a5ee8 0000000000000038 ffff8800385a5f68 ffffffffa00a91e8 7520676e6974616c 617061632074696e alcu......c......^Z8....8.......h_Z8............lating unit capa
ffff8800385a5ef8: 7020666f20656c62 6e696d726f667265 612068746f622067 6974656d68746972 6f6c20646e612063 706f206c61636967 736e6f6974617265 20656874206e6f20  ble of performing both arithmetic and logical operations on the
ffff8800385a5f38: 6e61202c61746164 2061202933282064 00000000746e6f63 00000000d863e02e ffff8800385a5f78 0000000000000037 ffff8800385a5ff8 ffffffffa00a91e8  data, and (3) a cont......c.....x_Z8....7........_Z8............
ffff8800385a5f78: 74696e75206c6f72 65746e69206f7420 6e69207465727072 6f69746375727473 65726f747320736e 6d656d206e692064 20646e612079726f 63656e20656b616d  rol unit to interpret instructions stored in memory and make nec
ffff8800385a5fb8: 6120797261737365 202e736e6f697463 2073692073696854 63206f7320656874 00000000656c6c61 00000000d863e02e ffff8800385a6008 0000000000000036  essary actions. This is the so calle......c......`Z8....6.......
ffff8800385a5ff8: ffff8800385a6088 .`Z8....

Call Trace:
  [<ffffffff81346876>] io_serial_in+0x16 <--
  [<ffffffff81346e64>] wait_for_xmitr+0x24
  [<ffffffff81346f46>] serial8250_console_putchar+0x26
  [<ffffffff813428de>] uart_console_write+0x3e
  [<ffffffff8100bc0e>] apic_timer_interrupt+0xe
  [<ffffffff813472ad>] serial8250_console_write+0xbd
  [<ffffffff8106b8f5>] __call_console_drivers+0x75
  [<ffffffff8106b95a>] _call_console_drivers+0x4a
  [<ffffffff8106be6e>] release_console_sem+0x4e
  [<ffffffff8106c628>] vprintk+0x248
  [<ffffffff814fd363>] printk+0x41

-Don Slutz

Quoted 4 lines
Quoted 2 lines

---

Ian.

#13 lore raw

Re: [PATCH v5 04/17] xenctx: Add command line options -b (--bytes-per-line) and -l (--lines)

In reply to Don Slutz
Quoted 2 lines · Don Slutz

On 03/21/14 10:32, Ian Campbell wrote:
By default only part of the stack is dumped:

Why not dump the whole page by default then? 5 lines seems rather arbitrary.

Quoted 2 lines

"less", "head" or "tail" are unable to change xenctx, only control what you see of xenctx's output.

Obviously! I'm not sure what your point is though -- my suggestion was that xenctx should/could output stuff which can be processed with these tools.

Quoted 2 lines

It is not that each change makes a big difference, that happens when several are used at one time:

Can we not just improve the default behaviour to be more useful? Having to give half a dozen different options to get useful output isn't really all that user friendly.

I accept that some options might have to remain in order to work sanely on 80-column displays but we should aim in the first instance to have the tool Do The Right/Useful Thing without needing extra options.

Ian.

author
#14 lore raw

Re: [PATCH v5 04/17] xenctx: Add command line options -b (--bytes-per-line) and -l (--lines)

Quoted 5 lines · Ian Campbell
Quoted 2 lines · Don Slutz

On 03/21/14 10:32, Ian Campbell wrote:
By default only part of the stack is dumped:

Why not dump the whole page by default then? 5 lines seems rather arbitrary.

5 is what it use to be. Not sure how much the default in linux is.

I have no issue with changing the default to MAX. However I got from reading Jan Beulich comments in Nov 2013, that these changes should not be intrusive.

Quoted 5 lines
Quoted 2 lines

"less", "head" or "tail" are unable to change xenctx, only control what you see of xenctx's output.

Obviously! I'm not sure what your point is though -- my suggestion was that xenctx should/could output stuff which can be processed with these tools.

Looks like I misunderstood you.

Quoted 5 lines
Quoted 2 lines

It is not that each change makes a big difference, that happens when several are used at one time:

Can we not just improve the default behaviour to be more useful? Having to give half a dozen different options to get useful output isn't really all that user friendly.

These are directly in response to:

-------- Original Message --------
Subject: Re: [PATCH v2 04/12] xenctx: Add stack address to dump, switch to 16 bytes per line.
Date: Thu, 7 Nov 2013 08:12:44 +0000
From: Jan Beulich <[email protected]>
To: Don Slutz <[email protected]>
CC: Ian Campbell <[email protected]>, Don Slutz <[email protected]>, George Dunlap <[email protected]>, Ian Jackson <[email protected]>, Stefano Stabellini <[email protected]>, xen-devel <[email protected]>

Quoted 1 line
Quoted 1 line
Quoted 1 line · Don Slutz

Again - why? This makes it just two entries per line for a 64-bit guest. Pretty little I would say.

Jan

Quoted 3 lines

I accept that some options might have to remain in order to work sanely on 80-column displays but we should aim in the first instance to have the tool Do The Right/Useful Thing without needing extra options.

I am currently not sure that "Do The Right/Useful Thing" is the same for all the people involved.

Are you asking for some kind of config file that allows a developer to select their preferred setting of options, or just to determine the best defaults?

Last I knew Jan Beulich does not what -t and you and I do. The issue is that -t by default pushes the output to > 80 columns.

-Don Slutz

Quoted 2 lines

Ian.

_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xen.org/xen-devel

#15 lore raw

Re: [PATCH v5 04/17] xenctx: Add command line options -b (--bytes-per-line) and -l (--lines)

Quoted 5 lines · Don Slutz
Quoted 3 lines · Ian Campbell
Quoted 2 lines · Don Slutz

On 03/21/14 10:32, Ian Campbell wrote:
By default only part of the stack is dumped:

Quoted 8 lines
Quoted 2 lines

Why not dump the whole page by default then? 5 lines seems rather arbitrary.

5 is what it use to be. Not sure how much the default in linux is.

I have no issue with changing the default to MAX. However I got from reading Jan Beulich comments in Nov 2013, that these changes should not be intrusive.

I think we are way past intrusive...

Quoted 7 lines
Quoted 5 lines
Quoted 2 lines

It is not that each change makes a big difference, that happens when several are used at one time:

Can we not just improve the default behaviour to be more useful? Having to give half a dozen different options to get useful output isn't really all that user friendly.

These are directly in response to:

Please can you get out of the habit of just cutting and pasting emails in response to questions, it's very hard to make sense of what you are trying to say when you do this. Just answer the question directly.

AFAICT the answer to my question is that a previous attempt at this change you changed the default behaviour and this was questioned because it reduced the amount of information on a line to a non-useful amount. Is that right? Did you agree with that assessment from Jan? If so then the right answer to my question would have been:
I tried this, but it resulted in only two stack entries per line which Jan pointed out wasn't very many so I decided to make it an option.

If you didn't agree with Jan then did you make a counter argument?

Quoted 6 lines
Quoted 3 lines

I accept that some options might have to remain in order to work sanely on 80-column displays but we should aim in the first instance to have the tool Do The Right/Useful Thing without needing extra options.

I am currently not sure that "Do The Right/Useful Thing" is the same for all the people involved.

It's not a hard and fast rule ("I accept that some options might have to remain"). What I am saying is please think about improving the defaults where it makes sense to do so. If you decide that adding a new option is the right thing to do then

Quoted 2 lines

Are you asking for some kind of config file that allows a developer to select their preferred setting of options,

Oh god no.

Quoted 1 line

or just to determine the best defaults?

Yes, at least where possible.

Quoted 3 lines

Last I knew Jan Beulich does not what -t and you and I do. The issue is that
-t by default pushes the output to > 80 columns.

I don't want things over 80 columns either.

I want to know that you have thought about the tradeoffs of adding a new option and concluded that a new option is better than changing the defaults -- the obvious way to stop me questioning this sort of thing would be to explain the choice in the commit message in the first place.

Ian.

author
#16 lore raw

Re: [PATCH v5 04/17] xenctx: Add command line options -b (--bytes-per-line) and -l (--lines)

Quoted 4 lines · Ian Campbell
Quoted 1 line · Don Slutz

On 03/24/14 06:44, Ian Campbell wrote:

I think we are way past intrusive...

Source code yes. Output before v8 by default no.
The v8 drop of -T is the 1st visible change from just running it.

Quoted 3 lines

Please can you get out of the habit of just cutting and pasting emails in response to questions, it's very hard to make sense of what you are trying to say when you do this. Just answer the question directly.

Still adjusting to the right level. Sorry about the cost to you.

[...]

Quoted 6 lines

I don't want things over 80 columns either.

I want to know that you have thought about the tradeoffs of adding a new option and concluded that a new option is better than changing the defaults -- the obvious way to stop me questioning this sort of thing would be to explain the choice in the commit message in the first place.

Good to know. I hope the commit message changes in v8 help.

-Don Slutz

Quoted 7 lines

Ian.

_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xen.org/xen-devel

author
#17 lore raw

PATCH v5 5/17 xenctx: Add command line option -D (--decode-as-ascii)

In reply to Don Slutz

If specified, output ascii version of stack also.

Here is an example:

Stack:
 ffffffff80048d19 0000000000200800 ffffffff803e7801 0000000000086800  .......... ......x>......h......
 0000000000000000 ffffffff80430720 ffffffff803e722f 80008e000010019c  ........ .C...../r>.............
 00000000ffffffff 0000000000000000 0000000000000000 0000000000200000  .......................... .....
 0000000000000000 0000000000000000                                    ................

---
v5: Add comment, move printf.

 tools/xentrace/xenctx.c | 39 ++++++++++++++++++++++++++++++++++++++-
 1 file changed, 38 insertions(+), 1 deletion(-)
tools/xentrace/xenctx.c +38 -1
index f540b61..f4a5125 100644
@@ -42,6 +42,7 @@ static struct xenctx {
     int multiple_pages;
     int bytes_per_line;
     int lines;
+    int decode_as_ascii;
     int all_vcpus;
     int self_paused;
     xc_dominfo_t dominfo;
@@ -669,6 +670,7 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width)
     guest_word_t frame;
     guest_word_t word;
     guest_word_t *p;
+    guest_word_t ascii[MAX_BYTES_PER_LINE/4];
     int i;
 
     if ( width )
@@ -683,6 +685,9 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width)
         printf("Stack:\n");
         for (i = 1; i < xenctx.lines + 1 && stack < stack_limit; i++)
         {
+            int j = 0;
+            int k;
+
             while ( stack < stack_limit &&
                     stack < stack_pointer(ctx) + i * xenctx.bytes_per_line )
             {
@@ -690,10 +695,36 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width)
                 if ( !p )
                     return -1;
                 word = read_stack_word(p, width);
+                if ( xenctx.decode_as_ascii )
+                    ascii[j++] = word;
                 printf(" ");
                 print_stack_word(word, width);
                 stack += width;
             }
+            if ( xenctx.decode_as_ascii )
+            {
+                /*
+                 * Line up ascii output if less than bytes_per_line
+                 * were printed.
+                 */
+                for (k = j; k < xenctx.bytes_per_line / width; k++)
+                    printf(" %*s", width * 2, "");
+                printf("  ");
+                for (k = 0; k < j; k++)
+                {
+                    int l;
+                    unsigned char *bytep = (unsigned char*)&ascii[k];
+
+                    for (l = 0; l < width; l++)
+                    {
+                        if (isprint(*bytep))
+                            printf("%c", *bytep);
+                        else
+                            printf(".");
+                        bytep++;
+                    }
+                }
+            }
             printf("\n");
         }
         printf("\n");
@@ -865,19 +896,22 @@ static void usage(void)
            DEFAULT_LINES);
     printf("                     Can be specified as MAX.  Note: Fewer lines will be output\n");
     printf("                     if Stack limit reached.\n");
+    printf("  -D, --decode-as-ascii\n");
+    printf("                     add a decode of Stack dump as ascii.\n");
 }
 
 int main(int argc, char **argv)
 {
     int ch;
     int ret;
-    static const char *sopts = "fs:hak:SCn:b:l:";
+    static const char *sopts = "fs:hak:SCn:b:l:D";
     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'},
         {"display-stack-pages", 0, NULL, 'n'},
+        {"decode-as-ascii", 0, NULL, 'D'},
         {"bytes-per-line", 1, NULL, 'b'},
         {"lines", 1, NULL, 'l'},
         {"all", 0, NULL, 'a'},
@@ -909,6 +943,9 @@ int main(int argc, char **argv)
         case 'n':
             xenctx.multiple_pages = strtol(optarg, NULL, 0);
             break;
+        case 'D':
+            xenctx.decode_as_ascii = 1;
+            break;
         case 'b':
             xenctx.bytes_per_line = strtol(optarg, NULL, 0);
             if ( xenctx.bytes_per_line < 4 ||
Signature · 1 line
1.8.4
#18 lore raw

Re: [PATCH v5 05/17] xenctx: Add command line option -D (--decode-as-ascii)

Quoted 1 line · Don Slutz

If specified, output ascii version of stack also.

I suppose this is optional because the result is >100 chars wide? Otherwise making it unconditional would be a nobrainer.

tools/xentrace/xenctx.c static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width) · line 711

Quoted 12 lines
                 printf(" ");
                 print_stack_word(word, width);
                 stack += width;
             }
tools/xentrace/xenctx.c +8 -0
+            if ( xenctx.decode_as_ascii )
+            {
+                /*
+                 * Line up ascii output if less than bytes_per_line
+                 * were printed.
+                 */
+                for (k = j; k < xenctx.bytes_per_line / width; k++)
+                    printf(" %*s", width * 2, "");

Avoid the loop by using width*2*((xenctx.bytes_per_line / width)-j) ? (or whatever the sums are)

At some point in the future perhaps
https://plus.google.com/111319147897550904359/posts/cZ6QVUAMAhT
will be widespread enoguh that we can all stop with this sort of thing...

Ian

author
#19 lore raw

Re: [PATCH v5 05/17] xenctx: Add command line option -D (--decode-as-ascii)

Quoted 4 lines · Ian Campbell
Quoted 1 line · Don Slutz

If specified, output ascii version of stack also.

I suppose this is optional because the result is >100 chars wide? Otherwise making it unconditional would be a nobrainer.

No not 100, but it does exceed 80 and from a previous email:

-------- Original Message --------
Subject: Re: [PATCH v2 03/12] xenctx: Output ascii version of stack also.
Date: Thu, 7 Nov 2013 12:43:14 +0000
From: Ian Campbell <[email protected]>
Organization: Citrix Systems, Inc.
To: Jan Beulich <[email protected]>
CC: Don Slutz <[email protected]>, Don Slutz <[email protected]>, "George Dunlap" <[email protected]>, Ian Jackson <[email protected]>, Stefano Stabellini <[email protected]>, xen-devel <[email protected]>

Quoted 4 lines · Jan Beulich
Quoted 1 line
Quoted 1 line
Quoted 1 line · Don Slutz

Why? I personally don't see a need - there's rarely much useful ASCII data on the stack.

This is true IME

Quoted 2 lines

So afaic: If at all, then only via command
line option defaulting to off.

Well, assuming it doesn't make the output >80 columns (which I can't tell from here) it seems harmless enough?

...

Quoted 13 lines

tools/xentrace/xenctx.c static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width) · line 711

Quoted 13 lines
                  printf(" ");
                  print_stack_word(word, width);
                  stack += width;
              }
tools/xentrace/xenctx.c +8 -0
+            if ( xenctx.decode_as_ascii )
+            {
+                /*
+                 * Line up ascii output if less than bytes_per_line
+                 * were printed.
+                 */
+                for (k = j; k < xenctx.bytes_per_line / width; k++)
+                    printf(" %*s", width * 2, "");
Quoted 2 lines

Avoid the loop by using width*2*((xenctx.bytes_per_line / width)-j) ? (or whatever the sums are)

I could, but you also need to include the test some how (and as an "if" is almost the same). And for code that is only ever run a few times in a developer tool, I do not see that the speed or output "breakage" make a big difference. But if you really want this...

Quoted 4 lines

At some point in the future perhaps
https://plus.google.com/111319147897550904359/posts/cZ6QVUAMAhT
will be widespread enoguh that we can all stop with this sort of thing...

Well, I wish them good luck. Getting the right terminal width to happen 100% of the time when going through many remote hops, just does not happen to me. (local stuff is just so much simpler.)

Also getting a table to look right with variable spacing and variable sized "characters" is very hard. Last I knew the technical writers still are hand adjusting things even now.

-Don Slutz

Quoted 2 lines

Ian

#20 lore raw

Re: [PATCH v5 05/17] xenctx: Add command line option -D (--decode-as-ascii)

Quoted 7 lines · Don Slutz
Quoted 4 lines · Ian Campbell
Quoted 1 line · Don Slutz

If specified, output ascii version of stack also.

I suppose this is optional because the result is >100 chars wide? Otherwise making it unconditional would be a nobrainer.

No not 100, but it does exceed 80 and from a previous email:

This having already been queried and explained I would have then expected the commit message to say something like "This is not the default because the result exceeds 80 characters per line"

Ian.

author
#21 lore raw

Re: [PATCH v5 05/17] xenctx: Add command line option -D (--decode-as-ascii)

Quoted 10 lines · Ian Campbell
Quoted 6 lines · Don Slutz
Quoted 4 lines · Ian Campbell
Quoted 1 line · Don Slutz

If specified, output ascii version of stack also.

I suppose this is optional because the result is >100 chars wide? Otherwise making it unconditional would be a nobrainer.

No not 100, but it does exceed 80 and from a previous email:

This having already been queried and explained I would have then expected the commit message to say something like "This is not the default because the result exceeds 80 characters per line"

Will add to commit message.

-Don Slutz

Quoted 2 lines

Ian.

author
#22 lore raw

PATCH v5 6/17 xenctx: Add command line option -t (--tag-stack-dump)

In reply to Don Slutz

If specified, add stack address to dump.

Here is an example:

Stack:
ffffffff803ddf90: ffffffff80048d19 0000000000200800 ffffffff803e7801 0000000000086800
ffffffff803ddfb0: 0000000000000000 ffffffff80430720 ffffffff803e722f 80008e000010019c
ffffffff803ddfd0: 00000000ffffffff 0000000000000000 0000000000000000 0000000000200000
ffffffff803ddff0: 0000000000000000 0000000000000000
---
 tools/xentrace/xenctx.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)
tools/xentrace/xenctx.c +13 -1
index f4a5125..93b50af 100644
@@ -43,6 +43,7 @@ static struct xenctx {
     int bytes_per_line;
     int lines;
     int decode_as_ascii;
+    int tag_stack_dump;
     int all_vcpus;
     int self_paused;
     xc_dominfo_t dominfo;
@@ -688,6 +689,11 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width)
             int j = 0;
             int k;
 
+            if ( xenctx.tag_stack_dump )
+            {
+                print_stack_word(stack, width);
+                printf(":");
+            }
             while ( stack < stack_limit &&
                     stack < stack_pointer(ctx) + i * xenctx.bytes_per_line )
             {
@@ -898,13 +904,15 @@ static void usage(void)
     printf("                     if Stack limit reached.\n");
     printf("  -D, --decode-as-ascii\n");
     printf("                     add a decode of Stack dump as ascii.\n");
+    printf("  -t, --tag-stack-dump\n");
+    printf("                     add address on each line of Stack dump.\n");
 }
 
 int main(int argc, char **argv)
 {
     int ch;
     int ret;
-    static const char *sopts = "fs:hak:SCn:b:l:D";
+    static const char *sopts = "fs:hak:SCn:b:l:Dt";
     static const struct option lopts[] = {
         {"stack-trace", 0, NULL, 'S'},
         {"symbol-table", 1, NULL, 's'},
@@ -912,6 +920,7 @@ int main(int argc, char **argv)
         {"kernel-start", 1, NULL, 'k'},
         {"display-stack-pages", 0, NULL, 'n'},
         {"decode-as-ascii", 0, NULL, 'D'},
+        {"tag-stack-dump", 0, NULL, 't'},
         {"bytes-per-line", 1, NULL, 'b'},
         {"lines", 1, NULL, 'l'},
         {"all", 0, NULL, 'a'},
@@ -946,6 +955,9 @@ int main(int argc, char **argv)
         case 'D':
             xenctx.decode_as_ascii = 1;
             break;
+        case 't':
+            xenctx.tag_stack_dump = 1;
+            break;
         case 'b':
             xenctx.bytes_per_line = strtol(optarg, NULL, 0);
             if ( xenctx.bytes_per_line < 4 ||
Signature · 1 line
1.8.4
Acked-by on v5 6/17
#23 lore raw

Re: [PATCH v5 06/17] xenctx: Add command line option -t (--tag-stack-dump)

Quoted 4 lines · Don Slutz

If specified, add stack address to dump.

Here is an example:

Quoted 8 lines
Stack:
ffffffff803ddf90: ffffffff80048d19 0000000000200800 ffffffff803e7801 0000000000086800
ffffffff803ddfb0: 0000000000000000 ffffffff80430720 ffffffff803e722f 80008e000010019c
ffffffff803ddfd0: 00000000ffffffff 0000000000000000 0000000000000000 0000000000200000
ffffffff803ddff0: 0000000000000000 0000000000000000
author
#24 lore raw

PATCH v5 7/17 xenctx: Change print_symbol to do the space before.

In reply to Don Slutz

From: Don Slutz <[email protected]>

This stops the output of an extra space at the end of the line.

---
 tools/xentrace/xenctx.c | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)
tools/xentrace/xenctx.c +10 -10
index 93b50af..d4e8935 100644
@@ -170,9 +170,9 @@ static void print_symbol(guest_word_t addr)
         return;
 
     if (addr==s->address)
-        printf("%s ", s->name);
+        printf(" %s", s->name);
     else
-        printf("%s+%#x ", s->name, (unsigned int)(addr - s->address));
+        printf(" %s+%#x", s->name, (unsigned int)(addr - s->address));
 }
 
 static void read_symbol_table(const char *symtab)
@@ -311,7 +311,7 @@ static void print_ctx_32(vcpu_guest_context_x86_32_t *ctx)
 {
     struct cpu_user_regs_x86_32 *regs = &ctx->user_regs;
 
-    printf("cs:eip: %04x:%08x ", regs->cs, regs->eip);
+    printf("cs:eip: %04x:%08x", regs->cs, regs->eip);
     print_symbol(regs->eip);
     print_flags(regs->eflags);
     printf("ss:esp: %04x:%08x\n", regs->ss, regs->esp);
@@ -340,7 +340,7 @@ static void print_ctx_32on64(vcpu_guest_context_x86_64_t *ctx)
 {
     struct cpu_user_regs_x86_64 *regs = &ctx->user_regs;
 
-    printf("cs:eip: %04x:%08x ", regs->cs, (uint32_t)regs->eip);
+    printf("cs:eip: %04x:%08x", regs->cs, (uint32_t)regs->eip);
     print_symbol((uint32_t)regs->eip);
     print_flags((uint32_t)regs->eflags);
     printf("ss:esp: %04x:%08x\n", regs->ss, (uint32_t)regs->esp);
@@ -369,7 +369,7 @@ static void print_ctx_64(vcpu_guest_context_x86_64_t *ctx)
 {
     struct cpu_user_regs_x86_64 *regs = &ctx->user_regs;
 
-    printf("rip: %016"PRIx64" ", regs->rip);
+    printf("rip: %016"PRIx64, regs->rip);
     print_symbol(regs->rip);
     print_flags(regs->rflags);
     printf("rsp: %016"PRIx64"\n", regs->rsp);
@@ -467,7 +467,7 @@ static void print_ctx_32(vcpu_guest_context_t *ctx)
 {
     vcpu_guest_core_regs_t *regs = &ctx->user_regs;
 
-    printf("PC:       %08"PRIx32" ", regs->pc32);
+    printf("PC:       %08"PRIx32, regs->pc32);
     print_symbol(regs->pc32);
     printf("\n");
     printf("CPSR:     %08"PRIx32"\n", regs->cpsr);
@@ -519,7 +519,7 @@ static void print_ctx_64(vcpu_guest_context_t *ctx)
 {
     vcpu_guest_core_regs_t *regs = &ctx->user_regs;
 
-    printf("PC:       %016"PRIx64" ", regs->pc64);
+    printf("PC:       %016"PRIx64, regs->pc64);
     print_symbol(regs->pc64);
     printf("\n");
 
@@ -742,7 +742,7 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width)
         printf("Call Trace:\n");
     printf("%c [<", xenctx.stack_trace ? '*' : ' ');
     print_stack_word(instr_pointer(ctx), width);
-    printf(">] ");
+    printf(">]");
 
     print_symbol(instr_pointer(ctx));
     printf(" <--\n");
@@ -782,7 +782,7 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width)
                 word = read_stack_word(p, width);
                 printf("%c [<", xenctx.stack_trace ? '|' : ' ');
                 print_stack_word(word, width);
-                printf(">] ");
+                printf(">]");
                 print_symbol(word);
                 printf("\n");
                 stack += width;
@@ -798,7 +798,7 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width)
             if (is_kernel_text(word)) {
                 printf("  [<");
                 print_stack_word(word, width);
-                printf(">] ");
+                printf(">]");
                 print_symbol(word);
                 printf("\n");
             } else if (xenctx.stack_trace) {
Signature · 1 line
1.8.4
author
#25 lore raw

PATCH v5 8/17 xenctx: More info on failed to map page.

In reply to Don Slutz

From: Don Slutz <[email protected]>

Also output an extra new line since we may be in the middle of output.

---
 tools/xentrace/xenctx.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
tools/xentrace/xenctx.c +1 -1
index d4e8935..107e353 100644
@@ -617,7 +617,7 @@ static void *map_page(vcpu_guest_context_any_t *ctx, int vcpu, guest_word_t virt
     mapped = xc_map_foreign_range(xenctx.xc_handle, xenctx.domid, XC_PAGE_SIZE, PROT_READ, mfn);
 
     if (mapped == NULL) {
-        fprintf(stderr, "failed to map page.\n");
+        fprintf(stderr, "\nfailed to map page for "FMT_32B_WORD".\n", virt);
         return NULL;
     }
 
Signature · 1 line
1.8.4
author
#26 lore raw

PATCH v5 9/17 xenctx: Add command line option -T (--tag-trace)

In reply to Don Slutz

If specified, add stack addr to Call and Stack trace.

Here is an example:

Call Trace:
                   [<ffffffff8006b2b0>] default_idle+0x29 <--
ffffffff803ddf90:  [<ffffffff80048d19>] cpu_idle+0x95
ffffffff803ddfa0:  [<ffffffff803e7801>] start_kernel+0x220
ffffffff803ddfc0:  [<ffffffff803e722f>] x86_64_start_kernel+0x22f

and

Stack Trace:
* [<ffffffff8006b2b0>] default_idle+0x29 <--

ffffffff803ddf90:  [<ffffffff80048d19>] cpu_idle+0x95
ffffffff803ddf98:    0000000000200800
ffffffff803ddfa0:  [<ffffffff803e7801>] start_kernel+0x220
ffffffff803ddfa8:    0000000000086800
ffffffff803ddfb0:    0000000000000000
ffffffff803ddfb8:    ffffffff80430720
ffffffff803ddfc0:  [<ffffffff803e722f>] x86_64_start_kernel+0x22f
ffffffff803ddfc8:    80008e000010019c
ffffffff803ddfd0:    00000000ffffffff
ffffffff803ddfd8:    0000000000000000
ffffffff803ddfe0:    0000000000000000
ffffffff803ddfe8:    0000000000200000
ffffffff803ddff0:    0000000000000000
ffffffff803ddff8:    0000000000000000

---
v5: Adjust option name, usage.

 tools/xentrace/xenctx.c | 53 ++++++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 46 insertions(+), 7 deletions(-)
tools/xentrace/xenctx.c +46 -7
index 107e353..5732665 100644
@@ -44,6 +44,7 @@ static struct xenctx {
     int lines;
     int decode_as_ascii;
     int tag_stack_dump;
+    int tag_call_trace;
     int all_vcpus;
     int self_paused;
     xc_dominfo_t dominfo;
@@ -740,6 +741,8 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width)
         printf("Stack Trace:\n");
     else
         printf("Call Trace:\n");
+    if ( xenctx.tag_call_trace )
+        printf(" %*s", width*2, "");
     printf("%c [<", xenctx.stack_trace ? '*' : ' ');
     print_stack_word(instr_pointer(ctx), width);
     printf(">]");
@@ -755,9 +758,15 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width)
                     p = map_page(ctx, vcpu, stack);
                     if (!p)
                         return -1;
-                    printf("|   ");
+                    if ( xenctx.tag_call_trace )
+                    {
+                        print_stack_word(stack, width);
+                        printf(": |   ");
+                    } else {
+                        printf("|   ");
+                    }
                     print_stack_word(read_stack_word(p, width), width);
-                    printf("   \n");
+                    printf("\n");
                     stack += width;
                 }
             } else {
@@ -769,7 +778,13 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width)
                 return -1;
             frame = read_stack_word(p, width);
             if (xenctx.stack_trace) {
-                printf("|-- ");
+                if ( xenctx.tag_call_trace )
+                {
+                    print_stack_word(stack, width);
+                    printf(": |-- ");
+                } else {
+                    printf("|-- ");
+                }
                 print_stack_word(read_stack_word(p, width), width);
                 printf("\n");
             }
@@ -780,7 +795,13 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width)
                 if (!p)
                     return -1;
                 word = read_stack_word(p, width);
-                printf("%c [<", xenctx.stack_trace ? '|' : ' ');
+                if ( xenctx.tag_call_trace )
+                {
+                    print_stack_word(stack, width);
+                    printf(": %c [<", xenctx.stack_trace ? '|' : ' ');
+                } else {
+                    printf("%c [<", xenctx.stack_trace ? '|' : ' ');
+                }
                 print_stack_word(word, width);
                 printf(">]");
                 print_symbol(word);
@@ -796,13 +817,25 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width)
                 return -1;
             word = read_stack_word(p, width);
             if (is_kernel_text(word)) {
-                printf("  [<");
+                if ( xenctx.tag_call_trace )
+                {
+                    print_stack_word(stack, width);
+                    printf(":  [<");
+                } else {
+                    printf("  [<");
+                }
                 print_stack_word(word, width);
                 printf(">]");
                 print_symbol(word);
                 printf("\n");
             } else if (xenctx.stack_trace) {
-                printf("    ");
+                if ( xenctx.tag_call_trace )
+                {
+                    print_stack_word(stack, width);
+                    printf(":    ");
+                } else {
+                    printf("    ");
+                }
                 print_stack_word(word, width);
                 printf("\n");
             }
@@ -906,13 +939,15 @@ static void usage(void)
     printf("                     add a decode of Stack dump as ascii.\n");
     printf("  -t, --tag-stack-dump\n");
     printf("                     add address on each line of Stack dump.\n");
+    printf("  -T, --tag-trace\n");
+    printf("                     add address on each line of Call or Stack trace.\n");
 }
 
 int main(int argc, char **argv)
 {
     int ch;
     int ret;
-    static const char *sopts = "fs:hak:SCn:b:l:Dt";
+    static const char *sopts = "fs:hak:SCn:b:l:DtT";
     static const struct option lopts[] = {
         {"stack-trace", 0, NULL, 'S'},
         {"symbol-table", 1, NULL, 's'},
@@ -921,6 +956,7 @@ int main(int argc, char **argv)
         {"display-stack-pages", 0, NULL, 'n'},
         {"decode-as-ascii", 0, NULL, 'D'},
         {"tag-stack-dump", 0, NULL, 't'},
+        {"tag-trace", 0, NULL, 'T'},
         {"bytes-per-line", 1, NULL, 'b'},
         {"lines", 1, NULL, 'l'},
         {"all", 0, NULL, 'a'},
@@ -958,6 +994,9 @@ int main(int argc, char **argv)
         case 't':
             xenctx.tag_stack_dump = 1;
             break;
+        case 'T':
+            xenctx.tag_call_trace = 1;
+            break;
         case 'b':
             xenctx.bytes_per_line = strtol(optarg, NULL, 0);
             if ( xenctx.bytes_per_line < 4 ||
Signature · 1 line
1.8.4
#27 lore raw

Re: [PATCH v5 09/17] xenctx: Add command line option -T (--tag-trace)

Quoted 1 line · Don Slutz

If specified, add stack addr to Call and Stack trace.

This could safely be unconditional I think.

Or if not then it should share an option with --tag-stack-dump, e.g. -a,--print-addresses

tools/xentrace/xenctx.c static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width) · line 767

Quoted 12 lines
tools/xentrace/xenctx.c +7 -1
@@ -755,9 +758,15 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width)
                     p = map_page(ctx, vcpu, stack);
                     if (!p)
                         return -1;
-                    printf("|   ");
+                    if ( xenctx.tag_call_trace )
+                    {
+                        print_stack_word(stack, width);
+                        printf(": |   ");
+                    } else {
+                        printf("|   ");
+                    }

if (trace)

	print stack work
	print ": "
}

print ("| ")

(the examples you gave have no vertical | in them -- are they out of date?)

tools/xentrace/xenctx.c static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width) · line 787

Quoted 12 lines
tools/xentrace/xenctx.c +7 -1
@@ -769,7 +778,13 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width)
                 return -1;
             frame = read_stack_word(p, width);
             if (xenctx.stack_trace) {
-                printf("|-- ");
+                if ( xenctx.tag_call_trace )
+                {
+                    print_stack_word(stack, width);
+                    printf(": |-- ");
+                } else {
+                    printf("|-- ");
+                }

Same comment as above.

Quoted 5 lines
tools/xentrace/xenctx.c +0 -0
                 print_stack_word(read_stack_word(p, width), width);
                 printf("\n");
             }
@@ -780,7 +795,13 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width)
                 if (!p)

tools/xentrace/xenctx.c static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width) · line 804

Quoted 10 lines
tools/xentrace/xenctx.c +7 -1
                     return -1;
                 word = read_stack_word(p, width);
-                printf("%c [<", xenctx.stack_trace ? '|' : ' ');
+                if ( xenctx.tag_call_trace )
+                {
+                    print_stack_word(stack, width);
+                    printf(": %c [<", xenctx.stack_trace ? '|' : ' ');
+                } else {
+                    printf("%c [<", xenctx.stack_trace ? '|' : ' ');
+                }

and again (here the code duplication is especially intolerable)

Quoted 5 lines
tools/xentrace/xenctx.c +0 -0
                 print_stack_word(word, width);
                 printf(">]");
                 print_symbol(word);
@@ -796,13 +817,25 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width)
                 return -1;

tools/xentrace/xenctx.c static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width) · line 826

Quoted 10 lines
tools/xentrace/xenctx.c +7 -1
             word = read_stack_word(p, width);
             if (is_kernel_text(word)) {
-                printf("  [<");
+                if ( xenctx.tag_call_trace )
+                {
+                    print_stack_word(stack, width);
+                    printf(":  [<");
+                } else {
+                    printf("  [<");
+                }

again.

tools/xentrace/xenctx.c static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width) · line 838

Quoted 13 lines
tools/xentrace/xenctx.c +7 -1
                 print_stack_word(word, width);
                 printf(">]");
                 print_symbol(word);
                 printf("\n");
             } else if (xenctx.stack_trace) {
-                printf("    ");
+                if ( xenctx.tag_call_trace )
+                {
+                    print_stack_word(stack, width);
+                    printf(":    ");
+                } else {
+                    printf("    ");
+                }

again.

It almost like a print_stack_trace helper is in order.

author
#28 lore raw

Re: [PATCH v5 09/17] xenctx: Add command line option -T (--tag-trace)

Quoted 7 lines · Ian Campbell
Quoted 1 line · Don Slutz

If specified, add stack addr to Call and Stack trace.

This could safely be unconditional I think.

Or if not then it should share an option with --tag-stack-dump, e.g. -a,--print-addresses

Ok.

Quoted 13 lines

tools/xentrace/xenctx.c static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width) · line 767

Quoted 12 lines
tools/xentrace/xenctx.c +7 -1
@@ -755,9 +758,15 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width)
                      p = map_page(ctx, vcpu, stack);
                      if (!p)
                          return -1;
-                    printf("|   ");
+                    if ( xenctx.tag_call_trace )
+                    {
+                        print_stack_word(stack, width);
+                        printf(": |   ");
+                    } else {
+                        printf("|   ");
+                    }

if (trace)

Quoted 7 lines
	print stack work
	print ": "
}

print ("| ")

(the examples you gave have no vertical | in them -- are they out of date?)

Nope. These are non "-f -S" output.

Here is "-f -S" output:

xenctx -s /boot/System.map-2.6.32-279.2.1.el6.mpbios5.x86_64 -f -S 2
rip: ffffffff810387db native_safe_halt+0xb
flags: 00000246 i z p
rsp: ffffffff81a03ec8
rax: 0000000000000000 rcx: 0000000000000000 rdx: 0000000000000000
rbx: 0000000000000000 rsi: 0000000000000001 rdi: ffffffff81ddc228
rbp: ffffffff81a03ec8 r8: 0000000000000000 r9: 0000000000000000
r10: 000001f319222f0f r11: ffffffff81a03e68 r12: ffffffff81c03800
r13: 0000000000000000 r14: ffffffffffffffff r15: 000000000008a790
cs: 0010 ss: 0018 ds: 0018 es: 0018
fs: 0000 @ 0000000000000000
gs: 0000 @ ffff88000b400000/0000000000000000/
Code (instr addr ffffffff810387db)
44 00 00 fb c9 c3 0f 1f 40 00 55 48 89 e5 0f 1f 44 00 00 fb f4 <c9> c3 0f 1f 00 55 48 89 e5 0f 1f

Stack:
 ffffffff81a03ee8 ffffffff810149cd ffffffff81a03fd8 ffffffff81c03800
 ffffffff81a03f18 ffffffff81009e06 6db6db6db6db6db7 e8be668bda5ab5b6
 0000000000000000 6db6db6db6db6db7 ffffffff81a03f28 ffffffff814e447a
 ffffffff81a03f68 ffffffff81c23f7b 8d0573d9e73df7bb ffffffff81c6b440
 0000000002014024 0000000000000000 ffffffff81dd9000 ffffffff81a03fa8

Stack Trace:
* [<ffffffff810387db>] native_safe_halt+0xb <--

|-- ffffffff81a03ee8
| [<ffffffff810149cd>] default_idle+0x4d
|   ffffffff81a03fd8
|   ffffffff81c03800
|-- ffffffff81a03f18
| [<ffffffff81009e06>] cpu_idle+0xb6
|   6db6db6db6db6db7
|   e8be668bda5ab5b6
|   0000000000000000
|   6db6db6db6db6db7
|-- ffffffff81a03f28
| [<ffffffff814e447a>] rest_init+0x7a
|-- ffffffff81a03f68
| [<ffffffff81c23f7b>] start_kernel+0x424
|   8d0573d9e73df7bb
|   ffffffff81c6b440
|   0000000002014024
|   0000000000000000
|   ffffffff81dd9000
|   ffffffff81a03fa8
|-- ffffffff81a03f88
| [<ffffffff81c2333a>] x86_64_start_reservations+0x125
|   ffffffff81a03fa8
|   0000000000000020
|-- ffffffff81a03fe8
| [<ffffffff81c23438>] x86_64_start_kernel+0xfa
|   0000000000000000
|   0000000000000000
|   81c28e0000103136
|   00000000ffffffff
|   0000000000000000
|   0000000000000000
|   0000000000000000
|   0000000000000000
|   0000000000000000
|   0000000000000000
|-- 0000000000000000
Quoted 61 lines

tools/xentrace/xenctx.c static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width) · line 787

Quoted 12 lines
tools/xentrace/xenctx.c +7 -1
@@ -769,7 +778,13 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width)
                  return -1;
              frame = read_stack_word(p, width);
              if (xenctx.stack_trace) {
-                printf("|-- ");
+                if ( xenctx.tag_call_trace )
+                {
+                    print_stack_word(stack, width);
+                    printf(": |-- ");
+                } else {
+                    printf("|-- ");
+                }

Same comment as above.

Quoted 5 lines
tools/xentrace/xenctx.c +0 -0
                  print_stack_word(read_stack_word(p, width), width);
                  printf("\n");
              }
@@ -780,7 +795,13 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width)
                  if (!p)

tools/xentrace/xenctx.c static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width) · line 804

Quoted 10 lines
tools/xentrace/xenctx.c +7 -1
                      return -1;
                  word = read_stack_word(p, width);
-                printf("%c [<", xenctx.stack_trace ? '|' : ' ');
+                if ( xenctx.tag_call_trace )
+                {
+                    print_stack_word(stack, width);
+                    printf(": %c [<", xenctx.stack_trace ? '|' : ' ');
+                } else {
+                    printf("%c [<", xenctx.stack_trace ? '|' : ' ');
+                }

and again (here the code duplication is especially intolerable)

Quoted 5 lines
tools/xentrace/xenctx.c +0 -0
                  print_stack_word(word, width);
                  printf(">]");
                  print_symbol(word);
@@ -796,13 +817,25 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width)
                  return -1;

tools/xentrace/xenctx.c static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width) · line 826

Quoted 10 lines
tools/xentrace/xenctx.c +7 -1
              word = read_stack_word(p, width);
              if (is_kernel_text(word)) {
-                printf("  [<");
+                if ( xenctx.tag_call_trace )
+                {
+                    print_stack_word(stack, width);
+                    printf(":  [<");
+                } else {
+                    printf("  [<");
+                }

again.

tools/xentrace/xenctx.c static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width) · line 838

Quoted 13 lines
tools/xentrace/xenctx.c +7 -1
                  print_stack_word(word, width);
                  printf(">]");
                  print_symbol(word);
                  printf("\n");
              } else if (xenctx.stack_trace) {
-                printf("    ");
+                if ( xenctx.tag_call_trace )
+                {
+                    print_stack_word(stack, width);
+                    printf(":    ");
+                } else {
+                    printf("    ");
+                }
Quoted 5 lines

again.

It almost like a print_stack_trace helper is in order.

Ok, I will recode these all as routine that is basicly:

+ if ( xenctx.tag_call_trace )
+ {
+ print_stack_word(stack, width);
+ printf(": ");
+ }

-Don Slutz

#29 lore raw

Re: [PATCH v5 09/17] xenctx: Add command line option -T (--tag-trace)

Quoted 1 line · Don Slutz

Nope. These are non "-f -S" output.

Ah, ok.

Quoted 5 lines
Quoted 3 lines

It almost like a print_stack_trace helper is in order.

Ok, I will recode these all as routine that is basicly:

Yes, thanks.

Quoted 11 lines
tools/xentrace/xenctx.c +5 -0
+                if ( xenctx.tag_call_trace )
+                {
+                    print_stack_word(stack, width);
+                    printf(": ");
+                }
 
 
 
    -Don Slutz
author
#30 lore raw

PATCH v5 10/17 xenctx: Add -m (--memory) <maddr> option to dump memory at maddr.

In reply to Don Slutz

Currently not supported on ARM.

New routine read_mem_word() will correctly read a word that crosses a page boundary. It will not fault if the 2nd page can not be mapped.

Here is an example:

Memory (address ffffffff803ddf90):
ffffffff80048d19 0000000000200800 ffffffff803e7801 0000000000086800 0000000000000000 ffffffff80430720 ffffffff803e722f 80008e000010019c 00000000ffffffff 0000000000000000 0000000000000000 0000000000200000 0000000000000000 0000000000000000 0000000000000000 00cf9b000000ffff 00af9b000000ffff 00cf93000000ffff 00cffb000000ffff 00cff3000000ffff

---
v5: Remove extra #ifndef. Make common routine print_lines().

 tools/xentrace/xenctx.c | 232 +++++++++++++++++++++++++++++++++---------------
 1 file changed, 162 insertions(+), 70 deletions(-)
tools/xentrace/xenctx.c +162 -70
index 5732665..13f56ed 100644
@@ -33,23 +33,6 @@
 #define DEFAULT_BYTES_PER_LINE 32
 #define DEFAULT_LINES 5
 
-static struct xenctx {
-    xc_interface *xc_handle;
-    int domid;
-    int frame_ptrs;
-    int stack_trace;
-    int disp_all;
-    int multiple_pages;
-    int bytes_per_line;
-    int lines;
-    int decode_as_ascii;
-    int tag_stack_dump;
-    int tag_call_trace;
-    int all_vcpus;
-    int self_paused;
-    xc_dominfo_t dominfo;
-} xenctx;
-
 #if defined (__i386__) || defined (__x86_64__)
 typedef unsigned long long guest_word_t;
 #define FMT_32B_WORD "%08llx"
@@ -73,6 +56,27 @@ typedef uint64_t guest_word_t;
 
 #define MAX_BYTES_PER_LINE 128
 
+static struct xenctx {
+    xc_interface *xc_handle;
+    int domid;
+    int frame_ptrs;
+    int stack_trace;
+    int disp_all;
+    int multiple_pages;
+    int bytes_per_line;
+    int lines;
+    int decode_as_ascii;
+    int tag_stack_dump;
+    int tag_call_trace;
+    int all_vcpus;
+#ifndef NO_TRANSLATION
+    guest_word_t mem_addr;
+    int do_memory;
+#endif
+    int self_paused;
+    xc_dominfo_t dominfo;
+} xenctx;
+
 struct symbol {
     guest_word_t address;
     char *name;
@@ -634,6 +638,36 @@ 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;
+    }
+}
+#endif
+
 static void print_stack_word(guest_word_t word, int width)
 {
     if (width == 4)
@@ -642,6 +676,78 @@ static void print_stack_word(guest_word_t word, int width)
         printf(FMT_64B_WORD, word);
 }
 
+#ifndef NO_TRANSLATION
+static int print_lines(vcpu_guest_context_any_t *ctx, int vcpu, int width,
+                       guest_word_t mem_addr, guest_word_t mem_limit)
+{
+    guest_word_t mem_start = mem_addr;
+    guest_word_t word;
+    guest_word_t ascii[MAX_BYTES_PER_LINE/4];
+    int i;
+
+    for (i = 1; i < xenctx.lines + 1 && mem_addr < mem_limit; i++)
+    {
+        int j = 0;
+        int k;
+
+        if ( xenctx.tag_stack_dump )
+        {
+            print_stack_word(mem_addr, width);
+            printf(":");
+        }
+        while ( mem_addr < mem_limit &&
+                mem_addr < mem_start + i * xenctx.bytes_per_line )
+        {
+            void *p = map_page(ctx, vcpu, mem_addr);
+            if ( !p )
+                return -1;
+            word = read_mem_word(ctx, vcpu, mem_addr, width); 
+            if ( xenctx.decode_as_ascii )
+                ascii[j++] = word;
+            printf(" ");
+            print_stack_word(word, width);
+            mem_addr += width;
+        }
+        if ( xenctx.decode_as_ascii )
+        {
+            /*
+             * Line up ascii output if less than bytes_per_line
+             * were printed.
+             */
+            for (k = j; k < xenctx.bytes_per_line / width; k++)
+                printf(" %*s", width * 2, "");
+            printf("  ");
+            for (k = 0; k < j; k++)
+            {
+                int l;
+                unsigned char *bytep = (unsigned char*)&ascii[k];
+
+                for (l = 0; l < width; l++)
+                {
+                    if (isprint(*bytep))
+                        printf("%c", *bytep);
+                    else
+                        printf(".");
+                    bytep++;
+                }
+            }
+        }
+        printf("\n");
+    }
+    printf("\n");
+    return 0;
+}
+
+static void print_mem(vcpu_guest_context_any_t *ctx, int vcpu, int width,
+                          guest_word_t mem_addr)
+{
+    printf("Memory (address ");
+    print_stack_word(mem_addr, width);
+    printf("):\n");
+    print_lines(ctx, vcpu, width, mem_addr,
+                mem_addr + xenctx.lines * xenctx.bytes_per_line);
+}
+
 static int print_code(vcpu_guest_context_any_t *ctx, int vcpu)
 {
     guest_word_t instr;
@@ -672,8 +778,6 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width)
     guest_word_t frame;
     guest_word_t word;
     guest_word_t *p;
-    guest_word_t ascii[MAX_BYTES_PER_LINE/4];
-    int i;
 
     if ( width )
         xenctx.bytes_per_line = ((xenctx.bytes_per_line + width - 1) / width) * width;
@@ -685,56 +789,8 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width)
     if ( xenctx.lines )
     {
         printf("Stack:\n");
-        for (i = 1; i < xenctx.lines + 1 && stack < stack_limit; i++)
-        {
-            int j = 0;
-            int k;
-
-            if ( xenctx.tag_stack_dump )
-            {
-                print_stack_word(stack, width);
-                printf(":");
-            }
-            while ( stack < stack_limit &&
-                    stack < stack_pointer(ctx) + i * xenctx.bytes_per_line )
-            {
-                p = map_page(ctx, vcpu, stack);
-                if ( !p )
-                    return -1;
-                word = read_stack_word(p, width);
-                if ( xenctx.decode_as_ascii )
-                    ascii[j++] = word;
-                printf(" ");
-                print_stack_word(word, width);
-                stack += width;
-            }
-            if ( xenctx.decode_as_ascii )
-            {
-                /*
-                 * Line up ascii output if less than bytes_per_line
-                 * were printed.
-                 */
-                for (k = j; k < xenctx.bytes_per_line / width; k++)
-                    printf(" %*s", width * 2, "");
-                printf("  ");
-                for (k = 0; k < j; k++)
-                {
-                    int l;
-                    unsigned char *bytep = (unsigned char*)&ascii[k];
-
-                    for (l = 0; l < width; l++)
-                    {
-                        if (isprint(*bytep))
-                            printf("%c", *bytep);
-                        else
-                            printf(".");
-                        bytep++;
-                    }
-                }
-            }
-            printf("\n");
-        }
-        printf("\n");
+        if ( print_lines(ctx, vcpu, width, stack, stack_limit) )
+            return -1;
     }
 
     if(xenctx.stack_trace)
@@ -882,6 +938,13 @@ static void dump_ctx(int vcpu)
     }
 #endif
 
+#ifndef NO_TRANSLATION
+    if ( xenctx.do_memory )
+    {
+        print_mem(&ctx, vcpu, guest_word_size, xenctx.mem_addr);
+        return;
+    }
+#endif
     print_ctx(&ctx);
 #ifndef NO_TRANSLATION
     if (print_code(&ctx, vcpu))
@@ -941,13 +1004,21 @@ static void usage(void)
     printf("                     add address on each line of Stack dump.\n");
     printf("  -T, --tag-trace\n");
     printf("                     add address on each line of Call or Stack trace.\n");
+#ifndef NO_TRANSLATION
+    printf("  -m maddr, --memory=maddr\n");
+    printf("                     dump memory at maddr.\n");
+#endif
 }
 
 int main(int argc, char **argv)
 {
     int ch;
     int ret;
+#ifndef NO_TRANSLATION
+    static const char *sopts = "fs:hak:SCn:b:l:DtTm:";
+#else
     static const char *sopts = "fs:hak:SCn:b:l:DtT";
+#endif
     static const struct option lopts[] = {
         {"stack-trace", 0, NULL, 'S'},
         {"symbol-table", 1, NULL, 's'},
@@ -957,6 +1028,9 @@ int main(int argc, char **argv)
         {"decode-as-ascii", 0, NULL, 'D'},
         {"tag-stack-dump", 0, NULL, 't'},
         {"tag-trace", 0, NULL, 'T'},
+#ifndef NO_TRANSLATION
+        {"memory", 1, NULL, 'm'},
+#endif
         {"bytes-per-line", 1, NULL, 'b'},
         {"lines", 1, NULL, 'l'},
         {"all", 0, NULL, 'a'},
@@ -967,6 +1041,7 @@ int main(int argc, char **argv)
     const char *symbol_table = NULL;
 
     int vcpu = 0;
+    int do_default = 1;
 
     xenctx.bytes_per_line = DEFAULT_BYTES_PER_LINE;
     xenctx.lines = DEFAULT_LINES;
@@ -1024,10 +1099,18 @@ int main(int argc, char **argv)
             break;
         case 'C':
             xenctx.all_vcpus = 1;
+            do_default = 0;
             break;
         case 'k':
             kernel_start = strtoull(optarg, NULL, 0);
             break;
+#ifndef NO_TRANSLATION
+        case 'm':
+            xenctx.mem_addr = strtoull(optarg, NULL, 0);
+            xenctx.do_memory = 1;
+            do_default = 0;
+            break;
+#endif
         case 'h':
             usage();
             exit(-1);
@@ -1077,9 +1160,18 @@ int main(int argc, char **argv)
         xenctx.self_paused = 1;
     }
 
+#ifndef NO_TRANSLATION
+    if ( xenctx.do_memory )
+    {
+        dump_ctx(vcpu);
+        if (xenctx.all_vcpus)
+            printf("\n");
+    }
+    xenctx.do_memory = 0;
+#endif
     if (xenctx.all_vcpus)
         dump_all_vcpus();
-    else
+    if ( do_default )
         dump_ctx(vcpu);
 
     if (xenctx.self_paused) {
Signature · 1 line
1.8.4
#31 lore raw

Re: [PATCH v5 10/17] xenctx: Add -m (--memory) <maddr> option to dump memory at maddr.

Quoted 64 lines · Don Slutz

Currently not supported on ARM.

New routine read_mem_word() will correctly read a word that crosses a page boundary. It will not fault if the 2nd page can not be mapped.

Here is an example:
Memory (address ffffffff803ddf90):
ffffffff80048d19 0000000000200800 ffffffff803e7801 0000000000086800 0000000000000000 ffffffff80430720 ffffffff803e722f 80008e000010019c 00000000ffffffff 0000000000000000 0000000000000000 0000000000200000 0000000000000000 0000000000000000 0000000000000000 00cf9b000000ffff 00af9b000000ffff 00cf93000000ffff 00cffb000000ffff 00cff3000000ffff

---
v5: Remove extra #ifndef. Make common routine print_lines().

 tools/xentrace/xenctx.c | 232 +++++++++++++++++++++++++++++++++---------------
 1 file changed, 162 insertions(+), 70 deletions(-)
tools/xentrace/xenctx.c +11 -17
index 5732665..13f56ed 100644
@@ -33,23 +33,6 @@
 #define DEFAULT_BYTES_PER_LINE 32
 #define DEFAULT_LINES 5
 
-static struct xenctx {
-    xc_interface *xc_handle;
-    int domid;
-    int frame_ptrs;
-    int stack_trace;
-    int disp_all;
-    int multiple_pages;
-    int bytes_per_line;
-    int lines;
-    int decode_as_ascii;
-    int tag_stack_dump;
-    int tag_call_trace;
-    int all_vcpus;
-    int self_paused;
-    xc_dominfo_t dominfo;
-} xenctx;
-
 #if defined (__i386__) || defined (__x86_64__)
 typedef unsigned long long guest_word_t;
 #define FMT_32B_WORD "%08llx"
@@ -73,6 +56,27 @@ typedef uint64_t guest_word_t;
 
 #define MAX_BYTES_PER_LINE 128
 
+static struct xenctx {
+    xc_interface *xc_handle;
+    int domid;
+    int frame_ptrs;
+    int stack_trace;
+    int disp_all;
+    int multiple_pages;
+    int bytes_per_line;
+    int lines;
+    int decode_as_ascii;
+    int tag_stack_dump;

tools/xentrace/xenctx.c typedef uint64_t guest_word_t; · line 79

Quoted 10 lines
tools/xentrace/xenctx.c +10 -0
+    int tag_call_trace;
+    int all_vcpus;
+#ifndef NO_TRANSLATION
+    guest_word_t mem_addr;
+    int do_memory;
+#endif
+    int self_paused;
+    xc_dominfo_t dominfo;
+} xenctx;
+

This motion seems to be unmotivated by the commit message.

(I've no idea why there is a struct for this stuff anyway, even though there is a good chance I added it, it could just as easily be globals in a program of this sort)

tools/xentrace/xenctx.c static void usage(void) · line 1021

Quoted 9 lines
tools/xentrace/xenctx.c +0 -0
 int main(int argc, char **argv)
 {
     int ch;
     int ret;
tools/xentrace/xenctx.c +4 -0
+#ifndef NO_TRANSLATION
+    static const char *sopts = "fs:hak:SCn:b:l:DtTm:";
+#else
     static const char *sopts = "fs:hak:SCn:b:l:DtT";
+#endif

static const char *sopts = "fs:hak:SCn:b:l:DtT"

#ifdef ....
				"m:"
#endif
	;

Or something to avoid that massive repetition. Another possibility:

#ifndef NO_TRANSLATION
#define TRANSLATION_OPTS "m:"
#else
#define TRANSLATION_OPTS

#endif
		sopts = "fs:....." TRANS...._OPTS

Ian.

author
#32 lore raw

Re: [PATCH v5 10/17] xenctx: Add -m (--memory) <maddr> option to dump memory at maddr.

Quoted 68 lines · Ian Campbell
Quoted 67 lines · Don Slutz

Currently not supported on ARM.

New routine read_mem_word() will correctly read a word that crosses a page boundary. It will not fault if the 2nd page can not be mapped.

Here is an example:
Memory (address ffffffff803ddf90):
ffffffff80048d19 0000000000200800 ffffffff803e7801 0000000000086800 0000000000000000 ffffffff80430720 ffffffff803e722f 80008e000010019c 00000000ffffffff 0000000000000000 0000000000000000 0000000000200000 0000000000000000 0000000000000000 0000000000000000 00cf9b000000ffff 00af9b000000ffff 00cf93000000ffff 00cffb000000ffff 00cff3000000ffff

---
v5: Remove extra #ifndef. Make common routine print_lines().

  tools/xentrace/xenctx.c | 232 +++++++++++++++++++++++++++++++++---------------
  1 file changed, 162 insertions(+), 70 deletions(-)
tools/xentrace/xenctx.c +14 -17
index 5732665..13f56ed 100644
@@ -33,23 +33,6 @@
  #define DEFAULT_BYTES_PER_LINE 32
  #define DEFAULT_LINES 5
 
-static struct xenctx {
-    xc_interface *xc_handle;
-    int domid;
-    int frame_ptrs;
-    int stack_trace;
-    int disp_all;
-    int multiple_pages;
-    int bytes_per_line;
-    int lines;
-    int decode_as_ascii;
-    int tag_stack_dump;
-    int tag_call_trace;
-    int all_vcpus;
-    int self_paused;
-    xc_dominfo_t dominfo;
-} xenctx;
-
  #if defined (__i386__) || defined (__x86_64__)
  typedef unsigned long long guest_word_t;
  #define FMT_32B_WORD "%08llx"
@@ -73,6 +56,27 @@ typedef uint64_t guest_word_t;
 
  #define MAX_BYTES_PER_LINE 128
 
+static struct xenctx {
+    xc_interface *xc_handle;
+    int domid;
+    int frame_ptrs;
+    int stack_trace;
+    int disp_all;
+    int multiple_pages;
+    int bytes_per_line;
+    int lines;
+    int decode_as_ascii;
+    int tag_stack_dump;
+    int tag_call_trace;
+    int all_vcpus;
+#ifndef NO_TRANSLATION
Quoted 8 lines

tools/xentrace/xenctx.c typedef uint64_t guest_word_t; · line 79

Quoted 7 lines
tools/xentrace/xenctx.c +7 -0
+    guest_word_t mem_addr;
+    int do_memory;
+#endif
+    int self_paused;
+    xc_dominfo_t dominfo;
+} xenctx;
+

This motion seems to be unmotivated by the commit message.

I will add the reason to the commit message:

Moved xenctx because guest_word_t is not defined where it was.

Quoted 3 lines

(I've no idea why there is a struct for this stuff anyway, even though there is a good chance I added it, it could just as easily be globals in a program of this sort)

I just went with what was there...

Quoted 10 lines

tools/xentrace/xenctx.c static void usage(void) · line 1021

Quoted 9 lines
tools/xentrace/xenctx.c +0 -0
  int main(int argc, char **argv)
  {
      int ch;
      int ret;
tools/xentrace/xenctx.c +4 -0
+#ifndef NO_TRANSLATION
+    static const char *sopts = "fs:hak:SCn:b:l:DtTm:";
+#else
      static const char *sopts = "fs:hak:SCn:b:l:DtT";
+#endif

static const char *sopts = "fs:hak:SCn:b:l:DtT"

Quoted 4 lines
#ifdef ....
				"m:"
#endif
	;

This is the way it use to be:

#ifdef __ia64__
        "r:"

#endif

Quoted 9 lines

Or something to avoid that massive repetition. Another possibility:

#ifndef NO_TRANSLATION
#define TRANSLATION_OPTS "m:"
#else
#define TRANSLATION_OPTS

#endif
		sopts = "fs:....." TRANS...._OPTS

I am planning on the following the old way (i.e. no new TRANSLATION_OPTS define).

-Don Slutz

Quoted 3 lines

Ian.

author
#33 lore raw

PATCH v5 11/17 xenctx: Add -d (--dump-as-stack) <daddr> option to dump memory at daddr as a stack.

In reply to Don Slutz

Also switch from read_stack_word to read_mem_word since the provided address may not be aligned.

---
 tools/xentrace/xenctx.c | 73 +++++++++++++++++++++++++++++++++++--------------
 1 file changed, 53 insertions(+), 20 deletions(-)
tools/xentrace/xenctx.c +53 -20
index 13f56ed..f77f17e 100644
@@ -71,7 +71,9 @@ static struct xenctx {
     int all_vcpus;
 #ifndef NO_TRANSLATION
     guest_word_t mem_addr;
+    guest_word_t stk_addr;
     int do_memory;
+    int do_stack;
 #endif
     int self_paused;
     xc_dominfo_t dominfo;
@@ -765,15 +767,13 @@ static int print_code(vcpu_guest_context_any_t *ctx, int vcpu)
         else
             printf("%02x ", *c);
     }
-    printf("\n");
-
-    printf("\n");
+    printf("\n\n\n");
     return 0;
 }
 
-static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width)
+static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width, guest_word_t stk_addr_start)
 {
-    guest_word_t stack = stack_pointer(ctx);
+    guest_word_t stack = stk_addr_start;
     guest_word_t stack_limit;
     guest_word_t frame;
     guest_word_t word;
@@ -781,11 +781,10 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width)
 
     if ( width )
         xenctx.bytes_per_line = ((xenctx.bytes_per_line + width - 1) / width) * width;
-    stack_limit = ((stack_pointer(ctx) + XC_PAGE_SIZE)
+    stack_limit = ((stack + XC_PAGE_SIZE)
                    & ~((guest_word_t) XC_PAGE_SIZE - 1));
     if ( xenctx.multiple_pages > 1 )
         stack_limit += (xenctx.multiple_pages - 1) * XC_PAGE_SIZE;
-    printf("\n");
     if ( xenctx.lines )
     {
         printf("Stack:\n");
@@ -797,14 +796,17 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width)
         printf("Stack Trace:\n");
     else
         printf("Call Trace:\n");
-    if ( xenctx.tag_call_trace )
-        printf(" %*s", width*2, "");
-    printf("%c [<", xenctx.stack_trace ? '*' : ' ');
-    print_stack_word(instr_pointer(ctx), width);
-    printf(">]");
-
-    print_symbol(instr_pointer(ctx));
-    printf(" <--\n");
+    if ( !xenctx.do_stack )
+    {
+        if ( xenctx.tag_call_trace )
+            printf(" %*s", width*2, "");
+        printf("%c [<", xenctx.stack_trace ? '*' : ' ');
+        print_stack_word(instr_pointer(ctx), width);
+        printf(">]");
+
+        print_symbol(instr_pointer(ctx));
+        printf(" <--\n");
+    }
     if (xenctx.frame_ptrs) {
         stack = stack_pointer(ctx);
         frame = frame_pointer(ctx);
@@ -866,12 +868,12 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width)
             }
         }
     } else {
-        stack = stack_pointer(ctx);
+        stack = stk_addr_start;
         while(stack < stack_limit) {
             p = map_page(ctx, vcpu, stack);
             if (!p)
                 return -1;
-            word = read_stack_word(p, width);
+            word = read_mem_word(ctx, vcpu, stack, width);
             if (is_kernel_text(word)) {
                 if ( xenctx.tag_call_trace )
                 {
@@ -944,13 +946,19 @@ static void dump_ctx(int vcpu)
         print_mem(&ctx, vcpu, guest_word_size, xenctx.mem_addr);
         return;
     }
+    if ( xenctx.do_stack )
+    {
+        print_stack(&ctx, vcpu, guest_word_size, xenctx.stk_addr);
+        return;
+    }
 #endif
     print_ctx(&ctx);
 #ifndef NO_TRANSLATION
     if (print_code(&ctx, vcpu))
         return;
     if (is_kernel_text(instr_pointer(&ctx)))
-        if (print_stack(&ctx, vcpu, guest_word_size))
+        if ( print_stack(&ctx, vcpu, guest_word_size,
+                         stack_pointer(&ctx)) )
             return;
 #endif
 }
@@ -1007,6 +1015,8 @@ static void usage(void)
 #ifndef NO_TRANSLATION
     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");
 #endif
 }
 
@@ -1015,7 +1025,7 @@ int main(int argc, char **argv)
     int ch;
     int ret;
 #ifndef NO_TRANSLATION
-    static const char *sopts = "fs:hak:SCn:b:l:DtTm:";
+    static const char *sopts = "fs:hak:SCn:b:l:DtTm:d:";
 #else
     static const char *sopts = "fs:hak:SCn:b:l:DtT";
 #endif
@@ -1030,6 +1040,7 @@ int main(int argc, char **argv)
         {"tag-trace", 0, NULL, 'T'},
 #ifndef NO_TRANSLATION
         {"memory", 1, NULL, 'm'},
+        {"dump-as-stack", 1, NULL, 'd'},
 #endif
         {"bytes-per-line", 1, NULL, 'b'},
         {"lines", 1, NULL, 'l'},
@@ -1110,6 +1121,11 @@ int main(int argc, char **argv)
             xenctx.do_memory = 1;
             do_default = 0;
             break;
+        case 'd':
+            xenctx.stk_addr = strtoull(optarg, NULL, 0);
+            xenctx.do_stack = 1;
+            do_default = 0;
+            break;
 #endif
         case 'h':
             usage();
@@ -1127,6 +1143,16 @@ int main(int argc, char **argv)
         exit(-1);
     }
 
+#ifndef NO_TRANSLATION
+    if ( xenctx.frame_ptrs && xenctx.do_stack )
+    {
+        fprintf(stderr,
+                "%s both --frame-pointers and --dump-as-stack is not supported\n",
+                argv[0]);
+        exit(-1);
+    }
+#endif
+
     xenctx.domid = atoi(argv[0]);
     if (xenctx.domid==0) {
             fprintf(stderr, "cannot trace dom0\n");
@@ -1164,10 +1190,17 @@ int main(int argc, char **argv)
     if ( xenctx.do_memory )
     {
         dump_ctx(vcpu);
-        if (xenctx.all_vcpus)
+        if ( xenctx.do_stack || xenctx.all_vcpus )
             printf("\n");
     }
     xenctx.do_memory = 0;
+    if ( xenctx.do_stack )
+    {
+        dump_ctx(vcpu);
+        if ( xenctx.all_vcpus )
+            printf("\n");
+    }
+    xenctx.do_stack = 0;
 #endif
     if (xenctx.all_vcpus)
         dump_all_vcpus();
Signature · 1 line
1.8.4
#34 lore raw

Re: [PATCH v5 11/17] xenctx: Add -d (--dump-as-stack) <daddr> option to dump memory at daddr as a stack.

tools/xentrace/xenctx.c static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width) · line 799

Quoted 13 lines · Don Slutz
tools/xentrace/xenctx.c +1 -8
@@ -797,14 +796,17 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width)
         printf("Stack Trace:\n");
     else
         printf("Call Trace:\n");
-    if ( xenctx.tag_call_trace )
-        printf(" %*s", width*2, "");
-    printf("%c [<", xenctx.stack_trace ? '*' : ' ');
-    print_stack_word(instr_pointer(ctx), width);
-    printf(">]");
-
-    print_symbol(instr_pointer(ctx));
-    printf(" <--\n");
+    if ( !xenctx.do_stack )

Why not?

Quoted 14 lines
tools/xentrace/xenctx.c +10 -0
+    {
+        if ( xenctx.tag_call_trace )
+            printf(" %*s", width*2, "");
+        printf("%c [<", xenctx.stack_trace ? '*' : ' ');
+        print_stack_word(instr_pointer(ctx), width);
+        printf(">]");
+
+        print_symbol(instr_pointer(ctx));
+        printf(" <--\n");
+    }
     if (xenctx.frame_ptrs) {
         stack = stack_pointer(ctx);
         frame = frame_pointer(ctx);

tools/xentrace/xenctx.c static void dump_ctx(int vcpu) · line 953

Quoted 8 lines
tools/xentrace/xenctx.c +5 -0
@@ -944,13 +946,19 @@ static void dump_ctx(int vcpu)
         print_mem(&ctx, vcpu, guest_word_size, xenctx.mem_addr);
         return;
     }
+    if ( xenctx.do_stack )
+    {
+        print_stack(&ctx, vcpu, guest_word_size, xenctx.stk_addr);
+        return;
+    }

It's starting to seem like print_mem and print_stack should be called from main instead of here. In other words actually have multiple modes instead of stuffing things in as special cases here.

tools/xentrace/xenctx.c int main(int argc, char **argv) · line 1125

Quoted 7 lines
tools/xentrace/xenctx.c +2 -0
 ,
@@ -1110,6 +1121,11 @@ int main(int argc, char **argv)
             xenctx.do_memory = 1;
             do_default = 0;
             break;
+        case 'd':
+            xenctx.stk_addr = strtoull(optarg, NULL, 0);

You can reuse mem_addr here, can't you?

author
#35 lore raw

Re: [PATCH v5 11/17] xenctx: Add -d (--dump-as-stack) <daddr> option to dump memory at daddr as a stack.

Quoted 15 lines · Ian Campbell

tools/xentrace/xenctx.c static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width) · line 799

Quoted 13 lines · Don Slutz
tools/xentrace/xenctx.c +1 -8
@@ -797,14 +796,17 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width)
          printf("Stack Trace:\n");
      else
          printf("Call Trace:\n");
-    if ( xenctx.tag_call_trace )
-        printf(" %*s", width*2, "");
-    printf("%c [<", xenctx.stack_trace ? '*' : ' ');
-    print_stack_word(instr_pointer(ctx), width);
-    printf(">]");
-
-    print_symbol(instr_pointer(ctx));
-    printf(" <--\n");
+    if ( !xenctx.do_stack )

Why not?

This code output's rip (instr_pointer(ctx)) which does not apply in this case.

Quoted 17 lines
Quoted 17 lines
tools/xentrace/xenctx.c +10 -0
+    {
+        if ( xenctx.tag_call_trace )
+            printf(" %*s", width*2, "");
+        printf("%c [<", xenctx.stack_trace ? '*' : ' ');
+        print_stack_word(instr_pointer(ctx), width);
+        printf(">]");
+
+        print_symbol(instr_pointer(ctx));
+        printf(" <--\n");
+    }
      if (xenctx.frame_ptrs) {
          stack = stack_pointer(ctx);
          frame = frame_pointer(ctx);
@@ -944,13 +946,19 @@ static void dump_ctx(int vcpu)
          print_mem(&ctx, vcpu, guest_word_size, xenctx.mem_addr);
          return;
      }
Quoted 8 lines

tools/xentrace/xenctx.c static void dump_ctx(int vcpu) · line 953

Quoted 5 lines
tools/xentrace/xenctx.c +5 -0
+    if ( xenctx.do_stack )
+    {
+        print_stack(&ctx, vcpu, guest_word_size, xenctx.stk_addr);
+        return;
+    }

It's starting to seem like print_mem and print_stack should be called from main instead of here. In other words actually have multiple modes instead of tuffing things in as special cases here.

The issue is that ctx (vcpu_guest_context_any_t) does not exist in main and is needed by map_page() (called from these).

dump_ctx() is the routine that gets this and guest_word_size, guest_protected_mode, and ctxt_word_size.

And so yes, this part of dump_ctx() could be moved to main and/or ctx could be made global.

Let me know if I should rework all this.

Quoted 11 lines

tools/xentrace/xenctx.c int main(int argc, char **argv) · line 1125

Quoted 7 lines
tools/xentrace/xenctx.c +2 -0
 ,
@@ -1110,6 +1121,11 @@ int main(int argc, char **argv)
              xenctx.do_memory = 1;
              do_default = 0;
              break;
+        case 'd':
+            xenctx.stk_addr = strtoull(optarg, NULL, 0);

You can reuse mem_addr here, can't you?

Nope. If both -d and -m are specified, then both are done.

-Don Slutz

#36 lore raw

Re: [PATCH v5 11/17] xenctx: Add -d (--dump-as-stack) <daddr> option to dump memory at daddr as a stack.

Quoted 9 lines · Don Slutz
Quoted 3 lines · Ian Campbell

It's starting to seem like print_mem and print_stack should be called from main instead of here. In other words actually have multiple modes instead of tuffing things in as special cases here.

The issue is that ctx (vcpu_guest_context_any_t) does not exist in main and is needed by map_page() (called from these).

Quoted 7 lines

dump_ctx() is the routine that gets this and guest_word_size, guest_protected_mode, and ctxt_word_size.

And so yes, this part of dump_ctx() could be moved to main and/or ctx could be made global.

Let me know if I should rework all this.

It does sound like some refactoring might be in order. Lets get this series put to bed first though.

Quoted 11 lines
Quoted 11 lines

tools/xentrace/xenctx.c int main(int argc, char **argv) · line 1125

Quoted 7 lines

,

tools/xentrace/xenctx.c +2 -0
@@ -1110,6 +1121,11 @@ int main(int argc, char **argv)
              xenctx.do_memory = 1;
              do_default = 0;
              break;
+        case 'd':
+            xenctx.stk_addr = strtoull(optarg, NULL, 0);

You can reuse mem_addr here, can't you?

Quoted 1 line

Nope. If both -d and -m are specified, then both are done.

Is that useful?

author
#37 lore raw

Re: [PATCH v5 11/17] xenctx: Add -d (--dump-as-stack) <daddr> option to dump memory at daddr as a stack.

Quoted 11 lines · Ian Campbell
Quoted 10 lines · Don Slutz
Quoted 3 lines · Ian Campbell

It's starting to seem like print_mem and print_stack should be called from main instead of here. In other words actually have multiple modes instead of tuffing things in as special cases here.

The issue is that ctx (vcpu_guest_context_any_t) does not exist in main and is needed by map_page() (called from these).

dump_ctx() is the routine that gets this and guest_word_size, guest_protected_mode, and ctxt_word_size.

Quoted 6 lines
Quoted 4 lines

And so yes, this part of dump_ctx() could be moved to main and/or ctx could be made global.

Let me know if I should rework all this.

It does sound like some refactoring might be in order. Lets get this series put to bed first though.

Ok.

Quoted 12 lines
Quoted 12 lines
Quoted 12 lines

tools/xentrace/xenctx.c int main(int argc, char **argv) · line 1125

Quoted 8 lines

,

tools/xentrace/xenctx.c +2 -0
@@ -1110,6 +1121,11 @@ int main(int argc, char **argv)
               xenctx.do_memory = 1;
               do_default = 0;
               break;
+        case 'd':
+            xenctx.stk_addr = strtoull(optarg, NULL, 0);

You can reuse mem_addr here, can't you?

Quoted 4 lines
Quoted 1 line

Nope. If both -d and -m are specified, then both are done.

Is that useful?

Maybe. I did use it to show the difference between 16 bit and 32 bit output (also v8 stuff). Not clear I would ever use both.

-Don Slutz

#38 lore raw

Re: [PATCH v5 11/17] xenctx: Add -d (--dump-as-stack) <daddr> option to dump memory at daddr as a stack.

Quoted 9 lines · Don Slutz
Quoted 4 lines · Ian Campbell
Quoted 1 line

Nope. If both -d and -m are specified, then both are done.

Is that useful?

Maybe. I did use it to show the difference between 16 bit and 32 bit output (also v8 stuff). Not clear I would ever use both.

I don't suppose you fancy writing a manpage for this thing? There's a document day on Monday (</hint>).

Ian.

author
#39 lore raw

Re: [PATCH v5 11/17] xenctx: Add -d (--dump-as-stack) <daddr> option to dump memory at daddr as a stack.

Quoted 5 lines · Ian Campbell
Quoted 2 lines · Don Slutz

On 03/27/14 11:58, Ian Campbell wrote:

I don't suppose you fancy writing a manpage for this thing? There's a document day on Monday (</hint>).

I guess that can happen. As you can see by my commit messages (and e-maill responses), I am not the best at this.

-Don Slutz

Quoted 2 lines

Ian.

author
#40 lore raw

PATCH v5 12/17 xenctx: change is_kernel_text() into kernel_addr().

In reply to Don Slutz

A new enum has been added to allow the caller to determine if this kernel address is a text or data address. This is currenlty not used, but will be in the next patch.

---
 tools/xentrace/xenctx.c | 70 +++++++++++++++++++++++++++++++++++--------------
 1 file changed, 51 insertions(+), 19 deletions(-)
tools/xentrace/xenctx.c +51 -19
index f77f17e..c574996 100644
@@ -33,6 +33,15 @@
 #define DEFAULT_BYTES_PER_LINE 32
 #define DEFAULT_LINES 5
 
+/* Note: the order of these matter.
+ * NOT_KERNEL_ADDR must be < both KERNEL_DATA_ADDR and KERNEL_TEXT_ADDR.
+ * KERNEL_DATA_ADDR must be < KERNEL_TEXT_ADDR. */
+typedef enum type_of_addr_ {
+    NOT_KERNEL_ADDR,
+    KERNEL_DATA_ADDR,
+    KERNEL_TEXT_ADDR,
+} type_of_addr;
+
 #if defined (__i386__) || defined (__x86_64__)
 typedef unsigned long long guest_word_t;
 #define FMT_32B_WORD "%08llx"
@@ -75,6 +84,7 @@ static struct xenctx {
     int do_memory;
     int do_stack;
 #endif
+    int kernel_start_set;
     int self_paused;
     xc_dominfo_t dominfo;
 } xenctx;
@@ -86,6 +96,7 @@ struct symbol {
 } *symbol_table = NULL;
 
 guest_word_t kernel_stext, kernel_etext, kernel_sinittext, kernel_einittext, kernel_hypercallpage;
+guest_word_t kernel_text, kernel_end;
 
 #if defined (__i386__) || defined (__arm__)
 unsigned long long kernel_start = 0xc0000000;
@@ -95,22 +106,37 @@ unsigned long long kernel_start = 0xffffffff80000000UL;
 unsigned long long kernel_start = 0xffffff8000000000UL;
 #endif
 
-static int is_kernel_text(guest_word_t addr)
+static type_of_addr kernel_addr(guest_word_t addr)
 {
-    if (symbol_table == NULL)
-        return (addr > kernel_start);
+    if ( symbol_table == NULL )
+    {
+        if ( addr > kernel_start )
+            return KERNEL_TEXT_ADDR;
+        else
+            return NOT_KERNEL_ADDR;
+    }
 
     if (addr >= kernel_stext &&
         addr <= kernel_etext)
-        return 1;
+        return KERNEL_TEXT_ADDR;
     if ( kernel_hypercallpage &&
          (addr >= kernel_hypercallpage &&
           addr <= kernel_hypercallpage + 4096) )
-        return 1;
+        return KERNEL_TEXT_ADDR;
     if (addr >= kernel_sinittext &&
         addr <= kernel_einittext)
-        return 1;
-    return 0;
+        return KERNEL_TEXT_ADDR;
+    if ( xenctx.kernel_start_set )
+    {
+        if ( addr >= kernel_start &&
+             addr <= kernel_end )
+            return KERNEL_DATA_ADDR;
+    } else {
+        if ( addr >= kernel_text &&
+             addr <= kernel_end )
+            return KERNEL_DATA_ADDR;
+    }
+    return NOT_KERNEL_ADDR;
 }
 
 #if 0
@@ -164,11 +190,11 @@ static struct symbol *lookup_symbol(guest_word_t address)
     return s->next && s->next->address <= address ? s->next : s;
 }
 
-static void print_symbol(guest_word_t addr)
+static void print_symbol(guest_word_t addr, type_of_addr type)
 {
     struct symbol *s;
 
-    if (!is_kernel_text(addr))
+    if ( kernel_addr(addr) < type )
         return;
 
     s = lookup_symbol(addr);
@@ -248,6 +274,10 @@ static void read_symbol_table(const char *symtab)
             kernel_stext = address;
         else if (strcmp(p, "_etext") == 0)
             kernel_etext = address;
+        else if ( strcmp(p, "_text") == 0 )
+            kernel_text = address;
+        else if ( strcmp(p, "_end") == 0 )
+            kernel_end = address;
         else if (strcmp(p, "_sinittext") == 0)
             kernel_sinittext = address;
         else if (strcmp(p, "_einittext") == 0)
@@ -319,7 +349,7 @@ static void print_ctx_32(vcpu_guest_context_x86_32_t *ctx)
     struct cpu_user_regs_x86_32 *regs = &ctx->user_regs;
 
     printf("cs:eip: %04x:%08x", regs->cs, regs->eip);
-    print_symbol(regs->eip);
+    print_symbol(regs->eip, KERNEL_TEXT_ADDR);
     print_flags(regs->eflags);
     printf("ss:esp: %04x:%08x\n", regs->ss, regs->esp);
 
@@ -348,7 +378,7 @@ static void print_ctx_32on64(vcpu_guest_context_x86_64_t *ctx)
     struct cpu_user_regs_x86_64 *regs = &ctx->user_regs;
 
     printf("cs:eip: %04x:%08x", regs->cs, (uint32_t)regs->eip);
-    print_symbol((uint32_t)regs->eip);
+    print_symbol((uint32_t)regs->eip, KERNEL_TEXT_ADDR);
     print_flags((uint32_t)regs->eflags);
     printf("ss:esp: %04x:%08x\n", regs->ss, (uint32_t)regs->esp);
 
@@ -377,7 +407,7 @@ static void print_ctx_64(vcpu_guest_context_x86_64_t *ctx)
     struct cpu_user_regs_x86_64 *regs = &ctx->user_regs;
 
     printf("rip: %016"PRIx64, regs->rip);
-    print_symbol(regs->rip);
+    print_symbol(regs->rip, KERNEL_TEXT_ADDR);
     print_flags(regs->rflags);
     printf("rsp: %016"PRIx64"\n", regs->rsp);
 
@@ -475,7 +505,7 @@ static void print_ctx_32(vcpu_guest_context_t *ctx)
     vcpu_guest_core_regs_t *regs = &ctx->user_regs;
 
     printf("PC:       %08"PRIx32, regs->pc32);
-    print_symbol(regs->pc32);
+    print_symbol(regs->pc32, KERNEL_TEXT_ADDR);
     printf("\n");
     printf("CPSR:     %08"PRIx32"\n", regs->cpsr);
     printf("USR:               SP:%08"PRIx32" LR:%08"PRIx32"\n",
@@ -527,7 +557,7 @@ static void print_ctx_64(vcpu_guest_context_t *ctx)
     vcpu_guest_core_regs_t *regs = &ctx->user_regs;
 
     printf("PC:       %016"PRIx64, regs->pc64);
-    print_symbol(regs->pc64);
+    print_symbol(regs->pc64, KERNEL_TEXT_ADDR);
     printf("\n");
 
     printf("LR:       %016"PRIx64"\n", regs->x30);
@@ -804,7 +834,7 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width, guest
         print_stack_word(instr_pointer(ctx), width);
         printf(">]");
 
-        print_symbol(instr_pointer(ctx));
+        print_symbol(instr_pointer(ctx), KERNEL_TEXT_ADDR);
         printf(" <--\n");
     }
     if (xenctx.frame_ptrs) {
@@ -862,7 +892,7 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width, guest
                 }
                 print_stack_word(word, width);
                 printf(">]");
-                print_symbol(word);
+                print_symbol(word, KERNEL_TEXT_ADDR);
                 printf("\n");
                 stack += width;
             }
@@ -874,7 +904,8 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width, guest
             if (!p)
                 return -1;
             word = read_mem_word(ctx, vcpu, stack, width);
-            if (is_kernel_text(word)) {
+            if ( kernel_addr(word) >= KERNEL_TEXT_ADDR )
+            {
                 if ( xenctx.tag_call_trace )
                 {
                     print_stack_word(stack, width);
@@ -884,7 +915,7 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width, guest
                 }
                 print_stack_word(word, width);
                 printf(">]");
-                print_symbol(word);
+                print_symbol(word, KERNEL_TEXT_ADDR);
                 printf("\n");
             } else if (xenctx.stack_trace) {
                 if ( xenctx.tag_call_trace )
@@ -956,7 +987,7 @@ static void dump_ctx(int vcpu)
 #ifndef NO_TRANSLATION
     if (print_code(&ctx, vcpu))
         return;
-    if (is_kernel_text(instr_pointer(&ctx)))
+    if ( kernel_addr(instr_pointer(&ctx)) >= KERNEL_TEXT_ADDR )
         if ( print_stack(&ctx, vcpu, guest_word_size,
                          stack_pointer(&ctx)) )
             return;
@@ -1114,6 +1145,7 @@ int main(int argc, char **argv)
             break;
         case 'k':
             kernel_start = strtoull(optarg, NULL, 0);
+            xenctx.kernel_start_set = 1;
             break;
 #ifndef NO_TRANSLATION
         case 'm':
Signature · 1 line
1.8.4
#41 lore raw

Re: [PATCH v5 12/17] xenctx: change is_kernel_text() into kernel_addr().

Quoted 14 lines · Don Slutz

A new enum has been added to allow the caller to determine if this kernel address is a text or data address. This is currenlty not used, but will be in the next patch.

---
 tools/xentrace/xenctx.c | 70 +++++++++++++++++++++++++++++++++++--------------
 1 file changed, 51 insertions(+), 19 deletions(-)
tools/xentrace/xenctx.c +0 -0
index f77f17e..c574996 100644

tools/xentrace/xenctx.c line 40

Quoted 8 lines
tools/xentrace/xenctx.c +5 -0
@@ -33,6 +33,15 @@
 #define DEFAULT_BYTES_PER_LINE 32
 #define DEFAULT_LINES 5
 
+/* Note: the order of these matter.
+ * NOT_KERNEL_ADDR must be < both KERNEL_DATA_ADDR and KERNEL_TEXT_ADDR.
+ * KERNEL_DATA_ADDR must be < KERNEL_TEXT_ADDR. */
+typedef enum type_of_addr_ {
+    NOT_KERNEL_ADDR,

AKA a User Address?

author
#42 lore raw

Re: [PATCH v5 12/17] xenctx: change is_kernel_text() into kernel_addr().

Quoted 18 lines · Ian Campbell
Quoted 17 lines · Don Slutz

A new enum has been added to allow the caller to determine if this kernel address is a text or data address. This is currenlty not used, but will be in the next patch.

---
  tools/xentrace/xenctx.c | 70 +++++++++++++++++++++++++++++++++++--------------
  1 file changed, 51 insertions(+), 19 deletions(-)
tools/xentrace/xenctx.c +0 -0
index f77f17e..c574996 100644
@@ -33,6 +33,15 @@
  #define DEFAULT_BYTES_PER_LINE 32
  #define DEFAULT_LINES 5
 
Quoted 8 lines

tools/xentrace/xenctx.c line 40

Quoted 5 lines
tools/xentrace/xenctx.c +5 -0
+/* Note: the order of these matter.
+ * NOT_KERNEL_ADDR must be < both KERNEL_DATA_ADDR and KERNEL_TEXT_ADDR.
+ * KERNEL_DATA_ADDR must be < KERNEL_TEXT_ADDR. */
+typedef enum type_of_addr_ {
+    NOT_KERNEL_ADDR,

AKA a User Address?

Yes.
-Don Slutz

author
#43 lore raw

Re: [PATCH v5 12/17] xenctx: change is_kernel_text() into kernel_addr().

Quoted 28 lines · Don Slutz
Quoted 10 lines · Ian Campbell
Quoted 9 lines · Don Slutz

A new enum has been added to allow the caller to determine if this kernel address is a text or data address. This is currenlty not used, but will be in the next patch.

---
  tools/xentrace/xenctx.c | 70 +++++++++++++++++++++++++++++++++++--------------
  1 file changed, 51 insertions(+), 19 deletions(-)
Quoted 15 lines

tools/xentrace/xenctx.c line 39

Quoted 12 lines
tools/xentrace/xenctx.c +4 -0
index f77f17e..c574996 100644
@@ -33,6 +33,15 @@
  #define DEFAULT_BYTES_PER_LINE 32
  #define DEFAULT_LINES 5
  +/* Note: the order of these matter.
+ * NOT_KERNEL_ADDR must be < both KERNEL_DATA_ADDR and KERNEL_TEXT_ADDR.
+ * KERNEL_DATA_ADDR must be < KERNEL_TEXT_ADDR. */
+typedef enum type_of_addr_ {
+    NOT_KERNEL_ADDR,

AKA a User Address?

Quoted 3 lines

Yes.
-Don Slutz

I have now found out this is not correct. kernel module addresses are also NOT_KERNEL_ADDR. Not sure what needs to be done here. Also turn out that:

ffffffffff600000 T vgettimeofday
ffffffffff60000f t vsysc2
ffffffffff600180 D __xtime_lock
ffffffffff600190 D __vxtime
ffffffffff6001c0 D __vgetcpu_mode
ffffffffff6001d0 D __wall_jiffies
ffffffffff6001e0 D __sys_tz
ffffffffff6001f0 D __sysctl_vsyscall
ffffffffff600200 D __xtime
ffffffffff600280 D __jiffies
ffffffffff600400 T vtime
ffffffffff60040e t vsysc1
ffffffffff600800 T vgetcpu
ffffffffff600c00 T venosys_1

will not be matched. Not sure what is the right thing to do here.

-Don Slutz

#44 lore raw

Re: [PATCH v5 12/17] xenctx: change is_kernel_text() into kernel_addr().

Quoted 18 lines
Quoted 1 line
Quoted 1 line · On 24.03.14 at 23:23, <[email protected]> wrote:

Also turn out that:

ffffffffff600000 T vgettimeofday
ffffffffff60000f t vsysc2
ffffffffff600180 D __xtime_lock
ffffffffff600190 D __vxtime
ffffffffff6001c0 D __vgetcpu_mode
ffffffffff6001d0 D __wall_jiffies
ffffffffff6001e0 D __sys_tz
ffffffffff6001f0 D __sysctl_vsyscall
ffffffffff600200 D __xtime
ffffffffff600280 D __jiffies
ffffffffff600400 T vtime
ffffffffff60040e t vsysc1
ffffffffff600800 T vgetcpu
ffffffffff600c00 T venosys_1

Quoted 1 line

will not be matched. Not sure what is the right thing to do here.

These aren't really kernel addresses, i.e. you wouldn't want them recognized as such in kernel stack dumps.

Jan

#45 lore raw

Re: [PATCH v5 12/17] xenctx: change is_kernel_text() into kernel_addr().

In reply to Don Slutz
Quoted 2 lines · Don Slutz

I have now found out this is not correct. kernel module addresses are also NOT_KERNEL_ADDR. Not sure what needs to be done here.

There probably isn't that much you can do without a great deal more introspection into the guest kernel, including kernel specific knowledge.

Ian.

author
#46 lore raw

PATCH v5 13/17 xenctx: Add convert of more registers to symbols

In reply to Don Slutz

For example can change:
gs: 0000 @ ffffffff803ac000/0000000000000000
to
gs: 0000 @ ffffffff803ac000/0000000000000000 boot_cpu_pda/

---
v5: Add reg_is_addr_mask.

 tools/xentrace/xenctx.c | 53 ++++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 41 insertions(+), 12 deletions(-)
tools/xentrace/xenctx.c +41 -12
index c574996..5dfa7e6 100644
@@ -330,17 +330,29 @@ static void print_flags(uint64_t flags)
     printf("\n");
 }
 
-static void print_special(void *regs, const char *name, unsigned int mask, int width)
+static void print_special(void *regs, const char *name, unsigned int mask,
+                          uint64_t reg_is_addr_mask[], int width)
 {
     unsigned int i;
 
     printf("\n");
     for (i = 0; mask; mask >>= 1, ++i)
         if (mask & 1) {
-            if (width == 4)
-                printf("%s%u: %08"PRIx32"\n", name, i, ((uint32_t *) regs)[i]);
+            if ( width == 4 )
+            {
+                printf("%s%u: %08"PRIx32, name, i, ((uint32_t *) regs)[i]);
+                if ( reg_is_addr_mask[i] )
+                    print_symbol(reg_is_addr_mask[i] & ((uint32_t *) regs)[i],
+                                 KERNEL_DATA_ADDR);
+            }
             else
-                printf("%s%u: %08"PRIx64"\n", name, i, ((uint64_t *) regs)[i]);
+            {
+                printf("%s%u: %016"PRIx64, name, i, ((uint64_t *) regs)[i]);
+                if ( reg_is_addr_mask[i] )
+                    print_symbol(reg_is_addr_mask[i] & ((uint64_t *) regs)[i],
+                                 KERNEL_DATA_ADDR);
+            }
+            printf("\n");
         }
 }
 
@@ -368,8 +380,11 @@ static void print_ctx_32(vcpu_guest_context_x86_32_t *ctx)
     printf(" gs:     %04x\n", regs->gs);
 
     if (xenctx.disp_all) {
-        print_special(ctx->ctrlreg, "cr", 0x1d, 4);
-        print_special(ctx->debugreg, "dr", 0xcf, 4);
+        uint64_t cr_reg_mask[5] = {0, 0, ~0ULL};
+        uint64_t dr_reg_mask[8] = {~0ULL, ~0ULL, ~0ULL, ~0ULL};
+
+        print_special(ctx->ctrlreg, "cr", 0x1d, cr_reg_mask, 4);
+        print_special(ctx->debugreg, "dr", 0xcf, dr_reg_mask, 4);
     }
 }
 
@@ -397,8 +412,11 @@ static void print_ctx_32on64(vcpu_guest_context_x86_64_t *ctx)
     printf(" gs:     %04x\n", regs->gs);
 
     if (xenctx.disp_all) {
-        print_special(ctx->ctrlreg, "cr", 0x1d, 4);
-        print_special(ctx->debugreg, "dr", 0xcf, 4);
+        uint64_t cr_reg_mask[5] = {0, 0, ~0ULL};
+        uint64_t dr_reg_mask[8] = {~0ULL, ~0ULL, ~0ULL, ~0ULL};
+
+        print_special(ctx->ctrlreg, "cr", 0x1d, cr_reg_mask, 4);
+        print_special(ctx->debugreg, "dr", 0xcf, dr_reg_mask, 4);
     }
 }
 
@@ -436,13 +454,24 @@ static void print_ctx_64(vcpu_guest_context_x86_64_t *ctx)
     printf(" ds: %04x\t", regs->ds);
     printf(" es: %04x\n", regs->es);
 
-    printf(" fs: %04x @ %016"PRIx64"\n", regs->fs, ctx->fs_base);
-    printf(" gs: %04x @ %016"PRIx64"/%016"PRIx64"\n", regs->gs,
+    printf(" fs: %04x @ %016"PRIx64, regs->fs, ctx->fs_base);
+    print_symbol(ctx->fs_base, KERNEL_DATA_ADDR);
+    printf("\n");
+    printf(" gs: %04x @ %016"PRIx64"/%016"PRIx64, regs->gs,
            ctx->gs_base_kernel, ctx->gs_base_user);
+    if (symbol_table) {
+        print_symbol(ctx->gs_base_kernel, KERNEL_DATA_ADDR);
+        printf("/");
+        print_symbol(ctx->gs_base_user, KERNEL_DATA_ADDR);
+    }
+    printf("\n");
 
     if (xenctx.disp_all) {
-        print_special(ctx->ctrlreg, "cr", 0x1d, 8);
-        print_special(ctx->debugreg, "dr", 0xcf, 8);
+        uint64_t cr_reg_mask[5] = {0, 0, ~0ULL};
+        uint64_t dr_reg_mask[8] = {~0ULL, ~0ULL, ~0ULL, ~0ULL};
+
+        print_special(ctx->ctrlreg, "cr", 0x1d, cr_reg_mask, 8);
+        print_special(ctx->debugreg, "dr", 0xcf, dr_reg_mask, 8);
     }
 }
 
Signature · 1 line
1.8.4
#47 lore raw

Re: [PATCH v5 13/17] xenctx: Add convert of more registers to symbols

tools/xentrace/xenctx.c static void print_ctx_32(vcpu_guest_context_x86_32_t *ctx) · line 384

Quoted 9 lines
Quoted 1 line
Quoted 1 line · Don Slutz
tools/xentrace/xenctx.c +2 -2
@@ -368,8 +380,11 @@ static void print_ctx_32(vcpu_guest_context_x86_32_t *ctx)
     printf(" gs:     %04x\n", regs->gs);
 
     if (xenctx.disp_all) {
-        print_special(ctx->ctrlreg, "cr", 0x1d, 4);
-        print_special(ctx->debugreg, "dr", 0xcf, 4);
+        uint64_t cr_reg_mask[5] = {0, 0, ~0ULL};
+        uint64_t dr_reg_mask[8] = {~0ULL, ~0ULL, ~0ULL, ~0ULL};

So you've got a total of three of those. Why can't they be static const at file scope, and be used in all three places?

Also, using C99 (available as gcc extension) here may make this a bit more legible:

static const uint64_t cr_reg_mask[5] = { [2] = ~UINT64_C(0) }; static const uint64_t dr_reg_mask[8] = { [0 ... 3] = ~UINT64_C(0) };

Jan

author
#48 lore raw

Re: [PATCH v5 13/17] xenctx: Add convert of more registers to symbols

Quoted 11 lines · Jan Beulich

tools/xentrace/xenctx.c static void print_ctx_32(vcpu_guest_context_x86_32_t *ctx) · line 384

Quoted 9 lines
Quoted 1 line
Quoted 1 line · Don Slutz
tools/xentrace/xenctx.c +2 -2
@@ -368,8 +380,11 @@ static void print_ctx_32(vcpu_guest_context_x86_32_t *ctx)
      printf(" gs:     %04x\n", regs->gs);
 
      if (xenctx.disp_all) {
-        print_special(ctx->ctrlreg, "cr", 0x1d, 4);
-        print_special(ctx->debugreg, "dr", 0xcf, 4);
+        uint64_t cr_reg_mask[5] = {0, 0, ~0ULL};
+        uint64_t dr_reg_mask[8] = {~0ULL, ~0ULL, ~0ULL, ~0ULL};

So you've got a total of three of those. Why can't they be static const at file scope, and be used in all three places?

Looks like they can.

Quoted 5 lines

Also, using C99 (available as gcc extension) here may make this a bit more legible:

static const uint64_t cr_reg_mask[5] = { [2] = ~UINT64_C(0) }; static const uint64_t dr_reg_mask[8] = { [0 ... 3] = ~UINT64_C(0) };

Will test that it works on CentOS 5.10 and a send a v6 of just this.

-Don Slutz

Quoted 2 lines

Jan

author
#49 lore raw

PATCH v6 13/17 xenctx: Add convert of more registers to symbols

Quoted 8 lines · Don Slutz
Quoted 1 line · Jan Beulich

Looks like they can.

Quoted 3 lines

Also, using C99 (available as gcc extension) here may make this a bit more legible:

Quoted 10 lines
Quoted 2 lines

static const uint64_t cr_reg_mask[5] = { [2] = ~UINT64_C(0) }; static const uint64_t dr_reg_mask[8] = { [0 ... 3] = ~UINT64_C(0) };

Will test that it works on CentOS 5.10 and a send a v6 of just this.

-Don Slutz

Quoted 2 lines

Jan

Here is v6:

From e418d907d55cdb5361879bbaea0c2b96443df846 Mon Sep 17 00:00:00 2001
From: Don Slutz <[email protected]>
Date: Sat, 9 Nov 2013 20:32:40 -0500
Subject: [PATCH 13/17] xenctx: Add convert of more registers to symbols

For example can change:
gs: 0000 @ ffffffff803ac000/0000000000000000
to
gs: 0000 @ ffffffff803ac000/0000000000000000 boot_cpu_pda/

---
 tools/xentrace/xenctx.c | 47 
+++++++++++++++++++++++++++++++++++------------
 1 file changed, 35 insertions(+), 12 deletions(-)
tools/xentrace/xenctx.c +35 -12
index c574996..88dcaf7 100644
@@ -106,6 +106,9 @@ unsigned long long kernel_start = 0xffffffff80000000UL;
 unsigned long long kernel_start = 0xffffff8000000000UL;
 #endif
 
+static const uint64_t cr_reg_mask[5] = { [2] = ~UINT64_C(0) };
+static const uint64_t dr_reg_mask[8] = { [0 ... 3] = ~UINT64_C(0) };
+
 static type_of_addr kernel_addr(guest_word_t addr)
 {
     if ( symbol_table == NULL )
@@ -330,17 +333,29 @@ static void print_flags(uint64_t flags)
     printf("\n");
 }
 
-static void print_special(void *regs, const char *name, unsigned int mask, int width)
+static void print_special(void *regs, const char *name, unsigned int mask,
+                          const uint64_t reg_is_addr_mask[], int width)
 {
     unsigned int i;
 
     printf("\n");
     for (i = 0; mask; mask >>= 1, ++i)
         if (mask & 1) {
-            if (width == 4)
-                printf("%s%u: %08"PRIx32"\n", name, i, ((uint32_t *) regs)[i]);
+            if ( width == 4 )
+            {
+                printf("%s%u: %08"PRIx32, name, i, ((uint32_t *) regs)[i]);
+                if ( reg_is_addr_mask[i] )
+                    print_symbol(reg_is_addr_mask[i] & ((uint32_t *) regs)[i],
+                                 KERNEL_DATA_ADDR);
+            }
             else
-                printf("%s%u: %08"PRIx64"\n", name, i, ((uint64_t *) regs)[i]);
+            {
+                printf("%s%u: %016"PRIx64, name, i, ((uint64_t *) regs)[i]);
+                if ( reg_is_addr_mask[i] )
+                    print_symbol(reg_is_addr_mask[i] & ((uint64_t *) regs)[i],
+                                 KERNEL_DATA_ADDR);
+            }
+            printf("\n");
         }
 }
 
@@ -368,8 +383,8 @@ static void print_ctx_32(vcpu_guest_context_x86_32_t *ctx)
     printf(" gs:     %04x\n", regs->gs);
 
     if (xenctx.disp_all) {
-        print_special(ctx->ctrlreg, "cr", 0x1d, 4);
-        print_special(ctx->debugreg, "dr", 0xcf, 4);
+        print_special(ctx->ctrlreg, "cr", 0x1d, cr_reg_mask, 4);
+        print_special(ctx->debugreg, "dr", 0xcf, dr_reg_mask, 4);
     }
 }
 
@@ -397,8 +412,8 @@ static void print_ctx_32on64(vcpu_guest_context_x86_64_t *ctx)
     printf(" gs:     %04x\n", regs->gs);
 
     if (xenctx.disp_all) {
-        print_special(ctx->ctrlreg, "cr", 0x1d, 4);
-        print_special(ctx->debugreg, "dr", 0xcf, 4);
+        print_special(ctx->ctrlreg, "cr", 0x1d, cr_reg_mask, 4);
+        print_special(ctx->debugreg, "dr", 0xcf, dr_reg_mask, 4);
     }
 }
 
@@ -436,13 +451,21 @@ static void print_ctx_64(vcpu_guest_context_x86_64_t *ctx)
     printf(" ds: %04x\t", regs->ds);
     printf(" es: %04x\n", regs->es);
 
-    printf(" fs: %04x @ %016"PRIx64"\n", regs->fs, ctx->fs_base);
-    printf(" gs: %04x @ %016"PRIx64"/%016"PRIx64"\n", regs->gs,
+    printf(" fs: %04x @ %016"PRIx64, regs->fs, ctx->fs_base);
+    print_symbol(ctx->fs_base, KERNEL_DATA_ADDR);
+    printf("\n");
+    printf(" gs: %04x @ %016"PRIx64"/%016"PRIx64, regs->gs,
            ctx->gs_base_kernel, ctx->gs_base_user);
+    if (symbol_table) {
+        print_symbol(ctx->gs_base_kernel, KERNEL_DATA_ADDR);
+        printf("/");
+        print_symbol(ctx->gs_base_user, KERNEL_DATA_ADDR);
+    }
+    printf("\n");
 
     if (xenctx.disp_all) {
-        print_special(ctx->ctrlreg, "cr", 0x1d, 8);
-        print_special(ctx->debugreg, "dr", 0xcf, 8);
+        print_special(ctx->ctrlreg, "cr", 0x1d, cr_reg_mask, 8);
+        print_special(ctx->debugreg, "dr", 0xcf, dr_reg_mask, 8);
     }
 }
 
Signature · 3 lines
1.7.11.7

   -Don Slutz
Quoted 1 line

From e418d907d55cdb5361879bbaea0c2b96443df846 Mon Sep 17 00:00:00 2001

From: Don Slutz <[email protected]>
Date: Sat, 9 Nov 2013 20:32:40 -0500
Subject: [PATCH 13/17] xenctx: Add convert of more registers to symbols

For example can change:
gs: 0000 @ ffffffff803ac000/0000000000000000
to
gs: 0000 @ ffffffff803ac000/0000000000000000 boot_cpu_pda/

---
 tools/xentrace/xenctx.c | 47 +++++++++++++++++++++++++++++++++++------------
 1 file changed, 35 insertions(+), 12 deletions(-)
tools/xentrace/xenctx.c +35 -12

87 lines not on this page · raw message

Signature · 1 line
1.7.11.7

_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xen.org/xen-devel

#50 lore raw

Re: [PATCH v6 13/17] xenctx: Add convert of more registers to symbols

tools/xentrace/xenctx.c unsigned long long kernel_start = 0xffffffff80000000UL; · line 110

Quoted 9 lines
Quoted 1 line
Quoted 1 line · Don Slutz
tools/xentrace/xenctx.c +2 -0
@@ -106,6 +106,9 @@ unsigned long long kernel_start = 0xffffffff80000000UL;
  unsigned long long kernel_start = 0xffffff8000000000UL;
  #endif
 
+static const uint64_t cr_reg_mask[5] = { [2] = ~UINT64_C(0) };
+static const uint64_t dr_reg_mask[8] = { [0 ... 3] = ~UINT64_C(0) };

This should be in an x86-specific section (preferably be added to an existing one rather than adding yet another).

Also the patch came through line wrapped.

Jan

author
#51 lore raw

PATCH v7 13/17 xenctx: Add convert of more registers to symbols

Quoted 7 lines · Jan Beulich
Quoted 7 lines
Quoted 1 line
Quoted 1 line · Don Slutz
tools/xentrace/xenctx.c +0 -0
@@ -106,6 +106,9 @@ unsigned long long kernel_start = 0xffffffff80000000UL;
   unsigned long long kernel_start = 0xffffff8000000000UL;
   #endif
 
Quoted 9 lines

tools/xentrace/xenctx.c unsigned long long kernel_start = 0xffffffff80000000UL; · line 110

Quoted 2 lines
tools/xentrace/xenctx.c +2 -0
+static const uint64_t cr_reg_mask[5] = { [2] = ~UINT64_C(0) };
+static const uint64_t dr_reg_mask[8] = { [0 ... 3] = ~UINT64_C(0) };

This should be in an x86-specific section (preferably be added to an existing one rather than adding yet another).

Also the patch came through line wrapped.

Jan

Here is v7 with them moved (and hopefully not line wrapped):

From bc8a441b718e302128f59a53908a1c05afca8680 Mon Sep 17 00:00:00 2001
From: Don Slutz <[email protected]>
Date: Sat, 9 Nov 2013 20:32:40 -0500
Subject: [PATCH 13/17] xenctx: Add convert of more registers to symbols

For example can change:
gs: 0000 @ ffffffff803ac000/0000000000000000
to
gs: 0000 @ ffffffff803ac000/0000000000000000 boot_cpu_pda/

---
 tools/xentrace/xenctx.c | 46 
++++++++++++++++++++++++++++++++++------------
 1 file changed, 34 insertions(+), 12 deletions(-)
tools/xentrace/xenctx.c +34 -12
index c574996..e6e41b6 100644
@@ -43,6 +43,8 @@ typedef enum type_of_addr_ {
 } type_of_addr;
 
 #if defined (__i386__) || defined (__x86_64__)
+static const uint64_t cr_reg_mask[5] = { [2] = ~UINT64_C(0) };
+static const uint64_t dr_reg_mask[8] = { [0 ... 3] = ~UINT64_C(0) };
 typedef unsigned long long guest_word_t;
 #define FMT_32B_WORD "%08llx"
 #define FMT_64B_WORD "%016llx"
@@ -330,17 +332,29 @@ static void print_flags(uint64_t flags)
     printf("\n");
 }
 
-static void print_special(void *regs, const char *name, unsigned int mask, int width)
+static void print_special(void *regs, const char *name, unsigned int mask,
+                          const uint64_t reg_is_addr_mask[], int width)
 {
     unsigned int i;
 
     printf("\n");
     for (i = 0; mask; mask >>= 1, ++i)
         if (mask & 1) {
-            if (width == 4)
-                printf("%s%u: %08"PRIx32"\n", name, i, ((uint32_t *) regs)[i]);
+            if ( width == 4 )
+            {
+                printf("%s%u: %08"PRIx32, name, i, ((uint32_t *) regs)[i]);
+                if ( reg_is_addr_mask[i] )
+                    print_symbol(reg_is_addr_mask[i] & ((uint32_t *) regs)[i],
+                                 KERNEL_DATA_ADDR);
+            }
             else
-                printf("%s%u: %08"PRIx64"\n", name, i, ((uint64_t *) regs)[i]);
+            {
+                printf("%s%u: %016"PRIx64, name, i, ((uint64_t *) regs)[i]);
+                if ( reg_is_addr_mask[i] )
+                    print_symbol(reg_is_addr_mask[i] & ((uint64_t *) regs)[i],
+                                 KERNEL_DATA_ADDR);
+            }
+            printf("\n");
         }
 }
 
@@ -368,8 +382,8 @@ static void print_ctx_32(vcpu_guest_context_x86_32_t *ctx)
     printf(" gs:     %04x\n", regs->gs);
 
     if (xenctx.disp_all) {
-        print_special(ctx->ctrlreg, "cr", 0x1d, 4);
-        print_special(ctx->debugreg, "dr", 0xcf, 4);
+        print_special(ctx->ctrlreg, "cr", 0x1d, cr_reg_mask, 4);
+        print_special(ctx->debugreg, "dr", 0xcf, dr_reg_mask, 4);
     }
 }
 
@@ -397,8 +411,8 @@ static void print_ctx_32on64(vcpu_guest_context_x86_64_t *ctx)
     printf(" gs:     %04x\n", regs->gs);
 
     if (xenctx.disp_all) {
-        print_special(ctx->ctrlreg, "cr", 0x1d, 4);
-        print_special(ctx->debugreg, "dr", 0xcf, 4);
+        print_special(ctx->ctrlreg, "cr", 0x1d, cr_reg_mask, 4);
+        print_special(ctx->debugreg, "dr", 0xcf, dr_reg_mask, 4);
     }
 }
 
@@ -436,13 +450,21 @@ static void print_ctx_64(vcpu_guest_context_x86_64_t *ctx)
     printf(" ds: %04x\t", regs->ds);
     printf(" es: %04x\n", regs->es);
 
-    printf(" fs: %04x @ %016"PRIx64"\n", regs->fs, ctx->fs_base);
-    printf(" gs: %04x @ %016"PRIx64"/%016"PRIx64"\n", regs->gs,
+    printf(" fs: %04x @ %016"PRIx64, regs->fs, ctx->fs_base);
+    print_symbol(ctx->fs_base, KERNEL_DATA_ADDR);
+    printf("\n");
+    printf(" gs: %04x @ %016"PRIx64"/%016"PRIx64, regs->gs,
            ctx->gs_base_kernel, ctx->gs_base_user);
+    if (symbol_table) {
+        print_symbol(ctx->gs_base_kernel, KERNEL_DATA_ADDR);
+        printf("/");
+        print_symbol(ctx->gs_base_user, KERNEL_DATA_ADDR);
+    }
+    printf("\n");
 
     if (xenctx.disp_all) {
-        print_special(ctx->ctrlreg, "cr", 0x1d, 8);
-        print_special(ctx->debugreg, "dr", 0xcf, 8);
+        print_special(ctx->ctrlreg, "cr", 0x1d, cr_reg_mask, 8);
+        print_special(ctx->debugreg, "dr", 0xcf, dr_reg_mask, 8);
     }
 }
 
Signature · 5 lines
1.7.11.7


Attached also just in case.
    -Don Slutz
Quoted 1 line

From bc8a441b718e302128f59a53908a1c05afca8680 Mon Sep 17 00:00:00 2001

From: Don Slutz <[email protected]>
Date: Sat, 9 Nov 2013 20:32:40 -0500
Subject: [PATCH 13/17] xenctx: Add convert of more registers to symbols

For example can change:
gs: 0000 @ ffffffff803ac000/0000000000000000
to
gs: 0000 @ ffffffff803ac000/0000000000000000 boot_cpu_pda/

---
 tools/xentrace/xenctx.c | 46 ++++++++++++++++++++++++++++++++++------------
 1 file changed, 34 insertions(+), 12 deletions(-)
tools/xentrace/xenctx.c +34 -12

86 lines not on this page · raw message

Signature · 1 line
1.7.11.7

_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xen.org/xen-devel

#52 lore raw

Re: [PATCH v7 13/17] xenctx: Add convert of more registers to symbols

Quoted 1 line · Don Slutz

hopefully not line wrapped

Sorry, but it was.

I recommend git send-email --in-reply-to='<message-id>' --reroll-count=7 for these cases, which will thread it and hopefully be clear enough what it is without the precursor "here is v7 with X changed" since you will have incorporated that into the patch's changelog.

Ian.

#53 lore raw

Re: [PATCH v6 13/17] xenctx: Add convert of more registers to symbols

In reply to Don Slutz
Quoted 14 lines · Don Slutz
Quoted 13 lines · Don Slutz
Quoted 1 line · Jan Beulich

Looks like they can.

Quoted 5 lines

Also, using C99 (available as gcc extension) here may make this a bit more legible:

static const uint64_t cr_reg_mask[5] = { [2] = ~UINT64_C(0) }; static const uint64_t dr_reg_mask[8] = { [0 ... 3] = ~UINT64_C(0) };

Will test that it works on CentOS 5.10 and a send a v6 of just this.

Quoted 7 lines
Quoted 5 lines

-Don Slutz

Quoted 2 lines

Jan

Here is v6:

It's whitespace knackered I'm afraid.

author
#54 lore raw

Re: [PATCH v6 13/17] xenctx: Add convert of more registers to symbols

Quoted 10 lines · Ian Campbell
Quoted 9 lines · Don Slutz
Quoted 8 lines · Don Slutz

On 03/21/14 06:24, Jan Beulich wrote:
Looks like they can.

Quoted 5 lines

Also, using C99 (available as gcc extension) here may make this a bit more legible:

static const uint64_t cr_reg_mask[5] = { [2] = ~UINT64_C(0) }; static const uint64_t dr_reg_mask[8] = { [0 ... 3] = ~UINT64_C(0) };

Quoted 10 lines
Quoted 7 lines
Quoted 6 lines

Will test that it works on CentOS 5.10 and a send a v6 of just this.

-Don Slutz

Quoted 2 lines

Jan

Here is v6:

It's whitespace knackered I'm afraid.

Yup, thunderbird strikes again (or why I normally post patches via git-send-email).

-Don Slutz

#55 lore raw

Re: [PATCH v5 13/17] xenctx: Add convert of more registers to symbols

In reply to Don Slutz

tools/xentrace/xenctx.c static void print_ctx_32(vcpu_guest_context_x86_32_t *ctx) · line 384

Quoted 8 lines · Don Slutz
tools/xentrace/xenctx.c +2 -2
@@ -368,8 +380,11 @@ static void print_ctx_32(vcpu_guest_context_x86_32_t *ctx)
     printf(" gs:     %04x\n", regs->gs);
 
     if (xenctx.disp_all) {
-        print_special(ctx->ctrlreg, "cr", 0x1d, 4);
-        print_special(ctx->debugreg, "dr", 0xcf, 4);
+        uint64_t cr_reg_mask[5] = {0, 0, ~0ULL};
+        uint64_t dr_reg_mask[8] = {~0ULL, ~0ULL, ~0ULL, ~0ULL};

Are you really using 8*64 bits to represent 8 boolean values? Your masks are all 0 or ~0.

#56 lore raw

Re: [PATCH v5 13/17] xenctx: Add convert of more registers to symbols

Quoted 6 lines
Quoted 1 line
Quoted 1 line · Ian Campbell
Quoted 3 lines · Don Slutz
(quoted diff) +0 -0
@@ -368,8 +380,11 @@ static void print_ctx_32(vcpu_guest_context_x86_32_t *ctx)
     printf(" gs:     %04x\n", regs->gs);
 
Quoted 8 lines

tools/xentrace/xenctx.c static void print_ctx_32(vcpu_guest_context_x86_32_t *ctx) · line 384

Quoted 5 lines
tools/xentrace/xenctx.c +2 -2
     if (xenctx.disp_all) {
-        print_special(ctx->ctrlreg, "cr", 0x1d, 4);
-        print_special(ctx->debugreg, "dr", 0xcf, 4);
+        uint64_t cr_reg_mask[5] = {0, 0, ~0ULL};
+        uint64_t dr_reg_mask[8] = {~0ULL, ~0ULL, ~0ULL, ~0ULL};

Are you really using 8*64 bits to represent 8 boolean values? Your masks are all 0 or ~0.

Actually I had asked for this, since special registers may happen to have (often at their bottom or top) bits not being part of an address.

Jan

#57 lore raw

Re: [PATCH v5 13/17] xenctx: Add convert of more registers to symbols

Quoted 15 lines · Jan Beulich
Quoted 6 lines
Quoted 1 line
Quoted 1 line · Ian Campbell
Quoted 3 lines · Don Slutz
(quoted diff) +0 -0
@@ -368,8 +380,11 @@ static void print_ctx_32(vcpu_guest_context_x86_32_t *ctx)
     printf(" gs:     %04x\n", regs->gs);
 
Quoted 8 lines

tools/xentrace/xenctx.c static void print_ctx_32(vcpu_guest_context_x86_32_t *ctx) · line 384

Quoted 5 lines
tools/xentrace/xenctx.c +2 -2
     if (xenctx.disp_all) {
-        print_special(ctx->ctrlreg, "cr", 0x1d, 4);
-        print_special(ctx->debugreg, "dr", 0xcf, 4);
+        uint64_t cr_reg_mask[5] = {0, 0, ~0ULL};
+        uint64_t dr_reg_mask[8] = {~0ULL, ~0ULL, ~0ULL, ~0ULL};

Are you really using 8*64 bits to represent 8 boolean values? Your masks are all 0 or ~0.

Quoted 2 lines

Actually I had asked for this, since special registers may happen to have (often at their bottom or top) bits not being part of an address.

I thought that might be the case, but I couldn't find any actual printing of such a register.

Ian.

author
#58 lore raw

Re: [PATCH v5 13/17] xenctx: Add convert of more registers to symbols

Quoted 14 lines · Ian Campbell
Quoted 13 lines · Jan Beulich
Quoted 13 lines
Quoted 1 line
Quoted 1 line · Ian Campbell

tools/xentrace/xenctx.c static void print_ctx_32(vcpu_guest_context_x86_32_t *ctx) · line 384

Quoted 8 lines · Don Slutz
tools/xentrace/xenctx.c +2 -2
@@ -368,8 +380,11 @@ static void print_ctx_32(vcpu_guest_context_x86_32_t *ctx)
      printf(" gs:     %04x\n", regs->gs);
 
      if (xenctx.disp_all) {
-        print_special(ctx->ctrlreg, "cr", 0x1d, 4);
-        print_special(ctx->debugreg, "dr", 0xcf, 4);
+        uint64_t cr_reg_mask[5] = {0, 0, ~0ULL};
+        uint64_t dr_reg_mask[8] = {~0ULL, ~0ULL, ~0ULL, ~0ULL};

Are you really using 8*64 bits to represent 8 boolean values? Your masks are all 0 or ~0.

Quoted 7 lines
Quoted 2 lines

Actually I had asked for this, since special registers may happen to have (often at their bottom or top) bits not being part of an address.

I thought that might be the case, but I couldn't find any actual printing of such a register.

Ian.

Getting a kernel value there is not simple. Using a kdb + 2.6.18 kernel, I got:

rip: ffffffff8006bdd8 default_idle+0x29
flags: 00000246 i z p
rsp: ffffffff80467f90
rax: 0000000000000000 rcx: 0000000000000000 rdx: 0000000000000000
rbx: ffffffff8006bdaf rsi: 0000000000000001 rdi: ffffffff8031e738
rbp: 0000000000086800 r8: ffffffff80466000 r9: 000000000000003f
r10: ffff81003ffb4008 r11: 0000000000000246 r12: 0000000000000000
r13: 0000000000000000 r14: 0000000000000000 r15: 0000000000000000
cs: 0010 ss: 0018 ds: 0018 es: 0018
fs: 0000 @ 0000000000000000
gs: 0000 @ ffffffff80435000/0000000000000000 boot_cpu_pda/

cr0: 000000008005003b
cr2: 00002b1b311c0290
cr3: 0000000033692000
cr4: 00000000000006a0

dr0: ffffffff8006fb6d timer_interrupt+0x15
dr1: 0000000000000000
dr2: 0000000000000000
dr3: 0000000000000000
dr6: 00000000ffff0ff0
dr7: 0000000000000400
Code (instr addr ffffffff8006bdd8)
65 48 8b 04 25 10 00 00 00 8b 80 38 e0 ff ff a8 08 75 04 fb f4 <eb> 01 fb 65 48 8b 04 25 10 00 00

Stack:
 ffffffff8004958f 0000000000200800 ffffffff80471809 0000000000086800
 0000000000000000 ffffffff804c0740 ffffffff8047122f 80008e000010019c
 00000000ffffffff 0000000000000000 0000000000000000 0000000000200000
 0000000000000000 0000000000000000

Call Trace:
  [<ffffffff8006bdd8>] default_idle+0x29 <--
  [<ffffffff8004958f>] cpu_idle+0x95
  [<ffffffff80471809>] start_kernel+0x220
  [<ffffffff8047122f>] x86_64_start_kernel+0x22f

After leaving kdb and the hardware breakpoint disabled.

-Don Slutz

#59 lore raw

Re: [PATCH v5 13/17] xenctx: Add convert of more registers to symbols

Quoted 17 lines · Don Slutz
Quoted 16 lines · Ian Campbell
Quoted 15 lines · Jan Beulich
Quoted 6 lines
Quoted 1 line
Quoted 1 line · Ian Campbell
Quoted 3 lines · Don Slutz
(quoted diff) +0 -0
@@ -368,8 +380,11 @@ static void print_ctx_32(vcpu_guest_context_x86_32_t *ctx)
      printf(" gs:     %04x\n", regs->gs);
 
Quoted 7 lines

tools/xentrace/xenctx.c static void print_ctx_32(vcpu_guest_context_x86_32_t *ctx) · line 384

Quoted 5 lines
tools/xentrace/xenctx.c +2 -2
      if (xenctx.disp_all) {
-        print_special(ctx->ctrlreg, "cr", 0x1d, 4);
-        print_special(ctx->debugreg, "dr", 0xcf, 4);
+        uint64_t cr_reg_mask[5] = {0, 0, ~0ULL};
+        uint64_t dr_reg_mask[8] = {~0ULL, ~0ULL, ~0ULL, ~0ULL};

Are you really using 8*64 bits to represent 8 boolean values? Your masks are all 0 or ~0.

Actually I had asked for this, since special registers may happen to have (often at their bottom or top) bits not being part of an address.

Quoted 8 lines
Quoted 5 lines

I thought that might be the case, but I couldn't find any actual printing of such a register.

Ian.

Getting a kernel value there is not simple. Using a kdb + 2.6.18 kernel, I got:

I'm afraid I cannot follow what this has to do with the previous exchange.

Ian.

author
#60 lore raw

Re: [PATCH v5 13/17] xenctx: Add convert of more registers to symbols

Quoted 21 lines · Ian Campbell
Quoted 20 lines · Don Slutz
Quoted 19 lines · Ian Campbell
Quoted 13 lines · Jan Beulich
Quoted 6 lines
Quoted 1 line
Quoted 1 line · Ian Campbell
Quoted 3 lines · Don Slutz
(quoted diff) +0 -0
@@ -368,8 +380,11 @@ static void print_ctx_32(vcpu_guest_context_x86_32_t *ctx)
       printf(" gs:     %04x\n", regs->gs);
 
Quoted 7 lines

tools/xentrace/xenctx.c static void print_ctx_32(vcpu_guest_context_x86_32_t *ctx) · line 384

Quoted 5 lines
tools/xentrace/xenctx.c +2 -2
       if (xenctx.disp_all) {
-        print_special(ctx->ctrlreg, "cr", 0x1d, 4);
-        print_special(ctx->debugreg, "dr", 0xcf, 4);
+        uint64_t cr_reg_mask[5] = {0, 0, ~0ULL};
+        uint64_t dr_reg_mask[8] = {~0ULL, ~0ULL, ~0ULL, ~0ULL};

Are you really using 8*64 bits to represent 8 boolean values? Your masks are all 0 or ~0.

Quoted 2 lines

Actually I had asked for this, since special registers may happen to have (often at their bottom or top) bits not being part of an address.

I thought that might be the case, but I couldn't find any actual printing of such a register.

Quoted 9 lines
Quoted 4 lines
Quoted 2 lines

Ian.

Getting a kernel value there is not simple. Using a kdb + 2.6.18 kernel, I got:

I'm afraid I cannot follow what this has to do with the previous exchange.

Ian.

Re-reading it, I see that you may have been referring to some register that is not cr0, cr2, cr3, cr4, dr0, dr1, dr2, dr3, dr6, and dr7.

If that is the case, my reply does not make sense. However CR3 is an example. Intel and AMD say:

Bits 51:40 of CR3 are reserved and must be 0 (intel).

All CR3 bits are writable, except for unimplemented physical address bits, which must be cleared to 0 (AMD).

PCD
Page-level Cache Disable (bit 4 of CR3) —

PWT Page-level Write-Through (bit 3 of CR3) —

So CR3 looks to be a register of the type in question. How ever, since it has a physical address and the map file is all virtual addresses, I used a 0 so a false match would not happen.

Let me know if more is needed.

-Don Slutz

_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xen.org/xen-devel

#61 lore raw

Re: [PATCH v5 13/17] xenctx: Add convert of more registers to symbols

Quoted 29 lines · Don Slutz
Quoted 28 lines · Ian Campbell
Quoted 17 lines · Don Slutz
Quoted 16 lines · Ian Campbell
Quoted 15 lines · Jan Beulich
Quoted 6 lines
Quoted 1 line
Quoted 1 line · Ian Campbell
Quoted 3 lines · Don Slutz
(quoted diff) +0 -0
@@ -368,8 +380,11 @@ static void print_ctx_32(vcpu_guest_context_x86_32_t *ctx)
       printf(" gs:     %04x\n", regs->gs);
 
Quoted 7 lines

Review static void print_ctx_32(vcpu_guest_context_x86_32_t *ctx) · line 384

Quoted 5 lines
(quoted diff) +2 -2
       if (xenctx.disp_all) {
-        print_special(ctx->ctrlreg, "cr", 0x1d, 4);
-        print_special(ctx->debugreg, "dr", 0xcf, 4);
+        uint64_t cr_reg_mask[5] = {0, 0, ~0ULL};
+        uint64_t dr_reg_mask[8] = {~0ULL, ~0ULL, ~0ULL, ~0ULL};

Are you really using 8*64 bits to represent 8 boolean values? Your masks are all 0 or ~0.

Actually I had asked for this, since special registers may happen to have (often at their bottom or top) bits not being part of an address.

Quoted 7 lines
Quoted 5 lines

I thought that might be the case, but I couldn't find any actual printing of such a register.

Ian.

Getting a kernel value there is not simple. Using a kdb + 2.6.18 kernel, I got:

I'm afraid I cannot follow what this has to do with the previous exchange.

Quoted 6 lines
Quoted 2 lines

Ian.

Re-reading it, I see that you may have been referring to some register that is not cr0, cr2, cr3, cr4, dr0, dr1, dr2, dr3, dr6, and dr7.

I was saying that I could not find a call to print_special where all members of reg_is_addr_mask were not either 0 or ~0ULL and then you starting talking about kdb + 2.6.18 kernels.

Have I missed a call to print_special with a mask value of something other than 0 or ~0ULL somewhere in this patch or perhaps a subsequent patch?

If I haven't missed it because it doesn't actually exist then reg_is_addr_mask could be replaced by a bitmask, or maybe the theoretical possibility of printing out a special register which does need masking makes it worthwhile to keep this functionality, or maybe it should be put aside until a patch which adds the printing of such a register.

[...]

Quoted 3 lines

So CR3 looks to be a register of the type in question. How ever, since it has a physical address and the map file is all virtual addresses, I used a 0 so a false match would not happen.

So in the end there are no special registers which have a symbol printed and which have any bits to mask?

Ian.

author
#62 lore raw

Re: [PATCH v5 13/17] xenctx: Add convert of more registers to symbols

Quoted 30 lines · Ian Campbell
Quoted 29 lines · Don Slutz
Quoted 28 lines · Ian Campbell
Quoted 17 lines · Don Slutz
Quoted 16 lines · Ian Campbell
Quoted 15 lines · Jan Beulich
Quoted 6 lines
Quoted 1 line
Quoted 1 line · Ian Campbell
Quoted 3 lines · Don Slutz
(quoted diff) +0 -0
@@ -368,8 +380,11 @@ static void print_ctx_32(vcpu_guest_context_x86_32_t *ctx)
        printf(" gs:     %04x\n", regs->gs);
 
Quoted 7 lines

Review static void print_ctx_32(vcpu_guest_context_x86_32_t *ctx) · line 384

Quoted 5 lines
(quoted diff) +2 -2
        if (xenctx.disp_all) {
-        print_special(ctx->ctrlreg, "cr", 0x1d, 4);
-        print_special(ctx->debugreg, "dr", 0xcf, 4);
+        uint64_t cr_reg_mask[5] = {0, 0, ~0ULL};
+        uint64_t dr_reg_mask[8] = {~0ULL, ~0ULL, ~0ULL, ~0ULL};

Are you really using 8*64 bits to represent 8 boolean values? Your masks are all 0 or ~0.

Actually I had asked for this, since special registers may happen to have (often at their bottom or top) bits not being part of an address.

Quoted 7 lines
Quoted 5 lines

I thought that might be the case, but I couldn't find any actual printing of such a register.

Ian.

Getting a kernel value there is not simple. Using a kdb + 2.6.18 kernel, I got:

I'm afraid I cannot follow what this has to do with the previous exchange.

Quoted 8 lines
Quoted 5 lines
Quoted 2 lines

Ian.

Re-reading it, I see that you may have been referring to some register that is not cr0, cr2, cr3, cr4, dr0, dr1, dr2, dr3, dr6, and dr7.

I was saying that I could not find a call to print_special where all members of reg_is_addr_mask were not either 0 or ~0ULL and then you starting talking about kdb + 2.6.18 kernels.

I did get off track, sorry about that.

Quoted 3 lines

Have I missed a call to print_special with a mask value of something other than 0 or ~0ULL somewhere in this patch or perhaps a subsequent patch?

Not that I know of.

Quoted 7 lines

If I haven't missed it because it doesn't actually exist then reg_is_addr_mask could be replaced by a bitmask, or maybe the theoretical possibility of printing out a special register which does need masking makes it worthwhile to keep this functionality, or maybe it should be put aside until a patch which adds the printing of such a register.

Quoted 6 lines

[...]

Quoted 3 lines

So CR3 looks to be a register of the type in question. How ever, since it has a physical address and the map file is all virtual addresses, I used a 0 so a false match would not happen.

So in the end there are no special registers which have a symbol printed and which have any bits to mask?

Yes. I am happy to go either way. Since I am putting the finishing comments on the next version (v8) of all these, for now I will continue with Jan's requested way (mask values of 0 or ~0ULL ).

-Don Slutz

Quoted 2 lines

Ian.

author
#63 lore raw

PATCH v5 14/17 xenctx: Add output of vcpu value and state for --all-vcpus

In reply to Don Slutz

This makes it easier to know which vcpu the registers belong to and when not all vcpus are online, which vcpu it is.

---
v5: Change vcpu=3 to vcpu3. Drop online.

 tools/xentrace/xenctx.c | 6 ++++++
 1 file changed, 6 insertions(+)
tools/xentrace/xenctx.c +6 -0
index 5dfa7e6..2041928 100644
@@ -1032,7 +1032,13 @@ static void dump_all_vcpus(void)
         if ( xc_vcpu_getinfo(xenctx.xc_handle, xenctx.domid, vcpu, &vinfo) )
             continue;
         if ( vinfo.online )
+        {
+            printf("vcpu%d:\n", vcpu);
             dump_ctx(vcpu);
+            printf("\n");
+        } else {
+            printf("vcpu%d offline\n\n", vcpu);
+        }
     }
 }
 
Signature · 1 line
1.8.4
author
#65 lore raw

PATCH v5 15/17 xenctx: Fix handling of !guest_protected_mode

In reply to Don Slutz

This includes that the stack pointer is valid.

---
 tools/xentrace/xenctx.c | 16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)
tools/xentrace/xenctx.c +15 -1
index 2041928..e7ef09b 100644
@@ -498,8 +498,13 @@ static guest_word_t instr_pointer(vcpu_guest_context_any_t *ctx)
             r += ctx->x32.user_regs.cs << NONPROT_MODE_SEGMENT_SHIFT;
     }
     else
+    {
         r = ctx->x64.user_regs.rip;
 
+        if ( !guest_protected_mode )
+            r += ctx->x64.user_regs.cs << NONPROT_MODE_SEGMENT_SHIFT;
+    }
+
     return r;
 }
 
@@ -514,8 +519,13 @@ static guest_word_t stack_pointer(vcpu_guest_context_any_t *ctx)
             r += ctx->x32.user_regs.ss << NONPROT_MODE_SEGMENT_SHIFT;
     }
     else
+    {
         r = ctx->x64.user_regs.rsp;
 
+        if ( !guest_protected_mode )
+            r += ctx->x64.user_regs.ss << NONPROT_MODE_SEGMENT_SHIFT;
+    }
+
     return r;
 }
 
@@ -851,6 +861,9 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width, guest
             return -1;
     }
 
+    if ( !guest_protected_mode )
+        return 0;
+
     if(xenctx.stack_trace)
         printf("Stack Trace:\n");
     else
@@ -1016,7 +1029,8 @@ static void dump_ctx(int vcpu)
 #ifndef NO_TRANSLATION
     if (print_code(&ctx, vcpu))
         return;
-    if ( kernel_addr(instr_pointer(&ctx)) >= KERNEL_TEXT_ADDR )
+    if ( !guest_protected_mode ||
+         kernel_addr(instr_pointer(&ctx)) >= KERNEL_TEXT_ADDR )
         if ( print_stack(&ctx, vcpu, guest_word_size,
                          stack_pointer(&ctx)) )
             return;
Signature · 1 line
1.8.4
#66 lore raw

Re: [PATCH v5 15/17] xenctx: Fix handling of !guest_protected_mode

Quoted 11 lines · Don Slutz
tools/xentrace/xenctx.c +3 -0
@@ -851,6 +861,9 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width, guest
             return -1;
     }
 
+    if ( !guest_protected_mode )
+        return 0;
+
     if(xenctx.stack_trace)
         printf("Stack Trace:\n");
     else

tools/xentrace/xenctx.c static void dump_ctx(int vcpu) · line 1032

Quoted 5 lines
tools/xentrace/xenctx.c +1 -1
@@ -1016,7 +1029,8 @@ static void dump_ctx(int vcpu)
 #ifndef NO_TRANSLATION
     if (print_code(&ctx, vcpu))
         return;
-    if ( kernel_addr(instr_pointer(&ctx)) >= KERNEL_TEXT_ADDR )
+    if ( !guest_protected_mode ||

Aren't this and the check in the previous hunk contradictory and/or equivalent (I can't decide which)

Quoted 4 lines
tools/xentrace/xenctx.c +1 -0
+         kernel_addr(instr_pointer(&ctx)) >= KERNEL_TEXT_ADDR )
         if ( print_stack(&ctx, vcpu, guest_word_size,
                          stack_pointer(&ctx)) )
             return;
author
#67 lore raw

Re: [PATCH v5 15/17] xenctx: Fix handling of !guest_protected_mode

Quoted 5 lines · Ian Campbell
Quoted 4 lines · Don Slutz
tools/xentrace/xenctx.c +0 -0
@@ -851,6 +861,9 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width, guest
              return -1;
      }
 
Quoted 14 lines

tools/xentrace/xenctx.c static void dump_ctx(int vcpu) · line 1032

Quoted 12 lines
tools/xentrace/xenctx.c +4 -1
+    if ( !guest_protected_mode )
+        return 0;
+
      if(xenctx.stack_trace)
          printf("Stack Trace:\n");
      else
@@ -1016,7 +1029,8 @@ static void dump_ctx(int vcpu)
  #ifndef NO_TRANSLATION
      if (print_code(&ctx, vcpu))
          return;
-    if ( kernel_addr(instr_pointer(&ctx)) >= KERNEL_TEXT_ADDR )
+    if ( !guest_protected_mode ||

Aren't this and the check in the previous hunk contradictory and/or equivalent (I can't decide which)

Nope. The check in the previous hung is to say that in !guest_protected_mode (aka real mode or 16bit mode), skip Call or Stack trace.

This check is to say do the stack dump.

Here is the output you get:
xenctx -t 5
cs:eip: f000:0000f033
flags: 00000046 z p
ss:esp: e000:0000f85a
eax: 00000000 ebx: 00000000 ecx: 00006b62 edx: 00000000
esi: 0000e000 edi: 0000f8b8 ebp: 00000000
ds: e000 es: 0040 fs: 0000 gs: 0000
Code (instr addr 000ff033)
fc 8e d5 67 8b 67 f8 8e dd 66 ff d1 8e de 8e d6 66 8b 26 b0 f0 <66> 89 3e b0 f0 66 5e 66 5b 66 5e

Stack:
000ef85a: 00000000 0000f88a 00000000 00000001 00000000 00006bbd 00000040 00000040
000ef87a: 00000000 0000000e 00001ff0 0000d4cb 00000000 0000000e 00000000 00001ff0
000ef89a: 00000040 ffffffff 00008e26 00001100 00008e30 1fee0246 00000000 1f000000
000ef8ba: 00000084 bb660000 0003fefc 3c038a67 66087464 03fef8bb 6606eb00 03ff00bb
000ef8da: 00b86600 67000a00 b0038966 00b3ba00 baaa0fee 3cec00b2 ba0a75f0 83edb004

Since this is 16 bit mode, maybe the stack should be:

Stack:

ef85a: 0000 0000 f88a 0000 0000 0000 0001 0000 0000 0000 6bbd 0000 0040 0000 0040 0000
ef87a: 0000 0000 000e 0000 1ff0 0000 d4cb 0000 0000 0000 000e 0000 0000 0000 1ff0 0000
ef89a: 0040 0000 ffff ffff 8e26 0000 1100 0000 8e30 0000 0246 1fee 0000 0000 0000 1f00
ef8ba: 0084 0000 0000 bb66 fefc 0003 8a67 3c03 7464 6608 f8bb 03fe eb00 6606 00bb 03ff
ef8da: 6600 00b8 0a00 6700 8966 b003 ba00 00b3 0fee baaa 00b2 3cec 75f0 ba0a b004 83ed

-Don Slutz

Quoted 5 lines
Quoted 4 lines
tools/xentrace/xenctx.c +1 -0
+         kernel_addr(instr_pointer(&ctx)) >= KERNEL_TEXT_ADDR )
          if ( print_stack(&ctx, vcpu, guest_word_size,
                           stack_pointer(&ctx)) )
              return;
author
#68 lore raw

PATCH v5 16/17 xenctx: Allow output for offline vcpu when specified.

In reply to Don Slutz

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.

---
 tools/xentrace/xenctx.c | 6 ++++++
 1 file changed, 6 insertions(+)
tools/xentrace/xenctx.c +6 -0
index e7ef09b..d6e85ac 100644
@@ -994,6 +994,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;
             }
@@ -1007,6 +1012,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;
         }
Signature · 1 line
1.8.4
#69 lore raw

Re: [PATCH v5 16/17] xenctx: Allow output for offline vcpu when specified.

Quoted 3 lines · Don Slutz

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.

Does that provide sensible results? I wouldn't have thought so.

Why not just print nothing for that vcpu?

#70 lore raw

Re: [PATCH v5 16/17] xenctx: Allow output for offline vcpu when specified.

Quoted 5 lines · Ian Campbell
Quoted 3 lines · Don Slutz

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.

Does that provide sensible results? I wouldn't have thought so.

It does display sensible results for the registers.

At boot time you get:

xenctx -s /boot/System.map-2.6.32-279.2.1.el6.mpbios5.x86_64 2 1
xc_vcpu_getcontext: No data available

But once a cpu is used you get correct data.

I found out that I add missed a change to xc_translate_foreign_address() (also check for errno == EBADSLT) which is needed to do the correct virtual to physical address conversion. Will be part of this patch in the next version. Here is some output using this new version.

Before "echo 0 > /sys/devices/system/cpu/cpu1/online":

xenctx -s /boot/System.map-2.6.32-279.2.1.el6.mpbios5.x86_64 1 1
rip: ffffffff810387db native_safe_halt+0xb
flags: 00000246 i z p
rsp: ffff88003e417ed8
rax: 0000000000000000 rcx: 0000000000000000 rdx: 0000000000000000
rbx: 0000000000000001 rsi: 0000000000000001 rdi: ffffffff81ddc228
rbp: ffff88003e417ed8 r8: 0000000000000000 r9: 0000000000000000
r10: 0000001bdca0ef03 r11: ffff88003e417e78 r12: ffffffff81c03800
r13: 0000000000000000 r14: 0000000000000000 r15: 0000000000000000
cs: 0010 ss: 0018 ds: 0018 es: 0018
fs: 0000 @ 0000000000000000
gs: 0000 @ ffff88000b420000/0000000000000000/
Code (instr addr ffffffff810387db)
44 00 00 fb c9 c3 0f 1f 40 00 55 48 89 e5 0f 1f 44 00 00 fb f4 <c9> c3 0f 1f 00 55 48 89 e5 0f 1f

Stack:
 ffff88003e417ef8 ffffffff810149cd ffff88003e417fd8 ffffffff81c03800
 ffff88003e417f28 ffffffff81009e06 ffff88003e417f18 a0460d871075161c
 0000000000000000 0000000000000000 ffff88003e417f48 ffffffff814f6e1f
 0000000000000000 00000001814f6bf5 0000000000000000 0000000000000000
 0000000000000000 0000000000000000 0000000000000000 0000000000000000

Call Trace:
  [<ffffffff810387db>] native_safe_halt+0xb <--
  [<ffffffff810149cd>] default_idle+0x4d
  [<ffffffff81009e06>] cpu_idle+0xb6
  [<ffffffff814f6e1f>] start_secondary+0x22a

After "echo 0 > /sys/devices/system/cpu/cpu1/online":

xenctx -s /boot/System.map-2.6.32-279.2.1.el6.mpbios5.x86_64 1 1
Note: vcpu1 offline:

rip: ffffffff8102acc1 native_play_dead+0x51
flags: 00000006 nz p
rsp: ffff88003e417ee8
rax: ffff88000b420000 rcx: 0000000000000020 rdx: ffff88000b420000
rbx: 0000000000016500 rsi: 0000000000000086 rdi: 0000000000000005
rbp: ffff88003e417ef8 r8: 0000000000000000 r9: ffff88000b4315a8
r10: 0000000000000005 r11: 0000000000000000 r12: 0000000000016500
r13: 0000000000000000 r14: 0000000000000000 r15: 0000000000000000
cs: 0010 ss: 0018 ds: 0018 es: 0018
fs: 0000 @ 0000000000000000
gs: 0000 @ ffff88000b420000/0000000000000000/
Code (instr addr ffffffff8102acc1)
00 00 42 80 3c 20 03 76 0b 0f 09 0f 1f 44 00 00 0f 1f 40 00 f4 <eb> fd 48 8d 3c 18 e8 04 92 fe ff

Stack:
 ffff88003e417fd8 ffffffff81c03800 ffff88003e417f28 ffffffff81009e4b
 ffff88003e417f18 a0460d871075161c 0000000000000000 0000000000000000
 ffff88003e417f48 ffffffff814f6e1f 0000000000000000 00000001814f6bf5
 0000000000000000 0000000000000000 0000000000000000 0000000000000000
 0000000000000000 0000000000000000 0000000000000000 0000000000000000

Call Trace:
  [<ffffffff8102acc1>] native_play_dead+0x51 <--
  [<ffffffff81009e4b>] cpu_idle+0xfb
  [<ffffffff814f6e1f>] start_secondary+0x22a

Using offline.ko module (posted on the list, with the change to output routine addresses) gives me on domU's serial console:

[  393.119432] offline 1.1 who=0x1 wait=0 cpu=1 depth=0 count=100
[  393.132654] init_module=ffffffffa0058210 offline_self=ffffffffa0058070 fill_stack=ffffffffa00580d0
[  393.158013] offline done who=0x1

Which is telling me that insmod is on cpu1, and we are offlineing cpu0:

xenctx -s /boot/System.map-2.6.32-279.2.1.el6.mpbios5.x86_64 1 0
Note: vcpu0 offline:

rip: ffffffffa0058093
flags: 00000097 s nz a p c
rsp: ffff88000b403f58
rax: 0000000000000000 rcx: ffffffff81a8f020 rdx: 0000000000000001
rbx: ffff88000b403f68 rsi: 0000000000000000 rdi: 0000000000000000
rbp: ffff88000b403f58 r8: ffff88000b431800 r9: 0000000000000001
r10: 0000000000000000 r11: 0000000000000000 r12: ffff88000b431800
r13: 0000000000000001 r14: ffff88003dea96c0 r15: 00000000ffffffff
cs: 0010 ss: 0018 ds: 0018 es: 0018
fs: 0000 @ 0000000000000000
gs: 0000 @ ffff88000b400000/0000000000000000/
Code (instr addr ffffffffa0058093)
e0 00 00 83 f8 1f 77 0d 8b 15 e8 48 00 00 0f a3 c2 73 02 fa f4 <c9> c3 66 66 2e 0f 1f 84 00 00 00

Since this kernel module is not part of kernel text, the stack display is skipped. So Use the new feature -d to force it out:

xenctx -s /boot/System.map-2.6.32-279.2.1.el6.mpbios5.x86_64 1 0 -d 0xffff88000b403f58 -t -T
Note: vcpu0 offline:

Stack:
ffff88000b403f58: ffff88000b403f98 ffffffff810a87e9 ffff88000b403f68 ffff88000b403f68
ffff88000b403f78: ffff88000b403f98 ffff88003dea96c0 ffffffff81a8f020 0000000000000000
ffff88000b403f98: ffff88000b403fa8 ffffffff8102a8f7 ffff88003efd3d30 ffffffff8100bdb3
ffff88000b403fb8: ffff88003efd3d30 0000000000000000 0000000000000000 0000000000000000
ffff88000b403fd8: 0000000000000000 0000000000000000 0000000000000000 0000000000000000

Call Trace:
ffff88000b403f60:  [<ffffffff810a87e9>] generic_smp_call_function_single_interrupt+0xa9
ffff88000b403fa0:  [<ffffffff8102a8f7>] smp_call_function_single_interrupt+0x27
ffff88000b403fb0:  [<ffffffff8100bdb3>] call_function_single_interrupt+0x13

Which is exactly the Call Trace that it should have.

Here is the state of vcpu1:

xenctx -s /boot/System.map-2.6.32-279.2.1.el6.mpbios5.x86_64 1 1 -t -T
rip: ffffffff810387db native_safe_halt+0xb
flags: 00000246 i z p
rsp: ffff88003e417ed8
rax: 0000000000000000 rcx: 0000000000000000 rdx: 0000000000000000
rbx: 0000000000000001 rsi: 0000000000000001 rdi: ffffffff81ddc228
rbp: ffff88003e417ed8 r8: 0000000000000000 r9: 0000000000000000
r10: 0000000000000000 r11: 0000000000000000 r12: ffffffff81c03800
r13: 0000000000000000 r14: 0000000000000000 r15: 0000000000000000
cs: 0010 ss: 0018 ds: 0018 es: 0018
fs: 0000 @ 0000000000000000
gs: 0000 @ ffff88000b420000/0000000000000000/
Code (instr addr ffffffff810387db)
44 00 00 fb c9 c3 0f 1f 40 00 55 48 89 e5 0f 1f 44 00 00 fb f4 <c9> c3 0f 1f 00 55 48 89 e5 0f 1f

Stack:
ffff88003e417ed8: ffff88003e417ef8 ffffffff810149cd ffff88003e417fd8 ffffffff81c03800
ffff88003e417ef8: ffff88003e417f28 ffffffff81009e06 ffff88003e417f18 bd1aee47aad97866
ffff88003e417f18: 0000000000000000 0000000000000000 ffff88003e417f48 ffffffff814f6e1f
ffff88003e417f38: 0000000000000000 00000001814f6bf5 0000000000000000 0000000000000000
ffff88003e417f58: 0000000000000000 0000000000000000 0000000000000000 0000000000000000

Call Trace:
                   [<ffffffff810387db>] native_safe_halt+0xb <--
ffff88003e417ee0:  [<ffffffff810149cd>] default_idle+0x4d
ffff88003e417f00:  [<ffffffff81009e06>] cpu_idle+0xb6
ffff88003e417f30:  [<ffffffff814f6e1f>] start_secondary+0x22a

Using gdbsx to also look at this data:

[root@dcs-xen-54 ~]# gdbsx -c 1 64 1
===> Context for DOMID:1

--> VCPU:1
rip:ffffffff810387db rsp:ffff88003e417ed8 flags:0000000000000246 rax:0000000000000000 rbx:0000000000000001 rcx:0000000000000000 rdx:0000000000000000 rsi:0000000000000001 rdi:ffffffff81ddc228 r08:0000000000000000 r09:0000000000000000 r10:0000000000000000 r11:0000000000000000 r12:ffffffff81c03800 r13:0000000000000000 r14:0000000000000000 r15:0000000000000000 rbp:ffff88003e417ed8 cs:0000000000000010 ds:0000000000000018 fs:0000000000000000 gs:0000000000000000

Call Trace:
   [ffffffff810387db]
   [ffffffff810149cd]
   [ffffffff81c03800]
   [ffffffff81009e06]
   [ffffffff814f6e1f]
   [ffffffff81a991e0]
   [ffffffff8107f5f0]
   [ffffffff81136a99]
   [ffffffff81136a99]
   [ffffffff81125b31]
   [ffffffff81136a99]

[root@dcs-xen-54 ~]# gdbsx -c 1 64 0
===> Context for DOMID:1

--> VCPU:0
rip:ffffffffa0058093 rsp:ffff88000b403f58 flags:0000000000000097 rax:0000000000000000 rbx:ffff88000b403f68 rcx:ffffffff81a8f020 rdx:0000000000000001 rsi:0000000000000000 rdi:0000000000000000 r08:ffff88000b431800 r09:0000000000000001 r10:0000000000000000 r11:0000000000000000 r12:ffff88000b431800 r13:0000000000000001 r14:ffff88003dea96c0 r15:00000000ffffffff rbp:ffff88000b403f58 cs:0000000000000010 ds:0000000000000018 fs:0000000000000000 gs:0000000000000000

Call Trace:
   [ffffffffa0058093]
   [ffffffff810a87e9]
   [ffffffff81a8f020]
   [ffffffff8102a8f7]
   [ffffffff8100bdb3]
   [ffffffffffffffff]
   [ffffffffffffffff]
   [ffffffffffffffff]
   [ffffffffffffffff]
   [ffffffffffffffff]
   [ffffffffffffffff]

(gdb) disass/r 0xffffffffa0058070,0xffffffffa0058097
Dump of assembler code from 0xffffffffa0058070 to 0xffffffffa0058097:

   0xffffffffa0058070:  55      push   %rbp
   0xffffffffa0058071:  48 89 e5        mov    %rsp,%rbp
   0xffffffffa0058074:  0f 1f 44 00 00  nopl   0x0(%rax,%rax,1)
   0xffffffffa0058079:  65 8b 04 25 b8 e0 00 00 mov %gs:0xe0b8,%eax
   0xffffffffa0058081:  83 f8 1f        cmp    $0x1f,%eax
   0xffffffffa0058084:  77 0d   ja     0xffffffffa0058093
   0xffffffffa0058086:  8b 15 e8 48 00 00       mov 0x48e8(%rip),%edx        # 0xffffffffa005c974
   0xffffffffa005808c:  0f a3 c2        bt     %eax,%edx
   0xffffffffa005808f:  73 02   jae    0xffffffffa0058093
   0xffffffffa0058091:  fa      cli
   0xffffffffa0058092:  f4      hlt
=> 0xffffffffa0058093:  c9      leaveq
   0xffffffffa0058094:  c3      retq
   0xffffffffa0058095:  66 66 2e 0f 1f 84 00 00 00 00 00 data32 nopw %cs:0x0(%rax,%rax,1)

End of assembler dump.

Quoted 1 line

Why not just print nothing for that vcpu?

That is what "-C" does.

author
#71 lore raw

PATCH v5 17/17 xenctx: Fixup options checking.

In reply to Don Slutz

Also display the correct program name in all cases.

---
 tools/xentrace/xenctx.c | 20 +++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)
tools/xentrace/xenctx.c +15 -5
index d6e85ac..164a13d 100644
@@ -1110,6 +1110,7 @@ int main(int argc, char **argv)
 {
     int ch;
     int ret;
+    char *prog = argv[0];
 #ifndef NO_TRANSLATION
     static const char *sopts = "fs:hak:SCn:b:l:DtTm:d:";
 #else
@@ -1176,7 +1177,7 @@ int main(int argc, char **argv)
             {
                 fprintf(stderr,
                         "%s: Unsupported value for --bytes-per-line. Needs to be 4 <= <bytes> <= %d\n",
-                        argv[0], MAX_BYTES_PER_LINE);
+                        prog, MAX_BYTES_PER_LINE);
                 exit(-1);
             }
             break;
@@ -1190,7 +1191,7 @@ int main(int argc, char **argv)
             {
                 fprintf(stderr,
                         "%s: Unsupported value for --lines. Needs to be >= 0\n",
-                        argv[0]);
+                        prog);
                 exit(-1);
             }
             break;
@@ -1218,7 +1219,7 @@ int main(int argc, char **argv)
             usage();
             exit(-1);
         case '?':
-            fprintf(stderr, "%s --help for more options\n", argv[0]);
+            fprintf(stderr, "%s --help for more options\n", prog);
             exit(-1);
         }
     }
@@ -1235,7 +1236,7 @@ int main(int argc, char **argv)
     {
         fprintf(stderr,
                 "%s both --frame-pointers and --dump-as-stack is not supported\n",
-                argv[0]);
+                prog);
         exit(-1);
     }
 #endif
@@ -1246,8 +1247,17 @@ int main(int argc, char **argv)
             exit(-1);
     }
 
-    if (argc == 2)
+    if ( argc == 2 )
+    {
+        if ( xenctx.all_vcpus )
+        {
+            fprintf(stderr,
+                    "%s both --all-vcpus and [VCPU] is not supported\n",
+                    prog);
+            exit(-1);
+        }
         vcpu = atoi(argv[1]);
+    }
 
     if (symbol_table)
         read_symbol_table(symbol_table);
Signature · 1 line
1.8.4
#72 lore raw

Re: [PATCH v5 17/17] xenctx: Fixup options checking.

Quoted 1 line · Don Slutz

Also display the correct program name in all cases.

Where was it wrong?

Quoted 10 lines
---
 tools/xentrace/xenctx.c | 20 +++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)
tools/xentrace/xenctx.c +0 -0
index d6e85ac..164a13d 100644

tools/xentrace/xenctx.c int main(int argc, char **argv) · line 1113

Quoted 4 lines
tools/xentrace/xenctx.c +1 -0
@@ -1110,6 +1110,7 @@ int main(int argc, char **argv)
 {
     int ch;
     int ret;
+    char *prog = argv[0];

const?

Quoted 58 lines
tools/xentrace/xenctx.c +14 -5
 #ifndef NO_TRANSLATION
     static const char *sopts = "fs:hak:SCn:b:l:DtTm:d:";
 #else
@@ -1176,7 +1177,7 @@ int main(int argc, char **argv)
             {
                 fprintf(stderr,
                         "%s: Unsupported value for --bytes-per-line. Needs to be 4 <= <bytes> <= %d\n",
-                        argv[0], MAX_BYTES_PER_LINE);
+                        prog, MAX_BYTES_PER_LINE);
                 exit(-1);
             }
             break;
@@ -1190,7 +1191,7 @@ int main(int argc, char **argv)
             {
                 fprintf(stderr,
                         "%s: Unsupported value for --lines. Needs to be >= 0\n",
-                        argv[0]);
+                        prog);
                 exit(-1);
             }
             break;
@@ -1218,7 +1219,7 @@ int main(int argc, char **argv)
             usage();
             exit(-1);
         case '?':
-            fprintf(stderr, "%s --help for more options\n", argv[0]);
+            fprintf(stderr, "%s --help for more options\n", prog);
             exit(-1);
         }
     }
@@ -1235,7 +1236,7 @@ int main(int argc, char **argv)
     {
         fprintf(stderr,
                 "%s both --frame-pointers and --dump-as-stack is not supported\n",
-                argv[0]);
+                prog);
         exit(-1);
     }
 #endif
@@ -1246,8 +1247,17 @@ int main(int argc, char **argv)
             exit(-1);
     }
 
-    if (argc == 2)
+    if ( argc == 2 )
+    {
+        if ( xenctx.all_vcpus )
+        {
+            fprintf(stderr,
+                    "%s both --all-vcpus and [VCPU] is not supported\n",
+                    prog);
+            exit(-1);
+        }
         vcpu = atoi(argv[1]);
+    }
 
     if (symbol_table)
         read_symbol_table(symbol_table);
author
#73 lore raw

Re: [PATCH v5 17/17] xenctx: Fixup options checking.

Quoted 3 lines · Ian Campbell
Quoted 1 line · Don Slutz

Also display the correct program name in all cases.

Where was it wrong?

After:

    argv += optind; argc -= optind;

and so

#11's new error message is wrong.

Will adjust this patch to be before #11.

Quoted 5 lines
Quoted 5 lines
---
  tools/xentrace/xenctx.c | 20 +++++++++++++++-----
  1 file changed, 15 insertions(+), 5 deletions(-)
Quoted 10 lines

tools/xentrace/xenctx.c int main(int argc, char **argv) · line 1113

Quoted 9 lines
tools/xentrace/xenctx.c +1 -0
index d6e85ac..164a13d 100644
@@ -1110,6 +1110,7 @@ int main(int argc, char **argv)
  {
      int ch;
      int ret;
+    char *prog = argv[0];

const?

Will add.

-Don Slutz

Quoted 60 lines
Quoted 59 lines
tools/xentrace/xenctx.c +14 -5
  #ifndef NO_TRANSLATION
      static const char *sopts = "fs:hak:SCn:b:l:DtTm:d:";
  #else
@@ -1176,7 +1177,7 @@ int main(int argc, char **argv)
              {
                  fprintf(stderr,
                          "%s: Unsupported value for --bytes-per-line. Needs to be 4 <= <bytes> <= %d\n",
-                        argv[0], MAX_BYTES_PER_LINE);
+                        prog, MAX_BYTES_PER_LINE);
                  exit(-1);
              }
              break;
@@ -1190,7 +1191,7 @@ int main(int argc, char **argv)
              {
                  fprintf(stderr,
                          "%s: Unsupported value for --lines. Needs to be >= 0\n",
-                        argv[0]);
+                        prog);
                  exit(-1);
              }
              break;
@@ -1218,7 +1219,7 @@ int main(int argc, char **argv)
              usage();
              exit(-1);
          case '?':
-            fprintf(stderr, "%s --help for more options\n", argv[0]);
+            fprintf(stderr, "%s --help for more options\n", prog);
              exit(-1);
          }
      }
@@ -1235,7 +1236,7 @@ int main(int argc, char **argv)
      {
          fprintf(stderr,
                  "%s both --frame-pointers and --dump-as-stack is not supported\n",
-                argv[0]);
+                prog);
          exit(-1);
      }
  #endif
@@ -1246,8 +1247,17 @@ int main(int argc, char **argv)
              exit(-1);
      }
 
-    if (argc == 2)
+    if ( argc == 2 )
+    {
+        if ( xenctx.all_vcpus )
+        {
+            fprintf(stderr,
+                    "%s both --all-vcpus and [VCPU] is not supported\n",
+                    prog);
+            exit(-1);
+        }
          vcpu = atoi(argv[1]);
+    }
 
      if (symbol_table)
          read_symbol_table(symbol_table);
#74 lore raw

Re: [PATCH v5 17/17] xenctx: Fixup options checking.

Quoted 10 lines · Don Slutz
Quoted 3 lines · Ian Campbell
Quoted 1 line · Don Slutz

Also display the correct program name in all cases.

Where was it wrong?

After:

     argv += optind; argc -= optind;

and so

I see. Please say something like "since we adjust argv during option parsing take a copy of the original argv[0]" in the commit message.

Ian.

#75 lore raw
In reply to Don Slutz
Quoted 1 line · Don Slutz

Add more functionality to xenctx.

So, I've been through this and it mostly seems independently useful, but the overriding thought I've been having is: aren't you piecemeal reinventing the debugger (like gdbsx)?

Ian.

author
#76 lore raw
Quoted 5 lines · Ian Campbell
Quoted 1 line · Don Slutz

Add more functionality to xenctx.

So, I've been through this and it mostly seems independently useful, but the overriding thought I've been having is: aren't you piecemeal reinventing the debugger (like gdbsx)?

Sort of. If this were a new command, I would think that "reinventing the debugger" would be more important.

There are several issues with using gdbsx to get a quick look at a domU:

1) you need to start gdbsx & gdb

2) gdb does not simply take a System.map file, nor is vmlinuz a big help. There is most likely a way to get gdb to use a System.map but I do not currently remember it.

3) Getting a call trace in gdb is hard without debugging symbols. And last I

    knew there was no native command to format it like xenctx:

      Call Trace:
         [<ffffffff8006bdd8>] default_idle+0x29 <--
         [<ffffffff8004958f>] cpu_idle+0x95
         [<ffffffff80471809>] start_kernel+0x220
         [<ffffffff8047122f>] x86_64_start_kernel+0x22f

4) You need to remember if this domU is in 32 or 64 bit mode (looks like saying 64, for a 32 may be ok).

5) Older gdb's do not display the registers that xenctx does.

The main new features would be -d and -m. The rest are enhancements or fixes.

Hope this helps.
-Don Slutz

Quoted 2 lines

Ian.