changeset 155:bbefb8b8e74c

- sparc32 thunk code - replaced some c++ comments with old c ones - whitespace cosmetics
author cslag
date Thu, 24 Nov 2016 23:47:31 +0000
parents 3729a99ef03c
children 9e4f1355a388
files ToDo dyncallback/dyncall_callback_sparc32.c dyncallback/dyncall_callback_sparc32.s dyncallback/dyncall_thunk_arm64.h dyncallback/dyncall_thunk_mips.c dyncallback/dyncall_thunk_mips.h dyncallback/dyncall_thunk_mips64.h dyncallback/dyncall_thunk_ppc32.c dyncallback/dyncall_thunk_ppc32_sysv.c dyncallback/dyncall_thunk_ppc64.c dyncallback/dyncall_thunk_sparc32.c dyncallback/dyncall_thunk_sparc32.h dyncallback/dyncall_thunk_x64.h dyncallback/dyncall_thunk_x86.h test/thunk/test_thunk.c
diffstat 15 files changed, 69 insertions(+), 51 deletions(-) [+]
line wrap: on
line diff
--- a/ToDo	Thu Nov 10 20:37:21 2016 +0100
+++ b/ToDo	Thu Nov 24 23:47:31 2016 +0000
@@ -1,5 +1,6 @@
 1.0:
 ----
+- dyncallback's "stack_cleanup" can be removed from non x86 impls... test if they still work
 - the CallVM-free functions are per VTable, however the latter can be changed out
   at runtime... which basically changes potentially the deallocator...
   same goes for functions setting the mode. think about how to make this safer - currently
--- a/dyncallback/dyncall_callback_sparc32.c	Thu Nov 10 20:37:21 2016 +0100
+++ b/dyncallback/dyncall_callback_sparc32.c	Thu Nov 24 23:47:31 2016 +0000
@@ -3,7 +3,7 @@
  Package: dyncall
  Library: dyncallback
  File: dyncallback/dyncall_callback_sparc32.c
- Description: Callback - Implementation for sparc32 (TODO: not implemented yet)
+ Description: Callback - Implementation for sparc32
  License:
 
    Copyright (c) 2007-2016 Daniel Adler <dadler@uni-goettingen.de>,
@@ -33,15 +33,16 @@
 
 struct DCCallback
 {
-  DCThunk            thunk;         /* offset  0, size ?? */
-  DCCallbackHandler* handler;       /* offset ??, size  4 */
-  size_t             stack_cleanup; /* offset ??, size  4 */
-  void*              userdata;      /* offset ??, size  4 */
+  DCThunk            thunk;         /* offset  0 size 24 */
+  DCCallbackHandler* handler;       /* offset 24 size  4 */
+  void*              userdata;      /* offset 28 size  4 */
 };
 
 
 void dcbInitCallback(DCCallback* pcb, const char* signature, DCCallbackHandler* handler, void* userdata)
 {
+  pcb->handler  = handler;
+  pcb->userdata = userdata;
 }
 
 DCCallback* dcbNewCallback(const char* signature, DCCallbackHandler* handler, void* userdata)
@@ -65,3 +66,4 @@
 {
   return pcb->userdata;
 }
+
--- a/dyncallback/dyncall_callback_sparc32.s	Thu Nov 10 20:37:21 2016 +0100
+++ b/dyncallback/dyncall_callback_sparc32.s	Thu Nov 24 23:47:31 2016 +0000
@@ -6,7 +6,7 @@
  Description: Callback Thunk - Implementation for Sparc 32-bit
  License:
 
-   Copyright (c) 2007-2011 Daniel Adler <dadler@uni-goettingen.de>,
+   Copyright (c) 2007-2016 Daniel Adler <dadler@uni-goettingen.de>,
                            Tassilo Philipp <tphilipp@potion-studios.com>
 
    Permission to use, copy, modify, and distribute this software for any
@@ -23,8 +23,14 @@
 
 */
 
+/* input:
+	$i0    -> thunk
+	$i0+24 -> cb handler
+	$i0+28 -> userdata
+*/
+
 .globl dcCallbackThunkEntry
 dcCallbackThunkEntry:
