rbdc 0.9.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (223) hide show
  1. checksums.yaml +4 -4
  2. data/dyncall/BUGS +1 -1
  3. data/dyncall/CMakeLists.txt +19 -7
  4. data/dyncall/ChangeLog +61 -20
  5. data/dyncall/LICENSE +1 -1
  6. data/dyncall/Makefile.generic +2 -0
  7. data/dyncall/ToDo +97 -29
  8. data/dyncall/autovar/README.txt +1 -0
  9. data/dyncall/autovar/autovar_ABI.h +4 -2
  10. data/dyncall/autovar/autovar_ARCH.h +9 -5
  11. data/dyncall/autovar/autovar_CC.h +3 -1
  12. data/dyncall/autovar/autovar_OS.h +2 -2
  13. data/dyncall/autovar/autovar_OSFAMILY.h +1 -1
  14. data/dyncall/configure +94 -38
  15. data/dyncall/dyncall/dyncall.3 +8 -4
  16. data/dyncall/dyncall/dyncall.h +1 -1
  17. data/dyncall/dyncall/dyncall_alloc.h +1 -1
  18. data/dyncall/dyncall/dyncall_api.c +3 -1
  19. data/dyncall/dyncall/dyncall_call.S +13 -5
  20. data/dyncall/dyncall/dyncall_call_arm32_arm.S +1 -2
  21. data/dyncall/dyncall/dyncall_call_arm32_arm.h +1 -1
  22. data/dyncall/dyncall/dyncall_call_arm32_arm_armhf.S +24 -26
  23. data/dyncall/dyncall/dyncall_call_arm32_arm_armhf.h +1 -1
  24. data/dyncall/dyncall/dyncall_call_arm32_thumb.h +1 -1
  25. data/dyncall/dyncall/dyncall_call_arm32_thumb_armhf.S +1 -1
  26. data/dyncall/dyncall/dyncall_call_arm32_thumb_gas.s +3 -7
  27. data/dyncall/dyncall/dyncall_call_arm64.S +2 -2
  28. data/dyncall/dyncall/dyncall_call_arm64.h +2 -2
  29. data/dyncall/dyncall/dyncall_call_mips.h +1 -1
  30. data/dyncall/dyncall/dyncall_call_mips_eabi.h +1 -1
  31. data/dyncall/dyncall/dyncall_call_mips_eabi_gas.s +16 -16
  32. data/dyncall/dyncall/dyncall_call_mips_gas.S +2 -2
  33. data/dyncall/dyncall/dyncall_call_mips_n32.h +5 -4
  34. data/dyncall/dyncall/dyncall_call_mips_n32_gas.s +4 -4
  35. data/dyncall/dyncall/dyncall_call_mips_n64.h +3 -3
  36. data/dyncall/dyncall/dyncall_call_mips_n64_gas.s +2 -2
  37. data/dyncall/dyncall/dyncall_call_mips_o32.h +4 -3
  38. data/dyncall/dyncall/dyncall_call_mips_o32_gas.s +1 -3
  39. data/dyncall/dyncall/dyncall_call_ppc32.S +1 -1
  40. data/dyncall/dyncall/dyncall_call_ppc32.h +1 -1
  41. data/dyncall/dyncall/dyncall_call_sparc.h +1 -1
  42. data/dyncall/dyncall/{dyncall_call_sparc.S → dyncall_call_sparc.s} +39 -44
  43. data/dyncall/dyncall/dyncall_call_sparc64.h +5 -5
  44. data/dyncall/dyncall/dyncall_call_sparc64.s +177 -0
  45. data/dyncall/dyncall/dyncall_call_x64.S +83 -86
  46. data/dyncall/dyncall/dyncall_call_x64.h +1 -1
  47. data/dyncall/dyncall/dyncall_call_x86.S +9 -9
  48. data/dyncall/dyncall/dyncall_call_x86.h +1 -1
  49. data/dyncall/dyncall/dyncall_call_x86_nasm.asm +5 -5
  50. data/dyncall/dyncall/dyncall_callf.c +18 -18
  51. data/dyncall/dyncall/dyncall_callf.h +1 -1
  52. data/dyncall/dyncall/dyncall_callvm.c +3 -3
  53. data/dyncall/dyncall/dyncall_callvm.h +1 -1
  54. data/dyncall/dyncall/dyncall_callvm_arm32_arm.c +25 -40
  55. data/dyncall/dyncall/dyncall_callvm_arm32_arm.h +1 -5
  56. data/dyncall/dyncall/dyncall_callvm_arm32_arm_armhf.c +25 -33
  57. data/dyncall/dyncall/dyncall_callvm_arm32_arm_armhf.h +1 -5
  58. data/dyncall/dyncall/dyncall_callvm_arm32_thumb.c +24 -36
  59. data/dyncall/dyncall/dyncall_callvm_arm32_thumb.h +1 -5
  60. data/dyncall/dyncall/dyncall_callvm_arm64.c +23 -27
  61. data/dyncall/dyncall/dyncall_callvm_arm64.h +2 -6
  62. data/dyncall/dyncall/dyncall_callvm_arm64_apple.c +23 -30
  63. data/dyncall/dyncall/dyncall_callvm_base.c +1 -1
  64. data/dyncall/dyncall/dyncall_callvm_mips.c +1 -1
  65. data/dyncall/dyncall/dyncall_callvm_mips.h +1 -1
  66. data/dyncall/dyncall/dyncall_callvm_mips_eabi.c +30 -27
  67. data/dyncall/dyncall/dyncall_callvm_mips_eabi.h +1 -5
  68. data/dyncall/dyncall/dyncall_callvm_mips_n32.c +24 -30
  69. data/dyncall/dyncall/{dyncall_call_sparc_v9.h → dyncall_callvm_mips_n32.h} +18 -8
  70. data/dyncall/dyncall/dyncall_callvm_mips_n64.c +23 -30
  71. data/dyncall/dyncall/dyncall_callvm_mips_n64.h +4 -6
  72. data/dyncall/dyncall/dyncall_callvm_mips_o32.c +31 -29
  73. data/dyncall/dyncall/dyncall_callvm_mips_o32.h +1 -3
  74. data/dyncall/dyncall/dyncall_callvm_ppc32.c +22 -20
  75. data/dyncall/dyncall/dyncall_callvm_ppc32.h +1 -3
  76. data/dyncall/dyncall/dyncall_callvm_ppc64.c +54 -15
  77. data/dyncall/dyncall/dyncall_callvm_ppc64.h +0 -2
  78. data/dyncall/dyncall/dyncall_callvm_sparc.c +34 -26
  79. data/dyncall/dyncall/dyncall_callvm_sparc.h +1 -3
  80. data/dyncall/dyncall/dyncall_callvm_sparc64.c +94 -150
  81. data/dyncall/dyncall/dyncall_callvm_sparc64.h +11 -17
  82. data/dyncall/dyncall/dyncall_callvm_x64.c +37 -36
  83. data/dyncall/dyncall/dyncall_callvm_x64.h +1 -4
  84. data/dyncall/dyncall/dyncall_callvm_x86.c +22 -63
  85. data/dyncall/dyncall/dyncall_callvm_x86.h +1 -17
  86. data/dyncall/dyncall/dyncall_config.h +1 -1
  87. data/dyncall/dyncall/dyncall_macros.h +28 -19
  88. data/dyncall/dyncall/dyncall_signature.h +1 -1
  89. data/dyncall/dyncall/dyncall_types.h +17 -18
  90. data/dyncall/dyncall/dyncall_utils.h +1 -1
  91. data/dyncall/dyncall/dyncall_value.h +28 -21
  92. data/dyncall/dyncall/dyncall_vector.c +1 -1
  93. data/dyncall/dyncall/dyncall_vector.h +1 -1
  94. data/dyncall/dyncall/gen-masm.sh +2 -2
  95. data/dyncall/dyncallback/CMakeLists.txt +1 -2
  96. data/dyncall/dyncallback/Makefile.generic +1 -1
  97. data/dyncall/dyncallback/dyncall_alloc_wx.c +1 -1
  98. data/dyncall/dyncallback/dyncall_alloc_wx.h +4 -3
  99. data/dyncall/dyncallback/dyncall_alloc_wx_malloc.c +8 -2
  100. data/dyncall/dyncallback/dyncall_alloc_wx_mmap.c +67 -4
  101. data/dyncall/dyncallback/dyncall_alloc_wx_win32.c +7 -2
  102. data/dyncall/dyncallback/dyncall_args.c +19 -15
  103. data/dyncall/dyncallback/dyncall_args.h +1 -1
  104. data/dyncall/dyncallback/{dyncall_args_arm32_arm.c → dyncall_args_arm32.c} +4 -4
  105. data/dyncall/dyncallback/{dyncall_args_arm32_arm.h → dyncall_args_arm32.h} +6 -6
  106. data/dyncall/dyncallback/dyncall_args_arm64.c +2 -2
  107. data/dyncall/dyncallback/dyncall_args_arm64_apple.c +2 -2
  108. data/dyncall/dyncallback/dyncall_args_mips.c +26 -21
  109. data/dyncall/dyncallback/dyncall_args_mips.h +18 -6
  110. data/dyncall/dyncallback/dyncall_args_mips64.c +81 -0
  111. data/dyncall/dyncallback/dyncall_args_mips_o32.c +104 -0
  112. data/dyncall/dyncallback/dyncall_args_ppc32.c +2 -2
  113. data/dyncall/dyncallback/dyncall_args_ppc32.h +1 -1
  114. data/dyncall/dyncallback/dyncall_args_ppc32_sysv.c +1 -1
  115. data/dyncall/dyncallback/dyncall_args_ppc64.c +24 -3
  116. data/dyncall/dyncallback/dyncall_args_sparc32.c +41 -15
  117. data/dyncall/dyncallback/dyncall_args_sparc32.h +2 -2
  118. data/dyncall/dyncallback/dyncall_args_sparc64.c +28 -15
  119. data/dyncall/dyncallback/dyncall_args_sparc64.h +7 -3
  120. data/dyncall/dyncallback/dyncall_args_x64.c +1 -1
  121. data/dyncall/dyncallback/dyncall_args_x64.h +1 -1
  122. data/dyncall/dyncallback/dyncall_args_x86.c +1 -1
  123. data/dyncall/dyncallback/dyncall_args_x86.h +1 -1
  124. data/dyncall/dyncallback/dyncall_callback.c +10 -12
  125. data/dyncall/dyncallback/dyncall_callback.h +2 -4
  126. data/dyncall/dyncallback/dyncall_callback_arch.S +12 -2
  127. data/dyncall/dyncallback/{dyncall_callback_arm32_arm.c → dyncall_callback_arm32.c} +25 -10
  128. data/dyncall/dyncallback/dyncall_callback_arm32_arm_apple.s +7 -7
  129. data/dyncall/dyncallback/dyncall_callback_arm32_arm_gas.S +9 -9
  130. data/dyncall/dyncallback/dyncall_callback_arm32_thumb_apple.S +1 -1
  131. data/dyncall/dyncallback/dyncall_callback_arm32_thumb_gas.S +1 -1
  132. data/dyncall/dyncallback/dyncall_callback_arm64.S +2 -2
  133. data/dyncall/dyncallback/dyncall_callback_arm64.c +20 -14
  134. data/dyncall/dyncallback/dyncall_callback_mips.c +26 -9
  135. data/dyncall/dyncallback/dyncall_callback_mips_eabi_gas.s +99 -0
  136. data/dyncall/dyncallback/{dyncall_args_arm32_thumb.h → dyncall_callback_mips_gas.S} +14 -9
  137. data/dyncall/dyncallback/{dyncall_callback_arm32_thumb.c → dyncall_callback_mips_n32_gas.s} +12 -7
  138. data/dyncall/dyncallback/dyncall_callback_mips_n64_gas.s +98 -0
  139. data/dyncall/dyncallback/dyncall_callback_mips_o32_gas.s +100 -0
  140. data/dyncall/dyncallback/dyncall_callback_ppc32.S +54 -54
  141. data/dyncall/dyncallback/dyncall_callback_ppc32.c +23 -5
  142. data/dyncall/dyncallback/dyncall_callback_ppc32_apple.s +92 -117
  143. data/dyncall/dyncallback/dyncall_callback_ppc64.S +2 -2
  144. data/dyncall/dyncallback/dyncall_callback_ppc64.c +23 -5
  145. data/dyncall/dyncallback/dyncall_callback_sparc32.c +25 -7
  146. data/dyncall/dyncallback/dyncall_callback_sparc32.s +55 -4
  147. data/dyncall/dyncallback/dyncall_callback_sparc64.c +25 -7
  148. data/dyncall/dyncallback/dyncall_callback_sparc64.s +89 -5
  149. data/dyncall/dyncallback/dyncall_callback_x64.S +8 -8
  150. data/dyncall/dyncallback/dyncall_callback_x64.c +19 -6
  151. data/dyncall/dyncallback/dyncall_callback_x86.S +29 -25
  152. data/dyncall/dyncallback/dyncall_callback_x86.c +24 -11
  153. data/dyncall/dyncallback/dyncall_thunk.c +6 -6
  154. data/dyncall/dyncallback/dyncall_thunk.h +9 -7
  155. data/dyncall/dyncallback/{dyncall_thunk_arm32_arm.c → dyncall_thunk_arm32.c} +5 -3
  156. data/dyncall/dyncallback/{dyncall_thunk_arm32_arm.h → dyncall_thunk_arm32.h} +7 -7
  157. data/dyncall/dyncallback/dyncall_thunk_arm64.c +2 -2
  158. data/dyncall/dyncallback/dyncall_thunk_arm64.h +8 -13
  159. data/dyncall/dyncallback/dyncall_thunk_mips.c +16 -20
  160. data/dyncall/dyncallback/dyncall_thunk_mips.h +4 -2
  161. data/dyncall/dyncallback/dyncall_thunk_mips64.c +103 -0
  162. data/dyncall/dyncallback/{dyncall_callback_arm32_thumb.h → dyncall_thunk_mips64.h} +15 -8
  163. data/dyncall/dyncallback/dyncall_thunk_ppc32.c +4 -4
  164. data/dyncall/dyncallback/dyncall_thunk_ppc32.h +1 -1
  165. data/dyncall/dyncallback/dyncall_thunk_ppc32_sysv.c +9 -9
  166. data/dyncall/dyncallback/dyncall_thunk_ppc64.c +2 -2
  167. data/dyncall/dyncallback/dyncall_thunk_sparc32.c +19 -2
  168. data/dyncall/dyncallback/dyncall_thunk_sparc32.h +5 -4
  169. data/dyncall/dyncallback/dyncall_thunk_sparc64.c +42 -2
  170. data/dyncall/dyncallback/dyncall_thunk_sparc64.h +5 -5
  171. data/dyncall/dyncallback/dyncall_thunk_x64.c +1 -1
  172. data/dyncall/dyncallback/dyncall_thunk_x64.h +2 -2
  173. data/dyncall/dyncallback/dyncall_thunk_x86.c +1 -1
  174. data/dyncall/dyncallback/dyncall_thunk_x86.h +2 -2
  175. data/dyncall/dyncallback/dyncallback.3 +16 -11
  176. data/dyncall/dynload/dynload.3 +63 -8
  177. data/dyncall/dynload/dynload.c +2 -8
  178. data/dyncall/dynload/dynload.h +9 -5
  179. data/dyncall/dynload/dynload_alloc.h +1 -1
  180. data/dyncall/dynload/dynload_syms.c +1 -3
  181. data/dyncall/dynload/dynload_syms_elf.c +19 -11
  182. data/dyncall/dynload/dynload_syms_mach-o.c +151 -75
  183. data/dyncall/dynload/dynload_syms_pe.c +24 -24
  184. data/dyncall/dynload/dynload_unix.c +156 -13
  185. data/dyncall/dynload/dynload_windows.c +15 -11
  186. data/dyncall/portasm/portasm-arm.S +1 -1
  187. data/dyncall/portasm/portasm-ppc.S +1 -1
  188. data/dyncall/portasm/{portasm-x64-att.S → portasm-x64.S} +7 -4
  189. data/dyncall/portasm/portasm-x86.S +4 -2
  190. data/{dyncall-bindings/ruby/rbdc/extconf.rb → extconf.rb} +4 -4
  191. data/{dyncall-bindings/ruby/rbdc/rbdc.c → rbdc.c} +5 -5
  192. metadata +24 -48
  193. data/dyncall/Makefile.M +0 -15
  194. data/dyncall/buildsys/dynmake/Makefile.base.M +0 -82
  195. data/dyncall/buildsys/dynmake/dynmake.bat +0 -2
  196. data/dyncall/buildsys/dynmake/dynmake.sh +0 -4
  197. data/dyncall/dynMakefile +0 -4
  198. data/dyncall/dyncall/Makefile.M +0 -10
  199. data/dyncall/dyncall/TODO +0 -9
  200. data/dyncall/dyncall/dynMakefile +0 -4
  201. data/dyncall/dyncall/dyncall_call_sparc64.S +0 -362
  202. data/dyncall/dyncall/dyncall_call_sparc_v9.S +0 -222
  203. data/dyncall/dyncall/dyncall_call_x64-att.S +0 -147
  204. data/dyncall/dyncall/dyncall_callvm_sparc_v9.c +0 -182
  205. data/dyncall/dyncall/dyncall_callvm_sparc_v9.h +0 -46
  206. data/dyncall/dyncallback/Makefile.M +0 -10
  207. data/dyncall/dyncallback/README.txt +0 -9
  208. data/dyncall/dyncallback/TODO +0 -4
  209. data/dyncall/dyncallback/dynMakefile +0 -4
  210. data/dyncall/dyncallback/dyncall_args_arm32_thumb.c +0 -30
  211. data/dyncall/dyncallback/dyncall_callback_arm32_arm.h +0 -46
  212. data/dyncall/dyncallback/dyncall_callback_mips.h +0 -43
  213. data/dyncall/dyncallback/dyncall_callback_ppc32.h +0 -43
  214. data/dyncall/dyncallback/dyncall_callback_ppc64.h +0 -56
  215. data/dyncall/dyncallback/dyncall_callback_sparc32.h +0 -44
  216. data/dyncall/dyncallback/dyncall_callback_x64.h +0 -45
  217. data/dyncall/dyncallback/dyncall_callback_x86.h +0 -50
  218. data/dyncall/dyncallback/dyncall_thunk_arm32_thumb.c +0 -30
  219. data/dyncall/dyncallback/dyncall_thunk_arm32_thumb.h +0 -36
  220. data/dyncall/dynload/Makefile.M +0 -10
  221. data/dyncall/dynload/TODO +0 -20
  222. data/dyncall/dynload/dynMakefile +0 -4
  223. data/dyncall/dynload/dynload_darwin.c +0 -90
