@@ -134,25 +134,25 @@ static int
134
134
process_fetch_insn (struct fetch_insn * code , void * rec , void * edata ,
135
135
void * dest , void * base )
136
136
{
137
- struct pt_regs * regs = rec ;
137
+ struct ftrace_regs * fregs = rec ;
138
138
unsigned long val ;
139
139
int ret ;
140
140
141
141
retry :
142
142
/* 1st stage: get value from context */
143
143
switch (code -> op ) {
144
144
case FETCH_OP_STACK :
145
- val = regs_get_kernel_stack_nth ( regs , code -> param );
145
+ val = ftrace_regs_get_kernel_stack_nth ( fregs , code -> param );
146
146
break ;
147
147
case FETCH_OP_STACKP :
148
- val = kernel_stack_pointer ( regs );
148
+ val = ftrace_regs_get_stack_pointer ( fregs );
149
149
break ;
150
150
case FETCH_OP_RETVAL :
151
- val = regs_return_value ( regs );
151
+ val = ftrace_regs_get_return_value ( fregs );
152
152
break ;
153
153
#ifdef CONFIG_HAVE_FUNCTION_ARG_ACCESS_API
154
154
case FETCH_OP_ARG :
155
- val = regs_get_kernel_argument ( regs , code -> param );
155
+ val = ftrace_regs_get_argument ( fregs , code -> param );
156
156
break ;
157
157
case FETCH_OP_EDATA :
158
158
val = * (unsigned long * )((unsigned long )edata + code -> offset );
@@ -175,7 +175,7 @@ NOKPROBE_SYMBOL(process_fetch_insn)
175
175
/* function entry handler */
176
176
static nokprobe_inline void
177
177
__fentry_trace_func (struct trace_fprobe * tf , unsigned long entry_ip ,
178
- struct pt_regs * regs ,
178
+ struct ftrace_regs * fregs ,
179
179
struct trace_event_file * trace_file )
180
180
{
181
181
struct fentry_trace_entry_head * entry ;
@@ -189,50 +189,79 @@ __fentry_trace_func(struct trace_fprobe *tf, unsigned long entry_ip,
189
189
if (trace_trigger_soft_disabled (trace_file ))
190
190
return ;
191
191
192
- dsize = __get_data_size (& tf -> tp , regs , NULL );
192
+ dsize = __get_data_size (& tf -> tp , fregs , NULL );
193
193
194
194
entry = trace_event_buffer_reserve (& fbuffer , trace_file ,
195
195
sizeof (* entry ) + tf -> tp .size + dsize );
196
196
if (!entry )
197
197
return ;
198
198
199
- fbuffer .regs = regs ;
199
+ fbuffer .regs = ftrace_get_regs ( fregs ) ;
200
200
entry = fbuffer .entry = ring_buffer_event_data (fbuffer .event );
201
201
entry -> ip = entry_ip ;
202
- store_trace_args (& entry [1 ], & tf -> tp , regs , NULL , sizeof (* entry ), dsize );
202
+ store_trace_args (& entry [1 ], & tf -> tp , fregs , NULL , sizeof (* entry ), dsize );
203
203
204
204
trace_event_buffer_commit (& fbuffer );
205
205
}
206
206
207
207
static void
208
208
fentry_trace_func (struct trace_fprobe * tf , unsigned long entry_ip ,
209
- struct pt_regs * regs )
209
+ struct ftrace_regs * fregs )
210
210
{
211
211
struct event_file_link * link ;
212
212
213
213
trace_probe_for_each_link_rcu (link , & tf -> tp )
214
- __fentry_trace_func (tf , entry_ip , regs , link -> file );
214
+ __fentry_trace_func (tf , entry_ip , fregs , link -> file );
215
215
}
216
216
NOKPROBE_SYMBOL (fentry_trace_func );
217
217
218
+ static nokprobe_inline
219
+ void store_fprobe_entry_data (void * edata , struct trace_probe * tp , struct ftrace_regs * fregs )
220
+ {
221
+ struct probe_entry_arg * earg = tp -> entry_arg ;
222
+ unsigned long val = 0 ;
223
+ int i ;
224
+
225
+ if (!earg )
226
+ return ;
227
+
228
+ for (i = 0 ; i < earg -> size ; i ++ ) {
229
+ struct fetch_insn * code = & earg -> code [i ];
230
+
231
+ switch (code -> op ) {
232
+ case FETCH_OP_ARG :
233
+ val = ftrace_regs_get_argument (fregs , code -> param );
234
+ break ;
235
+ case FETCH_OP_ST_EDATA :
236
+ * (unsigned long * )((unsigned long )edata + code -> offset ) = val ;
237
+ break ;
238
+ case FETCH_OP_END :
239
+ goto end ;
240
+ default :
241
+ break ;
242
+ }
243
+ }
244
+ end :
245
+ return ;
246
+ }
247
+
218
248
/* function exit handler */
219
249
static int trace_fprobe_entry_handler (struct fprobe * fp , unsigned long entry_ip ,
220
250
unsigned long ret_ip , struct ftrace_regs * fregs ,
221
251
void * entry_data )
222
252
{
223
253
struct trace_fprobe * tf = container_of (fp , struct trace_fprobe , fp );
224
- struct pt_regs * regs = ftrace_get_regs (fregs );
225
254
226
- if (regs && tf -> tp .entry_arg )
227
- store_trace_entry_data (entry_data , & tf -> tp , regs );
255
+ if (tf -> tp .entry_arg )
256
+ store_fprobe_entry_data (entry_data , & tf -> tp , fregs );
228
257
229
258
return 0 ;
230
259
}
231
260
NOKPROBE_SYMBOL (trace_fprobe_entry_handler )
232
261
233
262
static nokprobe_inline void
234
263
__fexit_trace_func (struct trace_fprobe * tf , unsigned long entry_ip ,
235
- unsigned long ret_ip , struct pt_regs * regs ,
264
+ unsigned long ret_ip , struct ftrace_regs * fregs ,
236
265
void * entry_data , struct trace_event_file * trace_file )
237
266
{
238
267
struct fexit_trace_entry_head * entry ;
@@ -246,60 +275,63 @@ __fexit_trace_func(struct trace_fprobe *tf, unsigned long entry_ip,
246
275
if (trace_trigger_soft_disabled (trace_file ))
247
276
return ;
248
277
249
- dsize = __get_data_size (& tf -> tp , regs , entry_data );
278
+ dsize = __get_data_size (& tf -> tp , fregs , entry_data );
250
279
251
280
entry = trace_event_buffer_reserve (& fbuffer , trace_file ,
252
281
sizeof (* entry ) + tf -> tp .size + dsize );
253
282
if (!entry )
254
283
return ;
255
284
256
- fbuffer .regs = regs ;
285
+ fbuffer .regs = ftrace_get_regs ( fregs ) ;
257
286
entry = fbuffer .entry = ring_buffer_event_data (fbuffer .event );
258
287
entry -> func = entry_ip ;
259
288
entry -> ret_ip = ret_ip ;
260
- store_trace_args (& entry [1 ], & tf -> tp , regs , entry_data , sizeof (* entry ), dsize );
289
+ store_trace_args (& entry [1 ], & tf -> tp , fregs , entry_data , sizeof (* entry ), dsize );
261
290
262
291
trace_event_buffer_commit (& fbuffer );
263
292
}
264
293
265
294
static void
266
295
fexit_trace_func (struct trace_fprobe * tf , unsigned long entry_ip ,
267
- unsigned long ret_ip , struct pt_regs * regs , void * entry_data )
296
+ unsigned long ret_ip , struct ftrace_regs * fregs , void * entry_data )
268
297
{
269
298
struct event_file_link * link ;
270
299
271
300
trace_probe_for_each_link_rcu (link , & tf -> tp )
272
- __fexit_trace_func (tf , entry_ip , ret_ip , regs , entry_data , link -> file );
301
+ __fexit_trace_func (tf , entry_ip , ret_ip , fregs , entry_data , link -> file );
273
302
}
274
303
NOKPROBE_SYMBOL (fexit_trace_func );
275
304
276
305
#ifdef CONFIG_PERF_EVENTS
277
306
278
307
static int fentry_perf_func (struct trace_fprobe * tf , unsigned long entry_ip ,
279
- struct pt_regs * regs )
308
+ struct ftrace_regs * fregs )
280
309
{
281
310
struct trace_event_call * call = trace_probe_event_call (& tf -> tp );
282
311
struct fentry_trace_entry_head * entry ;
283
312
struct hlist_head * head ;
284
313
int size , __size , dsize ;
314
+ struct pt_regs * regs ;
285
315
int rctx ;
286
316
287
317
head = this_cpu_ptr (call -> perf_events );
288
318
if (hlist_empty (head ))
289
319
return 0 ;
290
320
291
- dsize = __get_data_size (& tf -> tp , regs , NULL );
321
+ dsize = __get_data_size (& tf -> tp , fregs , NULL );
292
322
__size = sizeof (* entry ) + tf -> tp .size + dsize ;
293
323
size = ALIGN (__size + sizeof (u32 ), sizeof (u64 ));
294
324
size -= sizeof (u32 );
295
325
296
- entry = perf_trace_buf_alloc (size , NULL , & rctx );
326
+ entry = perf_trace_buf_alloc (size , & regs , & rctx );
297
327
if (!entry )
298
328
return 0 ;
299
329
330
+ regs = ftrace_fill_perf_regs (fregs , regs );
331
+
300
332
entry -> ip = entry_ip ;
301
333
memset (& entry [1 ], 0 , dsize );
302
- store_trace_args (& entry [1 ], & tf -> tp , regs , NULL , sizeof (* entry ), dsize );
334
+ store_trace_args (& entry [1 ], & tf -> tp , fregs , NULL , sizeof (* entry ), dsize );
303
335
perf_trace_buf_submit (entry , size , rctx , call -> event .type , 1 , regs ,
304
336
head , NULL );
305
337
return 0 ;
@@ -308,31 +340,34 @@ NOKPROBE_SYMBOL(fentry_perf_func);
308
340
309
341
static void
310
342
fexit_perf_func (struct trace_fprobe * tf , unsigned long entry_ip ,
311
- unsigned long ret_ip , struct pt_regs * regs ,
343
+ unsigned long ret_ip , struct ftrace_regs * fregs ,
312
344
void * entry_data )
313
345
{
314
346
struct trace_event_call * call = trace_probe_event_call (& tf -> tp );
315
347
struct fexit_trace_entry_head * entry ;
316
348
struct hlist_head * head ;
317
349
int size , __size , dsize ;
350
+ struct pt_regs * regs ;
318
351
int rctx ;
319
352
320
353
head = this_cpu_ptr (call -> perf_events );
321
354
if (hlist_empty (head ))
322
355
return ;
323
356
324
- dsize = __get_data_size (& tf -> tp , regs , entry_data );
357
+ dsize = __get_data_size (& tf -> tp , fregs , entry_data );
325
358
__size = sizeof (* entry ) + tf -> tp .size + dsize ;
326
359
size = ALIGN (__size + sizeof (u32 ), sizeof (u64 ));
327
360
size -= sizeof (u32 );
328
361
329
- entry = perf_trace_buf_alloc (size , NULL , & rctx );
362
+ entry = perf_trace_buf_alloc (size , & regs , & rctx );
330
363
if (!entry )
331
364
return ;
332
365
366
+ regs = ftrace_fill_perf_regs (fregs , regs );
367
+
333
368
entry -> func = entry_ip ;
334
369
entry -> ret_ip = ret_ip ;
335
- store_trace_args (& entry [1 ], & tf -> tp , regs , entry_data , sizeof (* entry ), dsize );
370
+ store_trace_args (& entry [1 ], & tf -> tp , fregs , entry_data , sizeof (* entry ), dsize );
336
371
perf_trace_buf_submit (entry , size , rctx , call -> event .type , 1 , regs ,
337
372
head , NULL );
338
373
}
@@ -344,17 +379,14 @@ static int fentry_dispatcher(struct fprobe *fp, unsigned long entry_ip,
344
379
void * entry_data )
345
380
{
346
381
struct trace_fprobe * tf = container_of (fp , struct trace_fprobe , fp );
347
- struct pt_regs * regs = ftrace_get_regs (fregs );
348
382
int ret = 0 ;
349
383
350
- if (!regs )
351
- return 0 ;
352
-
353
384
if (trace_probe_test_flag (& tf -> tp , TP_FLAG_TRACE ))
354
- fentry_trace_func (tf , entry_ip , regs );
385
+ fentry_trace_func (tf , entry_ip , fregs );
386
+
355
387
#ifdef CONFIG_PERF_EVENTS
356
388
if (trace_probe_test_flag (& tf -> tp , TP_FLAG_PROFILE ))
357
- ret = fentry_perf_func (tf , entry_ip , regs );
389
+ ret = fentry_perf_func (tf , entry_ip , fregs );
358
390
#endif
359
391
return ret ;
360
392
}
@@ -365,16 +397,12 @@ static void fexit_dispatcher(struct fprobe *fp, unsigned long entry_ip,
365
397
void * entry_data )
366
398
{
367
399
struct trace_fprobe * tf = container_of (fp , struct trace_fprobe , fp );
368
- struct pt_regs * regs = ftrace_get_regs (fregs );
369
-
370
- if (!regs )
371
- return ;
372
400
373
401
if (trace_probe_test_flag (& tf -> tp , TP_FLAG_TRACE ))
374
- fexit_trace_func (tf , entry_ip , ret_ip , regs , entry_data );
402
+ fexit_trace_func (tf , entry_ip , ret_ip , fregs , entry_data );
375
403
#ifdef CONFIG_PERF_EVENTS
376
404
if (trace_probe_test_flag (& tf -> tp , TP_FLAG_PROFILE ))
377
- fexit_perf_func (tf , entry_ip , ret_ip , regs , entry_data );
405
+ fexit_perf_func (tf , entry_ip , ret_ip , fregs , entry_data );
378
406
#endif
379
407
}
380
408
NOKPROBE_SYMBOL (fexit_dispatcher );
0 commit comments