Skip to content

Commit d9aa120

Browse files
author
Chris Andrews
committed
Finish PowerPC port - appears to work fine, all arg counts.
1 parent 94eafa4 commit d9aa120

File tree

1 file changed

+164
-20
lines changed

1 file changed

+164
-20
lines changed

ext/powerpc-darwin/dtrace_probe.c

+164-20
Original file line numberDiff line numberDiff line change
@@ -104,56 +104,210 @@ VALUE dtraceprobe_init(VALUE self, VALUE rargc)
104104
case 2:
105105
{
106106
uint8_t probe_insns[FUNC_SIZE] = {
107+
/* stmw r30,0xfff8(r1) */
108+
0xbf, 0xc1, 0xff, 0xf8,
109+
/* stwu r1,0xffd0(r1) */
110+
0x94, 0x21, 0xff, 0xd0,
111+
/* or r30,r1,r1 */
112+
0x7c, 0x3e, 0x0b, 0x78,
113+
/* stw r3,0x48(r30) */
114+
0x90, 0x7e, 0x00, 0x48,
115+
/* stw r4,0x4c(r30) */
116+
0x90, 0x9e, 0x00, 0x4c,
117+
/* lwz r1,0x0(r1) */
118+
0x80, 0x21, 0x00, 0x00,
119+
/* lmw r30,0xfff8(r1) */
120+
0xbb, 0xc1, 0xff, 0xf8,
121+
/* blr */
122+
0x4e, 0x80, 0x00, 0x20
107123
};
108-
install_insns(probe_insns, &insns[IS_ENABLED_FUNC_LEN], 12);
124+
install_insns(probe_insns, &insns[IS_ENABLED_FUNC_LEN], 8);
109125
}
110126
break;
111127

112128
case 3:
113129
{
114130
uint8_t probe_insns[FUNC_SIZE] = {
131+
/* stmw r30,0xfff8(r1) */
132+
0xbf, 0xc1, 0xff, 0xf8,
133+
/* stwu r1,0xffd0(r1) */
134+
0x94, 0x21, 0xff, 0xd0,
135+
/* or r30,r1,r1 */
136+
0x7c, 0x3e, 0x0b, 0x78,
137+
/* stw r3,0x48(r30) */
138+
0x90, 0x7e, 0x00, 0x48,
139+
/* stw r4,0x4c(r30) */
140+
0x90, 0x9e, 0x00, 0x4c,
141+
/* stw r5,0x50(r30) */
142+
0x90, 0xbe, 0x00, 0x50,
143+
/* lwz r1,0x0(r1) */
144+
0x80, 0x21, 0x00, 0x00,
145+
/* lmw r30,0xfff8(r1) */
146+
0xbb, 0xc1, 0xff, 0xf8,
147+
/* blr */
148+
0x4e, 0x80, 0x00, 0x20
115149
};
116-
install_insns(probe_insns, &insns[IS_ENABLED_FUNC_LEN], 16);
150+
install_insns(probe_insns, &insns[IS_ENABLED_FUNC_LEN], 9);
117151
}
118152
break;
119153

120154
case 4:
121155
{
122156
uint8_t probe_insns[FUNC_SIZE] = {
157+
/* stmw r30,0xfff8(r1) */
158+
0xbf, 0xc1, 0xff, 0xf8,
159+
/* stwu r1,0xffd0(r1) */
160+
0x94, 0x21, 0xff, 0xd0,
161+
/* or r30,r1,r1 */
162+
0x7c, 0x3e, 0x0b, 0x78,
163+
/* stw r3,0x48(r30) */
164+
0x90, 0x7e, 0x00, 0x48,
165+
/* stw r4,0x4c(r30) */
166+
0x90, 0x9e, 0x00, 0x4c,
167+
/* stw r5,0x50(r30) */
168+
0x90, 0xbe, 0x00, 0x50,
169+
/* stw r5,0x50(r30) */
170+
0x90, 0xde, 0x00, 0x54,
171+
/* lwz r1,0x0(r1) */
172+
0x80, 0x21, 0x00, 0x00,
173+
/* lmw r30,0xfff8(r1) */
174+
0xbb, 0xc1, 0xff, 0xf8,
175+
/* blr */
176+
0x4e, 0x80, 0x00, 0x20
123177
};
124-
install_insns(probe_insns, &insns[IS_ENABLED_FUNC_LEN], 16);
178+
install_insns(probe_insns, &insns[IS_ENABLED_FUNC_LEN], 10);
125179
}
126180
break;
127181