@@ -3,10 +3,10 @@
3
3
  Package: dyncall
4
4
  Library: dyncallback
5
5
  File: dyncallback/dyncall_callback_sparc64.c
6
- Description: Callback - Implementation for sparc64 (TODO: not implemented yet)
6
+ Description: Callback - Implementation for sparc64
7
7
  License:
8
8
 
9
- Copyright (c) 2007-2015 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
@@ -25,25 +25,42 @@
25
25
 
26
26
 
27
27
  #include "dyncall_callback.h"
28
- #include "dyncall_callback_sparc32.h"
29
-
30
28
  #include "dyncall_alloc_wx.h"
29
+ #include "dyncall_thunk.h"
30
+
31
+ /* Callback symbol. */
32
+ extern void dcCallbackThunkEntry();
33
+
34
+ struct DCCallback
35
+ {
36
+ DCThunk thunk; /* offset 0, size 56 */
37
+ DCCallbackHandler* handler; /* offset 56, size 8 */
38
+ void* userdata; /* offset 64, size 8 */
39
+ };
40
+
31
41
 
32
42
  void dcbInitCallback(DCCallback* pcb, const char* signature, DCCallbackHandler* handler, void* userdata)
33
43
  {
44
+ pcb->handler = handler;
45
+ pcb->userdata = userdata;
34
46
  }
