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 \ | |
47 | "#undef TRACE_SYSTEM | |
e41e2e82 | 48 | #define TRACE_SYSTEM syscalls |
5fee13fd | 49 | |
e41e2e82 MD |
50 | #if !defined(_TRACE_SYSCALLS_H) || defined(TRACE_HEADER_MULTI_READ) |
51 | #define _TRACE_SYSCALLS_H | |
5fee13fd MD |
52 | |
53 | #include <linux/tracepoint.h> | |
54 | #include <linux/syscalls.h> | |
55 | " >> ${HEADER} | |
56 | ||
57 | #TODO 0 | |
58 | ||
59 | # types: 4 | |
60 | # args 5 | |
61 | ||
62 | NRARGS=1 | |
63 | grep "^syscall [^ ]* nr [^ ]* nbargs ${NRARGS} " ${SRCFILE} > ${TMPFILE} | |
64 | sed 's/^syscall \([^ ]*\) nr \([^ ]*\) nbargs \([^ ]*\) '\ | |
65 | 'types: (\([^)]*\)) '\ | |
66 | 'args: (\([^)]*\))/'\ | |
67 | 'TRACE_EVENT(sys_\1,\n'\ | |
68 | ' TP_PROTO(\4 \5),\n'\ | |
69 | ' TP_ARGS(\5),\n'\ | |
70 | ' TP_STRUCT__entry(__field(\4, \5)),\n'\ | |
71 | ' TP_fast_assign(tp_assign(\5, \5)),\n'\ | |
72 | ' TP_printk()\n'\ | |
73 | ')/g'\ | |
74 | ${TMPFILE} >> ${HEADER} | |
75 | ||
76 | # types: 4 5 | |
77 | # args 6 7 | |
78 | ||
79 | NRARGS=2 | |
80 | grep "^syscall [^ ]* nr [^ ]* nbargs ${NRARGS} " ${SRCFILE} > ${TMPFILE} | |
81 | sed 's/^syscall \([^ ]*\) nr \([^ ]*\) nbargs \([^ ]*\) '\ | |
82 | 'types: (\([^,]*\), \([^)]*\)) '\ | |
83 | 'args: (\([^,]*\), \([^)]*\))/'\ | |
84 | 'TRACE_EVENT(sys_\1,\n'\ | |
85 | ' TP_PROTO(\4 \6, \5 \7),\n'\ | |
86 | ' TP_ARGS(\6, \7),\n'\ | |
87 | ' TP_STRUCT__entry(__field(\4, \6) __field(\5, \7)),\n'\ | |
88 | ' TP_fast_assign(tp_assign(\6, \6) tp_assign(\7, \7)),\n'\ | |
89 | ' TP_printk()\n'\ | |
90 | ')/g'\ | |
91 | ${TMPFILE} >> ${HEADER} | |
92 | ||
93 | # types: 4 5 6 | |
94 | # args 7 8 9 | |
95 | ||
96 | NRARGS=3 | |
97 | grep "^syscall [^ ]* nr [^ ]* nbargs ${NRARGS} " ${SRCFILE} > ${TMPFILE} | |
98 | sed 's/^syscall \([^ ]*\) nr \([^ ]*\) nbargs \([^ ]*\) '\ | |
99 | 'types: (\([^,]*\), \([^,]*\), \([^)]*\)) '\ | |
100 | 'args: (\([^,]*\), \([^,]*\), \([^)]*\))/'\ | |
101 | 'TRACE_EVENT(sys_\1,\n'\ | |
102 | ' TP_PROTO(\4 \7, \5 \8, \6 \9),\n'\ | |
103 | ' TP_ARGS(\7, \8, \9),\n'\ | |
104 | ' TP_STRUCT__entry(__field(\4, \7) __field(\5, \8) __field(\6, \9)),\n'\ | |
105 | ' TP_fast_assign(tp_assign(\7, \7) tp_assign(\8, \8) tp_assign(\9, \9)),\n'\ | |
106 | ' TP_printk()\n'\ | |
107 | ')/g'\ | |
108 | ${TMPFILE} >> ${HEADER} | |
109 | ||
110 | ||
111 | # types: 4 5 6 7 | |
112 | # args 8 9 10 11 | |
113 | ||
114 | NRARGS=4 | |
115 | grep "^syscall [^ ]* nr [^ ]* nbargs ${NRARGS} " ${SRCFILE} > ${TMPFILE} | |
116 | sed 's/^syscall \([^ ]*\) nr \([^ ]*\) nbargs \([^ ]*\) '\ | |
117 | 'types: (\([^,]*\), \([^,]*\), \([^,]*\), \([^)]*\)) '\ | |
118 | 'args: (\([^,]*\), \([^,]*\), \([^,]*\), \([^)]*\))/'\ | |
119 | 'TRACE_EVENT(sys_\1,\n'\ | |
120 | ' TP_PROTO(\4 \8, \5 \9, \6 \10, \7 \11),\n'\ | |
121 | ' TP_ARGS(\8, \9, \10, \11),\n'\ | |
122 | ' TP_STRUCT__entry(__field(\4, \8) __field(\5, \9) __field(\6, \10) __field(\7, \11)),\n'\ | |
123 | ' TP_fast_assign(tp_assign(\8, \8) tp_assign(\9, \9) tp_assign(\10, \10) tp_assign(\11, \11)),\n'\ | |
124 | ' TP_printk()\n'\ | |
125 | ')/g'\ | |
126 | ${TMPFILE} >> ${HEADER} | |
127 | ||
128 | # types: 4 5 6 7 8 | |
129 | # args 9 10 11 12 13 | |
130 | ||
131 | NRARGS=5 | |
132 | grep "^syscall [^ ]* nr [^ ]* nbargs ${NRARGS} " ${SRCFILE} > ${TMPFILE} | |
133 | sed 's/^syscall \([^ ]*\) nr \([^ ]*\) nbargs \([^ ]*\) '\ | |
134 | 'types: (\([^,]*\), \([^,]*\), \([^,]*\), \([^,]*\), \([^)]*\)) '\ | |
135 | 'args: (\([^,]*\), \([^,]*\), \([^,]*\), \([^,]*\), \([^)]*\))/'\ | |
136 | 'TRACE_EVENT(sys_\1,\n'\ | |
137 | ' TP_PROTO(\4 \9, \5 \10, \6 \11, \7 \12, \8 \13),\n'\ | |
138 | ' TP_ARGS(\9, \10, \11, \12, \13),\n'\ | |
139 | ' TP_STRUCT__entry(__field(\4, \9) __field(\5, \10) __field(\6, \11) __field(\7, \12) __field(\8, \13)),\n'\ | |
140 | ' TP_fast_assign(tp_assign(\9, \9) tp_assign(\10, \10) tp_assign(\11, \11) tp_assign(\12, \12) tp_assign(\13, \13)),\n'\ | |
141 | ' TP_printk()\n'\ | |
142 | ')/g'\ | |
143 | ${TMPFILE} >> ${HEADER} | |
144 | ||
145 | ||
146 | # types: 4 5 6 7 8 9 | |
147 | # args 10 11 12 13 14 15 | |
148 | ||
149 | NRARGS=6 | |
150 | grep "^syscall [^ ]* nr [^ ]* nbargs ${NRARGS} " ${SRCFILE} > ${TMPFILE} | |
151 | sed 's/^syscall \([^ ]*\) nr \([^ ]*\) nbargs \([^ ]*\) '\ | |
152 | 'types: (\([^,]*\), \([^,]*\), \([^,]*\), \([^,]*\), \([^,]*\), \([^)]*\)) '\ | |
153 | 'args: (\([^,]*\), \([^,]*\), \([^,]*\), \([^,]*\), \([^,]*\), \([^)]*\))/'\ | |
154 | 'TRACE_EVENT(sys_\1,\n'\ | |
155 | ' TP_PROTO(\4 \10, \5 \11, \6 \12, \7 \13, \8 \14, \9 \15),\n'\ | |
156 | ' TP_ARGS(\10, \11, \12, \13, \14, \15),\n'\ | |
157 | ' TP_STRUCT__entry(__field(\4, \10) __field(\5, \11) __field(\6, \12) __field(\7, \13) __field(\8, \14) __field(\9, \15)),\n'\ | |
158 | ' 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'\ | |
159 | ' TP_printk()\n'\ | |
160 | ')/g'\ | |
161 | ${TMPFILE} >> ${HEADER} | |
162 | ||
163 | echo -n \ | |
164 | " | |
e41e2e82 | 165 | #endif /* _TRACE_SYSCALLS_H */ |
5fee13fd MD |
166 | |
167 | /* This part must be outside protection */ | |
168 | #include \"../../../probes/define_trace.h\" | |
169 | " >> ${HEADER} | |
170 | ||
171 | rm -f ${INPUTFILE}.tmp | |
172 | rm -f ${TMPFILE} | |
173 | rm -f ${SRCFILE} |