diff options
Diffstat (limited to 'lib/objc-asm.S')
-rw-r--r-- | lib/objc-asm.S | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/lib/objc-asm.S b/lib/objc-asm.S index 7bfe159..7b874c4 100644 --- a/lib/objc-asm.S +++ b/lib/objc-asm.S @@ -13,12 +13,13 @@ _remap_start: .rept TRAMPOLINES_PER_PAGE 0: #if defined(__x86_64__) - push %rdi; push %rsi; push %rdx; push %rcx; push %r8; push %r9 + /* double push for align */ + push %rdi; push %rsi; push %rdx; push %rcx; push %r8; push %r9; push %r9 lea my_rpe(%rip), %rdx mov 8(%rdx), %rdi mov 16(%rdx), %rsi call *(%rdx) - pop %r9; pop %r8; pop %rcx; pop %rdx; pop %rsi; pop %rdi + pop %r9; pop %r9; pop %r8; pop %rcx; pop %rdx; pop %rsi; pop %rdi jmp *%rax #elif defined(__i386__) call 1f @@ -28,11 +29,11 @@ _remap_start: push 8(%edx) push 4(%edx) call *(%edx) - add 8, %esp + add $$8, %esp jmp *%eax #elif defined(__arm__) push {r0-r4, lr} /* r4 for align */ - mov r3, #(my_rpe - 1f) + mov r3, #(my_rpe - (1f + 2)) add r3, pc 1: ldr r0, [r3, #4] @@ -43,23 +44,23 @@ _remap_start: pop {r0-r4, lr} bx r9 #elif defined(__arm64__) + stp x30, x8, [sp, #-0x10]! stp x7, x6, [sp, #-0x10]! stp x5, x4, [sp, #-0x10]! stp x3, x2, [sp, #-0x10]! stp x1, x0, [sp, #-0x10]! - str x30, [sp, #-0x10]! - ldr x0, my_rpe+4 - ldr x1, my_rpe+8 + ldr x0, my_rpe+8 + ldr x1, my_rpe+0x10 ldr x2, my_rpe blr x2 mov x9, x0 - ldr x30, [sp], #0x10 ldp x1, x0, [sp], #0x10 ldp x3, x2, [sp], #0x10 ldp x5, x4, [sp], #0x10 ldp x7, x6, [sp], #0x10 + ldp x30, x8, [sp], #0x10 br x9 #else |