35
47
 
36
- extern void dcCallbackThunkEntry();
37
-
38
48
  DCCallback* dcbNewCallback(const char* signature, DCCallbackHandler* handler, void* userdata)
39
49
  {
40
50
  DCCallback* pcb;
41
51
  int err = dcAllocWX(sizeof(DCCallback), (void**) &pcb);
42
- if (err != 0) return 0;
52
+ if(err)
53
+ return NULL;
43
54
 
44
55
  dcbInitThunk(&pcb->thunk, dcCallbackThunkEntry);
45
56
  dcbInitCallback(pcb, signature, handler, userdata);
46
57
 
58
+ err = dcInitExecWX(pcb, sizeof(DCCallback));
59
+ if(err) {
60
+ dcFreeWX(pcb, sizeof(DCCallback));
61
+ return NULL;
62
+ }
63
+
47
64
  return pcb;
48
65
  }
49
66
 
@@ -56,3 +73,4 @@ void* dcbGetUserData(DCCallback* pcb)
56
73
  {
57
74
  return pcb->userdata;
58
75
  }
76
+
@@ -3,11 +3,10 @@
3
3
  Package: dyncall
4
4
  Library: dyncallback
5
5
  File: dyncallback/dyncall_callback_sparc64.s
6
- Description: Callback Thunk - Implementation for Sparc 64-bit
6
+ Description: Callback - Implementation for Sparc 64-bit
7
7
  License:
