rbdc 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +5 -5
  2. data/dyncall/CMakeLists.txt +3 -3
  3. data/dyncall/ChangeLog +33 -0
  4. data/dyncall/ChangeLog.orig +274 -0
  5. data/dyncall/LICENSE +1 -1
  6. data/dyncall/README +3 -5
  7. data/dyncall/ToDo +27 -18
  8. data/dyncall/ToDo.orig +201 -0
  9. data/dyncall/autovar/autovar_ARCH.h +1 -1
  10. data/dyncall/buildsys/vs2005/vs2005.sln +0 -9
  11. data/dyncall/cconv.lang +36 -0
  12. data/dyncall/configure +17 -9
  13. data/dyncall/configure.bat +1 -1
  14. data/dyncall/dyncall/dyncall.h +2 -1
  15. data/dyncall/dyncall/dyncall_call.S +9 -1
  16. data/dyncall/dyncall/dyncall_call_mips_n32.S +192 -0
  17. data/dyncall/dyncall/dyncall_call_mips_n64.S +197 -0
  18. data/dyncall/dyncall/dyncall_call_mips_n64.h +2 -0
  19. data/dyncall/dyncall/{dyncall_call_mips_o32_gas.s → dyncall_call_mips_o32.S} +44 -42
  20. data/dyncall/dyncall/dyncall_call_mips_o32.h +8 -3
  21. data/dyncall/dyncall/dyncall_call_ppc32.S +3 -1
  22. data/dyncall/dyncall/dyncall_call_ppc32.h +4 -3
  23. data/dyncall/dyncall/dyncall_call_ppc64.S +1 -1
  24. data/dyncall/dyncall/dyncall_call_ppc64.h +3 -0
  25. data/dyncall/dyncall/dyncall_call_x64.S +27 -2
  26. data/dyncall/dyncall/dyncall_call_x64.h +2 -1
  27. data/dyncall/dyncall/dyncall_call_x64_generic_masm.asm +13 -2
  28. data/dyncall/dyncall/dyncall_call_x86.S +6 -6
  29. data/dyncall/dyncall/dyncall_call_x86.h +7 -7
  30. data/dyncall/dyncall/dyncall_call_x86_generic_masm.asm +6 -7
  31. data/dyncall/dyncall/dyncall_callvm_mips_n64.c +27 -9
  32. data/dyncall/dyncall/dyncall_callvm_mips_o32.c +38 -31
  33. data/dyncall/dyncall/dyncall_callvm_mips_o32.c.orig +247 -0
  34. data/dyncall/dyncall/dyncall_callvm_x64.c +57 -3
  35. data/dyncall/dyncall/dyncall_callvm_x86.c +32 -32
  36. data/dyncall/dyncall/dyncall_macros.h +11 -8
  37. data/dyncall/dyncall/dyncall_struct.c +12 -6
  38. data/dyncall/dyncall/dyncall_struct.h +1 -1
  39. data/dyncall/dyncall/dyncall_vector.c +13 -12
  40. data/dyncall/dyncall/dyncall_vector.c.orig +53 -0
  41. data/dyncall/dyncall/gen-masm.sh +4 -5
  42. data/dyncall/dyncallback/dyncall_args_mips.h +24 -6
  43. data/dyncall/dyncallback/dyncall_args_mips64.c +3 -3
  44. data/dyncall/dyncallback/dyncall_args_mips_o32.c +19 -6
  45. data/dyncall/dyncallback/dyncall_callback_arch.S +11 -1
  46. data/dyncall/dyncallback/{dyncall_callback_mips_n32_gas.s → dyncall_callback_mips_n32.S} +1 -1
  47. data/dyncall/dyncallback/{dyncall_callback_mips_n64_gas.s → dyncall_callback_mips_n64.S} +39 -25
  48. data/dyncall/dyncallback/{dyncall_callback_mips_o32_gas.s → dyncall_callback_mips_o32.S} +29 -13
  49. data/dyncall/dyncallback/dyncall_callback_x86_masm.asm +0 -1
  50. data/dyncall/dyncallback/dyncall_thunk.h +1 -1
  51. data/dyncall/dyncallback/gen-masm.sh +3 -5
  52. data/dyncall/dynload/dynload.3 +16 -4
  53. data/dyncall/dynload/dynload_unix.c +101 -53
  54. data/dyncall/dynload/dynload_windows.c +76 -3
  55. data/dyncall/portasm/README.txt +1 -1
  56. data/dyncall/portasm/gen-masm.sh +5 -1
  57. metadata +14 -13
  58. data/dyncall/buildsys/vs2005/test_plain/test_plain.vcproj +0 -202
  59. data/dyncall/dyncall/dyncall_call_mips_gas.S +0 -37
  60. data/dyncall/dyncall/dyncall_call_mips_n32_gas.s +0 -192
  61. data/dyncall/dyncall/dyncall_call_mips_n64_gas.s +0 -192
  62. 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/dyncall_call_mips_o32_gas.s
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-2011 Daniel Adler <dadler@uni-goettingen.de>,
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
- /* $5 register data */
27
- /* $6 stack size (min 16-byte aligned to 8-bytes already) */
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 2
37
- .globl dcCall_mips_o32
38
- .ent dcCall_mips_o32
39
- .type dcCall_mips_o32, @function
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 $fp,40,$31 /* vars=8, regs=2/0, args=16, gp=8 */
42
- .mask 0xc0000000,-4
43
- .fmask 0x00000000,0
44
- .set noreorder
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 $sp,$sp,-8
47
- sw $31,4($sp) /* save link register */
48
- sw $fp,0($sp) /* save frame pointer */
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 $fp,$sp /* frame pointer = sp */
51
- sub $sp, $sp, $6 /* increment stack */
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 $12, $7
60
- move $14, $sp
59
+ move $12, $7
60
+ move $14, $sp
61
61
 
62
62
  .next:
63
- beq $6, $0, .skip
63
+ beq $6, $0, .skip
64
64
  nop
65
- lw $2, 0($12)
65
+ lw $2, 0($12)
66
66
  nop
67
- sw $2, 0($14)
68
- addiu $12,$12, 4
69
- addiu $14,$14, 4
70
- addiu $6, $6, -4
71
- j .next
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
- /* load two double-precision floating-point argument registers ($f12, $f14) */
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 $12, $7 /* $12 stack data */
83
- move $25, $4 /* $25 target function */
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 $4, 0($12)
88
- lw $5, 4($12)
89
- lw $6, 8($12)
90
- lw $7,12($12)
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 $25
96
+ jalr $25
95
97
  nop
96
- move $sp,$fp /* restore stack pointer */
98
+ move $sp, $fp /* restore stack pointer */
97
99
  nop
98
- lw $31,4($sp) /* restore return address */
99
- lw $fp,0($sp) /* restore frame pointer */
100
- addiu $sp,$sp,8 /* end stack frame */
101
- j $31 /* return */
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 reorder
105
- .end dcCall_mips_o32
106
- .ident "handwritten"
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 involves four
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 DCRegData_mips_o32_
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 (Linux) ABI */
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
@@ -197,7 +197,7 @@ ENTRY_C(dcCall_ppc64_syscall)
197
197
  ld r5 ,16(r11)
198
198
  ld r6 ,24(r11)
199
199
  ld r7 ,32(r11)
200
-
200
+ /* @@@ missing r8,r9,10 on some platforms? */
201
201
  sc /* system call */
202
202
 
203
203
  /* epilog */
@@ -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-2018 Daniel Adler <dadler@uni-goettingen.de>,
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) /* Adjust by 8-byte for the return-address. */
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