Make the Win64 -> ELF64 template a little smaller by using a string
copy op to shift arguments on the stack instead of transfering each argument one by one through a register. Probably doesn't affect overall operation, but makes the code a little less grotty and easier to update later if I choose to make the wrapper handle more args. Also add comments.
This commit is contained in:
parent
794d97253e
commit
cb91ac4b68
@ -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:
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user