8
8
 
9
- Copyright (c) 2007-2011 Daniel Adler <dadler@uni-goettingen.de>,
10
- Tassilo Philipp <tphilipp@potion-studios.com>
9
+ Copyright (c) 2017 Tassilo Philipp <tphilipp@potion-studios.com>
11
10
 
12
11
  Permission to use, copy, modify, and distribute this software for any
13
12
  purpose with or without fee is hereby granted, provided that the above
@@ -23,8 +22,93 @@
23
22
 
24
23
  */
25
24
 
25
+ /* input:
26
+ $i0 -> thunk
27
+ $i0+56 -> cb handler
28
+ $i0+64 -> userdata
29
+ */
30
+
31
+ /* NOTE: %sp/%fp for v9 are offset, using them needs a "BIAS" of 2047 */
32
+ BIAS = 2047
33
+
34
+ .text
26
35
  .globl dcCallbackThunkEntry
36
+
37
+ /* Called by thunk - thunk stores pointer to DCCallback */
38
+ /* in %g1, and pointer to called function in %g2 */
27
39
  dcCallbackThunkEntry:
28
- jmpl %i7 + 8, %g0 /* Return from proc. */
29
- nop
40
+
41
+ /* Prolog. */
42
+ /* Frame size of 336b comes from needing storage space for the following: */
43
+ /* req_reg_save_area:128 + spill:48 + dcargs:144 + retval:8 + pad:8 */
44
+ /* Spill area could theoretically be only 32b, b/c cbHandler function has */
45
+ /* 4 arguments, but let's be conservative. */
46
+ save %sp, -336, %sp
47
+
48
+ /* Spill register args as dcargs is based on that (in prev frame, after */
49
+ /* req_reg_save_area). */
50
+ add %fp, BIAS + 128, %l0
51
+ stx %i0, [ %l0 + 0 ] /* reg arg 0 */
52
+ stx %i1, [ %l0 + 8 ] /* reg arg 1 */
53
+ stx %i2, [ %l0 + 16 ] /* reg arg 2 */
54
+ stx %i3, [ %l0 + 24 ] /* reg arg 3 */
55
+ stx %i4, [ %l0 + 32 ] /* reg arg 4 */
56
+ stx %i5, [ %l0 + 40 ] /* reg arg 5 */
57
+ stx %l0, [ %sp + BIAS + 176 ] /* set DCArg's arg_ptr */
58
+ st %f0, [ %sp + BIAS + 184 ] /* store fp args in DCArgs's dreg_data */
59
+ st %f1, [ %sp + BIAS + 188 ] /* @@@ I think stx should work to store */
60
+ st %f2, [ %sp + BIAS + 192 ] /* all 64bits, but I get "Illegal */
61
+ st %f3, [ %sp + BIAS + 196 ] /* Operands", so using single prec. */
62
+ st %f4, [ %sp + BIAS + 200 ] /* store (st) */
63
+ st %f5, [ %sp + BIAS + 204 ]
64
+ st %f6, [ %sp + BIAS + 208 ]
65
+ st %f7, [ %sp + BIAS + 212 ]
66
+ st %f8, [ %sp + BIAS + 216 ]
67
+ st %f9, [ %sp + BIAS + 220 ]
68
+ st %f10, [ %sp + BIAS + 224 ]
69
+ st %f11, [ %sp + BIAS + 228 ]
70
+ st %f12, [ %sp + BIAS + 232 ]
71
+ st %f13, [ %sp + BIAS + 236 ]
72
+ st %f14, [ %sp + BIAS + 240 ]
73
+ st %f15, [ %sp + BIAS + 244 ]
74
+ st %f16, [ %sp + BIAS + 248 ]
75
+ st %f17, [ %sp + BIAS + 252 ]
76
+ st %f18, [ %sp + BIAS + 256 ]
77
+ st %f19, [ %sp + BIAS + 260 ]
78
+ st %f20, [ %sp + BIAS + 264 ]
79
+ st %f21, [ %sp + BIAS + 268 ]
80
+ st %f22, [ %sp + BIAS + 272 ]
81
+ st %f23, [ %sp + BIAS + 276 ]
82
+ st %f24, [ %sp + BIAS + 280 ]
83
+ st %f25, [ %sp + BIAS + 284 ]
84
+ st %f26, [ %sp + BIAS + 288 ]
85
+ st %f27, [ %sp + BIAS + 292 ]
86
+ st %f28, [ %sp + BIAS + 296 ]
87
+ st %f29, [ %sp + BIAS + 300 ]
88
+ st %f30, [ %sp + BIAS + 304 ]
89
+ st %f31, [ %sp + BIAS + 308 ]
90
+ stx %g0, [ %sp + BIAS + 312 ] /* init DCArg's i */
91
+
92
+ /* Zero retval store. */
93
+ stx %g0, [ %sp + BIAS + 320 ]
94
+
95
+ /* Prepare callback handler call. */
96
+ mov %g1, %o0 /* Param 0 = DCCallback*, %g1 holds ptr to thunk */
97
+ add %sp, BIAS + 176, %o1 /* Param 1 = DCArgs* (ptr to struct with args ptr) */
98
+ add %sp, BIAS + 320, %o2 /* Param 2 = results ptr to 8b of local stack data */
99
+ ldx [ %g1 + 64 ], %o3 /* Param 3 = userdata ptr */
100
+
101
+ /* Fetch callback handler address (after thunk blob) and call. */
102
+ ldx [ %g1 + 56 ], %l0
103
+ call %l0
104
+ nop
105
+
106
+ /* Put retval in %i0 (to be in caller's %o0), and %f0. */
107
+ ldx [ %sp + BIAS + 320 ], %i0
108
+ ldd [ %sp + BIAS + 320 ], %f0
109
+
110
+ /* Epilog. */
111
+ restore /* unshift reg window */
112
+ retl /* Return from proc. -- jmpl %i7 + 8, %g0 */
113
+ nop
30
114
 
