Commit | Line | Data |
---|---|---|
5fee13fd MD |
1 | #!/bin/sh |
2 | ||
3 | # Generate system call probe description macros from syscall metadata dump file. | |
4 | # example usage: | |
5 | # lttng-syscalls-generate-headers.sh 3.0.4 x86-64-syscalls-3.0.4 | |
6 | ||
7 | INPUTDIR=$1 | |
8 | INPUTFILE=$2 | |
9 | INPUT=${INPUTDIR}/${INPUTFILE} | |
10 | SRCFILE=gen.tmp.0 | |
11 | TMPFILE=gen.tmp.1 | |
12 | ||
13 | cp ${INPUT} ${SRCFILE} | |
14 | ||
15 | #Cleanup | |
16 | sed 's/^\[.*\] //g' ${SRCFILE} > ${TMPFILE} | |
17 | mv ${TMPFILE} ${SRCFILE} | |
18 | ||
19 | sed 's/^syscall sys_\([^ ]*\)/syscall \1/g' ${SRCFILE} > ${TMPFILE} | |
20 | mv ${TMPFILE} ${SRCFILE} | |
21 | ||
22 | #Filter | |
23 | ||
24 | #select only syscalls we currently support | |
25 | #move non-pointers with arguments to a integer-only file. | |
26 | CLASS=integers | |
27 | grep -v "\\*\|cap_user_header_t" ${SRCFILE} > ${TMPFILE} | |
28 | mv ${TMPFILE} ${SRCFILE} | |
29 | ||
30 | #TODO | |
31 | # move all system calls using pointers to a separate file. | |
32 | #CLASS=pointers | |
33 | #grep "\\*\|cap_#user_header_t" ${SRCFILE} > ${TMPFILE} | |
34 | #mv ${TMPFILE} ${SRCFILE} | |
35 | ||
36 | #TODO | |
37 | #move those without arguments to a separate file. | |
38 | #CLASS=noargs | |
39 | #grep "^syscall [^ ]* nr [^ ]* nbargs 0 " ${SRCFILE} > ${TMPFILE} | |
40 | #mv ${TMPFILE} ${SRCFILE} | |
41 | ||
42 | HEADER=headers/${INPUTFILE}-${CLASS}.h | |
43 | ||
44 | echo "/* THIS FILE IS AUTO-GENERATED. DO NOT EDIT */" > ${HEADER} | |
45 | ||
46 | echo \ | |
054f2ed3 MD |
47 | "#ifndef CREATE_SYSCALL_TABLE |
48 | ||
49 | #undef TRACE_SYSTEM | |
e41e2e82 | 50 | #define TRACE_SYSTEM syscalls |
5fee13fd | 51 | |
e41e2e82 MD |
52 | #if !defined(_TRACE_SYSCALLS_H) || defined(TRACE_HEADER_MULTI_READ) |
53 | #define _TRACE_SYSCALLS_H | |
5fee13fd MD |
54 | |
55 | #include <linux/tracepoint.h> | |
56 | #include <linux/syscalls.h> | |
57 | " >> ${HEADER} | |
58 | ||
59 | #TODO 0 | |
60 | ||
61 | # types: 4 | |
62 | # args 5 | |
63 | ||
64 | NRARGS=1 | |
65 | grep "^syscall [^ ]* nr [^ ]* nbargs ${NRARGS} " ${SRCFILE} > ${TMPFILE} | |
66 | sed 's/^syscall \([^ ]*\) nr \([^ ]*\) nbargs \([^ ]*\) '\ | |
67 | 'types: (\([^)]*\)) '\ | |
68 | 'args: (\([^)]*\))/'\ | |
69 | 'TRACE_EVENT(sys_\1,\n'\ | |
70 | ' TP_PROTO(\4 \5),\n'\ | |
71 | ' TP_ARGS(\5),\n'\ | |
72 | ' TP_STRUCT__entry(__field(\4, \5)),\n'\ | |
73 | ' TP_fast_assign(tp_assign(\5, \5)),\n'\ | |
74 | ' TP_printk()\n'\ | |
75 | ')/g'\ | |
76 | ${TMPFILE} >> ${HEADER} | |
77 | ||
78 | # types: 4 5 | |
79 | # args 6 7 | |
80 | ||
81 | NRARGS=2 | |
82 | grep "^syscall [^ ]* nr [^ ]* nbargs ${NRARGS} " ${SRCFILE} > ${TMPFILE} | |
83 | sed 's/^syscall \([^ ]*\) nr \([^ ]*\) nbargs \([^ ]*\) '\ | |
84 | 'types: (\([^,]*\), \([^)]*\)) '\ | |
85 | 'args: (\([^,]*\), \([^)]*\))/'\ | |
86 | 'TRACE_EVENT(sys_\1,\n'\ | |
87 | ' TP_PROTO(\4 \6, \5 \7),\n'\ | |
88 | ' TP_ARGS(\6, \7),\n'\ | |
89 | ' TP_STRUCT__entry(__field(\4, \6) __field(\5, \7)),\n'\ | |
90 | ' TP_fast_assign(tp_assign(\6, \6) tp_assign(\7, \7)),\n'\ | |
91 | ' TP_printk()\n'\ | |
92 | ')/g'\ | |
93 | ${TMPFILE} >> ${HEADER} | |
94 | ||
95 | # types: 4 5 6 | |
96 | # args 7 8 9 | |
97 | ||
98 | NRARGS=3 | |
99 | grep "^syscall [^ ]* nr [^ ]* nbargs ${NRARGS} " ${SRCFILE} > ${TMPFILE} | |
100 | sed 's/^syscall \([^ ]*\) nr \([^ ]*\) nbargs \([^ ]*\) '\ | |
101 | 'types: (\([^,]*\), \([^,]*\), \([^)]*\)) '\ | |
102 | 'args: (\([^,]*\), \([^,]*\), \([^)]*\))/'\ | |
103 | 'TRACE_EVENT(sys_\1,\n'\ | |
104 | ' TP_PROTO(\4 \7, \5 \8, \6 \9),\n'\ | |
105 | ' TP_ARGS(\7, \8, \9),\n'\ | |
106 | ' TP_STRUCT__entry(__field(\4, \7) __field(\5, \8) __field(\6, \9)),\n'\ | |
107 | ' TP_fast_assign(tp_assign(\7, \7) tp_assign(\8, \8) tp_assign(\9, \9)),\n'\ | |
108 | ' TP_printk()\n'\ | |
109 | ')/g'\ | |
110 | ${TMPFILE} >> ${HEADER} | |
111 | ||
112 | ||
113 | # types: 4 5 6 7 | |
114 | # args 8 9 10 11 | |
115 | ||
116 | NRARGS=4 | |
117 | grep "^syscall [^ ]* nr [^ ]* nbargs ${NRARGS} " ${SRCFILE} > ${TMPFILE} | |
118 | sed 's/^syscall \([^ ]*\) nr \([^ ]*\) nbargs \([^ ]*\) '\ | |
119 | 'types: (\([^,]*\), \([^,]*\), \([^,]*\), \([^)]*\)) '\ | |
120 | 'args: (\([^,]*\), \([^,]*\), \([^,]*\), \([^)]*\))/'\ | |
121 | 'TRACE_EVENT(sys_\1,\n'\ | |
122 | ' TP_PROTO(\4 \8, \5 \9, \6 \10, \7 \11),\n'\ | |
123 | ' TP_ARGS(\8, \9, \10, \11),\n'\ | |
124 | ' TP_STRUCT__entry(__field(\4, \8) __field(\5, \9) __field(\6, \10) __field(\7, \11)),\n'\ | |
125 | ' TP_fast_assign(tp_assign(\8, \8) tp_assign(\9, \9) tp_assign(\10, \10) tp_assign(\11, \11)),\n'\ | |
126 | ' TP_printk()\n'\ | |
127 | ')/g'\ | |
128 | ${TMPFILE} >> ${HEADER} | |
129 | ||
130 | # types: 4 5 6 7 8 | |
131 | # args 9 10 11 12 13 | |
132 | ||
133 | NRARGS=5 | |
134 | grep "^syscall [^ ]* nr [^ ]* nbargs ${NRARGS} " ${SRCFILE} > ${TMPFILE} | |
135 | sed 's/^syscall \([^ ]*\) nr \([^ ]*\) nbargs \([^ ]*\) '\ | |
136 | 'types: (\([^,]*\), \([^,]*\), \([^,]*\), \([^,]*\), \([^)]*\)) '\ | |
137 | 'args: (\([^,]*\), \([^,]*\), \([^,]*\), \([^,]*\), \([^)]*\))/'\ | |
138 | 'TRACE_EVENT(sys_\1,\n'\ | |
139 | ' TP_PROTO(\4 \9, \5 \10, \6 \11, \7 \12, \8 \13),\n'\ | |
140 | ' TP_ARGS(\9, \10, \11, \12, \13),\n'\ | |
141 | ' TP_STRUCT__entry(__field(\4, \9) __field(\5, \10) __field(\6, \11) __field(\7, \12) __field(\8, \13)),\n'\ | |
142 | ' TP_fast_assign(tp_assign(\9, \9) tp_assign(\10, \10) tp_assign(\11, \11) tp_assign(\12, \12) tp_assign(\13, \13)),\n'\ | |
143 | ' TP_printk()\n'\ | |
144 | ')/g'\ | |
145 | ${TMPFILE} >> ${HEADER} | |
146 | ||
147 | ||
148 | # types: 4 5 6 7 8 9 | |
149 | # args 10 11 12 13 14 15 | |
150 | ||
151 | NRARGS=6 | |
152 | grep "^syscall [^ ]* nr [^ ]* nbargs ${NRARGS} " ${SRCFILE} > ${TMPFILE} | |
153 | sed 's/^syscall \([^ ]*\) nr \([^ ]*\) nbargs \([^ ]*\) '\ | |
154 | 'types: (\([^,]*\), \([^,]*\), \([^,]*\), \([^,]*\), \([^,]*\), \([^)]*\)) '\ | |
155 | 'args: (\([^,]*\), \([^,]*\), \([^,]*\), \([^,]*\), \([^,]*\), \([^)]*\))/'\ | |
156 | 'TRACE_EVENT(sys_\1,\n'\ | |
157 | ' TP_PROTO(\4 \10, \5 \11, \6 \12, \7 \13, \8 \14, \9 \15),\n'\ | |
158 | ' TP_ARGS(\10, \11, \12, \13, \14, \15),\n'\ | |
159 | ' TP_STRUCT__entry(__field(\4, \10) __field(\5, \11) __field(\6, \12) __field(\7, \13) __field(\8, \14) __field(\9, \15)),\n'\ | |
160 | ' TP_fast_assign(tp_assign(\10, \10) tp_assign(\11, \11) tp_assign(\12, 12) tp_assign(\13, \13) tp_assign(\14, \14) tp_assign(\15, \15)),\n'\ | |
161 | ' TP_printk()\n'\ | |
162 | ')/g'\ | |
163 | ${TMPFILE} >> ${HEADER} | |
164 | ||
9b6d7a0c MD |
165 | # Macro for tracing syscall table |
166 | ||
e15b0e20 MD |
167 | rm -f ${TMPFILE} |
168 | for NRARGS in $(seq 1 6); do | |
169 | grep "^syscall [^ ]* nr [^ ]* nbargs ${NRARGS} " ${SRCFILE} >> ${TMPFILE} | |
170 | done | |
171 | ||
054f2ed3 | 172 | echo \ |
5fee13fd | 173 | " |
e41e2e82 | 174 | #endif /* _TRACE_SYSCALLS_H */ |
5fee13fd MD |
175 | |
176 | /* This part must be outside protection */ | |
177 | #include \"../../../probes/define_trace.h\" | |
054f2ed3 MD |
178 | |
179 | #else /* CREATE_SYSCALL_TABLE */ | |
180 | " >> ${HEADER} | |
181 | ||
182 | sed 's/^syscall \([^ ]*\) nr \([^ ]*\) nbargs \([^ ]*\) .*$/'\ | |
183 | 'TRACE_SYSCALL_TABLE(sys_\1, \2, \3)/g'\ | |
184 | ${TMPFILE} >> ${HEADER} | |
185 | ||
186 | echo -n \ | |
187 | " | |
188 | #endif /* CREATE_SYSCALL_TABLE */ | |
5fee13fd MD |
189 | " >> ${HEADER} |
190 | ||
191 | rm -f ${INPUTFILE}.tmp | |
192 | rm -f ${TMPFILE} | |
193 | rm -f ${SRCFILE} |