aboutsummaryrefslogtreecommitdiff
path: root/lib/darwin/objc-asm.S
blob: 98f1e556859119034e17088b8e6a0eec6c5eaf09 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
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, #:lower16:(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