# HG changeset patch # User kfraser@localhost.localdomain # Date 1169662824 0 # Node ID e68bf334ecb877189d718122894170a43de43575 # Parent 2932d0e7c5545167901afeb7ac87dc0c1edf4bfd 32-on-64: All argument registers must be zero extended to 64 bits (%rdx was missed). Signed-off-by: Keir Fraser diff -r 2932d0e7c554 -r e68bf334ecb8 xen/arch/x86/x86_64/compat/entry.S --- a/xen/arch/x86/x86_64/compat/entry.S Wed Jan 24 18:06:14 2007 +0000 +++ b/xen/arch/x86/x86_64/compat/entry.S Wed Jan 24 18:20:24 2007 +0000 @@ -16,7 +16,8 @@ ENTRY(compat_hypercall) jae compat_bad_hypercall #ifndef NDEBUG /* Deliberately corrupt parameter regs not used by this hypercall. */ - pushq UREGS_rbx(%rsp); pushq %rcx; pushq %rdx; pushq %rsi; pushq %rdi; pushq UREGS_rbp+5*8(%rsp) + pushq UREGS_rbx(%rsp); pushq %rcx; pushq %rdx; pushq %rsi; pushq %rdi + pushq UREGS_rbp+5*8(%rsp) leaq compat_hypercall_args_table(%rip),%r10 movq $6,%rcx subb (%r10,%rax,1),%cl @@ -28,11 +29,13 @@ ENTRY(compat_hypercall) pushq %rax pushq UREGS_rip+8(%rsp) #else - movl %eax,%eax - movl %ebp,%r9d - movl %edi,%r8d - xchgl %ecx,%esi - movl UREGS_rbx(%rsp),%edi + /* Relocate argument registers and zero-extend to 64 bits. */ + movl %eax,%eax /* Hypercall # */ + movl UREGS_rbx(%rsp),%edi /* Arg 1 */ + xchgl %ecx,%esi /* Arg 2, Arg 4 */ + movl %edx,%edx /* Arg 3 */ + movl %edi,%r8d /* Arg 5 */ + movl %ebp,%r9d /* Arg 6 */ #endif leaq compat_hypercall_table(%rip),%r10 PERFC_INCR(PERFC_hypercalls, %rax)