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
| // Copyright 2012 The Go Authors. All rights reserved.
| // Use of this source code is governed by a BSD-style
| // license that can be found in the LICENSE file.
|
| /*
| * Apple still insists on underscore prefixes for C function names.
| */
| #if defined(__APPLE__)
| #define EXT(s) _##s
| #else
| #define EXT(s) s
| #endif
|
| // Apple's ld64 wants 4-byte alignment for ARM code sections.
| // .align in both Apple as and GNU as treat n as aligning to 2**n bytes.
| .align 2
|
| /*
| * void crosscall_arm1(void (*fn)(void), void (*setg_gcc)(void *g), void *g)
| *
| * Calling into the 5c tool chain, where all registers are caller save.
| * Called from standard ARM EABI, where r4-r11 are callee-save, so they
| * must be saved explicitly.
| */
| .globl EXT(crosscall_arm1)
| EXT(crosscall_arm1):
| push {r4, r5, r6, r7, r8, r9, r10, r11, ip, lr}
| mov r4, r0
| mov r5, r1
| mov r0, r2
|
| // Because the assembler might target an earlier revision of the ISA
| // by default, we encode BLX as a .word.
| .word 0xe12fff35 // blx r5 // setg(g)
| .word 0xe12fff34 // blx r4 // fn()
|
| pop {r4, r5, r6, r7, r8, r9, r10, r11, ip, pc}
|
|
| #ifdef __ELF__
| .section .note.GNU-stack,"",%progbits
| #endif
|
|