xref: /openbmc/linux/include/trace/events/signal.h (revision b6dcefde)
1 #undef TRACE_SYSTEM
2 #define TRACE_SYSTEM signal
3 
4 #if !defined(_TRACE_SIGNAL_H) || defined(TRACE_HEADER_MULTI_READ)
5 #define _TRACE_SIGNAL_H
6 
7 #include <linux/signal.h>
8 #include <linux/sched.h>
9 #include <linux/tracepoint.h>
10 
11 #define TP_STORE_SIGINFO(__entry, info)				\
12 	do {							\
13 		if (info == SEND_SIG_NOINFO) {			\
14 			__entry->errno	= 0;			\
15 			__entry->code	= SI_USER;		\
16 		} else if (info == SEND_SIG_PRIV) {		\
17 			__entry->errno	= 0;			\
18 			__entry->code	= SI_KERNEL;		\
19 		} else {					\
20 			__entry->errno	= info->si_errno;	\
21 			__entry->code	= info->si_code;	\
22 		}						\
23 	} while (0)
24 
25 /**
26  * signal_generate - called when a signal is generated
27  * @sig: signal number
28  * @info: pointer to struct siginfo
29  * @task: pointer to struct task_struct
30  *
31  * Current process sends a 'sig' signal to 'task' process with
32  * 'info' siginfo. If 'info' is SEND_SIG_NOINFO or SEND_SIG_PRIV,
33  * 'info' is not a pointer and you can't access its field. Instead,
34  * SEND_SIG_NOINFO means that si_code is SI_USER, and SEND_SIG_PRIV
35  * means that si_code is SI_KERNEL.
36  */
37 TRACE_EVENT(signal_generate,
38 
39 	TP_PROTO(int sig, struct siginfo *info, struct task_struct *task),
40 
41 	TP_ARGS(sig, info, task),
42 
43 	TP_STRUCT__entry(
44 		__field(	int,	sig			)
45 		__field(	int,	errno			)
46 		__field(	int,	code			)
47 		__array(	char,	comm,	TASK_COMM_LEN	)
48 		__field(	pid_t,	pid			)
49 	),
50 
51 	TP_fast_assign(
52 		__entry->sig	= sig;
53 		TP_STORE_SIGINFO(__entry, info);
54 		memcpy(__entry->comm, task->comm, TASK_COMM_LEN);
55 		__entry->pid	= task->pid;
56 	),
57 
58 	TP_printk("sig=%d errno=%d code=%d comm=%s pid=%d",
59 		  __entry->sig, __entry->errno, __entry->code,
60 		  __entry->comm, __entry->pid)
61 );
62 
63 /**
64  * signal_deliver - called when a signal is delivered
65  * @sig: signal number
66  * @info: pointer to struct siginfo
67  * @ka: pointer to struct k_sigaction
68  *
69  * A 'sig' signal is delivered to current process with 'info' siginfo,
70  * and it will be handled by 'ka'. ka->sa.sa_handler can be SIG_IGN or
71  * SIG_DFL.
72  * Note that some signals reported by signal_generate tracepoint can be
73  * lost, ignored or modified (by debugger) before hitting this tracepoint.
74  * This means, this can show which signals are actually delivered, but
75  * matching generated signals and delivered signals may not be correct.
76  */
77 TRACE_EVENT(signal_deliver,
78 
79 	TP_PROTO(int sig, struct siginfo *info, struct k_sigaction *ka),
80 
81 	TP_ARGS(sig, info, ka),
82 
83 	TP_STRUCT__entry(
84 		__field(	int,		sig		)
85 		__field(	int,		errno		)
86 		__field(	int,		code		)
87 		__field(	unsigned long,	sa_handler	)
88 		__field(	unsigned long,	sa_flags	)
89 	),
90 
91 	TP_fast_assign(
92 		__entry->sig	= sig;
93 		TP_STORE_SIGINFO(__entry, info);
94 		__entry->sa_handler	= (unsigned long)ka->sa.sa_handler;
95 		__entry->sa_flags	= ka->sa.sa_flags;
96 	),
97 
98 	TP_printk("sig=%d errno=%d code=%d sa_handler=%lx sa_flags=%lx",
99 		  __entry->sig, __entry->errno, __entry->code,
100 		  __entry->sa_handler, __entry->sa_flags)
101 );
102 
103 /**
104  * signal_overflow_fail - called when signal queue is overflow
105  * @sig: signal number
106  * @group: signal to process group or not (bool)
107  * @info: pointer to struct siginfo
108  *
109  * Kernel fails to generate 'sig' signal with 'info' siginfo, because
110  * siginfo queue is overflow, and the signal is dropped.
111  * 'group' is not 0 if the signal will be sent to a process group.
112  * 'sig' is always one of RT signals.
113  */
114 TRACE_EVENT(signal_overflow_fail,
115 
116 	TP_PROTO(int sig, int group, struct siginfo *info),
117 
118 	TP_ARGS(sig, group, info),
119 
120 	TP_STRUCT__entry(
121 		__field(	int,	sig	)
122 		__field(	int,	group	)
123 		__field(	int,	errno	)
124 		__field(	int,	code	)
125 	),
126 
127 	TP_fast_assign(
128 		__entry->sig	= sig;
129 		__entry->group	= group;
130 		TP_STORE_SIGINFO(__entry, info);
131 	),
132 
133 	TP_printk("sig=%d group=%d errno=%d code=%d",
134 		  __entry->sig, __entry->group, __entry->errno, __entry->code)
135 );
136 
137 /**
138  * signal_lose_info - called when siginfo is lost
139  * @sig: signal number
140  * @group: signal to process group or not (bool)
141  * @info: pointer to struct siginfo
142  *
143  * Kernel generates 'sig' signal but loses 'info' siginfo, because siginfo
144  * queue is overflow.
145  * 'group' is not 0 if the signal will be sent to a process group.
146  * 'sig' is always one of non-RT signals.
147  */
148 TRACE_EVENT(signal_lose_info,
149 
150 	TP_PROTO(int sig, int group, struct siginfo *info),
151 
152 	TP_ARGS(sig, group, info),
153 
154 	TP_STRUCT__entry(
155 		__field(	int,	sig	)
156 		__field(	int,	group	)
157 		__field(	int,	errno	)
158 		__field(	int,	code	)
159 	),
160 
161 	TP_fast_assign(
162 		__entry->sig	= sig;
163 		__entry->group	= group;
164 		TP_STORE_SIGINFO(__entry, info);
165 	),
166 
167 	TP_printk("sig=%d group=%d errno=%d code=%d",
168 		  __entry->sig, __entry->group, __entry->errno, __entry->code)
169 );
170 #endif /* _TRACE_SIGNAL_H */
171 
172 /* This part must be outside protection */
173 #include <trace/define_trace.h>
174