0
|
1 /*
|
|
2
|
|
3 Package: dyncall
|
|
4 Library: dyncallback
|
|
5 File: dyncallback/dyncall_callback_x64.S
|
|
6 Description: Callback Thunk entry for x64 (portasm version)
|
|
7 License:
|
|
8
|
|
9 Copyright (c) 2011-2015 Daniel Adler <dadler@uni-goettingen.de>
|
|
10
|
|
11 Permission to use, copy, modify, and distribute this software for any
|
|
12 purpose with or without fee is hereby granted, provided that the above
|
|
13 copyright notice and this permission notice appear in all copies.
|
|
14
|
|
15 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
16 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
17 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
18 ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
19 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
20 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
21 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
22
|
|
23 */
|
|
24
|
|
25
|
|
26
|
|
27 #include "../portasm/portasm-x64-att.S"
|
|
28
|
|
29 /* structure sizes */
|
|
30
|
|
31 SET(DCThunk_size,24)
|
|
32 SET(DCArgs_size_win64,80)
|
|
33 SET(DCArgs_size_sysv,128)
|
|
34 SET(DCValue_size,8)
|
|
35
|
|
36 /* frame local variable offsets relative to %rbp*/
|
|
37
|
|
38 SET(FRAME_arg0_win64,48)
|
|
39 SET(FRAME_arg0_sysv,16)
|
|
40 SET(FRAME_return,8)
|
|
41 SET(FRAME_parent,0)
|
|
42 SET(FRAME_DCArgs_sysv,-128)
|
|
43 SET(FRAME_DCValue_sysv,-136)
|
|
44 SET(FRAME_DCArgs_win64,-80)
|
|
45 SET(FRAME_DCValue_win64,-80)
|
|
46
|
|
47 /* struct DCCallback */
|
|
48
|
|
49 SET(CTX_thunk,0)
|
|
50 SET(CTX_handler,24)
|
|
51 SET(CTX_userdata,32)
|
|
52 SET(DCCallback_size,40)
|
|
53
|
|
54 /* character constants */
|
|
55
|
|
56 #define ASCII_f 102
|
|
57 #define ASCII_d 100
|
|
58
|
|
59 GLOBAL(dcCallback_x64_sysv)
|
|
60 BEGIN_PROC(dcCallback_x64_sysv)
|
|
61
|
|
62 PUSH(RBP)
|
|
63 MOV(RSP,RBP)
|
|
64
|
|
65 /* initialize DCArgs */
|
|
66
|
|
67 /* float parameters (8 registers spill to DCArgs) */
|
|
68
|
|
69 SUB(LIT(8*8),RSP)
|
|
70
|
|
71 MOVSD(XMM7, QWORD(RSP,8*7)) /* struct offset 120: float parameter 7 */
|
|
72 MOVSD(XMM6, QWORD(RSP,8*6)) /* struct offset 112: float parameter 6 */
|
|
73 MOVSD(XMM5, QWORD(RSP,8*5)) /* struct offset 104: float parameter 5 */
|
|
74 MOVSD(XMM4, QWORD(RSP,8*4)) /* struct offset 96: float parameter 4 */
|
|
75 MOVSD(XMM3, QWORD(RSP,8*3)) /* struct offset 88: float parameter 3 */
|
|
76 MOVSD(XMM2, QWORD(RSP,8*2)) /* struct offset 80: float parameter 2 */
|
|
77 MOVSD(XMM1, QWORD(RSP,8*1)) /* struct offset 72: float parameter 1 */
|
|
78 MOVSD(XMM0, QWORD(RSP,8*0)) /* struct offset 64: float parameter 0 */
|
|
79
|
|
80 /* integer parameters (6 registers spill to DCArgs) */
|
|
81
|
|
82 PUSH(R9) /* struct offset 56: parameter 5 */
|
|
83 PUSH(R8) /* struct offset 48: parameter 4 */
|
|
84 PUSH(RCX) /* struct offset 40: parameter 3 */
|
|
85 PUSH(RDX) /* struct offset 32: parameter 2 */
|
|
86 PUSH(RSI) /* struct offset 24: parameter 1 */
|
|
87 PUSH(RDI) /* struct offset 16: parameter 0 */
|
|
88
|
|
89 /* register counts for integer/pointer and float regs */
|
|
90
|
|
91 PUSH(LIT(0)) /* struct offset 12: fcount */
|
|
92 /* struct offset 8: icount */
|
|
93
|
|
94 LEA(QWORD(RBP,FRAME_arg0_sysv),RDX) /* struct offset 0: stack pointer */
|
|
95 PUSH(RDX)
|
|
96
|
|
97 MOV(RSP,RSI) /* arg 1 RSI : DCArgs* */
|
|
98
|
|
99 /* initialize DCValue */
|
|
100
|
|
101 PUSH(LIT(0)) /* struct offset 0: return value (max long long) */
|
|
102
|
|
103 /* call handler( *ctx, *args, *value, *userdata) */
|
|
104
|
|
105 MOV(RAX,RDI) /* arg 0 RDI : DCCallback* (RAX) */
|
|
106 MOV(QWORD(RDI,CTX_userdata),RCX) /* arg 3 RCX : userdata* */
|
|
107 MOV(RSP,RDX) /* arg 2 RDX : DCValue* */
|
|
108 PUSH(LIT(0)) /* align to 16 bytes */
|
|
109 CALL_REG(QWORD(RAX,CTX_handler))
|
|
110
|
|
111 /* pass return type via registers, handle ints and floats */
|
|
112
|
|
113 MOV(QWORD(RBP,FRAME_DCValue_sysv),RAX)
|
|
114 MOVD(RAX,XMM0)
|
|
115
|
|
116 MOV(RBP,RSP)
|
|
117 POP(RBP)
|
|
118 RET()
|
|
119
|
|
120 END_PROC(dcCallback_x64_sysv)
|
|
121
|
|
122 GLOBAL(dcCallback_x64_win64)
|
|
123 BEGIN_PROC(dcCallback_x64_win64)
|
|
124
|
|
125 PUSH(RBP)
|
|
126 MOV(RSP,RBP)
|
|
127
|
|
128 /* initialize DCArgs */
|
|
129
|
|
130 /* float parameters (4 registers spill to DCArgs) */
|
|
131
|
|
132 SUB(LIT(4*8),RSP)
|
|
133
|
|
134 MOVSD(XMM3, QWORD(RSP,8*3)) /* struct offset 72: float parameter 3 */
|
|
135 MOVSD(XMM2, QWORD(RSP,8*2)) /* struct offset 64: float parameter 2 */
|
|
136 MOVSD(XMM1, QWORD(RSP,8*1)) /* struct offset 56: float parameter 1 */
|
|
137 MOVSD(XMM0, QWORD(RSP,8*0)) /* struct offset 48: float parameter 0 */
|
|
138
|
|
139 /* integer parameters (4 registers spill to DCArgs) */
|
|
140
|
|
141 PUSH(R9) /* struct offset 40: parameter 3 */
|
|
142 PUSH(R8) /* struct offset 32: parameter 2 */
|
|
143 PUSH(RDX) /* struct offset 24: parameter 1 */
|
|
144 PUSH(RCX) /* struct offset 16: parameter 0 */
|
|
145
|
|
146 /* register counts for integer/pointer and float regs */
|
|
147
|
|
148 PUSH(LIT(0)) /* struct offset 12: fcount */
|
|
149 /* struct offset 8: icount */
|
|
150
|
|
151 LEA(QWORD(RBP,FRAME_arg0_win64),RDX) /* struct offset 0: stack pointer */
|
|
152 PUSH(RDX)
|
|
153
|
|
154 MOV(RSP,RDX) /* arg 1 RDX : DCArgs* */
|
|
155
|
|
156 /* initialize DCValue */
|
|
157
|
|
158 // PUSHQ(LIT(0)) /* struct offset 0: return value (max long long) */
|
|
159
|
|
160 /* call handler( *ctx, *args, *value, *userdata) */
|
|
161
|
|
162 MOV(RAX,RCX) /* arg 0 RCX : DCCallback* (RAX) */
|
|
163 MOV(QWORD(RAX,CTX_userdata),R9) /* arg 3 R9 : userdata* */
|
|
164 MOV(RSP,R8) /* arg 2 R8 : DCValue* */
|
|
165 SUB(LIT(4*8),RSP) /* make room for spill area and call */
|
|
166 CALL_REG(QWORD(RAX,CTX_handler))
|
|
167
|
|
168 /* pass return type via registers, handle ints and floats */
|
|
169
|
|
170 MOV(QWORD(RBP,FRAME_DCValue_win64),RAX)
|
|
171 MOVD(RAX,XMM0)
|
|
172
|
|
173 MOV(RBP,RSP)
|
|
174 POP(RBP)
|
|
175 RET()
|
|
176
|
|
177 END_PROC(dcCallback_x64_win64)
|
|
178
|
|
179 END_ASM
|
|
180
|