@@ -14,6 +14,154 @@ SC_LTTNG_TRACEPOINT_EVENT(execve,
14
14
)
15
15
)
16
16
17
+ /*
18
+ * Clone()'s `flags` field has two parts:
19
+ * 1. exit signal: the least significant byte of the `unsigned long` is
20
+ * the signal the kernel must send to the parent process on child
21
+ * exit,
22
+ * 2. clone options: the remaining bytes of the `unsigned long` is used a
23
+ * bitwise flag for the clone options.
24
+ */
25
+ #define CLONE_EXIT_SIGNAL_FLAG_RESERVED_BITS 8
26
+ #define LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF (x ) ((x ) >> CLONE_EXIT_SIGNAL_FLAG_RESERVED_BITS )
27
+
28
+ SC_LTTNG_TRACEPOINT_ENUM (lttng_clone_exit_signal_flags ,
29
+ TP_ENUM_VALUES (
30
+ ctf_enum_value ("SIGHUP" , SIGHUP )
31
+ ctf_enum_value ("SIGINT" , SIGINT )
32
+ ctf_enum_value ("SIGQUIT" , SIGQUIT )
33
+ ctf_enum_value ("SIGILL" , SIGILL )
34
+ ctf_enum_value ("SIGTRAP" , SIGTRAP )
35
+ ctf_enum_value ("SIGABRT" , SIGABRT )
36
+ ctf_enum_value ("SIGIOT" , SIGIOT )
37
+ ctf_enum_value ("SIGBUS" , SIGBUS )
38
+ #ifdef SIGEMT
39
+ ctf_enum_value ("SIGEMT" , SIGEMT )
40
+ #endif /* #ifdef SIGEMT */
41
+ ctf_enum_value ("SIGFPE" , SIGFPE )
42
+ ctf_enum_value ("SIGKILL" , SIGKILL )
43
+ ctf_enum_value ("SIGUSR1" , SIGUSR1 )
44
+ ctf_enum_value ("SIGSEGV" , SIGSEGV )
45
+ ctf_enum_value ("SIGUSR2" , SIGUSR2 )
46
+ ctf_enum_value ("SIGPIPE" , SIGPIPE )
47
+ ctf_enum_value ("SIGALRM" , SIGALRM )
48
+ ctf_enum_value ("SIGTERM" , SIGTERM )
49
+ #ifdef SIGSTKFLT
50
+ ctf_enum_value ("SIGSTKFLT" , SIGSTKFLT )
51
+ #endif /* #ifdef SIGSTKFLT */
52
+ ctf_enum_value ("SIGCHLD" , SIGCHLD )
53
+ #ifdef SIGCLD
54
+ ctf_enum_value ("SIGCLD" , SIGCLD )
55
+ #endif /* #ifdef SIGCLD */
56
+ ctf_enum_value ("SIGCONT" , SIGCONT )
57
+ ctf_enum_value ("SIGSTOP" , SIGSTOP )
58
+ ctf_enum_value ("SIGTSTP" , SIGTSTP )
59
+ ctf_enum_value ("SIGTTIN" , SIGTTIN )
60
+ ctf_enum_value ("SIGTTOU" , SIGTTOU )
61
+ ctf_enum_value ("SIGURG" , SIGURG )
62
+ ctf_enum_value ("SIGXCPU" , SIGXCPU )
63
+ ctf_enum_value ("SIGXFSZ" , SIGXFSZ )
64
+ ctf_enum_value ("SIGVTALR" , SIGVTALRM )
65
+ ctf_enum_value ("SIGPROF" , SIGPROF )
66
+ ctf_enum_value ("SIGWINCH" , SIGWINCH )
67
+ ctf_enum_value ("SIGIO" , SIGIO )
68
+ ctf_enum_value ("SIGPOLL" , SIGPOLL )
69
+ ctf_enum_value ("SIGPWR" , SIGPWR )
70
+ #ifdef SIGINFO
71
+ ctf_enum_value ("SIGINFO" , SIGINFO )
72
+ #endif /* #ifdef SIGINFO */
73
+ #ifdef SIGLOST
74
+ ctf_enum_value ("SIGLOST" , SIGLOST )
75
+ #endif /* #ifdef SIGLOST */
76
+ ctf_enum_value ("SIGSYS" , SIGSYS )
77
+ #ifdef SIGUNUSED
78
+ ctf_enum_value ("SIGUNUSED" , SIGUNUSED )
79
+ #endif /* #ifdef SIGUNUSED */
80
+ )
81
+ )
82
+
83
+ SC_LTTNG_TRACEPOINT_ENUM (lttng_clone_option_flags ,
84
+ TP_ENUM_VALUES (
85
+ ctf_enum_value ("CLONE_CHILD_CLEARTID" , LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF (CLONE_CHILD_CLEARTID ))
86
+ ctf_enum_value ("CLONE_CHILD_SETTID" , LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF (CLONE_CHILD_SETTID ))
87
+ #if (LINUX_VERSION_CODE >= KERNEL_VERSION (5 ,5 ,0 ))
88
+ ctf_enum_value ("CLONE_CLEAR_SIGHAND" , LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF (CLONE_CLEAR_SIGHAND ))
89
+ #endif /* #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,5,0)) */
90
+ ctf_enum_value ("CLONE_DETACHED" , LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF (CLONE_DETACHED ))
91
+ ctf_enum_value ("CLONE_FILES" , LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF (CLONE_FILES ))
92
+ ctf_enum_value ("CLONE_FS" , LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF (CLONE_FS ))
93
+ ctf_enum_value ("CLONE_IO" , LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF (CLONE_IO ))
94
+ #if (LINUX_VERSION_CODE >= KERNEL_VERSION (4 ,6 ,0 ))
95
+ ctf_enum_value ("CLONE_NEWCGROUP" , LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF (CLONE_NEWCGROUP ))
96
+ #endif /* #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,6,0)) */
97
+ ctf_enum_value ("CLONE_NEWIPC" , LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF (CLONE_NEWIPC ))
98
+ ctf_enum_value ("CLONE_NEWNET" , LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF (CLONE_NEWNET ))
99
+ ctf_enum_value ("CLONE_NEWNS" , LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF (CLONE_NEWNS ))
100
+ ctf_enum_value ("CLONE_NEWPID" , LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF (CLONE_NEWPID ))
101
+ ctf_enum_value ("CLONE_NEWUSER" , LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF (CLONE_NEWUSER ))
102
+ ctf_enum_value ("CLONE_NEWUTS" , LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF (CLONE_NEWUTS ))
103
+ ctf_enum_value ("CLONE_PARENT" , LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF (CLONE_PARENT ))
104
+ ctf_enum_value ("CLONE_PARENT_SETTID" , LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF (CLONE_PARENT_SETTID ))
105
+ #if (LINUX_VERSION_CODE >= KERNEL_VERSION (5 ,2 ,0 ))
106
+ ctf_enum_value ("CLONE_PIDFD" , LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF (CLONE_PIDFD ))
107
+ #endif /* #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,2,0)) */
108
+ ctf_enum_value ("CLONE_PTRACE" , LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF (CLONE_PTRACE ))
109
+ ctf_enum_value ("CLONE_SETTLS" , LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF (CLONE_SETTLS ))
110
+ ctf_enum_value ("CLONE_SIGHAND" , LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF (CLONE_SIGHAND ))
111
+ ctf_enum_value ("CLONE_SYSVSEM" , LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF (CLONE_SYSVSEM ))
112
+ ctf_enum_value ("CLONE_THREAD" , LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF (CLONE_THREAD ))
113
+ ctf_enum_value ("CLONE_UNTRACED" , LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF (CLONE_UNTRACED ))
114
+ ctf_enum_value ("CLONE_VFORK" , LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF (CLONE_VFORK ))
115
+ ctf_enum_value ("CLONE_VM" , LTTNG_CLONE_OPTIONS_FLAGS_TO_CTF (CLONE_VM ))
116
+ )
117
+ )
118
+
119
+ #define LTTNG_CLONE_FLAGS_EXIT_SIGNAL \
120
+ { \
121
+ .name = "exit_signal", \
122
+ .type = { \
123
+ .atype = atype_enum_nestable, \
124
+ .u = { \
125
+ .enum_nestable = { \
126
+ .desc = &__enum_lttng_clone_exit_signal_flags, \
127
+ .container_type = __LTTNG_COMPOUND_LITERAL( \
128
+ struct lttng_type, __type_integer(unsigned long, \
129
+ CLONE_EXIT_SIGNAL_FLAG_RESERVED_BITS, \
130
+ 1, -1, __BYTE_ORDER, 16, none)), \
131
+ }, \
132
+ }, \
133
+ }, \
134
+ }
135
+
136
+ #define LTTNG_CLONE_FLAGS_OPTIONS \
137
+ { \
138
+ .name = "options", \
139
+ .type = { \
140
+ .atype = atype_enum_nestable, \
141
+ .u = { \
142
+ .enum_nestable = { \
143
+ .desc = &__enum_lttng_clone_option_flags, \
144
+ .container_type = __LTTNG_COMPOUND_LITERAL( \
145
+ struct lttng_type, __type_integer(unsigned long,\
146
+ sizeof(unsigned long) * CHAR_BIT - CLONE_EXIT_SIGNAL_FLAG_RESERVED_BITS, \
147
+ 1, -1, __BYTE_ORDER, 16, none)), \
148
+ }, \
149
+ }, \
150
+ }, \
151
+ }
152
+
153
+ #if (__BYTE_ORDER == __LITTLE_ENDIAN )
154
+ #define LTTNG_CLONE_FLAGS \
155
+ [0] = LTTNG_CLONE_FLAGS_EXIT_SIGNAL, \
156
+ [1] = LTTNG_CLONE_FLAGS_OPTIONS,
157
+
158
+ #else
159
+ #define LTTNG_CLONE_FLAGS \
160
+ [0] = LTTNG_CLONE_FLAGS_OPTIONS, \
161
+ [1] = LTTNG_CLONE_FLAGS_EXIT_SIGNAL,
162
+ #endif
163
+
164
+
17
165
#define OVERRIDE_32_clone
18
166
#define OVERRIDE_64_clone
19
167
SC_LTTNG_TRACEPOINT_EVENT (clone ,
@@ -23,7 +171,25 @@ SC_LTTNG_TRACEPOINT_EVENT(clone,
23
171
TP_ARGS (sc_exit (ret ,) clone_flags , newsp , parent_tid , child_tid ),
24
172
TP_FIELDS (
25
173
sc_exit (ctf_integer (long , ret , ret ))
26
- sc_in (ctf_integer_hex (unsigned long , clone_flags , clone_flags ))
174
+ sc_in (
175
+ ctf_custom_field (
176
+ ctf_custom_type (
177
+ {
178
+ .atype = atype_struct_nestable ,
179
+ .u .struct_nestable .nr_fields = 2 ,
180
+ .u .struct_nestable .fields =
181
+ __LTTNG_COMPOUND_LITERAL (struct lttng_event_field ,
182
+ LTTNG_CLONE_FLAGS
183
+ ),
184
+ .u .struct_nestable .alignment = lttng_alignof (uint32_t ) * CHAR_BIT ,
185
+ }
186
+ ),
187
+ flags ,
188
+ ctf_custom_code (
189
+ ctf_integer_type (uint32_t , clone_flags )
190
+ )
191
+ )
192
+ )
27
193
sc_in (ctf_integer_hex (unsigned long, newsp , newsp ))
28
194
sc_in (ctf_integer_hex (void * , parent_tid , parent_tid ))
29
195
sc_in (ctf_integer_hex (void * , child_tid , child_tid ))
0 commit comments