x86: Fix xentrace of hypercalls in debug builds of Xen.
authorKeir Fraser <keir@xensource.com>
Tue, 23 Oct 2007 08:41:06 +0000 (09:41 +0100)
committerKeir Fraser <keir@xensource.com>
Tue, 23 Oct 2007 08:41:06 +0000 (09:41 +0100)
Based on a patch by Yosuke Iwamatsu <y-iwamatsu@ab.jp.nec.com>

Signed-off-by: Keir Fraser <keir@xensource.com>
xen/arch/x86/x86_32/entry.S
xen/arch/x86/x86_64/compat/entry.S
xen/arch/x86/x86_64/entry.S

index bff00eb5c797359e249ee0ad133c6378c3f4f0e2..ca1575c1c688f4f2aca29853b2e399d901dd0abd 100644 (file)
@@ -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
index b1e762bdd0efa5cb9609533cb09a70d72d9910a6..915c6c3cdc32e5ef4408eb9519e49feaa046cef7 100644 (file)
@@ -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)
index ca67151e0b5cc9b9911a53763464449677c09d3d..dfc4df89421e4284576f0685f1abb0793d937e4b 100644 (file)
@@ -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)