@@ -134,25 +134,25 @@ static int
134134process_fetch_insn (struct fetch_insn * code , void * rec , void * edata ,
135135 void * dest , void * base )
136136{
137- struct pt_regs * regs = rec ;
137+ struct ftrace_regs * fregs = rec ;
138138 unsigned long val ;
139139 int ret ;
140140
141141retry :
142142 /* 1st stage: get value from context */
143143 switch (code -> op ) {
144144 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 );
146146 break ;
147147 case FETCH_OP_STACKP :
148- val = kernel_stack_pointer ( regs );
148+ val = ftrace_regs_get_stack_pointer ( fregs );
149149 break ;
150150 case FETCH_OP_RETVAL :
151- val = regs_return_value ( regs );
151+ val = ftrace_regs_get_return_value ( fregs );
152152 break ;
153153#ifdef CONFIG_HAVE_FUNCTION_ARG_ACCESS_API
154154 case FETCH_OP_ARG :
155- val = regs_get_kernel_argument ( regs , code -> param );
155+ val = ftrace_regs_get_argument ( fregs , code -> param );
156156 break ;
157157 case FETCH_OP_EDATA :
158158 val = * (unsigned long * )((unsigned long )edata + code -> offset );
@@ -175,7 +175,7 @@ NOKPROBE_SYMBOL(process_fetch_insn)
175175/* function entry handler */
176176static nokprobe_inline void
177177__fentry_trace_func (struct trace_fprobe * tf , unsigned long entry_ip ,
178- struct pt_regs * regs ,
178+ struct ftrace_regs * fregs ,
179179 struct trace_event_file * trace_file )
180180{
181181 struct fentry_trace_entry_head * entry ;
@@ -189,50 +189,79 @@ __fentry_trace_func(struct trace_fprobe *tf, unsigned long entry_ip,
189189 if (trace_trigger_soft_disabled (trace_file ))
190190 return ;
191191
192- dsize = __get_data_size (& tf -> tp , regs , NULL );
192+ dsize = __get_data_size (& tf -> tp , fregs , NULL );
193193
194194 entry = trace_event_buffer_reserve (& fbuffer , trace_file ,
195195 sizeof (* entry ) + tf -> tp .size + dsize );
196196 if (!entry )
197197 return ;
198198
199- fbuffer .regs = regs ;
199+ fbuffer .regs = ftrace_get_regs ( fregs ) ;
200200 entry = fbuffer .entry = ring_buffer_event_data (fbuffer .event );
201201 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 );
203203
204204 trace_event_buffer_commit (& fbuffer );
205205}
206206
207207static void
208208fentry_trace_func (struct trace_fprobe * tf , unsigned long entry_ip ,
209- struct pt_regs * regs )
209+ struct ftrace_regs * fregs )
210210{
211211 struct event_file_link * link ;
212212
213213 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 );
215215}
216216NOKPROBE_SYMBOL (fentry_trace_func );
217217
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+
218248/* function exit handler */
219249static int trace_fprobe_entry_handler (struct fprobe * fp , unsigned long entry_ip ,
220250 unsigned long ret_ip , struct ftrace_regs * fregs ,
221251 void * entry_data )
222252{
223253 struct trace_fprobe * tf = container_of (fp , struct trace_fprobe , fp );
224- struct pt_regs * regs = ftrace_get_regs (fregs );
225254
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 );
228257
229258 return 0 ;
230259}
231260NOKPROBE_SYMBOL (trace_fprobe_entry_handler )
232261
233262static nokprobe_inline void
234263__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 ,
236265 void * entry_data , struct trace_event_file * trace_file )
237266{
238267 struct fexit_trace_entry_head * entry ;
@@ -246,60 +275,63 @@ __fexit_trace_func(struct trace_fprobe *tf, unsigned long entry_ip,
246275 if (trace_trigger_soft_disabled (trace_file ))
247276 return ;
248277
249- dsize = __get_data_size (& tf -> tp , regs , entry_data );
278+ dsize = __get_data_size (& tf -> tp , fregs , entry_data );
250279
251280 entry = trace_event_buffer_reserve (& fbuffer , trace_file ,
252281 sizeof (* entry ) + tf -> tp .size + dsize );
253282 if (!entry )
254283 return ;
255284
256- fbuffer .regs = regs ;
285+ fbuffer .regs = ftrace_get_regs ( fregs ) ;
257286 entry = fbuffer .entry = ring_buffer_event_data (fbuffer .event );
258287 entry -> func = entry_ip ;
259288 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 );
261290
262291 trace_event_buffer_commit (& fbuffer );
263292}
264293
265294static void
266295fexit_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 )
268297{
269298 struct event_file_link * link ;
270299
271300 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 );
273302}
274303NOKPROBE_SYMBOL (fexit_trace_func );
275304
276305#ifdef CONFIG_PERF_EVENTS
277306
278307static int fentry_perf_func (struct trace_fprobe * tf , unsigned long entry_ip ,
279- struct pt_regs * regs )
308+ struct ftrace_regs * fregs )
280309{
281310 struct trace_event_call * call = trace_probe_event_call (& tf -> tp );
282311 struct fentry_trace_entry_head * entry ;
283312 struct hlist_head * head ;
284313 int size , __size , dsize ;
314+ struct pt_regs * regs ;
285315 int rctx ;
286316
287317 head = this_cpu_ptr (call -> perf_events );
288318 if (hlist_empty (head ))
289319 return 0 ;
290320
291- dsize = __get_data_size (& tf -> tp , regs , NULL );
321+ dsize = __get_data_size (& tf -> tp , fregs , NULL );
292322 __size = sizeof (* entry ) + tf -> tp .size + dsize ;
293323 size = ALIGN (__size + sizeof (u32 ), sizeof (u64 ));
294324 size -= sizeof (u32 );
295325
296- entry = perf_trace_buf_alloc (size , NULL , & rctx );
326+ entry = perf_trace_buf_alloc (size , & regs , & rctx );
297327 if (!entry )
298328 return 0 ;
299329
330+ regs = ftrace_fill_perf_regs (fregs , regs );
331+
300332 entry -> ip = entry_ip ;
301333 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 );
303335 perf_trace_buf_submit (entry , size , rctx , call -> event .type , 1 , regs ,
304336 head , NULL );
305337 return 0 ;
@@ -308,31 +340,34 @@ NOKPROBE_SYMBOL(fentry_perf_func);
308340
309341static void
310342fexit_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 ,
312344 void * entry_data )
313345{
314346 struct trace_event_call * call = trace_probe_event_call (& tf -> tp );
315347 struct fexit_trace_entry_head * entry ;
316348 struct hlist_head * head ;
317349 int size , __size , dsize ;
350+ struct pt_regs * regs ;
318351 int rctx ;
319352
320353 head = this_cpu_ptr (call -> perf_events );
321354 if (hlist_empty (head ))
322355 return ;
323356
324- dsize = __get_data_size (& tf -> tp , regs , entry_data );
357+ dsize = __get_data_size (& tf -> tp , fregs , entry_data );
325358 __size = sizeof (* entry ) + tf -> tp .size + dsize ;
326359 size = ALIGN (__size + sizeof (u32 ), sizeof (u64 ));
327360 size -= sizeof (u32 );
328361
329- entry = perf_trace_buf_alloc (size , NULL , & rctx );
362+ entry = perf_trace_buf_alloc (size , & regs , & rctx );
330363 if (!entry )
331364 return ;
332365
366+ regs = ftrace_fill_perf_regs (fregs , regs );
367+
333368 entry -> func = entry_ip ;
334369 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 );
336371 perf_trace_buf_submit (entry , size , rctx , call -> event .type , 1 , regs ,
337372 head , NULL );
338373}
@@ -344,17 +379,14 @@ static int fentry_dispatcher(struct fprobe *fp, unsigned long entry_ip,
344379 void * entry_data )
345380{
346381 struct trace_fprobe * tf = container_of (fp , struct trace_fprobe , fp );
347- struct pt_regs * regs = ftrace_get_regs (fregs );
348382 int ret = 0 ;
349383
350- if (!regs )
351- return 0 ;
352-
353384 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+
355387#ifdef CONFIG_PERF_EVENTS
356388 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 );
358390#endif
359391 return ret ;
360392}
@@ -365,16 +397,12 @@ static void fexit_dispatcher(struct fprobe *fp, unsigned long entry_ip,
365397 void * entry_data )
366398{
367399 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 ;
372400
373401 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 );
375403#ifdef CONFIG_PERF_EVENTS
376404 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 );
378406#endif
379407}
380408NOKPROBE_SYMBOL (fexit_dispatcher );
0 commit comments