diff --git a/sys/compat/ndis/winx64_wrap.S b/sys/compat/ndis/winx64_wrap.S index a94cd927ede9..1f9fc20b691b 100644 --- a/sys/compat/ndis/winx64_wrap.S +++ b/sys/compat/ndis/winx64_wrap.S @@ -91,42 +91,29 @@ .globl x86_64_wrap_end ENTRY(x86_64_wrap) - subq $96,%rsp - mov %rsi,96-8(%rsp) - mov %rdi,96-16(%rsp) - mov %rcx,%rdi - mov %rdx,%rsi - mov %r8,%rdx - mov %r9,%rcx - mov 96+40(%rsp),%r8 - mov 96+48(%rsp),%r9 - mov 96+56(%rsp),%rax - mov %rax,(%rsp) - mov 96+64(%rsp),%rax - mov %rax,8(%rsp) - mov 96+72(%rsp),%rax - mov %rax,16(%rsp) - mov 96+80(%rsp),%rax - mov %rax,24(%rsp) - mov 96+88(%rsp),%rax - mov %rax,32(%rsp) - mov 96+96(%rsp),%rax - mov %rax,40(%rsp) - mov 96+104(%rsp),%rax - mov %rax,48(%rsp) - mov 96+112(%rsp),%rax - mov %rax,56(%rsp) - mov 96+120(%rsp),%rax - mov %rax,64(%rsp) - mov 96+128(%rsp),%rax - mov %rax,72(%rsp) - xor %rax,%rax + subq $96,%rsp # allocate space on stack + mov %rsi,96-8(%rsp) # save %rsi + mov %rdi,96-16(%rsp)# save %rdi + mov %rcx,%r10 # temporarily save %rcx in scratch + mov %rsp,%rsi + add $96+56,%rsi # source == old stack top (stack+56) + mov %rsp,%rdi # destination == new stack top + mov $10,%rcx # count == 10 quadwords + rep + movsq # copy old stack contents to new location + mov %r10,%rdi # set up arg0 (%rcx -> %rdi) + mov %rdx,%rsi # set up arg1 (%rdx -> %rsi) + mov %r8,%rdx # set up arg2 (%r8 -> %rdx) + mov %r9,%rcx # set up arg3 (%r9 -> %rcx) + mov 96+40(%rsp),%r8 # set up arg4 (stack+40 -> %r8) + mov 96+48(%rsp),%r9 # set up arg5 (stack+48 -> %r9) + xor %rax,%rax # clear return value x86_64_wrap_call: mov $0xFF00FF00FF00FF00,%r11 - callq *%r11 - mov 96-16(%rsp),%rdi - mov 96-8(%rsp),%rsi - addq $96,%rsp + callq *%r11 # call routine + mov 96-16(%rsp),%rdi# restore %rdi + mov 96-8(%rsp),%rsi # restore %rsi + addq $96,%rsp # delete space on stack ret x86_64_wrap_end: