Support generation of syscall probes for those with pointers
[lttng-modules.git] / instrumentation / syscalls / lttng-syscalls-generate-headers.sh
index f241d343c543549861b3a5a3241fc28b4dfe05d7..231bd5c4929c1c7ae2bf7745393876b9046e86c8 100644 (file)
@@ -2,10 +2,13 @@
 
 # Generate system call probe description macros from syscall metadata dump file.
 # example usage:
-# lttng-syscalls-generate-headers.sh 3.0.4 x86-64-syscalls-3.0.4
+#
+# lttng-syscalls-generate-headers.sh integers 3.0.4 x86-64-syscalls-3.0.4
+# lttng-syscalls-generate-headers.sh pointers 3.0.4 x86-64-syscalls-3.0.4
 
-INPUTDIR=$1
-INPUTFILE=$2
+CLASS=$1
+INPUTDIR=$2
+INPUTFILE=$3
 INPUT=${INPUTDIR}/${INPUTFILE}
 SRCFILE=gen.tmp.0
 TMPFILE=gen.tmp.1
@@ -21,30 +24,27 @@ mv ${TMPFILE} ${SRCFILE}
 
 #Filter
 
-#select only syscalls we currently support
-#move non-pointers with arguments to a integer-only file.
-CLASS=integers
-grep -v "\\*\|cap_user_header_t" ${SRCFILE} > ${TMPFILE}
-mv ${TMPFILE} ${SRCFILE}
+if [ "$CLASS" = integers ]; then
+       #select integers and no-args.
+       grep -v "\\*\|cap_user_header_t" ${SRCFILE} > ${TMPFILE}
+       mv ${TMPFILE} ${SRCFILE}
+fi
 
-#TODO
-# move all system calls using pointers to a separate file.
-#CLASS=pointers
-#grep "\\*\|cap_#user_header_t" ${SRCFILE} > ${TMPFILE}
-#mv ${TMPFILE} ${SRCFILE}
 
-#TODO
-#move those without arguments to a separate file.
-#CLASS=noargs
-#grep "^syscall [^ ]* nr [^ ]* nbargs 0 " ${SRCFILE} > ${TMPFILE}
-#mv ${TMPFILE} ${SRCFILE}
+if [ "$CLASS" = pointers ]; then
+       #select system calls using pointers.
+       grep "\\*\|cap_#user_header_t" ${SRCFILE} > ${TMPFILE}
+       mv ${TMPFILE} ${SRCFILE}
+fi
 
 HEADER=headers/${INPUTFILE}-${CLASS}.h
 
 echo "/* THIS FILE IS AUTO-GENERATED. DO NOT EDIT */" > ${HEADER}
 
 echo \
-"#undef TRACE_SYSTEM
+"#ifndef CREATE_SYSCALL_TABLE
+
+#undef TRACE_SYSTEM
 #define TRACE_SYSTEM syscalls
 
 #if !defined(_TRACE_SYSCALLS_H) || defined(TRACE_HEADER_MULTI_READ)
@@ -54,7 +54,27 @@ echo \
 #include <linux/syscalls.h>
 " >> ${HEADER}
 
-#TODO 0
+if [ "$CLASS" = integers ]; then
+
+NRARGS=0
+
+echo \
+'DECLARE_EVENT_CLASS_NOARGS(syscalls_noargs,\n'\
+'      TP_STRUCT__entry(),\n'\
+'      TP_fast_assign(),\n'\
+'      TP_printk()\n'\
+')'\
+       >> ${HEADER}
+
+grep "^syscall [^ ]* nr [^ ]* nbargs ${NRARGS} " ${SRCFILE} > ${TMPFILE}
+sed 's/^syscall \([^ ]*\) nr \([^ ]*\) nbargs \([^ ]*\) '\
+'types: (\([^)]*\)) '\
+'args: (\([^)]*\))/'\
+'DEFINE_EVENT_NOARGS(syscalls_noargs, sys_\1)'\
+'/g'\
+       ${TMPFILE} >> ${HEADER}
+
+fi
 
 # types: 4
 # args   5
@@ -160,12 +180,43 @@ sed 's/^syscall \([^ ]*\) nr \([^ ]*\) nbargs \([^ ]*\) '\
 ')/g'\
        ${TMPFILE} >> ${HEADER}
 
-echo -n \
+# Macro for tracing syscall table
+
+rm -f ${TMPFILE}
+for NRARGS in $(seq 0 6); do
+       grep "^syscall [^ ]* nr [^ ]* nbargs ${NRARGS} " ${SRCFILE} >> ${TMPFILE}
+done
+
+echo \
 "
 #endif /*  _TRACE_SYSCALLS_H */
 
 /* This part must be outside protection */
 #include \"../../../probes/define_trace.h\"
+
+#else /* CREATE_SYSCALL_TABLE */
+" >> ${HEADER}
+
+
+NRARGS=0
+
+if [ "$CLASS" = integers ]; then
+#noargs
+grep "^syscall [^ ]* nr [^ ]* nbargs ${NRARGS} " ${SRCFILE} > ${TMPFILE}
+sed 's/^syscall \([^ ]*\) nr \([^ ]*\) nbargs \([^ ]*\) .*$/'\
+'TRACE_SYSCALL_TABLE(syscalls_noargs, sys_\1, \2, \3)/g'\
+       ${TMPFILE} >> ${HEADER}
+fi
+
+#others.
+grep -v "^syscall [^ ]* nr [^ ]* nbargs ${NRARGS} " ${SRCFILE} > ${TMPFILE}
+sed 's/^syscall \([^ ]*\) nr \([^ ]*\) nbargs \([^ ]*\) .*$/'\
+'TRACE_SYSCALL_TABLE(sys_\1, sys_\1, \2, \3)/g'\
+       ${TMPFILE} >> ${HEADER}
+
+echo -n \
+"
+#endif /* CREATE_SYSCALL_TABLE */
 " >> ${HEADER}
 
 rm -f ${INPUTFILE}.tmp
This page took 0.024614 seconds and 4 git commands to generate.