@@ -104,56 +104,210 @@ VALUE dtraceprobe_init(VALUE self, VALUE rargc)
104
104
case 2 :
105
105
{
106
106
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
107
123
};
108
- install_insns (probe_insns , & insns [IS_ENABLED_FUNC_LEN ], 12 );
124
+ install_insns (probe_insns , & insns [IS_ENABLED_FUNC_LEN ], 8 );
109
125
}
110
126
break ;
111
127
112
128
case 3 :
113
129
{
114
130
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
115
149
};
116
- install_insns (probe_insns , & insns [IS_ENABLED_FUNC_LEN ], 16 );
150
+ install_insns (probe_insns , & insns [IS_ENABLED_FUNC_LEN ], 9 );
117
151
}
118
152
break ;
119
153
120
154
case 4 :
121
155
{
122
156
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
123
177
};
124
- install_insns (probe_insns , & insns [IS_ENABLED_FUNC_LEN ], 16 );
178
+ install_insns (probe_insns , & insns [IS_ENABLED_FUNC_LEN ], 10 );
125
179
}
126
180
break ;
127
181
128
182
case 5 :
129
183
{
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 );
133
209
}
134
210
break ;
135
211
136
212
case 6 :
137
213
{
138
214
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
139
239
};
140
- install_insns (probe_insns , & insns [IS_ENABLED_FUNC_LEN ], 24 );
240
+ install_insns (probe_insns , & insns [IS_ENABLED_FUNC_LEN ], 12 );
141
241
}
142
242
break ;
143
243
144
244
case 7 :
145
245
{
146
246
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
147
273
};
148
- install_insns (probe_insns , & insns [IS_ENABLED_FUNC_LEN ], 28 );
274
+ install_insns (probe_insns , & insns [IS_ENABLED_FUNC_LEN ], 13 );
149
275
}
150
276
break ;
151
277
152
278
case 8 :
153
279
{
154
280
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
155
309
};
156
- install_insns (probe_insns , & insns [IS_ENABLED_FUNC_LEN ], 32 );
310
+ install_insns (probe_insns , & insns [IS_ENABLED_FUNC_LEN ], 14 );
157
311
}
158
312
break ;
159
313
@@ -299,17 +453,7 @@ VALUE dtraceprobe_probe_offset(VALUE self, VALUE file_addr, VALUE argc)
299
453
void * probe_addr ;
300
454
int offset ;
301
455
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 );
313
457
return INT2FIX ((int )probe_addr - (int )FIX2INT (file_addr ) + offset );
314
458
}
315
459
0 commit comments