-        jmpl %i7 + 8, %g0			/* Return from proc. */
-	 nop
+	jmpl %i7 + 8, %g0			/* Return from proc. */
+	nop
 
--- a/dyncallback/dyncall_thunk_arm64.h	Thu Nov 10 20:37:21 2016 +0100
+++ b/dyncallback/dyncall_thunk_arm64.h	Thu Nov 24 23:47:31 2016 +0000
@@ -26,17 +26,12 @@
 #ifndef DYNCALL_THUNK_ARM64_H
 #define DYNCALL_THUNK_ARM64_H
 
-struct DCThunk_
-{
-                                // off  size
-                                //-----|----------
-  unsigned int code[4];		//   0    16
-  void (*entry)();		//  16     8
-  void* reserved;         	//  24     8
-
-                                //  32 total size
-  
-};
+struct DCThunk_          /* off  size */
+{                        /* ----|---- */
+  unsigned int code[4];  /*   0   16  */
+  void (*entry)();       /*  16    8  */
+  void* reserved;        /*  24    8  */
+};                       /*  32 total */
 
 #endif /* DYNCALL_THUNK_ARM64_H */
 
--- a/dyncallback/dyncall_thunk_mips.c	Thu Nov 10 20:37:21 2016 +0100
+++ b/dyncallback/dyncall_thunk_mips.c	Thu Nov 24 23:47:31 2016 +0000
@@ -45,22 +45,18 @@
       jr  $t9
       ori $t4, $t4, %lo(p)        ; branch delay slot
 
-thunk.o:     file format elf32-tradbigmips
-
-
-Disassembly of section .text:
 
 00000000 <thunk>:
-   0:	3c0c0000 	lui	t4,0x0
-   4:	3c190000 	lui	t9,0x0
-   8:	37390000 	ori	t9,t9,0x0
-   c:	03200008 	jr	t9
-  10:	00200825 	move	at,at
-  14:	358c0000 	ori	t4,t4,0x0
-  18:	00200825 	move	at,at
-  1c:	00200825 	move	at,at
+   0:  3c0c0000  lui  t4,0x0
+   4:  3c190000  lui  t9,0x0
+   8:  37390000  ori  t9,t9,0x0
+   c:  03200008  jr   t9
+  10:  00200825  move at,at
+  14:  358c0000  ori  t4,t4,0x0
+  18:  00200825  move at,at
+  1c:  00200825  move at,at
 
-  */
+*/
 
 #if defined(DC__Endian_BIG)
 
--- a/dyncallback/dyncall_thunk_mips.h	Thu Nov 10 20:37:21 2016 +0100
+++ b/dyncallback/dyncall_thunk_mips.h	Thu Nov 24 23:47:31 2016 +0000
@@ -34,7 +34,7 @@
   unsigned short bddt[2]; // branch delay slots
 };
 
-#define DCTHUNK_MIPS_SIZE	20
+#define DCTHUNK_MIPS_SIZE 20
 
 #endif /* DYNCALL_THUNK_MIPS_H */
 
--- a/dyncallback/dyncall_thunk_mips64.h	Thu Nov 10 20:37:21 2016 +0100
+++ b/dyncallback/dyncall_thunk_mips64.h	Thu Nov 24 23:47:31 2016 +0000
@@ -35,7 +35,7 @@
   unsigned int padding; /* 4 bytes, to get struct size to multiple of 8 */
 };
 
-#define DCTHUNK_MIPS64_SIZE	56
+#define DCTHUNK_MIPS64_SIZE 56
 
 #endif /* DYNCALL_THUNK_MIPS64_H */
 
--- a/dyncallback/dyncall_thunk_ppc32.c	Thu Nov 10 20:37:21 2016 +0100
+++ b/dyncallback/dyncall_thunk_ppc32.c	Thu Nov 24 23:47:31 2016 +0000
@@ -42,7 +42,7 @@
 
   p->code_load_hi = 0x3c40U;     /* lis  r2, HI16(p) */
   p->addr_self_hi = hi16(p);
