Mercurial > pub > dyncall > dyncall
annotate dyncallback/dyncall_callback_arm32_arm_apple.s @ 336:3c6bc720bc1f r1.1-RC1
- doc: added mips64/n32 stub
author | Tassilo Philipp |
---|---|
date | Sat, 30 Nov 2019 15:57:28 +0100 |
parents | 91db39538e78 |
children |
rev | line source |
---|---|
0 | 1 /* |
2 | |
3 Package: dyncall | |
4 Library: dyncallback | |
5 File: dyncallback/dyncall_callback_arm32_arm_apple.s | |
6 Description: Callback Thunk - Implementation for ARM32 (ARM mode) for Apple's as | |
7 License: | |
8 | |
9 Copyright (c) 2007-2011 Daniel Adler <dadler@uni-goettingen.de>, | |
10 Tassilo Philipp <tphilipp@potion-studios.com> | |
11 | |
12 Permission to use, copy, modify, and distribute this software for any | |
13 purpose with or without fee is hereby granted, provided that the above | |
14 copyright notice and this permission notice appear in all copies. | |
15 | |
16 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
17 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
18 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
19 ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
20 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
21 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
22 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
23 | |
24 */ | |
25 | |
26 | |
27 .text | |
28 .code 32 /* ARM mode */ | |
29 | |
30 .globl _dcCallbackThunkEntry | |
31 .align 4 | |
32 /* sizes */ | |
249
91db39538e78
- replaced `.set' directives used to set symbol values in assembly files with (seemingly) more portable `=' syntax (e.g. older versions of Sun's `as' don't handle `.set')
Tassilo Philipp
parents:
41
diff
changeset
|
33 DCThunk_size = 8 |
91db39538e78
- replaced `.set' directives used to set symbol values in assembly files with (seemingly) more portable `=' syntax (e.g. older versions of Sun's `as' don't handle `.set')
Tassilo Philipp
parents:
41
diff
changeset
|
34 DCArgs_size = 24 |
91db39538e78
- replaced `.set' directives used to set symbol values in assembly files with (seemingly) more portable `=' syntax (e.g. older versions of Sun's `as' don't handle `.set')
Tassilo Philipp
parents:
41
diff
changeset
|
35 DCCallback_size = 20 |
91db39538e78
- replaced `.set' directives used to set symbol values in assembly files with (seemingly) more portable `=' syntax (e.g. older versions of Sun's `as' don't handle `.set')
Tassilo Philipp
parents:
41
diff
changeset
|
36 DCValue_size = 8 |
0 | 37 |
38 /* struct DCCallback offsets and size */ | |
249
91db39538e78
- replaced `.set' directives used to set symbol values in assembly files with (seemingly) more portable `=' syntax (e.g. older versions of Sun's `as' don't handle `.set')
Tassilo Philipp
parents:
41
diff
changeset
|
39 CTX_thunk = 0 |
91db39538e78
- replaced `.set' directives used to set symbol values in assembly files with (seemingly) more portable `=' syntax (e.g. older versions of Sun's `as' don't handle `.set')
Tassilo Philipp
parents:
41
diff
changeset
|
40 CTX_handler = 12 |
91db39538e78
- replaced `.set' directives used to set symbol values in assembly files with (seemingly) more portable `=' syntax (e.g. older versions of Sun's `as' don't handle `.set')
Tassilo Philipp
parents:
41
diff
changeset
|
41 CTX_userdata = 16 |
0 | 42 |
43 | |
44 /* Called by thunk - thunk stores pointer to DCCallback in r12 */ | |
45 _dcCallbackThunkEntry: | |
46 | |
47 /* Prolog. This function never needs to spill inside its prolog, so just store the permanent registers. */ | |
48 stmdb r13, {r4-r11, r13, r14} /* Permanent registers and stack pointer, etc... -> save area on stack (except counter). */ | |
49 mov r11, r13 /* Set frame pointer. */ | |
50 sub r13, r13, #40 /* Adjust stack pointer. */ | |
51 | |
52 /* Grab arguments. */ | |
53 mov r4, #0 | |
54 stmdb r13!, {r0-r4, r11} /* Spill first 4 args to DCArgs, along with reg_count and (stack) pointer to remaining args. */ | |
55 | |
56 /* Prepare callback handler call. */ | |
57 mov r0, r12 /* Parameter 0 (r0) = DCCallback pointer (r12, pointer to thunk). */ | |
58 mov r1, r13 /* Parameter 1 (r1) = DCArgs pointer (r13, stack pointer). */ | |
59 sub r13, r13, #DCValue_size /* Make room for return value. */ | |
60 mov r2, r13 /* Parameter 2 (r2) = results pointer. */ | |
61 ldr r3, [r12, #CTX_userdata] /* Parameter 3 (r3) = userdata pointer. */ | |
62 | |
63 /* Call. */ | |
64 ldr r4, [r12, #CTX_handler] /* Load callback handler pointer into r4. */ | |
65 mov r14, r15 /* Branch return address(r15) -> link register (r14) -- r15 always points to address of current + 2 instructions (= Epilog code). */ | |
66 bx r4 /* Call. */ | |
67 | |
68 /* Return value. */ | |
69 ldmia r13, {r0, r1} /* Load return value in r0 and r1. */ | |
70 | |
71 /* Epilog. */ | |
72 ldmdb r11, {r4-r11, r13, r15} /* Restore permanent registers (restore stack ptr and program counter).@@@db not needed since we rewrite r13? */ | |
73 |