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