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
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
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 # */
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)
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)