@@ -6,7 +6,7 @@
6
6
  Description: Callback Thunk entry for x64 (portasm version)
7
7
  License:
8
8
 
9
- Copyright (c) 2011-2015 Daniel Adler <dadler@uni-goettingen.de>
9
+ Copyright (c) 2011-2018 Daniel Adler <dadler@uni-goettingen.de>
10
10
 
11
11
  Permission to use, copy, modify, and distribute this software for any
12
12
  purpose with or without fee is hereby granted, provided that the above
@@ -24,7 +24,7 @@
24
24
 
25
25
 
26
26
 
27
- #include "../portasm/portasm-x64-att.S"
27
+ #include "../portasm/portasm-x64.S"
28
28
 
29
29
  /* structure sizes */
30
30
 
@@ -58,7 +58,7 @@ SET(DCCallback_size,40)
58
58
 
59
59
  GLOBAL(dcCallback_x64_sysv)
60
60
  BEGIN_PROC(dcCallback_x64_sysv)
61
-
61
+
62
62
  PUSH(RBP)
63
63
  MOV(RSP,RBP)
64
64
 
@@ -66,7 +66,7 @@ BEGIN_PROC(dcCallback_x64_sysv)
66
66
 
67
67
  /* float parameters (8 registers spill to DCArgs) */
