Mercurial > pub > dyncall > dyncall
diff dyncallback/dyncall_thunk_ppc64.c @ 7:7ca57dbefed4
- ppc64 update from Masanori
author | cslag |
---|---|
date | Sun, 19 Jul 2015 13:05:34 +0200 |
parents | 3e629dc19168 |
children | bbefb8b8e74c |
line wrap: on
line diff
--- a/dyncallback/dyncall_thunk_ppc64.c Thu Jul 09 20:51:11 2015 +0200 +++ b/dyncallback/dyncall_thunk_ppc64.c Sun Jul 19 13:05:34 2015 +0200 @@ -31,9 +31,34 @@ void dcbInitThunk(DCThunk* p, void (*entry)()) { -#if DC__ABI_PPC64_ELF_V == 2 +#if DC__ABI_PPC64_ELF_V != 2 /* - ppc64 thunk code: + ppc64 thunk code: (v1) + oris r11, r2, HI16(p) + ori r11,r11, LO16(p) + ld r12,48(r11) + ld r2,56(r11) + mtctr r12 + bctr + */ + + p->thunk_entry = (void *)&(p->code_load_hi); + p->toc_thunk = ((long)(p->thunk_entry) & 0xffffffff00000000UL); + + 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->addr_self_lo = LO16(p); + p->code_jump[0] = 0xe98b0030U; /* ld r12,48(r11) */ + p->code_jump[1] = 0xe84b0038U; /* ld r2,56(r11) */ + p->code_jump[2] = 0x7d8903a6U; /* mtclr r12 */ + p->code_jump[3] = 0x4e800420U; /* bctr */ + p->addr_entry = (void *)*((long *)entry); + p->toc_entry = *((long *)(entry + 8)); + +#else + /* + ppc64 thunk code: (v2) lis r11, HIST16(p) ori r11,r11, HIER16(p) rldicr r11,r11,32,31 @@ -57,31 +82,6 @@ p->code_jump[1] = 0x7d8903a6U; /* mtclr r12 */ p->code_jump[2] = 0x4e800420U; /* bctr */ p->addr_entry = (void *)(entry); - -#else - /* - ppc64 thunk code: - oris r11, r2, HI16(p) - ori r11,r11, LO16(p) - ld r12,48(r11) - ld r2,56(r11) - mtctr r12 - bctr - */ - - p->thunk_entry = (void *)&(p->code_load_hi); - p->toc_thunk = ((long)(p->thunk_entry) & 0xffffffff00000000UL); - - 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->addr_self_lo = LO16(p); - p->code_jump[0] = 0xe98b0030U; /* ld r12,48(r11) */ - p->code_jump[1] = 0xe84b0038U; /* ld r2,56(r11) */ - p->code_jump[2] = 0x7d8903a6U; /* mtclr r12 */ - p->code_jump[3] = 0x4e800420U; /* bctr */ - p->addr_entry = (void *)*((long *)entry); - p->toc_entry = *((long *)(entry + 8)); #endif }