-  p->code_load_lo = 0x6042U; 	 /* ori  r2, r2, LO16(p) */
+  p->code_load_lo = 0x6042U;     /* ori  r2, r2, LO16(p) */
   p->addr_self_lo = lo16(p);
   p->code_jump[0] = 0x81820014U; /* lwz   r12, 20(r2) */
   p->code_jump[1] = 0x7d8903a6U; /* mtclr r12 */
--- a/dyncallback/dyncall_thunk_ppc32_sysv.c	Thu Nov 10 20:37:21 2016 +0100
+++ b/dyncallback/dyncall_thunk_ppc32_sysv.c	Thu Nov 24 23:47:31 2016 +0000
@@ -31,15 +31,15 @@
 void dcbInitThunk(DCThunk* p, void (*entry)())
 {
 /*
-   0:	3d 60 00 00 	lis     r11,0
-   4:	61 6b 00 01 	ori     r11,r11,1
-   8:	81 82 00 14 	lwz     r12,20(r2)
-   c:	7d 89 03 a6 	mtctr   r12
-  10:	4e 80 04 20 	bctr
+   0:  3d 60 00 00   lis   r11,0
+   4:  61 6b 00 01   ori   r11,r11,1
+   8:  81 82 00 14   lwz   r12,20(r2)
+   c:  7d 89 03 a6   mtctr r12
+  10:  4e 80 04 20   bctr
 */
   p->code_load_hi = 0x3d60U;     /* lis  r11, HI16(p) */
   p->addr_self_hi = hi16(p);
-  p->code_load_lo = 0x616bU; 	 /* ori  r11, r11, LO16(p) */
+  p->code_load_lo = 0x616bU;     /* ori  r11, r11, LO16(p) */
   p->addr_self_lo = lo16(p);
   p->code_jump[0] = 0x818b0014U; /* lwz   r12, 20(r11) */
   p->code_jump[1] = 0x7d8903a6U; /* mtclr r12 */
--- a/dyncallback/dyncall_thunk_ppc64.c	Thu Nov 10 20:37:21 2016 +0100
+++ b/dyncallback/dyncall_thunk_ppc64.c	Thu Nov 24 23:47:31 2016 +0000
@@ -47,7 +47,7 @@
 
   p->code_load_hi = 0x644bU;     /* oris  r11, r2, HI16(p) */
   p->addr_self_hi = HI16(p);
-  p->code_load_lo = 0x616bU; 	 /* ori   r11,r11, LO16(p) */
+  p->code_load_lo = 0x616bU;     /* ori   r11,r11, LO16(p) */
   p->addr_self_lo = LO16(p);
   p->code_jump[0] = 0xe98b0030U; /* ld    r12,48(r11) */
   p->code_jump[1] = 0xe84b0038U; /* ld    r2,56(r11) */
@@ -76,7 +76,7 @@
   p->code_rot       = 0x796b07c6U; /* rldicr r11,r11,32,31 */
   p->code_load_hi   = 0x656bU;     /* oris   r11,r11, HI16(p) */
   p->addr_self_hi   = HI16(p);
-  p->code_load_lo   = 0x616bU; 	   /* ori    r11,r11, LO16(p) */
+  p->code_load_lo   = 0x616bU;     /* ori    r11,r11, LO16(p) */
   p->addr_self_lo   = LO16(p);
   p->code_jump[0]   = 0xe98b0028U; /* ld     r12,40(r11) */
   p->code_jump[1]   = 0x7d8903a6U; /* mtclr  r12 */
--- a/dyncallback/dyncall_thunk_sparc32.c	Thu Nov 10 20:37:21 2016 +0100
+++ b/dyncallback/dyncall_thunk_sparc32.c	Thu Nov 24 23:47:31 2016 +0000
@@ -6,7 +6,7 @@
  Description: Thunk - Implementation for sparc32
  License:
 
-   Copyright (c) 2007-2015 Daniel Adler <dadler@uni-goettingen.de>,
+   Copyright (c) 2007-2016 Daniel Adler <dadler@uni-goettingen.de>,
                            Tassilo Philipp <tphilipp@potion-studios.com>
 
    Permission to use, copy, modify, and distribute this software for any
@@ -28,6 +28,23 @@
 
 void dcbInitThunk(DCThunk* p, void (*entry)())
 {
-  /* not yet implemented */
+  /* example
+                      ; put thunk pointer in g1
+   0:   03 00 00 00   sethi  %hi(0), %g1
+   4:   82 10 60 00   or     %g1, 0, %g1
+                      ; use g2 for entry pointer and "call" it, b/c branch instructions can't handle 32bit addresses
+   8:   05 00 00 00   sethi  %hi(0), %g2
+  12:   84 10 a0 00   or     %g2, 0, %g2
+                      ; jump - write link to %g0, effectively discarding it; also nop for delay slot
+  16:   81 c0 80 00   jmpl   %g2, %g0
+  20:   01 00 00 00   nop
+*/
+
+  p->code[0] = 0x03000000 | ((unsigned int)p >> 10);       /* sethi %hi(p), %g1      -- hi 22 bits */
+  p->code[1] = 0x82106000 | ((unsigned int)p & 0x3ff);     /* or %g1, <p&0x3ff>, %g1 -- lo 10 bits */
+  p->code[2] = 0x05000000 | ((unsigned int)entry >> 10);   /* sethi %hi(entry), %g2                */
+  p->code[3] = 0x8410a000 | ((unsigned int)entry & 0x3ff); /* or %g2, <entry&0x3ff>, %g2           */
+  p->code[4] = 0x81c08000;                                 /* jmpl %g2, %g0  -- discards link addr */
+  p->code[5] = 0x01000000;                                 /* nop                                  */
 }
 
--- a/dyncallback/dyncall_thunk_sparc32.h	Thu Nov 10 20:37:21 2016 +0100
+++ b/dyncallback/dyncall_thunk_sparc32.h	Thu Nov 24 23:47:31 2016 +0000
@@ -6,7 +6,7 @@
  Description: Thunk - Header for sparc32 - not yet implemented
  License:
 
-   Copyright (c) 2007-2015 Daniel Adler <dadler@uni-goettingen.de>,
+   Copyright (c) 2007-2016 Daniel Adler <dadler@uni-goettingen.de>,
                            Tassilo Philipp <tphilipp@potion-studios.com>
 
    Permission to use, copy, modify, and distribute this software for any
@@ -29,9 +29,10 @@
 
 struct DCThunk_
 {
-  int x[4]; /* dummy */
+  unsigned int code[6];
 };
 
-#define DCTHUNK_SIZE_SPARC32 32
+#define DCTHUNK_SIZE_SPARC32 24
 
 #endif /* DYNCALL_THUNK_SPARC32_H */
+
--- a/dyncallback/dyncall_thunk_x64.h	Thu Nov 10 20:37:21 2016 +0100
+++ b/dyncallback/dyncall_thunk_x64.h	Thu Nov 24 23:47:31 2016 +0000
@@ -33,7 +33,7 @@
   void (*entry)();
 };
 
-#define DCTHUNK_X64_SIZE	24
+#define DCTHUNK_X64_SIZE 24
 
 
 #endif /* DYNCALL_THUNK_X64_H */
--- a/dyncallback/dyncall_thunk_x86.h	Thu Nov 10 20:37:21 2016 +0100
+++ b/dyncallback/dyncall_thunk_x86.h	Thu Nov 24 23:47:31 2016 +0000
@@ -35,6 +35,6 @@
   void        (*addr_entry)();
 };
 
-#define DCTHUNK_X86_SIZE	16
+#define DCTHUNK_X86_SIZE 16
 
 #endif /* DYNCALL_THUNK_X86_H */
--- a/test/thunk/test_thunk.c	Thu Nov 10 20:37:21 2016 +0100
+++ b/test/thunk/test_thunk.c	Thu Nov 24 23:47:31 2016 +0000
@@ -51,7 +51,7 @@
 
 void my_entry(const char* text)
 {
-  printf("%s: 1\n", text);
+  printf("%s: %d\n", text, strcmp(text, "wx") == 0 || strcmp(text, "stack") == 0 || strcmp(text, "heap") == 0); /* @@@ */
 }
 
 typedef void (printfun)(const char*);