68
68
 
69
- SUB(LIT(8*8),RSP)
69
+ SUB(LIT(8*8),RSP)
70
70
 
71
71
  MOVSD(XMM7, QWORD(RSP,8*7)) /* struct offset 120: float parameter 7 */
72
72
  MOVSD(XMM6, QWORD(RSP,8*6)) /* struct offset 112: float parameter 6 */
@@ -95,7 +95,7 @@ BEGIN_PROC(dcCallback_x64_sysv)
95
95
  PUSH(RDX)
96
96
 
97
97
  MOV(RSP,RSI) /* arg 1 RSI : DCArgs* */
98
-
98
+
99
99
  /* initialize DCValue */
100
100
 
101
101
  PUSH(LIT(0)) /* struct offset 0: return value (max long long) */
@@ -121,7 +121,7 @@ END_PROC(dcCallback_x64_sysv)
121
121
 
122
122
  GLOBAL(dcCallback_x64_win64)
123
123
  BEGIN_PROC(dcCallback_x64_win64)
124
-
124
+
125
125
  PUSH(RBP)
126
126
  MOV(RSP,RBP)
127
127
 
@@ -129,7 +129,7 @@ BEGIN_PROC(dcCallback_x64_win64)
129
129
 
130
130
  /* float parameters (4 registers spill to DCArgs) */
