3 # Generate system call probe description macros from syscall metadata dump file.
4 # The resulting header will be written in the headers subdirectory, in a file name
5 # based on the name of the input file.
9 # lttng-syscalls-generate-headers.sh <type> <input_dir> <input_filename_in_dir> <bitness>
10 # lttng-syscalls-generate-headers.sh integers 3.0.4 x86-64-syscalls-3.0.4 64
11 # lttng-syscalls-generate-headers.sh pointers 3.0.4 x86-64-syscalls-3.0.4 64
17 INPUT
=${INPUTDIR}/${INPUTFILE}
22 HEADER
=headers
/${INPUTFILE}_
${CLASS}.h
24 if [ x
"$INPUTDIR" = x
"" ]; then
25 echo "Error: Please specify input directory as second argument"
29 if [ x
"$INPUTFILE" = x
"" ]; then
30 echo "Error: Please specify input file as third argument"
34 if [ x
"$BITNESS" != x
"32" ] && [ x
"$BITNESS" != x
"64" ]; then
35 echo "Error: Please specify bitness as fourth argument (\"32\" or \"64\")"
39 cp ${INPUT} ${SRCFILE}
42 perl
-p -e 's/^\[.*\] //g' ${SRCFILE} > ${TMPFILE}
43 mv ${TMPFILE} ${SRCFILE}
45 perl
-p -e 's/^syscall sys_([^ ]*)/syscall $1/g' ${SRCFILE} > ${TMPFILE}
46 mv ${TMPFILE} ${SRCFILE}
50 if [ "$CLASS" = integers
]; then
51 #select integers and no-args.
53 grep -v "\\*\|cap_user_header_t" ${SRCFILE} > ${TMPFILE}
54 mv ${TMPFILE} ${SRCFILE}
58 if [ "$CLASS" = pointers
]; then
59 #select system calls using pointers.
61 grep "\\*\|cap_#user_header_t" ${SRCFILE} > ${TMPFILE}
62 mv ${TMPFILE} ${SRCFILE}
65 if [ x
"$CLASSCAP" = x
"" ]; then
66 echo "Error: Please specify \"integers\" or \"pointers\" as first argument"
71 echo "/* THIS FILE IS AUTO-GENERATED. DO NOT EDIT */" > ${HEADER}
74 "#ifndef CREATE_SYSCALL_TABLE
76 #if !defined(_TRACE_SYSCALLS_${CLASSCAP}_H) || defined(TRACE_HEADER_MULTI_READ)
77 #define _TRACE_SYSCALLS_${CLASSCAP}_H
79 #include \"../../../probes/lttng-tracepoint-event.h\"
80 #include <linux/syscalls.h>
81 #include \"${INPUTFILE}_${CLASS}_override.h\"
82 #include \"syscalls_${CLASS}_override.h\"
85 if [ "$CLASS" = integers
]; then
94 'SC_LTTNG_TRACEPOINT_EVENT_CLASS_NOARGS(syscalls_noargs,\n'\
95 ' TP_STRUCT__entry(),\n'\
96 ' TP_fast_assign(),\n'\
101 grep "^syscall [^ ]* nr [^ ]* nbargs ${NRARGS} " ${SRCFILE} > ${TMPFILE}
102 perl -p -e 's/^syscall ([^ ]*) nr ([^ ]*) nbargs ([^ ]*) '\
103 'types: \(([^)]*)\) '\
104 'args: \(([^)]*)\)/'\
105 '#ifndef OVERRIDE_'"${BITNESS}"'_$1\n'\
106 'SC_LTTNG_TRACEPOINT_EVENT_INSTANCE_NOARGS(syscalls_noargs, $1)\n'\
108 ${TMPFILE} >> ${HEADER}
111 '#else /* #ifdef SC_ENTER */\n'\
114 grep "^syscall
[^
]* nr
[^
]* nbargs
${NRARGS} " ${SRCFILE} > ${TMPFILE}
115 perl
-p -e 's/^syscall ([^ ]*) nr ([^ ]*) nbargs ([^ ]*) '\
116 'types: \(([^)]*)\) '\
117 'args: \(([^)]*)\)/'\
118 '#ifndef OVERRIDE_'"${BITNESS}"'_$1\n'\
119 'SC_LTTNG_TRACEPOINT_EVENT($1,\n'\
120 ' TP_PROTO(sc_exit(long ret)),\n'\
121 ' TP_ARGS(sc_exit(ret)),\n'\
122 ' TP_STRUCT__entry(sc_exit(__field(long, ret))),\n'\
123 ' TP_fast_assign(sc_exit(tp_assign(long, ret, ret))),\n'\
127 ${TMPFILE} >> ${HEADER}
130 '#endif /* else #ifdef SC_ENTER */\n'\
140 grep "^syscall [^ ]* nr [^ ]* nbargs ${NRARGS} " ${SRCFILE} > ${TMPFILE}
143 echo "${LINE}" > ${TMPFILE2}
144 perl -p -e 's/^syscall ([^ ]*) .*/$1/g' ${TMPFILE2} > ${TMPFILE3}
145 SC_NAME=$(cat ${TMPFILE3})
146 ARG1=$(./lttng-get-syscall-inout.sh table-syscall-inout.txt ${SC_NAME} 1)
147 echo Syscall: ${SC_NAME} ${ARG1}
148 perl -p -e 's/^syscall ([^ ]*) nr ([^ ]*) nbargs ([^ ]*) '\
149 'types: \(([^)]*)\) '\
150 'args: \(([^)]*)\)/'\
151 '#ifndef OVERRIDE_'"${BITNESS}"'_$1\n'\
152 'SC_LTTNG_TRACEPOINT_EVENT($1,\n'\
153 ' TP_PROTO(sc_exit(long ret,) $4 $5),\n'\
154 ' TP_ARGS(sc_exit(ret,) $5),\n'\
155 ' TP_STRUCT__entry(sc_exit(__field(long, ret)) '"${ARG1}"'(__field($4, $5))),\n'\
156 ' TP_fast_assign(sc_exit(tp_assign(long, ret, ret)) '"${ARG1}"'(tp_assign($4, $5, $5))),\n'\
160 ${TMPFILE2} >> ${HEADER}
167 grep "^syscall
[^
]* nr
[^
]* nbargs
${NRARGS} " ${SRCFILE} > ${TMPFILE}
170 echo "${LINE}" > ${TMPFILE2}
171 perl
-p -e 's/^syscall ([^ ]*) .*/$1/g' ${TMPFILE2} > ${TMPFILE3}
172 SC_NAME
=$
(cat ${TMPFILE3})
173 ARG1
=$
(.
/lttng-get-syscall-inout.sh table-syscall-inout.txt
${SC_NAME} 1)
174 ARG2
=$
(.
/lttng-get-syscall-inout.sh table-syscall-inout.txt
${SC_NAME} 2)
175 echo Syscall
: ${SC_NAME} ${ARG1} ${ARG2}
176 perl
-p -e 's/^syscall ([^ ]*) nr ([^ ]*) nbargs ([^ ]*) '\
177 'types: \(([^,]*), ([^)]*)\) '\
178 'args: \(([^,]*), ([^)]*)\)/'\
179 '#ifndef OVERRIDE_'"${BITNESS}"'_$1\n'\
180 'SC_LTTNG_TRACEPOINT_EVENT($1,\n'\
181 ' TP_PROTO(sc_exit(long ret,) $4 $6, $5 $7),\n'\
182 ' TP_ARGS(sc_exit(ret,) $6, $7),\n'\
183 ' TP_STRUCT__entry(sc_exit(__field(long, ret)) '"${ARG1}"'(__field($4, $6)) '"${ARG2}"'(__field($5, $7))),\n'\
184 ' TP_fast_assign(sc_exit(tp_assign(long, ret, ret)) '"${ARG1}"'(tp_assign($4, $6, $6)) '"${ARG2}"'(tp_assign($5, $7, $7))),\n'\
188 ${TMPFILE2} >> ${HEADER}
195 grep "^syscall [^ ]* nr [^ ]* nbargs ${NRARGS} " ${SRCFILE} > ${TMPFILE}
198 echo "${LINE}" > ${TMPFILE2}
199 perl -p -e 's/^syscall ([^ ]*) .*/$1/g' ${TMPFILE2} > ${TMPFILE3}
200 SC_NAME=$(cat ${TMPFILE3})
201 ARG1=$(./lttng-get-syscall-inout.sh table-syscall-inout.txt ${SC_NAME} 1)
202 ARG2=$(./lttng-get-syscall-inout.sh table-syscall-inout.txt ${SC_NAME} 2)
203 ARG3=$(./lttng-get-syscall-inout.sh table-syscall-inout.txt ${SC_NAME} 3)
204 echo Syscall: ${SC_NAME} ${ARG1} ${ARG2} ${ARG3}
205 perl -p -e 's/^syscall ([^ ]*) nr ([^ ]*) nbargs ([^ ]*) '\
206 'types: \(([^,]*), ([^,]*), ([^)]*)\) '\
207 'args: \(([^,]*), ([^,]*), ([^)]*)\)/'\
208 '#ifndef OVERRIDE_'"${BITNESS}"'_$1\n'\
209 'SC_LTTNG_TRACEPOINT_EVENT($1,\n'\
210 ' TP_PROTO(sc_exit(long ret,) $4 $7, $5 $8, $6 $9),\n'\
211 ' TP_ARGS(sc_exit(ret,) $7, $8, $9),\n'\
212 ' TP_STRUCT__entry(sc_exit(__field(long, ret)) '"${ARG1}"'(__field($4, $7)) '"${ARG2}"'(__field($5, $8)) '"${ARG3}"'(__field($6, $9))),\n'\
213 ' TP_fast_assign(sc_exit(tp_assign(long, ret, ret)) '"${ARG1}"'(tp_assign($4, $7, $7)) '"${ARG2}"'(tp_assign($5, $8, $8)) '"${ARG3}"'(tp_assign($6, $9, $9))),\n'\
217 ${TMPFILE2} >> ${HEADER}
225 grep "^syscall
[^
]* nr
[^
]* nbargs
${NRARGS} " ${SRCFILE} > ${TMPFILE}
228 echo "${LINE}" > ${TMPFILE2}
229 perl
-p -e 's/^syscall ([^ ]*) .*/$1/g' ${TMPFILE2} > ${TMPFILE3}
230 SC_NAME
=$
(cat ${TMPFILE3})
231 ARG1
=$
(.
/lttng-get-syscall-inout.sh table-syscall-inout.txt
${SC_NAME} 1)
232 ARG2
=$
(.
/lttng-get-syscall-inout.sh table-syscall-inout.txt
${SC_NAME} 2)
233 ARG3
=$
(.
/lttng-get-syscall-inout.sh table-syscall-inout.txt
${SC_NAME} 3)
234 ARG4
=$
(.
/lttng-get-syscall-inout.sh table-syscall-inout.txt
${SC_NAME} 4)
235 echo Syscall
: ${SC_NAME} ${ARG1} ${ARG2} ${ARG3} ${ARG4}
236 perl
-p -e 's/^syscall ([^ ]*) nr ([^ ]*) nbargs ([^ ]*) '\
237 'types: \(([^,]*), ([^,]*), ([^,]*), ([^)]*)\) '\
238 'args: \(([^,]*), ([^,]*), ([^,]*), ([^)]*)\)/'\
239 '#ifndef OVERRIDE_'"${BITNESS}"'_$1\n'\
240 'SC_LTTNG_TRACEPOINT_EVENT($1,\n'\
241 ' TP_PROTO(sc_exit(long ret,) $4 $8, $5 $9, $6 $10, $7 $11),\n'\
242 ' TP_ARGS(sc_exit(ret,) $8, $9, $10, $11),\n'\
243 ' TP_STRUCT__entry(sc_exit(__field(long, ret)) '"${ARG1}"'(__field($4, $8)) '"${ARG2}"'(__field($5, $9)) '"${ARG3}"'(__field($6, $10)) '"${ARG4}"'(__field($7, $11))),\n'\
244 ' TP_fast_assign(sc_exit(tp_assign(long, ret, ret)) '"${ARG1}"'(tp_assign($4, $8, $8)) '"${ARG2}"'(tp_assign($5, $9, $9)) '"${ARG3}"'(tp_assign($6, $10, $10)) '"${ARG4}"'(tp_assign($7, $11, $11))),\n'\
248 ${TMPFILE2} >> ${HEADER}
255 grep "^syscall [^ ]* nr [^ ]* nbargs ${NRARGS} " ${SRCFILE} > ${TMPFILE}
258 echo "${LINE}" > ${TMPFILE2}
259 perl -p -e 's/^syscall ([^ ]*) .*/$1/g' ${TMPFILE2} > ${TMPFILE3}
260 SC_NAME=$(cat ${TMPFILE3})
261 ARG1=$(./lttng-get-syscall-inout.sh table-syscall-inout.txt ${SC_NAME} 1)
262 ARG2=$(./lttng-get-syscall-inout.sh table-syscall-inout.txt ${SC_NAME} 2)
263 ARG3=$(./lttng-get-syscall-inout.sh table-syscall-inout.txt ${SC_NAME} 3)
264 ARG4=$(./lttng-get-syscall-inout.sh table-syscall-inout.txt ${SC_NAME} 4)
265 ARG5=$(./lttng-get-syscall-inout.sh table-syscall-inout.txt ${SC_NAME} 5)
266 echo Syscall: ${SC_NAME} ${ARG1} ${ARG2} ${ARG3} ${ARG4} ${ARG5}
267 perl -p -e 's/^syscall ([^ ]*) nr ([^ ]*) nbargs ([^ ]*) '\
268 'types: \(([^,]*), ([^,]*), ([^,]*), ([^,]*), ([^)]*)\) '\
269 'args: \(([^,]*), ([^,]*), ([^,]*), ([^,]*), ([^)]*)\)/'\
270 '#ifndef OVERRIDE_'"${BITNESS}"'_$1\n'\
271 'SC_LTTNG_TRACEPOINT_EVENT($1,\n'\
272 ' TP_PROTO(sc_exit(long ret,) $4 $9, $5 $10, $6 $11, $7 $12, $8 $13),\n'\
273 ' TP_ARGS(sc_exit(ret,) $9, $10, $11, $12, $13),\n'\
274 ' TP_STRUCT__entry(sc_exit(__field(long, ret)) '"${ARG1}"'(__field($4, $9)) '"${ARG2}"'(__field($5, $10)) '"${ARG3}"'(__field($6, $11)) '"${ARG4}"'(__field($7, $12)) '"${ARG5}"'(__field($8, $13))),\n'\
275 ' TP_fast_assign(sc_exit(tp_assign(long, ret, ret)) '"${ARG1}"'(tp_assign($4, $9, $9)) '"${ARG2}"'(tp_assign($5, $10, $10)) '"${ARG3}"'(tp_assign($6, $11, $11)) '"${ARG4}"'(tp_assign($7, $12, $12)) '"${ARG5}"'(tp_assign($8, $13, $13))),\n'\
279 ${TMPFILE2} >> ${HEADER}
284 # args 10 11 12 13 14 15
287 grep "^syscall
[^
]* nr
[^
]* nbargs
${NRARGS} " ${SRCFILE} > ${TMPFILE}
290 echo "${LINE}" > ${TMPFILE2}
291 perl
-p -e 's/^syscall ([^ ]*) .*/$1/g' ${TMPFILE2} > ${TMPFILE3}
292 SC_NAME
=$
(cat ${TMPFILE3})
293 ARG1
=$
(.
/lttng-get-syscall-inout.sh table-syscall-inout.txt
${SC_NAME} 1)
294 ARG2
=$
(.
/lttng-get-syscall-inout.sh table-syscall-inout.txt
${SC_NAME} 2)
295 ARG3
=$
(.
/lttng-get-syscall-inout.sh table-syscall-inout.txt
${SC_NAME} 3)
296 ARG4
=$
(.
/lttng-get-syscall-inout.sh table-syscall-inout.txt
${SC_NAME} 4)
297 ARG5
=$
(.
/lttng-get-syscall-inout.sh table-syscall-inout.txt
${SC_NAME} 5)
298 ARG6
=$
(.
/lttng-get-syscall-inout.sh table-syscall-inout.txt
${SC_NAME} 6)
299 echo Syscall
: ${SC_NAME} ${ARG1} ${ARG2} ${ARG3} ${ARG4} ${ARG5} ${ARG6}
300 perl
-p -e 's/^syscall ([^ ]*) nr ([^ ]*) nbargs ([^ ]*) '\
301 'types: \(([^,]*), ([^,]*), ([^,]*), ([^,]*), ([^,]*), ([^\)]*)\) '\
302 'args: \(([^,]*), ([^,]*), ([^,]*), ([^,]*), ([^,]*), ([^\)]*)\)/'\
303 '#ifndef OVERRIDE_'"${BITNESS}"'_$1\n'\
304 'SC_LTTNG_TRACEPOINT_EVENT($1,\n'\
305 ' TP_PROTO(sc_exit(long ret,) $4 $10, $5 $11, $6 $12, $7 $13, $8 $14, $9 $15),\n'\
306 ' TP_ARGS(sc_exit(ret,) $10, $11, $12, $13, $14, $15),\n'\
307 ' TP_STRUCT__entry(sc_exit(__field(long, ret)) '"${ARG1}"'(__field($4, $10)) '"${ARG2}"'(__field($5, $11)) '"${ARG3}"'(__field($6, $12)) '"${ARG4}"'(__field($7, $13)) '"${ARG5}"'(__field($8, $14)) '"${ARG6}"'(__field($9, $15))),\n'\
308 ' TP_fast_assign(sc_exit(tp_assign(long, ret, ret)) '"${ARG1}"'(tp_assign($4, $10, $10)) '"${ARG2}"'(tp_assign($5, $11, $11)) '"${ARG3}"'(tp_assign($6, $12, $12)) '"${ARG4}"'(tp_assign($7, $13, $13)) '"${ARG5}"'(tp_assign($8, $14, $14)) '"${ARG6}"'(tp_assign($9, $15, $15))),\n'\
312 ${TMPFILE2} >> ${HEADER}
315 # Macro for tracing syscall table
319 #endif /* _TRACE_SYSCALLS_${CLASSCAP}_H */
321 /* This part must be outside protection */
322 #include \"../../../probes/define_trace.h\"
324 #else /* CREATE_SYSCALL_TABLE */
326 #include \"${INPUTFILE}_${CLASS}_override.h\"
327 #include \"syscalls_${CLASS}_override.h\"
332 if [ "$CLASS" = integers
]; then
339 grep "^syscall [^ ]* nr [^ ]* nbargs ${NRARGS} " ${SRCFILE} > ${TMPFILE}
340 perl -p -e 's/^syscall ([^ ]*) nr ([^ ]*) nbargs ([^ ]*) .*$/'\
341 '#ifndef OVERRIDE_TABLE_'"${BITNESS}"'_$1\n'\
342 'TRACE_SYSCALL_TABLE\(syscalls_noargs, $1, $2, $3\)\n'\
344 ${TMPFILE} >> ${HEADER}
347 '#else /* #ifdef SC_ENTER */\n'\
350 grep "^syscall
[^
]* nr
[^
]* nbargs
${NRARGS} " ${SRCFILE} > ${TMPFILE}
351 perl
-p -e 's/^syscall ([^ ]*) nr ([^ ]*) nbargs ([^ ]*) .*$/'\
352 '#ifndef OVERRIDE_TABLE_'"${BITNESS}"'_$1\n'\
353 'TRACE_SYSCALL_TABLE($1, $1, $2, $3)\n'\
355 ${TMPFILE} >> ${HEADER}
358 '#endif /* else #ifdef SC_ENTER */\n'\
364 grep -v "^syscall [^ ]* nr [^ ]* nbargs ${NRARGS} " ${SRCFILE} > ${TMPFILE}
365 perl -p -e 's/^syscall ([^ ]*) nr ([^ ]*) nbargs ([^ ]*) .*$/'\
366 '#ifndef OVERRIDE_TABLE_'"${BITNESS}"'_$1\n'\
367 'TRACE_SYSCALL_TABLE($1, $1, $2, $3)\n'\
369 ${TMPFILE} >> ${HEADER}
373 #endif /* CREATE_SYSCALL_TABLE */
376 #fields names: ...char * type with *name* or *file* or *path* or *root*
377 # or *put_old* or *type*
378 cp -f ${HEADER} ${TMPFILE}
380 perl -p -e 's/__field\(([^,)]*char \*), ([^\)]*)(name|file|path|root|put_old|type)([^\)]*)\)/__string_from_user($2$3$4, $2$3$4)/g'\
381 ${TMPFILE} >> ${HEADER}
382 cp -f ${HEADER} ${TMPFILE}
384 perl -p -e 's/tp_assign\(([^,)]*char \*), ([^,]*)(name|file|path|root|put_old|type)([^,]*), ([^\)]*)\)/tp_copy_string_from_user($2$3$4, $5)/g'\
385 ${TMPFILE} >> ${HEADER}
387 #prettify addresses heuristics.
388 #field names with addr or ptr
389 cp -f ${HEADER} ${TMPFILE}
391 perl -p -e 's/__field\(([^,)]*), ([^,)]*addr|[^,)]*ptr)([^),]*)\)/__field_hex($1, $2$3)/g'\
392 ${TMPFILE} >> ${HEADER}
394 #field types ending with '*'
395 cp -f ${HEADER} ${TMPFILE}
397 perl -p -e 's/__field\(([^,)]*\*), ([^),]*)\)/__field_hex($1, $2)/g'\
398 ${TMPFILE} >> ${HEADER}
400 #strip the extra type information from tp_assign.
401 cp -f ${HEADER} ${TMPFILE}
403 perl -p -e 's/tp_assign\(([^,)]*), ([^,]*), ([^\)]*)\)/tp_assign($2, $3)/g'\
404 ${TMPFILE} >> ${HEADER}
406 rm -f ${INPUTFILE}.tmp