# HG changeset patch
# User Keir Fraser <keir@xxxxxxxxxxxxx>
# Date 1193128866 -3600
# Node ID 4970cbf9b19e751c7bc79107bd354bc1403d074f
# Parent 5a213170b06e0739b4c8914eedee5530d55a6bb7
x86: Fix xentrace of hypercalls in debug builds of Xen.
Based on a patch by Yosuke Iwamatsu <y-iwamatsu@xxxxxxxxxxxxx>
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
---
xen/arch/x86/x86_32/entry.S | 5 ++++-
xen/arch/x86/x86_64/compat/entry.S | 17 ++++++++++-------
xen/arch/x86/x86_64/entry.S | 18 +++++++++++-------
3 files changed, 25 insertions(+), 15 deletions(-)
diff -r 5a213170b06e -r 4970cbf9b19e xen/arch/x86/x86_32/entry.S
--- a/xen/arch/x86/x86_32/entry.S Tue Oct 23 09:31:03 2007 +0100
+++ b/xen/arch/x86/x86_32/entry.S Tue Oct 23 09:41:06 2007 +0100
@@ -181,6 +181,7 @@ 1: sti
movl $0xDEADBEEF,%eax
rep stosl
movl %esi,%eax
+#define SHADOW_BYTES 32 /* 6 shadow parameters + EIP + hypercall # */
#else
/*
* We need shadow parameters even on non-debug builds. We depend on the
@@ -193,12 +194,14 @@ 1: sti
pushl 20(%esp) # EDX
pushl 20(%esp) # ECX
pushl 20(%esp) # EBX
+#define SHADOW_BYTES 24 /* 6 shadow parameters */
#endif
cmpb $0,tb_init_done
je tracing_off
call trace_hypercall
/* Now restore all the registers that trace_hypercall clobbered */
- movl UREGS_eax+24(%esp),%eax /* Hypercall # */
+ movl UREGS_eax+SHADOW_BYTES(%esp),%eax /* Hypercall # */
+#undef SHADOW_BYTES
tracing_off:
call *hypercall_table(,%eax,4)
addl $24,%esp # Discard the shadow parameters
diff -r 5a213170b06e -r 4970cbf9b19e xen/arch/x86/x86_64/compat/entry.S
--- a/xen/arch/x86/x86_64/compat/entry.S Tue Oct 23 09:31:03 2007 +0100
+++ b/xen/arch/x86/x86_64/compat/entry.S Tue Oct 23 09:41:06 2007 +0100
@@ -47,6 +47,7 @@ ENTRY(compat_hypercall)
movl UREGS_rax(%rsp),%eax
pushq %rax
pushq UREGS_rip+8(%rsp)
+#define SHADOW_BYTES 16 /* Shadow EIP + shadow hypercall # */
#else
/* Relocate argument registers and zero-extend to 64 bits. */
movl %eax,%eax /* Hypercall # */
@@ -55,18 +56,20 @@ ENTRY(compat_hypercall)
movl %edi,%r8d /* Arg 5 */
movl %ebp,%r9d /* Arg 6 */
movl UREGS_rbx(%rsp),%edi /* Arg 1 */
+#define SHADOW_BYTES 0 /* No on-stack shadow state */
#endif
cmpb $0,tb_init_done(%rip)
je compat_tracing_off
call trace_hypercall
/* Now restore all the registers that trace_hypercall clobbered */
- movl UREGS_rax(%rsp),%eax /* Hypercall # */
- movl UREGS_rbx(%rsp),%edi /* Arg 1 */
- movl UREGS_rcx(%rsp),%esi /* Arg 2 */
- movl UREGS_rdx(%rsp),%edx /* Arg 3 */
- movl UREGS_rsi(%rsp),%ecx /* Arg 4 */
- movl UREGS_rdi(%rsp),%r8d /* Arg 5 */
- movl UREGS_rbp(%rsp),%r9d /* Arg 6 */
+ movl UREGS_rax+SHADOW_BYTES(%rsp),%eax /* Hypercall # */
+ movl UREGS_rbx+SHADOW_BYTES(%rsp),%edi /* Arg 1 */
+ movl UREGS_rcx+SHADOW_BYTES(%rsp),%esi /* Arg 2 */
+ movl UREGS_rdx+SHADOW_BYTES(%rsp),%edx /* Arg 3 */
+ movl UREGS_rsi+SHADOW_BYTES(%rsp),%ecx /* Arg 4 */
+ movl UREGS_rdi+SHADOW_BYTES(%rsp),%r8d /* Arg 5 */
+ movl UREGS_rbp+SHADOW_BYTES(%rsp),%r9d /* Arg 6 */
+#undef SHADOW_BYTES
compat_tracing_off:
leaq compat_hypercall_table(%rip),%r10
PERFC_INCR(PERFC_hypercalls, %rax, %rbx)
diff -r 5a213170b06e -r 4970cbf9b19e xen/arch/x86/x86_64/entry.S
--- a/xen/arch/x86/x86_64/entry.S Tue Oct 23 09:31:03 2007 +0100
+++ b/xen/arch/x86/x86_64/entry.S Tue Oct 23 09:41:06 2007 +0100
@@ -148,18 +148,22 @@ ENTRY(syscall_enter)
movq UREGS_rax(%rsp),%rax
pushq %rax
pushq UREGS_rip+8(%rsp)
+#define SHADOW_BYTES 16 /* Shadow EIP + shadow hypercall # */
+#else
+#define SHADOW_BYTES 0 /* No on-stack shadow state */
#endif
cmpb $0,tb_init_done(%rip)
je tracing_off
call trace_hypercall
/* Now restore all the registers that trace_hypercall clobbered */
- movq UREGS_rax(%rsp),%rax /* Hypercall # */
- movq UREGS_rdi(%rsp),%rdi /* Arg 1 */
- movq UREGS_rsi(%rsp),%rsi /* Arg 2 */
- movq UREGS_rdx(%rsp),%rdx /* Arg 3 */
- movq UREGS_r10(%rsp),%rcx /* Arg 4 */
- movq UREGS_rdi(%rsp),%r8 /* Arg 5 */
- movq UREGS_rbp(%rsp),%r9 /* Arg 6 */
+ movq UREGS_rax+SHADOW_BYTES(%rsp),%rax /* Hypercall # */
+ movq UREGS_rdi+SHADOW_BYTES(%rsp),%rdi /* Arg 1 */
+ movq UREGS_rsi+SHADOW_BYTES(%rsp),%rsi /* Arg 2 */
+ movq UREGS_rdx+SHADOW_BYTES(%rsp),%rdx /* Arg 3 */
+ movq UREGS_r10+SHADOW_BYTES(%rsp),%rcx /* Arg 4 */
+ movq UREGS_rdi+SHADOW_BYTES(%rsp),%r8 /* Arg 5 */
+ movq UREGS_rbp+SHADOW_BYTES(%rsp),%r9 /* Arg 6 */
+#undef SHADOW_BYTES
tracing_off:
leaq hypercall_table(%rip),%r10
PERFC_INCR(PERFC_hypercalls, %rax, %rbx)
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|