131
131
 
132
- SUB(LIT(4*8),RSP)
132
+ SUB(LIT(4*8),RSP)
133
133
 
134
134
  MOVSD(XMM3, QWORD(RSP,8*3)) /* struct offset 72: float parameter 3 */
135
135
  MOVSD(XMM2, QWORD(RSP,8*2)) /* struct offset 64: float parameter 2 */
@@ -174,7 +174,7 @@ BEGIN_PROC(dcCallback_x64_win64)
174
174
  POP(RBP)
175
175
  RET()
176
176
 
177
- END_PROC(dcCallback_x64_win64)
177
+ END_PROC(dcCallback_x64_win64)
178
178
 
179
179
  END_ASM
180
180
 
@@ -6,7 +6,7 @@
6
6
  Description: Callback - Implementation for x64
7
7
  License:
8
8
 
9
- Copyright (c) 2007-2015 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
@@ -24,16 +24,21 @@
24
24
  */
25
25
 
26
26
 
27
-
28
- #include "dyncall_callback_x64.h"
29
- #include "dyncall_args_x64.h"
27
+ #include "dyncall_callback.h"
30
28
  #include "dyncall_alloc_wx.h"
31
-
29
+ #include "dyncall_thunk.h"
32
30
 
33
31
  /* Callback symbol. */
34
32
  extern void dcCallback_x64_sysv();
35
33
  extern void dcCallback_x64_win64();
36
34
 
35
+ struct DCCallback
36
+ {
37
+ DCThunk thunk; // offset 0, size 24
38
+ DCCallbackHandler* handler; // offset 24
39
+ void* userdata; // offset 32
40
+ };
41
+
37
42
 
38
43
  void dcbInitCallback(DCCallback* pcb, const char* signature, DCCallbackHandler* handler, void* userdata)
