xenctx: Many changes.
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
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
@@ -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
Re: [PATCH v5 01/17] xenctx: clean up usage output
Quoted 6 lines · Don Slutz
Fix usage formatting to be all the same.
Fix usage display of default --kernel-start for 64 bit.
Signed-off-by Don Slutz <[email protected]>Reviewed-by George Dunlap <[email protected]>
PATCH v5 2/17 xenctx: Clean up stack trace when hypercall_page not in symbol table
In reply to Don SlutzFrom: 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
@@ -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
PATCH v5 3/17 xenctx: Add -n (--display-stack-pages) option to output larger stack
In reply to Don SlutzFrom: 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
@@ -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
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
Signed-off-by Don Slutz <[email protected]>
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@@ -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.
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
Signed-off-by Don Slutz <[email protected]>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@@ -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
-0stack_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 itnr_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.
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.
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
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
@@ -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
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
Signed-off-by Don Slutz <[email protected]>---
Ian.
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
ffff8800385a6088And 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
Signed-off-by Don Slutz <[email protected]>---
Ian.
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:ffffffff81346876io_serial_in+0x16
flags: 00000002 nz
rsp:ffff8800385a5ab8
rax:000000000000006frcx: 0000000000000000 rdx:00000000000003fd
rbx:ffffffff81ff8f00rsi: 0000000000000005 rdi:ffffffff81ff8f00
rbp:ffff8800385a5ab8r8:ffffffff81c03a10r9: 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 addrffffffff81346876)
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 55Stack: 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+0x41Here is the same data with a bigger -l (domU is paused):
tools/xentrace/xenctx-s ~/zzm 4 -n 2 -l 10
rip:ffffffff81346876io_serial_in+0x16
flags: 00000002 nz
rsp:ffff8800385a5ab8
rax:000000000000006frcx: 0000000000000000 rdx:00000000000003fd
rbx:ffffffff81ff8f00rsi: 0000000000000005 rdi:ffffffff81ff8f00
rbp:ffff8800385a5ab8r8:ffffffff81c03a10r9: 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 addrffffffff81346876)
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 55Stack: 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:ffffffff81346876io_serial_in+0x16
flags: 00000002 nz
rsp:ffff8800385a5ab8
rax:000000000000006frcx: 0000000000000000 rdx:00000000000003fd
rbx:ffffffff81ff8f00rsi: 0000000000000005 rdi:ffffffff81ff8f00
rbp:ffff8800385a5ab8r8:ffffffff81c03a10r9: 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 addrffffffff81346876)
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 55Stack: ffff8800385a5ae8 ffffffff81346e64 ffffffff81ff8f00 0000000000000072 0000000000000064 0000000000000025 ffff8800385a5b08 ffffffff81346f46 ffffffff81e3e430 ffffffff81ff8f00 ffff8800385a5b48 ffffffff813428de ffffffff8100bc0e 0000000000000000 ffffffff81ff8f00 0000000000000001 0000000000000064 ffffffff81e3e40c ffff8800385a5b98 ffffffff813472adStack 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 ffff8800385a6088And 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:ffffffff81346876io_serial_in+0x16
flags: 00000002 nz
rsp:ffff8800385a5ab8
rax:000000000000006frcx: 0000000000000000 rdx:00000000000003fd
rbx:ffffffff81ff8f00rsi: 0000000000000005 rdi:ffffffff81ff8f00
rbp:ffff8800385a5ab8r8:ffffffff81c03a10r9: 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 addrffffffff81346876)
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 55Stack: 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
Signed-off-by Don Slutz <[email protected]>---
Ian.
Re: [PATCH v5 04/17] xenctx: Add command line options -b (--bytes-per-line) and -l (--lines)
In reply to Don SlutzQuoted 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.
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
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.
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
PATCH v5 5/17 xenctx: Add command line option -D (--decode-as-ascii)
In reply to Don SlutzIf 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
@@ -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
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
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
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.
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.
PATCH v5 6/17 xenctx: Add command line option -t (--tag-stack-dump)
In reply to Don SlutzIf 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
@@ -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
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 0000000000000000Signed-off-by Don Slutz <[email protected]>Reviewed-by George Dunlap <[email protected]>
PATCH v5 7/17 xenctx: Change print_symbol to do the space before.
In reply to Don SlutzFrom: 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
@@ -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
PATCH v5 8/17 xenctx: More info on failed to map page.
In reply to Don SlutzFrom: 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
@@ -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
PATCH v5 9/17 xenctx: Add command line option -T (--tag-trace)
In reply to Don SlutzIf 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+0x22fand
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
@@ -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
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
-0print_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
-1return -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
-0print_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
-1word =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
-1print_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.
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
-0print_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
-1return -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
-0print_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
-1word =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
-1print_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_tracehelper 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
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_tracehelper 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
PATCH v5 10/17 xenctx: Add -m (--memory) <maddr> option to dump memory at maddr.
In reply to Don SlutzCurrently 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
@@ -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
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 (addressffffffff803ddf90):
ffffffff80048d190000000000200800ffffffff803e78010000000000086800 0000000000000000ffffffff80430720ffffffff803e722f80008e000010019c00000000ffffffff0000000000000000 0000000000000000 0000000000200000 0000000000000000 0000000000000000 000000000000000000cf9b000000ffff00af9b000000ffff00cf93000000ffff00cffb000000ffff00cff3000000ffffSigned-off-by Don Slutz <[email protected]>---
v5: Remove extra #ifndef. Make common routineprint_lines().tools/xentrace/xenctx.c | 232 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 162 insertions(+), 70 deletions(-)tools/xentrace/xenctx.c +11
-17@@ -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
-0int 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.
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 (addressffffffff803ddf90):
ffffffff80048d190000000000200800ffffffff803e78010000000000086800 0000000000000000ffffffff80430720ffffffff803e722f80008e000010019c00000000ffffffff0000000000000000 0000000000000000 0000000000200000 0000000000000000 0000000000000000 000000000000000000cf9b000000ffff00af9b000000ffff00cf93000000ffff00cffb000000ffff00cff3000000ffffSigned-off-by Don Slutz <[email protected]>---
v5: Remove extra #ifndef. Make common routineprint_lines().tools/xentrace/xenctx.c | 232 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 162 insertions(+), 70 deletions(-)tools/xentrace/xenctx.c +14
-17@@ -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
-0int 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
#defineTRANSLATION_OPTS"m:"
#else
#defineTRANSLATION_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.
PATCH v5 11/17 xenctx: Add -d (--dump-as-stack) <daddr> option to dump memory at daddr as a stack.
In reply to Don SlutzAlso 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
@@ -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
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?
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_memandprint_stackshould 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_addrhere, can't you?
Nope. If both -d and -m are specified, then both are done.
-Don Slutz
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_memandprint_stackshould 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 bymap_page()(called from these).
Quoted 7 lines
dump_ctx()is the routine that gets this andguest_word_size,guest_protected_mode, andctxt_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_addrhere, can't you?
Quoted 1 line
Nope. If both -d and -m are specified, then both are done.
Is that useful?
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_memandprint_stackshould 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 bymap_page()(called from these).
dump_ctx()is the routine that gets this andguest_word_size,guest_protected_mode, andctxt_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_addrhere, 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
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.
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.
PATCH v5 12/17 xenctx: change is_kernel_text() into kernel_addr().
In reply to Don SlutzA 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
@@ -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, guestprint_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, guestif (!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
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.
Signed-off-by Don Slutz <[email protected]>--- tools/xentrace/xenctx.c | 70 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 51 insertions(+), 19 deletions(-)tools/xentrace/xenctx.c +0
-0
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?
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.
Signed-off-by Don Slutz <[email protected]>--- tools/xentrace/xenctx.c | 70 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 51 insertions(+), 19 deletions(-)tools/xentrace/xenctx.c +0
-0@@ -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
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.
Signed-off-by Don Slutz <[email protected]>--- 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@@ -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 vgettimeofdayffffffffff60000f t vsysc2ffffffffff600180 D __xtime_lockffffffffff600190 D __vxtimeffffffffff6001c0 D __vgetcpu_modeffffffffff6001d0 D __wall_jiffiesffffffffff6001e0 D __sys_tzffffffffff6001f0 D __sysctl_vsyscallffffffffff600200 D __xtimeffffffffff600280 D __jiffiesffffffffff600400 T vtimeffffffffff60040e t vsysc1ffffffffff600800 T vgetcpuffffffffff600c00 T venosys_1
will not be matched. Not sure what is the right thing to do here.
-Don Slutz
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:
ffffffffff600000T vgettimeofdayffffffffff60000ft vsysc2ffffffffff600180D__xtime_lockffffffffff600190D__vxtimeffffffffff6001c0D__vgetcpu_modeffffffffff6001d0D__wall_jiffiesffffffffff6001e0D__sys_tzffffffffff6001f0D__sysctl_vsyscallffffffffff600200D__xtimeffffffffff600280D__jiffiesffffffffff600400T vtimeffffffffff60040et vsysc1ffffffffff600800T vgetcpuffffffffff600c00Tvenosys_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
Re: [PATCH v5 12/17] xenctx: change is_kernel_text() into kernel_addr().
In reply to Don SlutzQuoted 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.
PATCH v5 13/17 xenctx: Add convert of more registers to symbols
In reply to Don SlutzFor 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
@@ -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
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
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_tcr_reg_mask[5] = { [2] = ~UINT64_C(0) }; static constuint64_tdr_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
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_tcr_reg_mask[5] = { [2] = ~UINT64_C(0) }; static constuint64_tdr_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
@@ -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
e418d907d55cdb5361879bbaea0c2b96443df846Mon 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
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
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
@@ -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 SlutzQuoted 1 line
From
bc8a441b718e302128f59a53908a1c05afca8680Mon 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
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.
Re: [PATCH v6 13/17] xenctx: Add convert of more registers to symbols
In reply to Don SlutzQuoted 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_tcr_reg_mask[5] = { [2] = ~UINT64_C(0) }; static constuint64_tdr_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.
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_tcr_reg_mask[5] = { [2] = ~UINT64_C(0) }; static constuint64_tdr_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
Re: [PATCH v5 13/17] xenctx: Add convert of more registers to symbols
In reply to Don Slutztools/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.
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
-2if (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
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
-2if (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.
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
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
-2if (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.
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
-2if (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
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
-2if (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.
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
-2if (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_specialwhere all members ofreg_is_addr_maskwere 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_specialwith 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_maskcould 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.
PATCH v5 14/17 xenctx: Add output of vcpu value and state for --all-vcpus
In reply to Don SlutzThis 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
@@ -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
Re: [PATCH v5 14/17] xenctx: Add output of vcpu value and state for --all-vcpus
Quoted 4 lines · 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.
Signed-off-by Don Slutz <[email protected]>
PATCH v5 15/17 xenctx: Fix handling of !guest_protected_mode
In reply to Don SlutzThis 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
@@ -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, guestreturn -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
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, guestreturn -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 ;
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, guestreturn -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 ;
PATCH v5 16/17 xenctx: Allow output for offline vcpu when specified.
In reply to Don Slutzxc_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
@@ -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
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 calculatingctxt_word_sizeandguest_word_sizein the case.
Does that provide sensible results? I wouldn't have thought so.
Why not just print nothing for that vcpu?
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 calculatingctxt_word_sizeandguest_word_sizein 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 1xc_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+0x22aUsing 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.
PATCH v5 17/17 xenctx: Fixup options checking.
In reply to Don SlutzAlso 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
@@ -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
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
Signed-off-by Don Slutz <[email protected]>--- tools/xentrace/xenctx.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-)tools/xentrace/xenctx.c +0
-0
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);
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
Signed-off-by Don Slutz <[email protected]>--- 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@@ -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);
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.
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.
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+0x22f4) 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.