File: autoconf-utrace-via-tracepoints2.c

package info (click to toggle)
systemtap 5.3-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 47,552 kB
  • sloc: cpp: 81,117; ansic: 54,933; xml: 49,795; exp: 43,595; sh: 11,526; python: 5,003; perl: 2,252; tcl: 1,312; makefile: 1,006; javascript: 149; lisp: 105; awk: 101; asm: 91; java: 70; sed: 16
file content (81 lines) | stat: -rw-r--r-- 2,836 bytes parent folder | download
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);
}