39
44
  {
@@ -47,7 +52,8 @@ DCCallback* dcbNewCallback(const char* signature, DCCallbackHandler* handler, vo
47
52
  int err;
48
53
  DCCallback* pcb;
49
54
  err = dcAllocWX(sizeof(DCCallback), (void**) &pcb);
50
- if (err != 0) return 0;
55
+ if(err)
56
+ return NULL;
51
57
 
52
58
  #if defined (DC__OS_Win64)
53
59
  dcbInitThunk(&pcb->thunk, dcCallback_x64_win64);
@@ -55,6 +61,13 @@ DCCallback* dcbNewCallback(const char* signature, DCCallbackHandler* handler, vo
55
61
  dcbInitThunk(&pcb->thunk, dcCallback_x64_sysv);
56
62
  #endif
57
63
  dcbInitCallback(pcb, signature, handler, userdata);
64
+
65
+ err = dcInitExecWX(pcb, sizeof(DCCallback));
66
+ if(err) {
67
+ dcFreeWX(pcb, sizeof(DCCallback));
68
+ return NULL;
69
+ }
70
+
58
71
  return pcb;
59
72
  }
60
73
 
@@ -6,7 +6,7 @@
6
6
  Description: Callback Thunk entry for x86
7
7
  License:
8
8
 
9
- Copyright (c) 2011-2015 Daniel Adler <dadler@uni-goettingen.de>
9
+ Copyright (c) 2011-2018 Daniel Adler <dadler@uni-goettingen.de>
10
10
 
11
11
  Permission to use, copy, modify, and distribute this software for any
12
12
  purpose with or without fee is hereby granted, provided that the above
@@ -24,30 +24,32 @@
24
24
 
25
25
 
26
26
  #include "../portasm/portasm-x86.S"
27
+ #include "../dyncall/dyncall_macros.h"
28
+
27
29
  BEGIN_ASM
28
- DCThunk_size = 16
29
- DCArgs_size = 20
30
- DCValue_size = 8
30
+ DCThunk_size = 16
31
+ DCArgs_size = 20
32
+ DCValue_size = 8
31
33
 
32
- CTX_thunk = 0
33
- CTX_phandler = 16
34
- CTX_pargsvt = 20
35
- CTX_stack_cleanup = 24
36
- CTX_userdata = 28
34
+ CTX_thunk = 0
35
+ CTX_phandler = 16
36
+ CTX_pargsvt = 20
37
+ CTX_stack_cleanup = 24
38
+ CTX_userdata = 28
37
39
 
38
- frame_arg0 = 8
39
- frame_ret = 4
40
- frame_parent = 0
41
- frame_CTX = -4
42
- frame_DCArgs = -24
43
- frame_DCValue = -32
40
+ frame_arg0 = 8
41
+ frame_ret = 4
42
+ frame_parent = 0
43
+ frame_CTX = -4
44
+ frame_DCArgs = -24
45
+ frame_DCValue = -32
44
46
 
45
- #define ASCII_L 76
46
- #define ASCII_l 108
47
- #define ASCII_d 100
48
- #define ASCII_f 102
49
- #define ASCII_i 105
50
- #define ASCII_v 118
47
+ #define ASCII_L 76
48
+ #define ASCII_l 108
49
+ #define ASCII_d 100
50
+ #define ASCII_f 102
51
+ #define ASCII_i 105
52
+ #define ASCII_v 118
51
53
 
52
54
  GLOBAL(dcCallbackThunkEntry)
53
55
  BEGIN_PROC(dcCallbackThunkEntry)
@@ -77,7 +79,7 @@ BEGIN_PROC(dcCallbackThunkEntry)
77
79
  CALL_DWORD(EAX,CTX_phandler)
78
80
  /* cleanup stack */
79
81
  MOVL(EBP,ESP) /* reset esp to frame */
80
- POP(ECX) /* skip parent frame */
82
+ POP(ECX) /* skip parent frame */
81
83
  POP(ECX) /* pop return address */
82
84
  MOVL(DWORD(EBP,frame_CTX),EDX)
83
85
  ADD(DWORD(EDX,CTX_stack_cleanup),ESP) /* cleanup stack */
@@ -85,13 +87,15 @@ BEGIN_PROC(dcCallbackThunkEntry)
85
87
  LEA(DWORD(EBP,frame_DCValue), EDX)
86
88
  MOVL(DWORD(EBP,0), EBP) /* EBP = parent frame */
87
89
  /* handle return value */
88
-
90
+
91
+ #if !defined(DC__OS_Minix)
89
92
  CMP(LIT(ASCII_f),AL)
90
93
  JE(LOCAL(return_f32))
91
94
  CMP(LIT(ASCII_d),AL)
92
95
  JE(LOCAL(return_f64))
93
-
94
- /* All int cases <= 32 bits (+ pointer & string cases) fall in the 32 bits int case*/
96
+ #endif
97
+
98
+ /* All int cases (+ pointer & string cases) fall in the return_i64 case, here */
95
99
  LOCAL(return_i64):
96
100
  MOVL(DWORD(EDX,0),EAX)
97
101
  MOVL(DWORD(EDX,4),EDX)
@@ -6,7 +6,7 @@
6
6
  Description: Callback - Implementation for x86
7
7
  License:
8
8
 
9
- Copyright (c) 2007-2015 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
@@ -24,22 +24,27 @@
24
24
  */
25
25
 
26
26
 
27
-
28
- #include "dyncall_callback_x86.h"
27
+ #include "dyncall_callback.h"
28
+ #include "dyncall_alloc_wx.h"
29
+ #include "dyncall_thunk.h"
29
30
  #include "dyncall_args_x86.h"
30
31
 
31
- #include "dyncall_alloc_wx.h"
32
- #include "dyncall_signature.h"
32
+ /* Callback symbol. */
33
+ extern void dcCallbackThunkEntry();
33
34
 
34
- /*
35
- * assembly thunk entry for callbacks
36
- */
35
+ struct DCCallback
36
+ {
37
+ DCThunk thunk; /* offset 0, size 16 */
38
+ DCCallbackHandler* handler; /* offset 16 */
39
+ DCArgsVT* args_vt; /* offset 20 */
40
+ size_t stack_cleanup; /* offset 24 */
41
+ void* userdata; /* offset 28 */
42
+ };
37
43
 
38
- extern void dcCallbackThunkEntry();
39
44
 
40
45
  /* compute stacksize for callee cleanup calling conventions:
41
46
  *
42
- * stdcall,fastcall_ms,fastcall_gnu
47
+ * cdecl,stdcall,thiscall_ms,fastcall_ms,fastcall_gnu
43
48
  */
44
49
 
45
50
  static int dcbCleanupSize_x86_cdecl(const char* signature)
@@ -260,10 +265,18 @@ DCCallback* dcbNewCallback(const char* signature, DCCallbackHandler* handler, vo
260
265
  int err;
261
266
  DCCallback* pcb;
262
267
  err = dcAllocWX(sizeof(DCCallback), (void**) &pcb);
263
- if (err != 0) return 0;
268
+ if(err)
269
+ return NULL;
264
270
 
265
271
  dcbInitThunk(&pcb->thunk, dcCallbackThunkEntry);
266
272
  dcbInitCallback(pcb, signature, handler, userdata);
273
+
274
+ err = dcInitExecWX(pcb, sizeof(DCCallback));
275
+ if(err) {
276
+ dcFreeWX(pcb, sizeof(DCCallback));
277
+ return NULL;
278
+ }
279
+
267
280
  return pcb;
268
281
  }
269
282