rbdc 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/dyncall/CMakeLists.txt +3 -3
- data/dyncall/ChangeLog +33 -0
- data/dyncall/ChangeLog.orig +274 -0
- data/dyncall/LICENSE +1 -1
- data/dyncall/README +3 -5
- data/dyncall/ToDo +27 -18
- data/dyncall/ToDo.orig +201 -0
- data/dyncall/autovar/autovar_ARCH.h +1 -1
- data/dyncall/buildsys/vs2005/vs2005.sln +0 -9
- data/dyncall/cconv.lang +36 -0
- data/dyncall/configure +17 -9
- data/dyncall/configure.bat +1 -1
- data/dyncall/dyncall/dyncall.h +2 -1
- data/dyncall/dyncall/dyncall_call.S +9 -1
- data/dyncall/dyncall/dyncall_call_mips_n32.S +192 -0
- data/dyncall/dyncall/dyncall_call_mips_n64.S +197 -0
- data/dyncall/dyncall/dyncall_call_mips_n64.h +2 -0
- data/dyncall/dyncall/{dyncall_call_mips_o32_gas.s → dyncall_call_mips_o32.S} +44 -42
- data/dyncall/dyncall/dyncall_call_mips_o32.h +8 -3
- data/dyncall/dyncall/dyncall_call_ppc32.S +3 -1
- data/dyncall/dyncall/dyncall_call_ppc32.h +4 -3
- data/dyncall/dyncall/dyncall_call_ppc64.S +1 -1
- data/dyncall/dyncall/dyncall_call_ppc64.h +3 -0
- data/dyncall/dyncall/dyncall_call_x64.S +27 -2
- data/dyncall/dyncall/dyncall_call_x64.h +2 -1
- data/dyncall/dyncall/dyncall_call_x64_generic_masm.asm +13 -2
- data/dyncall/dyncall/dyncall_call_x86.S +6 -6
- data/dyncall/dyncall/dyncall_call_x86.h +7 -7
- data/dyncall/dyncall/dyncall_call_x86_generic_masm.asm +6 -7
- data/dyncall/dyncall/dyncall_callvm_mips_n64.c +27 -9
- data/dyncall/dyncall/dyncall_callvm_mips_o32.c +38 -31
- data/dyncall/dyncall/dyncall_callvm_mips_o32.c.orig +247 -0
- data/dyncall/dyncall/dyncall_callvm_x64.c +57 -3
- data/dyncall/dyncall/dyncall_callvm_x86.c +32 -32
- data/dyncall/dyncall/dyncall_macros.h +11 -8
- data/dyncall/dyncall/dyncall_struct.c +12 -6
- data/dyncall/dyncall/dyncall_struct.h +1 -1
- data/dyncall/dyncall/dyncall_vector.c +13 -12
- data/dyncall/dyncall/dyncall_vector.c.orig +53 -0
- data/dyncall/dyncall/gen-masm.sh +4 -5
- data/dyncall/dyncallback/dyncall_args_mips.h +24 -6
- data/dyncall/dyncallback/dyncall_args_mips64.c +3 -3
- data/dyncall/dyncallback/dyncall_args_mips_o32.c +19 -6
- data/dyncall/dyncallback/dyncall_callback_arch.S +11 -1
- data/dyncall/dyncallback/{dyncall_callback_mips_n32_gas.s → dyncall_callback_mips_n32.S} +1 -1
- data/dyncall/dyncallback/{dyncall_callback_mips_n64_gas.s → dyncall_callback_mips_n64.S} +39 -25
- data/dyncall/dyncallback/{dyncall_callback_mips_o32_gas.s → dyncall_callback_mips_o32.S} +29 -13
- data/dyncall/dyncallback/dyncall_callback_x86_masm.asm +0 -1
- data/dyncall/dyncallback/dyncall_thunk.h +1 -1
- data/dyncall/dyncallback/gen-masm.sh +3 -5
- data/dyncall/dynload/dynload.3 +16 -4
- data/dyncall/dynload/dynload_unix.c +101 -53
- data/dyncall/dynload/dynload_windows.c +76 -3
- data/dyncall/portasm/README.txt +1 -1
- data/dyncall/portasm/gen-masm.sh +5 -1
- metadata +14 -13
- data/dyncall/buildsys/vs2005/test_plain/test_plain.vcproj +0 -202
- data/dyncall/dyncall/dyncall_call_mips_gas.S +0 -37
- data/dyncall/dyncall/dyncall_call_mips_n32_gas.s +0 -192
- data/dyncall/dyncall/dyncall_call_mips_n64_gas.s +0 -192
- data/dyncall/dyncallback/dyncall_callback_mips_gas.S +0 -38
@@ -0,0 +1,197 @@
|
|
1
|
+
/*
|
2
|
+
|
3
|
+
Package: dyncall
|
4
|
+
Library: dyncall
|
5
|
+
File: dyncall/dyncall_call_mips_n64.S
|
6
|
+
Description: mips "n64" abi call kernel implementation in GNU Assembler
|
7
|
+
License:
|
8
|
+
|
9
|
+
Copyright (c) 2007-2018 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
|
+
.section .mdebug.abi64
|
27
|
+
.previous
|
28
|
+
.abicalls
|
29
|
+
.text
|
30
|
+
.align 2
|
31
|
+
.globl dcCall_mips_n64
|
32
|
+
.ent dcCall_mips_n64
|
33
|
+
dcCall_mips_n64:
|
34
|
+
|
35
|
+
/* Stack-frame prolog */
|
36
|
+
|
37
|
+
# .frame $fp,64,$31 /* vars=16, regs=3/0, args=0, extra=16 */
|
38
|
+
# .mask 0xd0000000,-8
|
39
|
+
# .fmask 0x00000000,0
|
40
|
+
dsubu $sp,$sp,64
|
41
|
+
sd $31,48($sp) /* save return address register (ra) */
|
42
|
+
sd $30,40($sp) /* save frame pointer register (fp) */
|
43
|
+
sd $28,32($sp) /* save global pointer register (gp) */
|
44
|
+
move $fp,$sp
|
45
|
+
|
46
|
+
|
47
|
+
/* arguments: */
|
48
|
+
|
49
|
+
/* $4 target function */
|
50
|
+
/* $5 register data */
|
51
|
+
/* $6 stack size */
|
52
|
+
/* $7 stack data */
|
53
|
+
|
54
|
+
|
55
|
+
/* allocate argument stack space */
|
56
|
+
|
57
|
+
dsubu $sp, $sp, $6
|
58
|
+
|
59
|
+
/* copy stack data */
|
60
|
+
|
61
|
+
/* n64 abi call assumptions:
|
62
|
+
- stack data is 16-byte aligned.
|
63
|
+
- no extra-storage for arguments passed via registers.
|
64
|
+
*/
|
65
|
+
|
66
|
+
/* $12 source pointer (parameter stack data) */
|
67
|
+
/* $14 destination (stack pointer) */
|
68
|
+
/* $6 byte count */
|
69
|
+
|
70
|
+
move $12, $7
|
71
|
+
move $14, $sp
|
72
|
+
|
73
|
+
.next:
|
74
|
+
beq $6, $0, .skip
|
75
|
+
# nop
|
76
|
+
daddiu $6, $6, -8
|
77
|
+
ld $2, 0($12)
|
78
|
+
sd $2, 0($14)
|
79
|
+
daddiu $12,$12, 8
|
80
|
+
daddiu $14,$14, 8
|
81
|
+
b .next
|
82
|
+
.skip:
|
83
|
+
move $25, $4
|
84
|
+
|
85
|
+
/* load registers */
|
86
|
+
|
87
|
+
/* locals: */
|
88
|
+
/* $13 = register data */
|
89
|
+
move $13, $5
|
90
|
+
|
91
|
+
/* load parameter registers (only ints on hardfloat) */
|
92
|
+
|
93
|
+
ld $4 , 0($13)
|
94
|
+
ld $5 , 8($13)
|
95
|
+
ld $6 ,16($13)
|
96
|
+
ld $7 ,24($13)
|
97
|
+
ld $8 ,32($13)
|
98
|
+
ld $9 ,40($13)
|
99
|
+
ld $10,48($13)
|
100
|
+
ld $11,56($13)
|
101
|
+
|
102
|
+
#if defined(DC__ABI_HARDFLOAT)
|
103
|
+
|
104
|
+
/* $14 = useDouble flags */
|
105
|
+
ld $14, 128($13)
|
106
|
+
|
107
|
+
/* load float-or-double floating pointer parameter registers
|
108
|
+
a 64-bit bitmask given at byte offset 128 of regdata indicates
|
109
|
+
if loading a float (bit cleared) or double (bit set), starting
|
110
|
+
at bit position 0 in bitmask.
|
111
|
+
*/
|
112
|
+
.t0:
|
113
|
+
and $15, $14, 1
|
114
|
+
bgtz $15, .d0
|
115
|
+
.f0:
|
116
|
+
l.s $f12, 64($13)
|
117
|
+
j .t1
|
118
|
+
.d0:
|
119
|
+
l.d $f12, 64($13)
|
120
|
+
|
121
|
+
.t1:
|
122
|
+
and $15, $14, 2
|
123
|
+
bgtz $15, .d1
|
124
|
+
.f1:
|
125
|
+
l.s $f13, 72($13)
|
126
|
+
j .t2
|
127
|
+
.d1:
|
128
|
+
l.d $f13, 72($13)
|
129
|
+
.t2:
|
130
|
+
and $15, $14, 4
|
131
|
+
bgtz $15, .d2
|
132
|
+
.f2:
|
133
|
+
l.s $f14, 80($13)
|
134
|
+
j .t3
|
135
|
+
.d2:
|
136
|
+
l.d $f14, 80($13)
|
137
|
+
.t3:
|
138
|
+
and $15, $14, 8
|
139
|
+
bgtz $15, .d3
|
140
|
+
.f3:
|
141
|
+
l.s $f15, 88($13)
|
142
|
+
j .t4
|
143
|
+
.d3:
|
144
|
+
l.d $f15, 88($13)
|
145
|
+
.t4:
|
146
|
+
and $15, $14, 16
|
147
|
+
bgtz $15, .d4
|
148
|
+
.f4:
|
149
|
+
l.s $f16, 96($13)
|
150
|
+
j .t5
|
151
|
+
.d4:
|
152
|
+
l.d $f16, 96($13)
|
153
|
+
.t5:
|
154
|
+
and $15, $14, 32
|
155
|
+
bgtz $15, .d5
|
156
|
+
.f5:
|
157
|
+
l.s $f17,104($13)
|
158
|
+
j .t6
|
159
|
+
.d5:
|
160
|
+
l.d $f17,104($13)
|
161
|
+
.t6:
|
162
|
+
and $15, $14, 64
|
163
|
+
bgtz $15, .d6
|
164
|
+
.f6:
|
165
|
+
l.s $f18,112($13)
|
166
|
+
j .t7
|
167
|
+
.d6:
|
168
|
+
l.d $f18,112($13)
|
169
|
+
.t7:
|
170
|
+
and $15, $14, 128
|
171
|
+
bgtz $15, .d7
|
172
|
+
.f7:
|
173
|
+
l.s $f19,120($13)
|
174
|
+
j .fregend
|
175
|
+
.d7:
|
176
|
+
l.d $f19,120($13)
|
177
|
+
|
178
|
+
#endif /* DC__ABI_HARDFLOAT) */
|
179
|
+
|
180
|
+
.fregend:
|
181
|
+
|
182
|
+
/* jump-and-link to register $25 */
|
183
|
+
|
184
|
+
jal $31, $25
|
185
|
+
nop /* branch-delay slot - no nop according to gcc assembly */
|
186
|
+
/* output, but let's play safe */
|
187
|
+
|
188
|
+
/* Stack-frame epilog */
|
189
|
+
move $sp,$fp
|
190
|
+
ld $ra,48($sp) /* restore ra register */
|
191
|
+
ld $fp,40($sp) /* restore fp register */
|
192
|
+
ld $gp,32($sp) /* restore gp register */
|
193
|
+
daddu $sp,$sp,64
|
194
|
+
j $ra
|
195
|
+
.end dcCall_mips_n64
|
196
|
+
.size dcCall_mips_n64, .-dcCall_mips_n64
|
197
|
+
|
@@ -53,8 +53,10 @@ extern "C" {
|
|
53
53
|
struct DCRegData_mips_n64
|
54
54
|
{
|
55
55
|
DClonglong mIntData[8];
|
56
|
+
#if defined(DC__ABI_HARDFLOAT)
|
56
57
|
union { DCfloat f; DCdouble d; } mFloatData[8];
|
57
58
|
DClonglong mUseDouble; /* bitmask: lower 8 bits specify to use float or double from union array. */
|
59
|
+
#endif /* DC__ABI_HARDFLOAT */
|
58
60
|
};
|
59
61
|
|
60
62
|
void dcCall_mips_n64(DCpointer target, struct DCRegData_mips_n64* regdata, DCsize stksize, DCpointer stkdata);
|
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
Package: dyncall
|
4
4
|
Library: dyncall
|
5
|
-
File: dyncall/
|
5
|
+
File: dyncall/dyncall_call_mips_o32.S
|
6
6
|
Description: mips "o32" abi call kernel implementation in GNU Assembler
|
7
7
|
License:
|
8
8
|
|
9
|
-
Copyright (c) 2007-
|
9
|
+
Copyright (c) 2007-2018 Daniel Adler <dadler@uni-goettingen.de>,
|
10
10
|
Tassilo Philipp <tphilipp@potion-studios.com>
|
11
11
|
|
12
12
|
Permission to use, copy, modify, and distribute this software for any
|
@@ -23,8 +23,8 @@
|
|
23
23
|
|
24
24
|
*/
|
25
25
|
/* $4 target function */
|
26
|
-
|
27
|
-
/* $6 stack size (
|
26
|
+
/* $5 register data */
|
27
|
+
/* $6 stack size (guaranteed to be >= 16b and multiple of 8b) */
|
28
28
|
/* $7 stack data */
|
29
29
|
|
30
30
|
|
@@ -33,22 +33,22 @@
|
|
33
33
|
.previous
|
34
34
|
.abicalls
|
35
35
|
.text
|
36
|
-
.align
|
37
|
-
.globl
|
38
|
-
.ent
|
39
|
-
.type
|
36
|
+
.align 2
|
37
|
+
.globl dcCall_mips_o32
|
38
|
+
.ent dcCall_mips_o32
|
39
|
+
.type dcCall_mips_o32, @function
|
40
40
|
dcCall_mips_o32:
|
41
|
-
.frame
|
42
|
-
.mask
|
43
|
-
.fmask
|
44
|
-
.set
|
41
|
+
.frame $fp,40,$31 /* vars=8, regs=2/0, args=16, gp=8 */
|
42
|
+
.mask 0xc0000000,-4
|
43
|
+
.fmask 0x00000000,0
|
44
|
+
.set noreorder
|
45
45
|
|
46
|
-
addiu
|
47
|
-
sw
|
48
|
-
sw
|
46
|
+
addiu $sp, $sp, -8
|
47
|
+
sw $31, 4($sp) /* save link register */
|
48
|
+
sw $fp, 0($sp) /* save frame pointer */
|
49
49
|
nop
|
50
|
-
move
|
51
|
-
sub
|
50
|
+
move $fp, $sp /* frame pointer = sp */
|
51
|
+
sub $sp, $sp, $6 /* increment stack */
|
52
52
|
|
53
53
|
/* copy stack data */
|
54
54
|
|
@@ -56,52 +56,54 @@ dcCall_mips_o32:
|
|
56
56
|
/* $14 destination (stack pointer) */
|
57
57
|
/* $6 byte count */
|
58
58
|
|
59
|
-
move
|
60
|
-
move
|
59
|
+
move $12, $7
|
60
|
+
move $14, $sp
|
61
61
|
|
62
62
|
.next:
|
63
|
-
beq
|
63
|
+
beq $6, $0, .skip
|
64
64
|
nop
|
65
|
-
lw
|
65
|
+
lw $2, 0($12)
|
66
66
|
nop
|
67
|
-
sw
|
68
|
-
addiu
|
69
|
-
addiu
|
70
|
-
addiu
|
71
|
-
j
|
67
|
+
sw $2, 0($14)
|
68
|
+
addiu $12, $12, 4
|
69
|
+
addiu $14, $14, 4
|
70
|
+
addiu $6, $6, -4
|
71
|
+
j .next
|
72
72
|
nop
|
73
73
|
.skip:
|
74
74
|
|
75
|
-
|
75
|
+
#if defined(DC__ABI_HARDFLOAT)
|
76
|
+
/* load two double-precision floating-point argument registers ($f12, $f14) - not for softfloat */
|
76
77
|
|
77
78
|
l.d $f12, 0($5)
|
78
79
|
l.d $f14, 8($5)
|
80
|
+
#endif
|
79
81
|
|
80
82
|
/* prepare call */
|
81
83
|
|
82
|
-
move
|
83
|
-
move
|
84
|
+
move $12, $7 /* $12 stack data */
|
85
|
+
move $25, $4 /* $25 target function */
|
84
86
|
|
85
87
|
/* load first four integer arguments ($4-$7) */
|
86
88
|
|
87
|
-
lw
|
88
|
-
lw
|
89
|
-
lw
|
90
|
-
lw
|
89
|
+
lw $4, 0($12)
|
90
|
+
lw $5, 4($12)
|
91
|
+
lw $6, 8($12)
|
92
|
+
lw $7, 12($12)
|
91
93
|
|
92
94
|
/* call target function */
|
93
95
|
|
94
|
-
jalr
|
96
|
+
jalr $25
|
95
97
|
nop
|
96
|
-
move
|
98
|
+
move $sp, $fp /* restore stack pointer */
|
97
99
|
nop
|
98
|
-
lw
|
99
|
-
lw
|
100
|
-
addiu
|
101
|
-
j
|
100
|
+
lw $31, 4($sp) /* restore return address */
|
101
|
+
lw $fp, 0($sp) /* restore frame pointer */
|
102
|
+
addiu $sp, $sp, 8 /* end stack frame */
|
103
|
+
j $31 /* return */
|
102
104
|
nop
|
103
105
|
|
104
|
-
.set
|
105
|
-
.end
|
106
|
-
.ident
|
106
|
+
.set reorder
|
107
|
+
.end dcCall_mips_o32
|
108
|
+
.ident "handwritten"
|
107
109
|
|
@@ -37,10 +37,13 @@ extern "C" {
|
|
37
37
|
/* Call-kernel register data:
|
38
38
|
|
39
39
|
Details:
|
40
|
+
|
40
41
|
The structure holds the argument data for transfering float/double arguments
|
41
42
|
via registers as well.
|
42
|
-
The call-kernel implements loads two doubles, which
|
43
|
-
32-bit floating pointer registers.
|
43
|
+
The call-kernel on hardfloat platforms implements loads two doubles, which
|
44
|
+
involves four 32-bit floating pointer registers. It's unused for softfloat
|
45
|
+
platforms.
|
46
|
+
|
44
47
|
Float arguments map as following:
|
45
48
|
|
46
49
|
float argument 0 is at u[0][0] for little, u[0][1] for big endian and
|
@@ -49,12 +52,14 @@ extern "C" {
|
|
49
52
|
|
50
53
|
*/
|
51
54
|
|
52
|
-
typedef struct
|
55
|
+
typedef struct
|
53
56
|
{
|
57
|
+
#if defined(DC__ABI_HARDFLOAT)
|
54
58
|
union {
|
55
59
|
double d;
|
56
60
|
float f[2];
|
57
61
|
} u[2];
|
62
|
+
#endif /* DC__ABI_HARDFLOAT */
|
58
63
|
} DCRegData_mips_o32;
|
59
64
|
|
60
65
|
|
@@ -268,6 +268,7 @@ ENTRY_C(dcCall_ppc32_sysv)
|
|
268
268
|
|
269
269
|
.align 2
|
270
270
|
|
271
|
+
/* @@@ Bus Error on Darwin */
|
271
272
|
GLOBAL_C(dcCall_ppc32_syscall)
|
272
273
|
ENTRY_C(dcCall_ppc32_syscall)
|
273
274
|
mflr r0 /* r0 = return address */
|
@@ -282,10 +283,11 @@ ENTRY_C(dcCall_ppc32_syscall)
|
|
282
283
|
lwz r5 , 8(r11)
|
283
284
|
lwz r6 ,12(r11)
|
284
285
|
lwz r7 ,16(r11)
|
286
|
+
/* @@@ missing r8,r9,10 on some platforms? */
|
285
287
|
sc
|
286
288
|
|
287
289
|
lwz r1, 0(r1) /* restore stack */
|
288
290
|
lwz r0, 4(r1) /* r0 = return address */
|
289
291
|
mtlr r0 /* setup link register */
|
290
292
|
blr
|
291
|
-
|
293
|
+
|
@@ -47,13 +47,14 @@ struct DCRegData_ppc32_
|
|
47
47
|
*/
|
48
48
|
|
49
49
|
/* Darwin ABI */
|
50
|
-
|
51
50
|
void dcCall_ppc32_darwin (DCpointer target, struct DCRegData_ppc32_* ppc32data, DCsize stksize, DCpointer stkdata);
|
52
51
|
|
53
|
-
/* System V
|
54
|
-
|
52
|
+
/* System V ABI */
|
55
53
|
void dcCall_ppc32_sysv (DCpointer target, struct DCRegData_ppc32_* ppc32data, DCsize stksize, DCpointer stkdata);
|
56
54
|
|
55
|
+
/* syscall @@@ Bus Error on Darwin */
|
56
|
+
void dcCall_ppc32_syscall (DCpointer target, struct DCRegData_ppc32_* ppc32data, DCsize stksize, DCpointer stkdata);
|
57
|
+
|
57
58
|
#ifdef __cplusplus
|
58
59
|
}
|
59
60
|
#endif
|
@@ -47,6 +47,9 @@ struct DCRegData_ppc64_
|
|
47
47
|
|
48
48
|
void dcCall_ppc64(DCpointer target, struct DCRegData_ppc64_* ppc64data, DCsize stksize, DCpointer stkdata);
|
49
49
|
|
50
|
+
/* syscall */
|
51
|
+
void dcCall_ppc64_syscall(DCpointer target, struct DCRegData_ppc64_* ppc64data, DCsize stksize, DCpointer stkdata);
|
52
|
+
|
50
53
|
#ifdef __cplusplus
|
51
54
|
}
|
52
55
|
#endif
|
@@ -6,7 +6,7 @@
|
|
6
6
|
Description: All x64 abi call kernel implementation
|
7
7
|
License:
|
8
8
|
|
9
|
-
Copyright (c) 2007-
|
9
|
+
Copyright (c) 2007-2020 Daniel Adler <dadler@uni-goettingen.de>,
|
10
10
|
Tassilo Philipp <tphilipp@potion-studios.com>
|
11
11
|
|
12
12
|
Permission to use, copy, modify, and distribute this software for any
|
@@ -60,7 +60,7 @@ BEGIN_PROC(dcCall_x64_sysv)
|
|
60
60
|
|
61
61
|
ADD(LIT(31),RDI) /* Align stack to 32-byte. */
|
62
62
|
AND(LIT(-32),RDI)
|
63
|
-
ADD(LIT(8),RDI)
|
63
|
+
ADD(LIT(8),RDI) /* Adjust by 8-byte for the return-address. */
|
64
64
|
SUB(RDI,RSP) /* Setup stack frame by subtracting the size of arguments. */
|
65
65
|
|
66
66
|
MOV(RDI,RCX) /* Store number of bytes to copy to stack in RCX (for rep movsb). */
|
@@ -143,5 +143,30 @@ BEGIN_PROC(dcCall_x64_win64)
|
|
143
143
|
|
144
144
|
END_PROC(dcCall_x64_win64)
|
145
145
|
|
146
|
+
/*---------------------------------------------------------------------------
|
147
|
+
|
148
|
+
Call Kernel for x64 System V syscalls
|
149
|
+
|
150
|
+
Input:
|
151
|
+
RDI : pointer to arguments
|
152
|
+
RSI : syscall id
|
153
|
+
|
154
|
+
*/
|
155
|
+
|
156
|
+
GLOBAL(dcCall_x64_syscall_sysv)
|
157
|
+
BEGIN_PROC(dcCall_x64_syscall_sysv)
|
158
|
+
|
159
|
+
MOV(RSI,RAX) /* load system call id. */
|
160
|
+
MOV(QWORD(RDI,40),R9) /* copy first six int/pointer arguments to RDI, RSI, RDX, R10, R8, R9. */
|
161
|
+
MOV(QWORD(RDI,32),R8)
|
162
|
+
MOV(QWORD(RDI,24),R10)
|
163
|
+
MOV(QWORD(RDI,16),RDX)
|
164
|
+
MOV(QWORD(RDI,8),RSI)
|
165
|
+
MOV(QWORD(RDI,0),RDI) /* Set RDI last to not overwrite it to soon. */
|
166
|
+
SYSCALL
|
167
|
+
RET()
|
168
|
+
|
169
|
+
END_PROC(dcCall_x64_syscall_sysv)
|
170
|
+
|
146
171
|
END_ASM
|
147
172
|
|