128182
case 5:
129183
{
130-
uint8_t probe_insns[FUNC_SIZE] = {
131-
};
132-
install_insns(probe_insns, &insns[IS_ENABLED_FUNC_LEN], 20);
184+
uint8_t probe_insns[FUNC_SIZE] = {
185+
/* stmw r30,0xfff8(r1) */
186+
0xbf, 0xc1, 0xff, 0xf8,
187+
/* stwu r1,0xffd0(r1) */
188+
0x94, 0x21, 0xff, 0xd0,
189+
/* or r30,r1,r1 */
190+
0x7c, 0x3e, 0x0b, 0x78,
191+
/* stw r3,0x48(r30) */
192+
0x90, 0x7e, 0x00, 0x48,
193+
/* stw r4,0x4c(r30) */
194+
0x90, 0x9e, 0x00, 0x4c,
195+
/* stw r5,0x50(r30) */
196+
0x90, 0xbe, 0x00, 0x50,
197+
/* stw r6,0x54(r30) */
198+
0x90, 0xde, 0x00, 0x54,
199+
/* stw r7,0x58(r30) */
200+
0x90, 0xfe, 0x00, 0x58,
201+
/* lwz r1,0x0(r1) */
202+
0x80, 0x21, 0x00, 0x00,
203+
/* lmw r30,0xfff8(r1) */
204+
0xbb, 0xc1, 0xff, 0xf8,
205+
/* blr */
206+
0x4e, 0x80, 0x00, 0x20
207+
};
208+
install_insns(probe_insns, &insns[IS_ENABLED_FUNC_LEN], 11);
133209
}
134210
break;
135211

136212
case 6:
137213
{
138214
uint8_t probe_insns[FUNC_SIZE] = {
215+
/* stmw r30,0xfff8(r1) */
216+
0xbf, 0xc1, 0xff, 0xf8,
217+
/* stwu r1,0xffd0(r1) */
218+
0x94, 0x21, 0xff, 0xd0,
219+
/* or r30,r1,r1 */
220+
0x7c, 0x3e, 0x0b, 0x78,
221+
/* stw r3,0x48(r30) */
222+
0x90, 0x7e, 0x00, 0x48,
223+
/* stw r4,0x4c(r30) */
224+
0x90, 0x9e, 0x00, 0x4c,
225+
/* stw r5,0x50(r30) */
226+
0x90, 0xbe, 0x00, 0x50,
227+
/* stw r6,0x54(r30) */
228+
0x90, 0xde, 0x00, 0x54,
229+
/* stw r7,0x58(r30) */
230+
0x90, 0xfe, 0x00, 0x58,
231+
/* stw r8,0x5c(r30) */
232+
0x91, 0x1e, 0x00, 0x5c,
233+
/* lwz r1,0x0(r1) */
234+
0x80, 0x21, 0x00, 0x00,
235+
/* lmw r30,0xfff8(r1) */
236+
0xbb, 0xc1, 0xff, 0xf8,
237+
/* blr */
238+
0x4e, 0x80, 0x00, 0x20
139239
};
140-
install_insns(probe_insns, &insns[IS_ENABLED_FUNC_LEN], 24);
240+
install_insns(probe_insns, &insns[IS_ENABLED_FUNC_LEN], 12);
141241
}
142242
break;
143243

