# HG changeset patch # User Tassilo Philipp # Date 1489410806 -3600 # Node ID b827c074b4daa94356151ff5bdf089de0da32682 # Parent 44ae5b653086ee24c92a7afb2bfd942da76c9c27 - first impl of sparc64 thunks diff -r 44ae5b653086 -r b827c074b4da dyncallback/dyncall_thunk_sparc32.c --- a/dyncallback/dyncall_thunk_sparc32.c Mon Mar 13 13:23:10 2017 +0100 +++ b/dyncallback/dyncall_thunk_sparc32.c Mon Mar 13 14:13:26 2017 +0100 @@ -38,7 +38,7 @@ ; 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 */ diff -r 44ae5b653086 -r b827c074b4da dyncallback/dyncall_thunk_sparc64.c --- a/dyncallback/dyncall_thunk_sparc64.c Mon Mar 13 13:23:10 2017 +0100 +++ b/dyncallback/dyncall_thunk_sparc64.c Mon Mar 13 14:13:26 2017 +0100 @@ -28,6 +28,46 @@ 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 + 8: 83 28 70 20 sllx %g1, 0x20, %g1 + 12: 21 00 00 00 sethi %hi(0), %l0 + 16: a0 14 20 00 or %l0, 0, %l0 + 20: 82 04 00 01 add %l0, %g1, %g1 + ; use g2 for entry pointer and "call" it, b/c branch instructions can't handle 64bit addresses + 24: 05 00 00 00 sethi %hi(0), %g2 + 28: 84 10 a0 00 or %g2, 0, %g2 + 32: 85 28 b0 20 sllx %g2, 0x20, %g2 + 36: 21 00 00 00 sethi %hi(0), %l0 + 40: a0 14 20 00 or %l0, 0, %l0 + 44: 84 04 00 02 add %l0, %g2, %g2 + ; jump - write link to %g0, effectively discarding it; also nop for delay slot + 48: 81 c0 80 00 jmpl %g2, %g0 + 52: 01 00 00 00 nop + */ + + union { + unsigned int x[2]; + void* p; + } t, e; + t.p = p; + e.p = entry; + + p->code[ 0] = 0x03000000 | (t.x[0] >> 10); /* sethi %hi(p), %g1 -- hi 22 bits */ + p->code[ 1] = 0x82106000 | (t.x[0] & 0x3ff); /* or %g1, , %g1 -- lo 10 bits */ + p->code[ 2] = 0x83287020; /* sllx %g1, 0x20, %g1 */ + p->code[ 3] = 0x21000000 | (t.x[1] >> 10); /* sethi %hi(p), %l0 */ + p->code[ 4] = 0xa0142000 | (t.x[1] & 0x3ff); /* or %l0, , %l0 */ + p->code[ 5] = 0x82040001; /* add %l0, %g1, %g1 */ + p->code[ 6] = 0x05000000 | (e.x[0] >> 10); /* sethi %hi(entry), %g2 */ + p->code[ 7] = 0x8410a000 | (e.x[0] & 0x3ff); /* or %g2, , %g2 */ + p->code[ 8] = 0x8528b020; /* sllx %g2, 0x20, %g2 */ + p->code[ 9] = 0x21000000 | (e.x[1] >> 10); /* sethi %hi(entry), %l0 */ + p->code[10] = 0xa0142000 | (e.x[1] & 0x3ff); /* or %l0, , %l0 */ + p->code[11] = 0x84040002; /* add %l0, %g2, %g2 */ + p->code[12] = 0x81c08000; /* jmpl %g2, %g0 -- discards link addr */ + p->code[13] = 0x01000000; /* nop */ } diff -r 44ae5b653086 -r b827c074b4da dyncallback/dyncall_thunk_sparc64.h --- a/dyncallback/dyncall_thunk_sparc64.h Mon Mar 13 13:23:10 2017 +0100 +++ b/dyncallback/dyncall_thunk_sparc64.h Mon Mar 13 14:13:26 2017 +0100 @@ -3,10 +3,10 @@ Package: dyncall Library: dyncallback File: dyncallback/dyncall_thunk_sparc64.h - Description: Thunk - Header for sparc64 - not yet implemented + Description: Thunk - Header for sparc64 License: - Copyright (c) 2007-2015 Daniel Adler , + Copyright (c) 2007-2017 Daniel Adler , Tassilo Philipp Permission to use, copy, modify, and distribute this software for any @@ -29,9 +29,9 @@ struct DCThunk_ { - int x[4]; /* dummy */ + unsigned int code[14]; }; -#define DCTHUNK_SIZE_SPARC64 32 +#define DCTHUNK_SIZE_SPARC64 56 -#endif /* DYNCALL_THUNK_SPARC32_H */ +#endif /* DYNCALL_THUNK_SPARC64_H */