1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
|
/* variant of autoconf_utrace_via_tracepoints.c post
kernel commit 3e816361e94a0e79b1aabf44abec552e9698b196
adding group_dead argument to sched_process_exit */
#include <linux/mm.h>
#include <trace/events/sched.h>
#include <trace/events/syscalls.h>
#include <linux/task_work.h>
// The utrace-less task_finder needs 5 specific tracepoints and
// <linux/task_work.h>.
// NB: in kernels which do have the requisite pieces, just unconfigured, then
// everything below will compile just fine, only returning ENOSYS at runtime.
// To get the compile-time error that autoconf needs, check it directly:
#ifndef CONFIG_TRACEPOINTS
#error "CONFIG_TRACEPOINTS is not enabled"
#endif
void __sched_process_fork(void *cb_data __attribute__((unused)),
struct task_struct *parent __attribute__((unused)),
struct task_struct *child __attribute__((unused)));
void __sched_process_fork(void *cb_data __attribute__((unused)),
struct task_struct *parent __attribute__((unused)),
struct task_struct *child __attribute__((unused)))
{
return;
}
void __sched_process_exit(void *cb_data __attribute__((unused)),
struct task_struct *task __attribute__((unused)),
bool group_dead __attribute__((unused)));
void __sched_process_exit(void *cb_data __attribute__((unused)),
struct task_struct *task __attribute__((unused)),
bool group_dead __attribute__((unused)))
{
return;
}
void __sched_process_exec(void *cb_data __attribute__ ((unused)),
struct task_struct *task __attribute__((unused)),
pid_t old_pid __attribute__((unused)),
struct linux_binprm *bprm __attribute__((unused)));
void __sched_process_exec(void *cb_data __attribute__ ((unused)),
struct task_struct *task __attribute__((unused)),
pid_t old_pid __attribute__((unused)),
struct linux_binprm *bprm __attribute__((unused)))
{
return;
}
void __sys_enter(void *cb_data __attribute__ ((unused)),
struct pt_regs *regs __attribute__((unused)),
long id __attribute__((unused)));
void __sys_enter(void *cb_data __attribute__ ((unused)),
struct pt_regs *regs __attribute__((unused)),
long id __attribute__((unused)))
{
return;
}
void __sys_exit(void *cb_data __attribute__ ((unused)),
struct pt_regs *regs __attribute__((unused)),
long ret __attribute__((unused)));
void __sys_exit(void *cb_data __attribute__ ((unused)),
struct pt_regs *regs __attribute__((unused)),
long ret __attribute__((unused)))
{
return;
}
void __autoconf_func(void);
void __autoconf_func(void)
{
(void) register_trace_sched_process_fork(__sched_process_fork, NULL);
(void) register_trace_sched_process_exit(__sched_process_exit, NULL);
(void) register_trace_sched_process_exec(__sched_process_exec, NULL);
(void) register_trace_sys_enter(__sys_enter, NULL);
(void) register_trace_sys_exit(__sys_exit, NULL);
}
|