# HG changeset patch # User cslag # Date 1480031251 0 # Node ID bbefb8b8e74c6a72f7932490c00dcfbf42591d08 # Parent 3729a99ef03c33172280d2a7e3f44628164d691a - sparc32 thunk code - replaced some c++ comments with old c ones - whitespace cosmetics diff -r 3729a99ef03c -r bbefb8b8e74c ToDo --- 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 diff -r 3729a99ef03c -r bbefb8b8e74c dyncallback/dyncall_callback_sparc32.c --- 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 , @@ -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; } + diff -r 3729a99ef03c -r bbefb8b8e74c dyncallback/dyncall_callback_sparc32.s --- 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 , + Copyright (c) 2007-2016 Daniel Adler , Tassilo Philipp 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 diff -r 3729a99ef03c -r bbefb8b8e74c dyncallback/dyncall_thunk_arm64.h --- 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 */ diff -r 3729a99ef03c -r bbefb8b8e74c dyncallback/dyncall_thunk_mips.c --- 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 : - 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) diff -r 3729a99ef03c -r bbefb8b8e74c dyncallback/dyncall_thunk_mips.h --- 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 */ diff -r 3729a99ef03c -r bbefb8b8e74c dyncallback/dyncall_thunk_mips64.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 */ diff -r 3729a99ef03c -r bbefb8b8e74c dyncallback/dyncall_thunk_ppc32.c --- 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 */ diff -r 3729a99ef03c -r bbefb8b8e74c dyncallback/dyncall_thunk_ppc32_sysv.c --- 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 */ diff -r 3729a99ef03c -r bbefb8b8e74c dyncallback/dyncall_thunk_ppc64.c --- 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 */ diff -r 3729a99ef03c -r bbefb8b8e74c dyncallback/dyncall_thunk_sparc32.c --- 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 , + Copyright (c) 2007-2016 Daniel Adler , Tassilo Philipp 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, , %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, , %g2 */ + p->code[4] = 0x81c08000; /* jmpl %g2, %g0 -- discards link addr */ + p->code[5] = 0x01000000; /* nop */ } diff -r 3729a99ef03c -r bbefb8b8e74c dyncallback/dyncall_thunk_sparc32.h --- 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 , + Copyright (c) 2007-2016 Daniel Adler , Tassilo Philipp 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 */ + diff -r 3729a99ef03c -r bbefb8b8e74c dyncallback/dyncall_thunk_x64.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 */ diff -r 3729a99ef03c -r bbefb8b8e74c dyncallback/dyncall_thunk_x86.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 */ diff -r 3729a99ef03c -r bbefb8b8e74c test/thunk/test_thunk.c --- 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*);