From: Keir Fraser Date: Tue, 23 Oct 2007 08:41:06 +0000 (+0100) Subject: x86: Fix xentrace of hypercalls in debug builds of Xen. X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~14845^2~5 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=f767bbd02828f67d86c2f42d791d5a0c56295c15;p=xen.git x86: Fix xentrace of hypercalls in debug builds of Xen. Based on a patch by Yosuke Iwamatsu Signed-off-by: Keir Fraser --- diff --git a/xen/arch/x86/x86_32/entry.S b/xen/arch/x86/x86_32/entry.S index bff00eb5c7..ca1575c1c6 100644 --- a/xen/arch/x86/x86_32/entry.S +++ b/xen/arch/x86/x86_32/entry.S @@ -181,6 +181,7 @@ ENTRY(hypercall) 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 @@ ENTRY(hypercall) 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 --git a/xen/arch/x86/x86_64/compat/entry.S b/xen/arch/x86/x86_64/compat/entry.S index b1e762bdd0..915c6c3cdc 100644 --- a/xen/arch/x86/x86_64/compat/entry.S +++ b/xen/arch/x86/x86_64/compat/entry.S @@ -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 --git a/xen/arch/x86/x86_64/entry.S b/xen/arch/x86/x86_64/entry.S index ca67151e0b..dfc4df8942 100644 --- a/xen/arch/x86/x86_64/entry.S +++ b/xen/arch/x86/x86_64/entry.S @@ -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)