diff options
author | comex | 2015-01-19 19:12:32 -0500 |
---|---|---|
committer | comex | 2015-01-19 19:12:32 -0500 |
commit | c25b9e2337aad02073a199619f6f754f15cccd38 (patch) | |
tree | 603f3bcdc6eb687c11c077f350cde53fc1700898 /lib/darwin/objc-asm.S | |
parent | some reorganization (diff) | |
download | substitute-c25b9e2337aad02073a199619f6f754f15cccd38.tar.gz |
more reorganization - move OS X/iOS specific stuff into its own directory
Diffstat (limited to 'lib/darwin/objc-asm.S')
-rw-r--r-- | lib/darwin/objc-asm.S | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/lib/darwin/objc-asm.S b/lib/darwin/objc-asm.S new file mode 100644 index 0000000..bebce80 --- /dev/null +++ b/lib/darwin/objc-asm.S @@ -0,0 +1,72 @@ +#include "objc.h" +.text +.align _PAGE_SHIFT +#ifdef __arm__ +.thumb_func _remap_start +.thumb +#endif +.globl _remap_start +_remap_start: + +.set i, 0 +#define my_rpe (0b + (_PAGE_SIZE - i * TRAMPOLINE_SIZE + i * TRAMP_INFO_PAGE_ENTRY_SIZE)) +.rept TRAMPOLINES_PER_PAGE +0: +#if defined(__x86_64__) + /* 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 %r9; pop %r8; pop %rcx; pop %rdx; pop %rsi; pop %rdi + jmp *%rax +#elif defined(__i386__) + call 1f +1: + pop %edx + lea my_rpe-1b(%edx), %edx + push 8(%edx) + push 4(%edx) + call *(%edx) + add $$8, %esp + jmp *%eax +#elif defined(__arm__) + push {r0-r4, lr} /* r4 for align */ + mov r3, #(my_rpe - (1f + 2)) + add r3, pc +1: + ldr r0, [r3, #4] + ldr r1, [r3, #8] + ldr r2, [r3] + blx r2 + mov r9, r0 + 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]! + + ldr x0, my_rpe+8 + ldr x1, my_rpe+0x10 + ldr x2, my_rpe + blr x2 + mov x9, x0 + + 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 +#error No forwarding assembly definition for this arch +#endif + +.set i, i + 1 +.endr + |