aboutsummaryrefslogtreecommitdiff
path: root/lib/objc-asm.S
diff options
context:
space:
mode:
Diffstat (limited to 'lib/objc-asm.S')
-rw-r--r--lib/objc-asm.S17
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