Frank Ch. Eigler wrote:
Hi -
I think the problem is that from within the utrace .report_signal
handler I want to call the function that corresponds to "if (condition)
{ ... }" which is represented as say probe_1064(struct context *), but I
don't know where I would find the "struct context *" argument that the
probe_1064() requires. [...]
Look at the "stap -p3" code generated from
probe begin { println("hello") }
or probe kernel.function("sys_open") { println("hello") }
or probe process("bash").begin { println("hello") }
You'll see that context allocation is done by the systemtap-generated
function that receives the callback from the kernel facility that
represents the event source. That function -- usually just one per
derived_probe_group -- then invokes the appropriate probe handler
function ("probe_NNNN (struct context *)") through a function pointer.
Dave,
Frank gave you a good overview, but I thought I fill in a few more
details. If you want to specifically see how utrace probes get called,
you can look at the output of the following:
# stap -p3 -e 'probe process("/bin/bash").syscall { printf("hello\n") }'
The routine you'll want to study is 'stap_utrace_probe_syscall'.
There's a lot of code in that routine, but most of it is boilerplate.
That C routine gets output in the translator by
utrace_derived_probe_group::emit_module_decls(). For instance, here's
the code that generates 'stap_utrace_probe_syscall':
s.op->newline() << "static u32 stap_utrace_probe_syscall(struct
utrace_attached_engine *engine, struct task_struct *tsk, struct pt_regs
*regs) {";
s.op->indent(1);
s.op->newline() << "struct stap_utrace_probe *p = (struct
stap_utrace_probe *)engine->data;";
common_probe_entryfn_prologue (s.op, "STAP_SESSION_RUNNING");
s.op->newline() << "c->probe_point = p->pp;";
s.op->newline() << "c->regs = regs;";
// call probe function
s.op->newline() << "(*p->ph) (c);";
common_probe_entryfn_epilogue (s.op);
s.op->newline() << "return UTRACE_ACTION_RESUME;";
s.op->newline(-1) << "}";
The utrace_derived_probe_group::emit_module_decls() function outputs all
the .report_* related functions that the utrace probes need.