144244
case 7:
145245
{
146246
uint8_t probe_insns[FUNC_SIZE] = {
247+
/* stmw r30,0xfff8(r1) */
248+
0xbf, 0xc1, 0xff, 0xf8,
249+
/* stwu r1,0xffd0(r1) */
250+
0x94, 0x21, 0xff, 0xd0,
251+
/* or r30,r1,r1 */
252+
0x7c, 0x3e, 0x0b, 0x78,
253+
/* stw r3,0x48(r30) */
254+
0x90, 0x7e, 0x00, 0x48,
255+
/* stw r4,0x4c(r30) */
256+
0x90, 0x9e, 0x00, 0x4c,
257+
/* stw r5,0x50(r30) */
258+
0x90, 0xbe, 0x00, 0x50,
259+
/* stw r6,0x54(r30) */
260+
0x90, 0xde, 0x00, 0x54,
261+
/* stw r7,0x58(r30) */
262+
0x90, 0xfe, 0x00, 0x58,
263+
/* stw r8,0x5c(r30) */
264+
0x91, 0x1e, 0x00, 0x5c,
265+
/* stw r9,0x60(r30) */
266+
0x91, 0x3e, 0x00, 0x60,
267+
/* lwz r1,0x0(r1) */
268+
0x80, 0x21, 0x00, 0x00,
269+
/* lmw r30,0xfff8(r1) */
270+
0xbb, 0xc1, 0xff, 0xf8,
271+
/* blr */
272+
0x4e, 0x80, 0x00, 0x20
147273
};
148-
install_insns(probe_insns, &insns[IS_ENABLED_FUNC_LEN], 28);
274+
install_insns(probe_insns, &insns[IS_ENABLED_FUNC_LEN], 13);
149275
}
150276
break;
151277

152278
case 8:
153279
{
154280
uint8_t probe_insns[FUNC_SIZE] = {
281+
/* stmw r30,0xfff8(r1) */
282+
0xbf, 0xc1, 0xff, 0xf8,
283+
/* stwu r1,0xffd0(r1) */
284+
0x94, 0x21, 0xff, 0xd0,
285+
/* or r30,r1,r1 */
286+
0x7c, 0x3e, 0x0b, 0x78,
287+
/* stw r3,0x48(r30) */
288+
0x90, 0x7e, 0x00, 0x48,
289+
/* stw r4,0x4c(r30) */
290+
0x90, 0x9e, 0x00, 0x4c,
291+
/* stw r5,0x50(r30) */
292+
0x90, 0xbe, 0x00, 0x50,
293+
/* stw r6,0x54(r30) */
294+
0x90, 0xde, 0x00, 0x54,
295+
/* stw r7,0x58(r30) */
296+
0x90, 0xfe, 0x00, 0x58,
297+
/* stw r8,0x5c(r30) */
298+
0x91, 0x1e, 0x00, 0x5c,
299+
/* stw r9,0x60(r30) */
300+
0x91, 0x3e, 0x00, 0x60,
301+
/* stw r10,0x64(r30) */
302+
0x91, 0x5e, 0x00, 0x64,
303+
/* lwz r1,0x0(r1) */
304+
0x80, 0x21, 0x00, 0x00,
305+
/* lmw r30,0xfff8(r1) */
306+
0xbb, 0xc1, 0xff, 0xf8,
307+
/* blr */
308+
0x4e, 0x80, 0x00, 0x20
155309
};
156-
install_insns(probe_insns, &insns[IS_ENABLED_FUNC_LEN], 32);
310+
install_insns(probe_insns, &insns[IS_ENABLED_FUNC_LEN], 14);
157311
}
158312
break;
159313

@@ -299,17 +453,7 @@ VALUE dtraceprobe_probe_offset(VALUE self, VALUE file_addr, VALUE argc)
299453
void *probe_addr;
300454
int offset;
301455
probe_addr = (void *)FIX2INT(rb_funcall(self, rb_intern("addr"), 0));
302-
switch FIX2INT(argc) {
303-
case 0:
304-
offset = 40; /* 32 + 6 + 2 */
305-
break;
306-
case 1:
307-
offset = 46; /* 32 + 6 + 6 + 2 */
308-
break;
309-
default:
310-
offset = 46 + (FIX2INT(argc)-1) * 7; /* 32 + 6 + 6 + 7 per subsequent arg + 2 */
311-
break;
312-
}
456+
offset = IS_ENABLED_FUNC_LEN + 8 + (FIX2INT(argc) * 4);
313457
return INT2FIX((int)probe_addr - (int)FIX2INT(file_addr) + offset);
314458
}
315459

0 commit comments

Comments
 (0)