Skip to content

Commit d775625

Browse files
tahinicompudj
authored andcommitted
syscalls: Make clone()'s flags field a 2 enum struct.
The clone system call has a flags field, whose values are defined in uapi/linux/sched.h file. This field is now a struct made of 2 enumerations to make the values more readable/meaningful. The `flags` field has two parts: 1. exit signal: the least significant byte of the `unsigned long` is the signal the kernel need to send to the parent process on child exit, 2. clone options: the remaining bytes of the `unsigned long` is used a bitwise flag for the clone options. Those 2-in-1 fields should be printed using two different CTF fields. Here's an example babeltrace output of the clone system call: syscall_entry_clone: { cpu_id = 2 }, { flags = { exit_signal = ( "SIGCHLD" : container = 0x11 ), options = ( "CLONE_CHILD_CLEARTID" | "CLONE_CHILD_SETTID" : container = 0x12000 ) } Change-Id: Ic375b59fb3b6564f036e1af24d66c0c7069b47d6 Signed-off-by: Geneviève Bastien <gbastien@versatic.net> Signed-off-by: Francis Deslauriers <francis.deslauriers@efficios.com> Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
1 parent 092ffe9 commit d775625

File tree

1 file changed

+167
-1
lines changed

1 file changed

+167
-1
lines changed

include/instrumentation/syscalls/headers/syscalls_pointers_override.h

Lines changed: 167 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,154 @@ SC_LTTNG_TRACEPOINT_EVENT(execve,
1414
)
1515
)
1616

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+
17165
#define OVERRIDE_32_clone
18166
#define OVERRIDE_64_clone
19167
SC_LTTNG_TRACEPOINT_EVENT(clone,
@@ -23,7 +171,25 @@ SC_LTTNG_TRACEPOINT_EVENT(clone,
23171
TP_ARGS(sc_exit(ret,) clone_flags, newsp, parent_tid, child_tid),
24172
TP_FIELDS(
25173
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+
)
27193
sc_in(ctf_integer_hex(unsigned long, newsp, newsp))
28194
sc_in(ctf_integer_hex(void *, parent_tid, parent_tid))
29195
sc_in(ctf_integer_hex(void *, child_tid, child_tid))

0 commit comments

Comments
 (0)