Mercurial > pub > dyncall > dyncall
comparison 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 |
comparison
equal
deleted
inserted
replaced
6:b8ea1d2a34a3 | 7:7ca57dbefed4 |
---|---|
29 #define HI16(x) (unsigned short)((((unsigned long)(x))>>16UL) & 0xffff) | 29 #define HI16(x) (unsigned short)((((unsigned long)(x))>>16UL) & 0xffff) |
30 #define LO16(x) (unsigned short)( ((unsigned long)(x)) & 0xffff) | 30 #define LO16(x) (unsigned short)( ((unsigned long)(x)) & 0xffff) |
31 | 31 |
32 void dcbInitThunk(DCThunk* p, void (*entry)()) | 32 void dcbInitThunk(DCThunk* p, void (*entry)()) |
33 { | 33 { |
34 #if DC__ABI_PPC64_ELF_V == 2 | 34 #if DC__ABI_PPC64_ELF_V != 2 |
35 /* | 35 /* |
36 ppc64 thunk code: | 36 ppc64 thunk code: (v1) |
37 oris r11, r2, HI16(p) | |
38 ori r11,r11, LO16(p) | |
39 ld r12,48(r11) | |
40 ld r2,56(r11) | |
41 mtctr r12 | |
42 bctr | |
43 */ | |
44 | |
45 p->thunk_entry = (void *)&(p->code_load_hi); | |
46 p->toc_thunk = ((long)(p->thunk_entry) & 0xffffffff00000000UL); | |
47 | |
48 p->code_load_hi = 0x644bU; /* oris r11, r2, HI16(p) */ | |
49 p->addr_self_hi = HI16(p); | |
50 p->code_load_lo = 0x616bU; /* ori r11,r11, LO16(p) */ | |
51 p->addr_self_lo = LO16(p); | |
52 p->code_jump[0] = 0xe98b0030U; /* ld r12,48(r11) */ | |
53 p->code_jump[1] = 0xe84b0038U; /* ld r2,56(r11) */ | |
54 p->code_jump[2] = 0x7d8903a6U; /* mtclr r12 */ | |
55 p->code_jump[3] = 0x4e800420U; /* bctr */ | |
56 p->addr_entry = (void *)*((long *)entry); | |
57 p->toc_entry = *((long *)(entry + 8)); | |
58 | |
59 #else | |
60 /* | |
61 ppc64 thunk code: (v2) | |
37 lis r11, HIST16(p) | 62 lis r11, HIST16(p) |
38 ori r11,r11, HIER16(p) | 63 ori r11,r11, HIER16(p) |
39 rldicr r11,r11,32,31 | 64 rldicr r11,r11,32,31 |
40 oris r11,r11, HI16(p) | 65 oris r11,r11, HI16(p) |
41 ori r11,r11, LO16(p) | 66 ori r11,r11, LO16(p) |
55 p->addr_self_lo = LO16(p); | 80 p->addr_self_lo = LO16(p); |
56 p->code_jump[0] = 0xe98b0028U; /* ld r12,40(r11) */ | 81 p->code_jump[0] = 0xe98b0028U; /* ld r12,40(r11) */ |
57 p->code_jump[1] = 0x7d8903a6U; /* mtclr r12 */ | 82 p->code_jump[1] = 0x7d8903a6U; /* mtclr r12 */ |
58 p->code_jump[2] = 0x4e800420U; /* bctr */ | 83 p->code_jump[2] = 0x4e800420U; /* bctr */ |
59 p->addr_entry = (void *)(entry); | 84 p->addr_entry = (void *)(entry); |
60 | |
61 #else | |
62 /* | |
63 ppc64 thunk code: | |
64 oris r11, r2, HI16(p) | |
65 ori r11,r11, LO16(p) | |
66 ld r12,48(r11) | |
67 ld r2,56(r11) | |
68 mtctr r12 | |
69 bctr | |
70 */ | |
71 | |
72 p->thunk_entry = (void *)&(p->code_load_hi); | |
73 p->toc_thunk = ((long)(p->thunk_entry) & 0xffffffff00000000UL); | |
74 | |
75 p->code_load_hi = 0x644bU; /* oris r11, r2, HI16(p) */ | |
76 p->addr_self_hi = HI16(p); | |
77 p->code_load_lo = 0x616bU; /* ori r11,r11, LO16(p) */ | |
78 p->addr_self_lo = LO16(p); | |
79 p->code_jump[0] = 0xe98b0030U; /* ld r12,48(r11) */ | |
80 p->code_jump[1] = 0xe84b0038U; /* ld r2,56(r11) */ | |
81 p->code_jump[2] = 0x7d8903a6U; /* mtclr r12 */ | |
82 p->code_jump[3] = 0x4e800420U; /* bctr */ | |
83 p->addr_entry = (void *)*((long *)entry); | |
84 p->toc_entry = *((long *)(entry + 8)); | |
85 #endif | 85 #endif |
86 } | 86 } |
87 | 87 |