xref: /aosp_15_r20/external/linux-kselftest/tools/testing/selftests/bpf/sdt.h (revision 053f45be4e351dfd5e965df293cd45b779f579ee)
1*053f45beSAndroid Build Coastguard Worker /* <sys/sdt.h> - Systemtap static probe definition macros.
2*053f45beSAndroid Build Coastguard Worker 
3*053f45beSAndroid Build Coastguard Worker    This file is dedicated to the public domain, pursuant to CC0
4*053f45beSAndroid Build Coastguard Worker    (https://creativecommons.org/publicdomain/zero/1.0/)
5*053f45beSAndroid Build Coastguard Worker */
6*053f45beSAndroid Build Coastguard Worker 
7*053f45beSAndroid Build Coastguard Worker #ifndef _SYS_SDT_H
8*053f45beSAndroid Build Coastguard Worker #define _SYS_SDT_H    1
9*053f45beSAndroid Build Coastguard Worker 
10*053f45beSAndroid Build Coastguard Worker /*
11*053f45beSAndroid Build Coastguard Worker   This file defines a family of macros
12*053f45beSAndroid Build Coastguard Worker 
13*053f45beSAndroid Build Coastguard Worker        STAP_PROBEn(op1, ..., opn)
14*053f45beSAndroid Build Coastguard Worker 
15*053f45beSAndroid Build Coastguard Worker   that emit a nop into the instruction stream, and some data into an auxiliary
16*053f45beSAndroid Build Coastguard Worker   note section.  The data in the note section describes the operands, in terms
17*053f45beSAndroid Build Coastguard Worker   of size and location.  Each location is encoded as assembler operand string.
18*053f45beSAndroid Build Coastguard Worker   Consumer tools such as gdb or systemtap insert breakpoints on top of
19*053f45beSAndroid Build Coastguard Worker   the nop, and decode the location operand-strings, like an assembler,
20*053f45beSAndroid Build Coastguard Worker   to find the values being passed.
21*053f45beSAndroid Build Coastguard Worker 
22*053f45beSAndroid Build Coastguard Worker   The operand strings are selected by the compiler for each operand.
23*053f45beSAndroid Build Coastguard Worker   They are constrained by gcc inline-assembler codes.  The default is:
24*053f45beSAndroid Build Coastguard Worker 
25*053f45beSAndroid Build Coastguard Worker   #define STAP_SDT_ARG_CONSTRAINT nor
26*053f45beSAndroid Build Coastguard Worker 
27*053f45beSAndroid Build Coastguard Worker   This is a good default if the operands tend to be integral and
28*053f45beSAndroid Build Coastguard Worker   moderate in number (smaller than number of registers).  In other
29*053f45beSAndroid Build Coastguard Worker   cases, the compiler may report "'asm' requires impossible reload" or
30*053f45beSAndroid Build Coastguard Worker   similar.  In this case, consider simplifying the macro call (fewer
31*053f45beSAndroid Build Coastguard Worker   and simpler operands), reduce optimization, or override the default
32*053f45beSAndroid Build Coastguard Worker   constraints string via:
33*053f45beSAndroid Build Coastguard Worker 
34*053f45beSAndroid Build Coastguard Worker   #define STAP_SDT_ARG_CONSTRAINT g
35*053f45beSAndroid Build Coastguard Worker   #include <sys/sdt.h>
36*053f45beSAndroid Build Coastguard Worker 
37*053f45beSAndroid Build Coastguard Worker   See also:
38*053f45beSAndroid Build Coastguard Worker   https://sourceware.org/systemtap/wiki/UserSpaceProbeImplementation
39*053f45beSAndroid Build Coastguard Worker   https://gcc.gnu.org/onlinedocs/gcc/Constraints.html
40*053f45beSAndroid Build Coastguard Worker  */
41*053f45beSAndroid Build Coastguard Worker 
42*053f45beSAndroid Build Coastguard Worker 
43*053f45beSAndroid Build Coastguard Worker 
44*053f45beSAndroid Build Coastguard Worker #ifdef __ASSEMBLER__
45*053f45beSAndroid Build Coastguard Worker # define _SDT_PROBE(provider, name, n, arglist)	\
46*053f45beSAndroid Build Coastguard Worker   _SDT_ASM_BODY(provider, name, _SDT_ASM_SUBSTR_1, (_SDT_DEPAREN_##n arglist)) \
47*053f45beSAndroid Build Coastguard Worker   _SDT_ASM_BASE
48*053f45beSAndroid Build Coastguard Worker # define _SDT_ASM_1(x)			x;
49*053f45beSAndroid Build Coastguard Worker # define _SDT_ASM_2(a, b)		a,b;
50*053f45beSAndroid Build Coastguard Worker # define _SDT_ASM_3(a, b, c)		a,b,c;
51*053f45beSAndroid Build Coastguard Worker # define _SDT_ASM_5(a, b, c, d, e)	a,b,c,d,e;
52*053f45beSAndroid Build Coastguard Worker # define _SDT_ASM_STRING_1(x)		.asciz #x;
53*053f45beSAndroid Build Coastguard Worker # define _SDT_ASM_SUBSTR_1(x)		.ascii #x;
54*053f45beSAndroid Build Coastguard Worker # define _SDT_DEPAREN_0()				/* empty */
55*053f45beSAndroid Build Coastguard Worker # define _SDT_DEPAREN_1(a)				a
56*053f45beSAndroid Build Coastguard Worker # define _SDT_DEPAREN_2(a,b)				a b
57*053f45beSAndroid Build Coastguard Worker # define _SDT_DEPAREN_3(a,b,c)				a b c
58*053f45beSAndroid Build Coastguard Worker # define _SDT_DEPAREN_4(a,b,c,d)			a b c d
59*053f45beSAndroid Build Coastguard Worker # define _SDT_DEPAREN_5(a,b,c,d,e)			a b c d e
60*053f45beSAndroid Build Coastguard Worker # define _SDT_DEPAREN_6(a,b,c,d,e,f)			a b c d e f
61*053f45beSAndroid Build Coastguard Worker # define _SDT_DEPAREN_7(a,b,c,d,e,f,g)			a b c d e f g
62*053f45beSAndroid Build Coastguard Worker # define _SDT_DEPAREN_8(a,b,c,d,e,f,g,h)		a b c d e f g h
63*053f45beSAndroid Build Coastguard Worker # define _SDT_DEPAREN_9(a,b,c,d,e,f,g,h,i)		a b c d e f g h i
64*053f45beSAndroid Build Coastguard Worker # define _SDT_DEPAREN_10(a,b,c,d,e,f,g,h,i,j)		a b c d e f g h i j
65*053f45beSAndroid Build Coastguard Worker # define _SDT_DEPAREN_11(a,b,c,d,e,f,g,h,i,j,k)		a b c d e f g h i j k
66*053f45beSAndroid Build Coastguard Worker # define _SDT_DEPAREN_12(a,b,c,d,e,f,g,h,i,j,k,l)	a b c d e f g h i j k l
67*053f45beSAndroid Build Coastguard Worker #else
68*053f45beSAndroid Build Coastguard Worker #if defined _SDT_HAS_SEMAPHORES
69*053f45beSAndroid Build Coastguard Worker #define _SDT_NOTE_SEMAPHORE_USE(provider, name) \
70*053f45beSAndroid Build Coastguard Worker   __asm__ __volatile__ ("" :: "m" (provider##_##name##_semaphore));
71*053f45beSAndroid Build Coastguard Worker #else
72*053f45beSAndroid Build Coastguard Worker #define _SDT_NOTE_SEMAPHORE_USE(provider, name)
73*053f45beSAndroid Build Coastguard Worker #endif
74*053f45beSAndroid Build Coastguard Worker 
75*053f45beSAndroid Build Coastguard Worker # define _SDT_PROBE(provider, name, n, arglist) \
76*053f45beSAndroid Build Coastguard Worker   do {									    \
77*053f45beSAndroid Build Coastguard Worker     _SDT_NOTE_SEMAPHORE_USE(provider, name); \
78*053f45beSAndroid Build Coastguard Worker     __asm__ __volatile__ (_SDT_ASM_BODY(provider, name, _SDT_ASM_ARGS, (n)) \
79*053f45beSAndroid Build Coastguard Worker 			  :: _SDT_ASM_OPERANDS_##n arglist);		    \
80*053f45beSAndroid Build Coastguard Worker     __asm__ __volatile__ (_SDT_ASM_BASE);				    \
81*053f45beSAndroid Build Coastguard Worker   } while (0)
82*053f45beSAndroid Build Coastguard Worker # define _SDT_S(x)			#x
83*053f45beSAndroid Build Coastguard Worker # define _SDT_ASM_1(x)			_SDT_S(x) "\n"
84*053f45beSAndroid Build Coastguard Worker # define _SDT_ASM_2(a, b)		_SDT_S(a) "," _SDT_S(b) "\n"
85*053f45beSAndroid Build Coastguard Worker # define _SDT_ASM_3(a, b, c)		_SDT_S(a) "," _SDT_S(b) "," \
86*053f45beSAndroid Build Coastguard Worker 					_SDT_S(c) "\n"
87*053f45beSAndroid Build Coastguard Worker # define _SDT_ASM_5(a, b, c, d, e)	_SDT_S(a) "," _SDT_S(b) "," \
88*053f45beSAndroid Build Coastguard Worker 					_SDT_S(c) "," _SDT_S(d) "," \
89*053f45beSAndroid Build Coastguard Worker 					_SDT_S(e) "\n"
90*053f45beSAndroid Build Coastguard Worker # define _SDT_ASM_ARGS(n)		_SDT_ASM_TEMPLATE_##n
91*053f45beSAndroid Build Coastguard Worker # define _SDT_ASM_STRING_1(x)		_SDT_ASM_1(.asciz #x)
92*053f45beSAndroid Build Coastguard Worker # define _SDT_ASM_SUBSTR_1(x)		_SDT_ASM_1(.ascii #x)
93*053f45beSAndroid Build Coastguard Worker 
94*053f45beSAndroid Build Coastguard Worker # define _SDT_ARGFMT(no)                _SDT_ASM_1(_SDT_SIGN %n[_SDT_S##no]) \
95*053f45beSAndroid Build Coastguard Worker                                         _SDT_ASM_1(_SDT_SIZE %n[_SDT_S##no]) \
96*053f45beSAndroid Build Coastguard Worker                                         _SDT_ASM_1(_SDT_TYPE %n[_SDT_S##no]) \
97*053f45beSAndroid Build Coastguard Worker                                         _SDT_ASM_SUBSTR(_SDT_ARGTMPL(_SDT_A##no))
98*053f45beSAndroid Build Coastguard Worker 
99*053f45beSAndroid Build Coastguard Worker 
100*053f45beSAndroid Build Coastguard Worker # ifndef STAP_SDT_ARG_CONSTRAINT
101*053f45beSAndroid Build Coastguard Worker # if defined __powerpc__
102*053f45beSAndroid Build Coastguard Worker # define STAP_SDT_ARG_CONSTRAINT        nZr
103*053f45beSAndroid Build Coastguard Worker # elif defined __arm__
104*053f45beSAndroid Build Coastguard Worker # define STAP_SDT_ARG_CONSTRAINT        g
105*053f45beSAndroid Build Coastguard Worker # else
106*053f45beSAndroid Build Coastguard Worker # define STAP_SDT_ARG_CONSTRAINT        nor
107*053f45beSAndroid Build Coastguard Worker # endif
108*053f45beSAndroid Build Coastguard Worker # endif
109*053f45beSAndroid Build Coastguard Worker 
110*053f45beSAndroid Build Coastguard Worker # define _SDT_STRINGIFY(x)              #x
111*053f45beSAndroid Build Coastguard Worker # define _SDT_ARG_CONSTRAINT_STRING(x)  _SDT_STRINGIFY(x)
112*053f45beSAndroid Build Coastguard Worker /* _SDT_S encodes the size and type as 0xSSTT which is decoded by the assembler
113*053f45beSAndroid Build Coastguard Worker    macros _SDT_SIZE and _SDT_TYPE */
114*053f45beSAndroid Build Coastguard Worker # define _SDT_ARG(n, x)				    \
115*053f45beSAndroid Build Coastguard Worker   [_SDT_S##n] "n" ((_SDT_ARGSIGNED (x) ? (int)-1 : 1) * (-(((int) _SDT_ARGSIZE (x)) << 8) + (-(0x7f & __builtin_classify_type (x))))), \
116*053f45beSAndroid Build Coastguard Worker   [_SDT_A##n] _SDT_ARG_CONSTRAINT_STRING (STAP_SDT_ARG_CONSTRAINT) (_SDT_ARGVAL (x))
117*053f45beSAndroid Build Coastguard Worker #endif
118*053f45beSAndroid Build Coastguard Worker #define _SDT_ASM_STRING(x)		_SDT_ASM_STRING_1(x)
119*053f45beSAndroid Build Coastguard Worker #define _SDT_ASM_SUBSTR(x)		_SDT_ASM_SUBSTR_1(x)
120*053f45beSAndroid Build Coastguard Worker 
121*053f45beSAndroid Build Coastguard Worker #define _SDT_ARGARRAY(x)	(__builtin_classify_type (x) == 14	\
122*053f45beSAndroid Build Coastguard Worker 				 || __builtin_classify_type (x) == 5)
123*053f45beSAndroid Build Coastguard Worker 
124*053f45beSAndroid Build Coastguard Worker #ifdef __cplusplus
125*053f45beSAndroid Build Coastguard Worker # define _SDT_ARGSIGNED(x)	(!_SDT_ARGARRAY (x) \
126*053f45beSAndroid Build Coastguard Worker 				 && __sdt_type<__typeof (x)>::__sdt_signed)
127*053f45beSAndroid Build Coastguard Worker # define _SDT_ARGSIZE(x)	(_SDT_ARGARRAY (x) \
128*053f45beSAndroid Build Coastguard Worker 				 ? sizeof (void *) : sizeof (x))
129*053f45beSAndroid Build Coastguard Worker # define _SDT_ARGVAL(x)		(x)
130*053f45beSAndroid Build Coastguard Worker 
131*053f45beSAndroid Build Coastguard Worker # include <cstddef>
132*053f45beSAndroid Build Coastguard Worker 
133*053f45beSAndroid Build Coastguard Worker template<typename __sdt_T>
134*053f45beSAndroid Build Coastguard Worker struct __sdt_type
135*053f45beSAndroid Build Coastguard Worker {
136*053f45beSAndroid Build Coastguard Worker   static const bool __sdt_signed = false;
137*053f45beSAndroid Build Coastguard Worker };
138*053f45beSAndroid Build Coastguard Worker 
139*053f45beSAndroid Build Coastguard Worker #define __SDT_ALWAYS_SIGNED(T) \
140*053f45beSAndroid Build Coastguard Worker template<> struct __sdt_type<T> { static const bool __sdt_signed = true; };
141*053f45beSAndroid Build Coastguard Worker #define __SDT_COND_SIGNED(T,CT)						\
142*053f45beSAndroid Build Coastguard Worker template<> struct __sdt_type<T> { static const bool __sdt_signed = ((CT)(-1) < 1); };
143*053f45beSAndroid Build Coastguard Worker __SDT_ALWAYS_SIGNED(signed char)
144*053f45beSAndroid Build Coastguard Worker __SDT_ALWAYS_SIGNED(short)
145*053f45beSAndroid Build Coastguard Worker __SDT_ALWAYS_SIGNED(int)
146*053f45beSAndroid Build Coastguard Worker __SDT_ALWAYS_SIGNED(long)
147*053f45beSAndroid Build Coastguard Worker __SDT_ALWAYS_SIGNED(long long)
148*053f45beSAndroid Build Coastguard Worker __SDT_ALWAYS_SIGNED(volatile signed char)
149*053f45beSAndroid Build Coastguard Worker __SDT_ALWAYS_SIGNED(volatile short)
150*053f45beSAndroid Build Coastguard Worker __SDT_ALWAYS_SIGNED(volatile int)
151*053f45beSAndroid Build Coastguard Worker __SDT_ALWAYS_SIGNED(volatile long)
152*053f45beSAndroid Build Coastguard Worker __SDT_ALWAYS_SIGNED(volatile long long)
153*053f45beSAndroid Build Coastguard Worker __SDT_ALWAYS_SIGNED(const signed char)
154*053f45beSAndroid Build Coastguard Worker __SDT_ALWAYS_SIGNED(const short)
155*053f45beSAndroid Build Coastguard Worker __SDT_ALWAYS_SIGNED(const int)
156*053f45beSAndroid Build Coastguard Worker __SDT_ALWAYS_SIGNED(const long)
157*053f45beSAndroid Build Coastguard Worker __SDT_ALWAYS_SIGNED(const long long)
158*053f45beSAndroid Build Coastguard Worker __SDT_ALWAYS_SIGNED(const volatile signed char)
159*053f45beSAndroid Build Coastguard Worker __SDT_ALWAYS_SIGNED(const volatile short)
160*053f45beSAndroid Build Coastguard Worker __SDT_ALWAYS_SIGNED(const volatile int)
161*053f45beSAndroid Build Coastguard Worker __SDT_ALWAYS_SIGNED(const volatile long)
162*053f45beSAndroid Build Coastguard Worker __SDT_ALWAYS_SIGNED(const volatile long long)
163*053f45beSAndroid Build Coastguard Worker __SDT_COND_SIGNED(char, char)
164*053f45beSAndroid Build Coastguard Worker __SDT_COND_SIGNED(wchar_t, wchar_t)
165*053f45beSAndroid Build Coastguard Worker __SDT_COND_SIGNED(volatile char, char)
166*053f45beSAndroid Build Coastguard Worker __SDT_COND_SIGNED(volatile wchar_t, wchar_t)
167*053f45beSAndroid Build Coastguard Worker __SDT_COND_SIGNED(const char, char)
168*053f45beSAndroid Build Coastguard Worker __SDT_COND_SIGNED(const wchar_t, wchar_t)
169*053f45beSAndroid Build Coastguard Worker __SDT_COND_SIGNED(const volatile char, char)
170*053f45beSAndroid Build Coastguard Worker __SDT_COND_SIGNED(const volatile wchar_t, wchar_t)
171*053f45beSAndroid Build Coastguard Worker #if defined (__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
172*053f45beSAndroid Build Coastguard Worker /* __SDT_COND_SIGNED(char16_t) */
173*053f45beSAndroid Build Coastguard Worker /* __SDT_COND_SIGNED(char32_t) */
174*053f45beSAndroid Build Coastguard Worker #endif
175*053f45beSAndroid Build Coastguard Worker 
176*053f45beSAndroid Build Coastguard Worker template<typename __sdt_E>
177*053f45beSAndroid Build Coastguard Worker struct __sdt_type<__sdt_E[]> : public __sdt_type<__sdt_E *> {};
178*053f45beSAndroid Build Coastguard Worker 
179*053f45beSAndroid Build Coastguard Worker template<typename __sdt_E, size_t __sdt_N>
180*053f45beSAndroid Build Coastguard Worker struct __sdt_type<__sdt_E[__sdt_N]> : public __sdt_type<__sdt_E *> {};
181*053f45beSAndroid Build Coastguard Worker 
182*053f45beSAndroid Build Coastguard Worker #elif !defined(__ASSEMBLER__)
183*053f45beSAndroid Build Coastguard Worker __extension__ extern unsigned long long __sdt_unsp;
184*053f45beSAndroid Build Coastguard Worker # define _SDT_ARGINTTYPE(x)						\
185*053f45beSAndroid Build Coastguard Worker   __typeof (__builtin_choose_expr (((__builtin_classify_type (x)	\
186*053f45beSAndroid Build Coastguard Worker 				     + 3) & -4) == 4, (x), 0U))
187*053f45beSAndroid Build Coastguard Worker # define _SDT_ARGSIGNED(x)						\
188*053f45beSAndroid Build Coastguard Worker   (!__extension__							\
189*053f45beSAndroid Build Coastguard Worker    (__builtin_constant_p ((((unsigned long long)			\
190*053f45beSAndroid Build Coastguard Worker 			    (_SDT_ARGINTTYPE (x)) __sdt_unsp)		\
191*053f45beSAndroid Build Coastguard Worker 			   & ((unsigned long long)1 << (sizeof (unsigned long long)	\
192*053f45beSAndroid Build Coastguard Worker 				       * __CHAR_BIT__ - 1))) == 0)	\
193*053f45beSAndroid Build Coastguard Worker     || (_SDT_ARGINTTYPE (x)) -1 > (_SDT_ARGINTTYPE (x)) 0))
194*053f45beSAndroid Build Coastguard Worker # define _SDT_ARGSIZE(x)	\
195*053f45beSAndroid Build Coastguard Worker   (_SDT_ARGARRAY (x) ? sizeof (void *) : sizeof (x))
196*053f45beSAndroid Build Coastguard Worker # define _SDT_ARGVAL(x)		(x)
197*053f45beSAndroid Build Coastguard Worker #endif
198*053f45beSAndroid Build Coastguard Worker 
199*053f45beSAndroid Build Coastguard Worker #if defined __powerpc__ || defined __powerpc64__
200*053f45beSAndroid Build Coastguard Worker # define _SDT_ARGTMPL(id)	%I[id]%[id]
201*053f45beSAndroid Build Coastguard Worker #elif defined __i386__
202*053f45beSAndroid Build Coastguard Worker # define _SDT_ARGTMPL(id)	%k[id]  /* gcc.gnu.org/PR80115 sourceware.org/PR24541 */
203*053f45beSAndroid Build Coastguard Worker #else
204*053f45beSAndroid Build Coastguard Worker # define _SDT_ARGTMPL(id)	%[id]
205*053f45beSAndroid Build Coastguard Worker #endif
206*053f45beSAndroid Build Coastguard Worker 
207*053f45beSAndroid Build Coastguard Worker /* NB: gdb PR24541 highlighted an unspecified corner of the sdt.h
208*053f45beSAndroid Build Coastguard Worker    operand note format.
209*053f45beSAndroid Build Coastguard Worker 
210*053f45beSAndroid Build Coastguard Worker    The named register may be a longer or shorter (!) alias for the
211*053f45beSAndroid Build Coastguard Worker    storage where the value in question is found.  For example, on
212*053f45beSAndroid Build Coastguard Worker    i386, 64-bit value may be put in register pairs, and the register
213*053f45beSAndroid Build Coastguard Worker    name stored would identify just one of them.  Previously, gcc was
214*053f45beSAndroid Build Coastguard Worker    asked to emit the %w[id] (16-bit alias of some registers holding
215*053f45beSAndroid Build Coastguard Worker    operands), even when a wider 32-bit value was used.
216*053f45beSAndroid Build Coastguard Worker 
217*053f45beSAndroid Build Coastguard Worker    Bottom line: the byte-width given before the @ sign governs.  If
218*053f45beSAndroid Build Coastguard Worker    there is a mismatch between that width and that of the named
219*053f45beSAndroid Build Coastguard Worker    register, then a sys/sdt.h note consumer may need to employ
220*053f45beSAndroid Build Coastguard Worker    architecture-specific heuristics to figure out where the compiler
221*053f45beSAndroid Build Coastguard Worker    has actually put the complete value.
222*053f45beSAndroid Build Coastguard Worker */
223*053f45beSAndroid Build Coastguard Worker 
224*053f45beSAndroid Build Coastguard Worker #ifdef __LP64__
225*053f45beSAndroid Build Coastguard Worker # define _SDT_ASM_ADDR	.8byte
226*053f45beSAndroid Build Coastguard Worker #else
227*053f45beSAndroid Build Coastguard Worker # define _SDT_ASM_ADDR	.4byte
228*053f45beSAndroid Build Coastguard Worker #endif
229*053f45beSAndroid Build Coastguard Worker 
230*053f45beSAndroid Build Coastguard Worker /* The ia64 and s390 nop instructions take an argument. */
231*053f45beSAndroid Build Coastguard Worker #if defined(__ia64__) || defined(__s390__) || defined(__s390x__)
232*053f45beSAndroid Build Coastguard Worker #define _SDT_NOP	nop 0
233*053f45beSAndroid Build Coastguard Worker #else
234*053f45beSAndroid Build Coastguard Worker #define _SDT_NOP	nop
235*053f45beSAndroid Build Coastguard Worker #endif
236*053f45beSAndroid Build Coastguard Worker 
237*053f45beSAndroid Build Coastguard Worker #define _SDT_NOTE_NAME	"stapsdt"
238*053f45beSAndroid Build Coastguard Worker #define _SDT_NOTE_TYPE	3
239*053f45beSAndroid Build Coastguard Worker 
240*053f45beSAndroid Build Coastguard Worker /* If the assembler supports the necessary feature, then we can play
241*053f45beSAndroid Build Coastguard Worker    nice with code in COMDAT sections, which comes up in C++ code.
242*053f45beSAndroid Build Coastguard Worker    Without that assembler support, some combinations of probe placements
243*053f45beSAndroid Build Coastguard Worker    in certain kinds of C++ code may produce link-time errors.  */
244*053f45beSAndroid Build Coastguard Worker #include "sdt-config.h"
245*053f45beSAndroid Build Coastguard Worker #if _SDT_ASM_SECTION_AUTOGROUP_SUPPORT
246*053f45beSAndroid Build Coastguard Worker # define _SDT_ASM_AUTOGROUP "?"
247*053f45beSAndroid Build Coastguard Worker #else
248*053f45beSAndroid Build Coastguard Worker # define _SDT_ASM_AUTOGROUP ""
249*053f45beSAndroid Build Coastguard Worker #endif
250*053f45beSAndroid Build Coastguard Worker 
251*053f45beSAndroid Build Coastguard Worker #define _SDT_DEF_MACROS							     \
252*053f45beSAndroid Build Coastguard Worker 	_SDT_ASM_1(.altmacro)						     \
253*053f45beSAndroid Build Coastguard Worker 	_SDT_ASM_1(.macro _SDT_SIGN x)				     	     \
254*053f45beSAndroid Build Coastguard Worker 	_SDT_ASM_3(.pushsection .note.stapsdt,"","note")		     \
255*053f45beSAndroid Build Coastguard Worker 	_SDT_ASM_1(.iflt \\x)						     \
256*053f45beSAndroid Build Coastguard Worker 	_SDT_ASM_1(.ascii "-")						     \
257*053f45beSAndroid Build Coastguard Worker 	_SDT_ASM_1(.endif)						     \
258*053f45beSAndroid Build Coastguard Worker 	_SDT_ASM_1(.popsection)						     \
259*053f45beSAndroid Build Coastguard Worker 	_SDT_ASM_1(.endm)						     \
260*053f45beSAndroid Build Coastguard Worker 	_SDT_ASM_1(.macro _SDT_SIZE_ x)					     \
261*053f45beSAndroid Build Coastguard Worker 	_SDT_ASM_3(.pushsection .note.stapsdt,"","note")		     \
262*053f45beSAndroid Build Coastguard Worker 	_SDT_ASM_1(.ascii "\x")						     \
263*053f45beSAndroid Build Coastguard Worker 	_SDT_ASM_1(.popsection)						     \
264*053f45beSAndroid Build Coastguard Worker 	_SDT_ASM_1(.endm)						     \
265*053f45beSAndroid Build Coastguard Worker 	_SDT_ASM_1(.macro _SDT_SIZE x)					     \
266*053f45beSAndroid Build Coastguard Worker 	_SDT_ASM_1(_SDT_SIZE_ %%((-(-\\x*((-\\x>0)-(-\\x<0))))>>8))	     \
267*053f45beSAndroid Build Coastguard Worker 	_SDT_ASM_1(.endm)						     \
268*053f45beSAndroid Build Coastguard Worker 	_SDT_ASM_1(.macro _SDT_TYPE_ x)				             \
269*053f45beSAndroid Build Coastguard Worker 	_SDT_ASM_3(.pushsection .note.stapsdt,"","note")		     \
270*053f45beSAndroid Build Coastguard Worker 	_SDT_ASM_2(.ifc 8,\\x)					     	     \
271*053f45beSAndroid Build Coastguard Worker 	_SDT_ASM_1(.ascii "f")						     \
272*053f45beSAndroid Build Coastguard Worker 	_SDT_ASM_1(.endif)						     \
273*053f45beSAndroid Build Coastguard Worker 	_SDT_ASM_1(.ascii "@")						     \
274*053f45beSAndroid Build Coastguard Worker 	_SDT_ASM_1(.popsection)						     \
275*053f45beSAndroid Build Coastguard Worker 	_SDT_ASM_1(.endm)						     \
276*053f45beSAndroid Build Coastguard Worker 	_SDT_ASM_1(.macro _SDT_TYPE x)				     	     \
277*053f45beSAndroid Build Coastguard Worker 	_SDT_ASM_1(_SDT_TYPE_ %%((\\x)&(0xff)))			     \
278*053f45beSAndroid Build Coastguard Worker 	_SDT_ASM_1(.endm)
279*053f45beSAndroid Build Coastguard Worker 
280*053f45beSAndroid Build Coastguard Worker #define _SDT_UNDEF_MACROS						      \
281*053f45beSAndroid Build Coastguard Worker   _SDT_ASM_1(.purgem _SDT_SIGN)						      \
282*053f45beSAndroid Build Coastguard Worker   _SDT_ASM_1(.purgem _SDT_SIZE_)					      \
283*053f45beSAndroid Build Coastguard Worker   _SDT_ASM_1(.purgem _SDT_SIZE)						      \
284*053f45beSAndroid Build Coastguard Worker   _SDT_ASM_1(.purgem _SDT_TYPE_)					      \
285*053f45beSAndroid Build Coastguard Worker   _SDT_ASM_1(.purgem _SDT_TYPE)
286*053f45beSAndroid Build Coastguard Worker 
287*053f45beSAndroid Build Coastguard Worker #define _SDT_ASM_BODY(provider, name, pack_args, args, ...)		      \
288*053f45beSAndroid Build Coastguard Worker   _SDT_DEF_MACROS							      \
289*053f45beSAndroid Build Coastguard Worker   _SDT_ASM_1(990:	_SDT_NOP)					      \
290*053f45beSAndroid Build Coastguard Worker   _SDT_ASM_3(		.pushsection .note.stapsdt,_SDT_ASM_AUTOGROUP,"note") \
291*053f45beSAndroid Build Coastguard Worker   _SDT_ASM_1(		.balign 4)					      \
292*053f45beSAndroid Build Coastguard Worker   _SDT_ASM_3(		.4byte 992f-991f, 994f-993f, _SDT_NOTE_TYPE)	      \
293*053f45beSAndroid Build Coastguard Worker   _SDT_ASM_1(991:	.asciz _SDT_NOTE_NAME)				      \
294*053f45beSAndroid Build Coastguard Worker   _SDT_ASM_1(992:	.balign 4)					      \
295*053f45beSAndroid Build Coastguard Worker   _SDT_ASM_1(993:	_SDT_ASM_ADDR 990b)				      \
296*053f45beSAndroid Build Coastguard Worker   _SDT_ASM_1(		_SDT_ASM_ADDR _.stapsdt.base)			      \
297*053f45beSAndroid Build Coastguard Worker   _SDT_SEMAPHORE(provider,name)						      \
298*053f45beSAndroid Build Coastguard Worker   _SDT_ASM_STRING(provider)						      \
299*053f45beSAndroid Build Coastguard Worker   _SDT_ASM_STRING(name)							      \
300*053f45beSAndroid Build Coastguard Worker   pack_args args							      \
301*053f45beSAndroid Build Coastguard Worker   _SDT_ASM_SUBSTR(\x00)							      \
302*053f45beSAndroid Build Coastguard Worker   _SDT_UNDEF_MACROS							      \
303*053f45beSAndroid Build Coastguard Worker   _SDT_ASM_1(994:	.balign 4)					      \
304*053f45beSAndroid Build Coastguard Worker   _SDT_ASM_1(		.popsection)
305*053f45beSAndroid Build Coastguard Worker 
306*053f45beSAndroid Build Coastguard Worker #define _SDT_ASM_BASE							      \
307*053f45beSAndroid Build Coastguard Worker   _SDT_ASM_1(.ifndef _.stapsdt.base)					      \
308*053f45beSAndroid Build Coastguard Worker   _SDT_ASM_5(		.pushsection .stapsdt.base,"aG","progbits",	      \
309*053f45beSAndroid Build Coastguard Worker 							.stapsdt.base,comdat) \
310*053f45beSAndroid Build Coastguard Worker   _SDT_ASM_1(		.weak _.stapsdt.base)				      \
311*053f45beSAndroid Build Coastguard Worker   _SDT_ASM_1(		.hidden _.stapsdt.base)				      \
312*053f45beSAndroid Build Coastguard Worker   _SDT_ASM_1(	_.stapsdt.base: .space 1)				      \
313*053f45beSAndroid Build Coastguard Worker   _SDT_ASM_2(		.size _.stapsdt.base, 1)			      \
314*053f45beSAndroid Build Coastguard Worker   _SDT_ASM_1(		.popsection)					      \
315*053f45beSAndroid Build Coastguard Worker   _SDT_ASM_1(.endif)
316*053f45beSAndroid Build Coastguard Worker 
317*053f45beSAndroid Build Coastguard Worker #if defined _SDT_HAS_SEMAPHORES
318*053f45beSAndroid Build Coastguard Worker #define _SDT_SEMAPHORE(p,n) \
319*053f45beSAndroid Build Coastguard Worker 	_SDT_ASM_1(		_SDT_ASM_ADDR p##_##n##_semaphore)
320*053f45beSAndroid Build Coastguard Worker #else
321*053f45beSAndroid Build Coastguard Worker #define _SDT_SEMAPHORE(p,n) _SDT_ASM_1(		_SDT_ASM_ADDR 0)
322*053f45beSAndroid Build Coastguard Worker #endif
323*053f45beSAndroid Build Coastguard Worker 
324*053f45beSAndroid Build Coastguard Worker #define _SDT_ASM_BLANK _SDT_ASM_SUBSTR(\x20)
325*053f45beSAndroid Build Coastguard Worker #define _SDT_ASM_TEMPLATE_0		/* no arguments */
326*053f45beSAndroid Build Coastguard Worker #define _SDT_ASM_TEMPLATE_1		_SDT_ARGFMT(1)
327*053f45beSAndroid Build Coastguard Worker #define _SDT_ASM_TEMPLATE_2		_SDT_ASM_TEMPLATE_1 _SDT_ASM_BLANK _SDT_ARGFMT(2)
328*053f45beSAndroid Build Coastguard Worker #define _SDT_ASM_TEMPLATE_3		_SDT_ASM_TEMPLATE_2 _SDT_ASM_BLANK _SDT_ARGFMT(3)
329*053f45beSAndroid Build Coastguard Worker #define _SDT_ASM_TEMPLATE_4		_SDT_ASM_TEMPLATE_3 _SDT_ASM_BLANK _SDT_ARGFMT(4)
330*053f45beSAndroid Build Coastguard Worker #define _SDT_ASM_TEMPLATE_5		_SDT_ASM_TEMPLATE_4 _SDT_ASM_BLANK _SDT_ARGFMT(5)
331*053f45beSAndroid Build Coastguard Worker #define _SDT_ASM_TEMPLATE_6		_SDT_ASM_TEMPLATE_5 _SDT_ASM_BLANK _SDT_ARGFMT(6)
332*053f45beSAndroid Build Coastguard Worker #define _SDT_ASM_TEMPLATE_7		_SDT_ASM_TEMPLATE_6 _SDT_ASM_BLANK _SDT_ARGFMT(7)
333*053f45beSAndroid Build Coastguard Worker #define _SDT_ASM_TEMPLATE_8		_SDT_ASM_TEMPLATE_7 _SDT_ASM_BLANK _SDT_ARGFMT(8)
334*053f45beSAndroid Build Coastguard Worker #define _SDT_ASM_TEMPLATE_9		_SDT_ASM_TEMPLATE_8 _SDT_ASM_BLANK _SDT_ARGFMT(9)
335*053f45beSAndroid Build Coastguard Worker #define _SDT_ASM_TEMPLATE_10		_SDT_ASM_TEMPLATE_9 _SDT_ASM_BLANK _SDT_ARGFMT(10)
336*053f45beSAndroid Build Coastguard Worker #define _SDT_ASM_TEMPLATE_11		_SDT_ASM_TEMPLATE_10 _SDT_ASM_BLANK _SDT_ARGFMT(11)
337*053f45beSAndroid Build Coastguard Worker #define _SDT_ASM_TEMPLATE_12		_SDT_ASM_TEMPLATE_11 _SDT_ASM_BLANK _SDT_ARGFMT(12)
338*053f45beSAndroid Build Coastguard Worker #define _SDT_ASM_OPERANDS_0()		[__sdt_dummy] "g" (0)
339*053f45beSAndroid Build Coastguard Worker #define _SDT_ASM_OPERANDS_1(arg1)	_SDT_ARG(1, arg1)
340*053f45beSAndroid Build Coastguard Worker #define _SDT_ASM_OPERANDS_2(arg1, arg2) \
341*053f45beSAndroid Build Coastguard Worker   _SDT_ASM_OPERANDS_1(arg1), _SDT_ARG(2, arg2)
342*053f45beSAndroid Build Coastguard Worker #define _SDT_ASM_OPERANDS_3(arg1, arg2, arg3) \
343*053f45beSAndroid Build Coastguard Worker   _SDT_ASM_OPERANDS_2(arg1, arg2), _SDT_ARG(3, arg3)
344*053f45beSAndroid Build Coastguard Worker #define _SDT_ASM_OPERANDS_4(arg1, arg2, arg3, arg4) \
345*053f45beSAndroid Build Coastguard Worker   _SDT_ASM_OPERANDS_3(arg1, arg2, arg3), _SDT_ARG(4, arg4)
346*053f45beSAndroid Build Coastguard Worker #define _SDT_ASM_OPERANDS_5(arg1, arg2, arg3, arg4, arg5) \
347*053f45beSAndroid Build Coastguard Worker   _SDT_ASM_OPERANDS_4(arg1, arg2, arg3, arg4), _SDT_ARG(5, arg5)
348*053f45beSAndroid Build Coastguard Worker #define _SDT_ASM_OPERANDS_6(arg1, arg2, arg3, arg4, arg5, arg6) \
349*053f45beSAndroid Build Coastguard Worker   _SDT_ASM_OPERANDS_5(arg1, arg2, arg3, arg4, arg5), _SDT_ARG(6, arg6)
350*053f45beSAndroid Build Coastguard Worker #define _SDT_ASM_OPERANDS_7(arg1, arg2, arg3, arg4, arg5, arg6, arg7) \
351*053f45beSAndroid Build Coastguard Worker   _SDT_ASM_OPERANDS_6(arg1, arg2, arg3, arg4, arg5, arg6), _SDT_ARG(7, arg7)
352*053f45beSAndroid Build Coastguard Worker #define _SDT_ASM_OPERANDS_8(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) \
353*053f45beSAndroid Build Coastguard Worker   _SDT_ASM_OPERANDS_7(arg1, arg2, arg3, arg4, arg5, arg6, arg7), \
354*053f45beSAndroid Build Coastguard Worker     _SDT_ARG(8, arg8)
355*053f45beSAndroid Build Coastguard Worker #define _SDT_ASM_OPERANDS_9(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9) \
356*053f45beSAndroid Build Coastguard Worker   _SDT_ASM_OPERANDS_8(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8), \
357*053f45beSAndroid Build Coastguard Worker     _SDT_ARG(9, arg9)
358*053f45beSAndroid Build Coastguard Worker #define _SDT_ASM_OPERANDS_10(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10) \
359*053f45beSAndroid Build Coastguard Worker   _SDT_ASM_OPERANDS_9(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9), \
360*053f45beSAndroid Build Coastguard Worker     _SDT_ARG(10, arg10)
361*053f45beSAndroid Build Coastguard Worker #define _SDT_ASM_OPERANDS_11(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11) \
362*053f45beSAndroid Build Coastguard Worker   _SDT_ASM_OPERANDS_10(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10), \
363*053f45beSAndroid Build Coastguard Worker     _SDT_ARG(11, arg11)
364*053f45beSAndroid Build Coastguard Worker #define _SDT_ASM_OPERANDS_12(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11,arg12) \
365*053f45beSAndroid Build Coastguard Worker   _SDT_ASM_OPERANDS_11(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11), \
366*053f45beSAndroid Build Coastguard Worker     _SDT_ARG(12, arg12)
367*053f45beSAndroid Build Coastguard Worker 
368*053f45beSAndroid Build Coastguard Worker /* These macros can be used in C, C++, or assembly code.
369*053f45beSAndroid Build Coastguard Worker    In assembly code the arguments should use normal assembly operand syntax.  */
370*053f45beSAndroid Build Coastguard Worker 
371*053f45beSAndroid Build Coastguard Worker #define STAP_PROBE(provider, name) \
372*053f45beSAndroid Build Coastguard Worker   _SDT_PROBE(provider, name, 0, ())
373*053f45beSAndroid Build Coastguard Worker #define STAP_PROBE1(provider, name, arg1) \
374*053f45beSAndroid Build Coastguard Worker   _SDT_PROBE(provider, name, 1, (arg1))
375*053f45beSAndroid Build Coastguard Worker #define STAP_PROBE2(provider, name, arg1, arg2) \
376*053f45beSAndroid Build Coastguard Worker   _SDT_PROBE(provider, name, 2, (arg1, arg2))
377*053f45beSAndroid Build Coastguard Worker #define STAP_PROBE3(provider, name, arg1, arg2, arg3) \
378*053f45beSAndroid Build Coastguard Worker   _SDT_PROBE(provider, name, 3, (arg1, arg2, arg3))
379*053f45beSAndroid Build Coastguard Worker #define STAP_PROBE4(provider, name, arg1, arg2, arg3, arg4) \
380*053f45beSAndroid Build Coastguard Worker   _SDT_PROBE(provider, name, 4, (arg1, arg2, arg3, arg4))
381*053f45beSAndroid Build Coastguard Worker #define STAP_PROBE5(provider, name, arg1, arg2, arg3, arg4, arg5) \
382*053f45beSAndroid Build Coastguard Worker   _SDT_PROBE(provider, name, 5, (arg1, arg2, arg3, arg4, arg5))
383*053f45beSAndroid Build Coastguard Worker #define STAP_PROBE6(provider, name, arg1, arg2, arg3, arg4, arg5, arg6)	\
384*053f45beSAndroid Build Coastguard Worker   _SDT_PROBE(provider, name, 6, (arg1, arg2, arg3, arg4, arg5, arg6))
385*053f45beSAndroid Build Coastguard Worker #define STAP_PROBE7(provider, name, arg1, arg2, arg3, arg4, arg5, arg6, arg7) \
386*053f45beSAndroid Build Coastguard Worker   _SDT_PROBE(provider, name, 7, (arg1, arg2, arg3, arg4, arg5, arg6, arg7))
387*053f45beSAndroid Build Coastguard Worker #define STAP_PROBE8(provider,name,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8) \
388*053f45beSAndroid Build Coastguard Worker   _SDT_PROBE(provider, name, 8, (arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8))
389*053f45beSAndroid Build Coastguard Worker #define STAP_PROBE9(provider,name,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9)\
390*053f45beSAndroid Build Coastguard Worker   _SDT_PROBE(provider, name, 9, (arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9))
391*053f45beSAndroid Build Coastguard Worker #define STAP_PROBE10(provider,name,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10) \
392*053f45beSAndroid Build Coastguard Worker   _SDT_PROBE(provider, name, 10, \
393*053f45beSAndroid Build Coastguard Worker 	     (arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10))
394*053f45beSAndroid Build Coastguard Worker #define STAP_PROBE11(provider,name,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11) \
395*053f45beSAndroid Build Coastguard Worker   _SDT_PROBE(provider, name, 11, \
396*053f45beSAndroid Build Coastguard Worker 	     (arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11))
397*053f45beSAndroid Build Coastguard Worker #define STAP_PROBE12(provider,name,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11,arg12) \
398*053f45beSAndroid Build Coastguard Worker   _SDT_PROBE(provider, name, 12, \
399*053f45beSAndroid Build Coastguard Worker 	     (arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11,arg12))
400*053f45beSAndroid Build Coastguard Worker 
401*053f45beSAndroid Build Coastguard Worker /* This STAP_PROBEV macro can be used in variadic scenarios, where the
402*053f45beSAndroid Build Coastguard Worker    number of probe arguments is not known until compile time.  Since
403*053f45beSAndroid Build Coastguard Worker    variadic macro support may vary with compiler options, you must
404*053f45beSAndroid Build Coastguard Worker    pre-#define SDT_USE_VARIADIC to enable this type of probe.
405*053f45beSAndroid Build Coastguard Worker 
406*053f45beSAndroid Build Coastguard Worker    The trick to count __VA_ARGS__ was inspired by this post by
407*053f45beSAndroid Build Coastguard Worker    Laurent Deniau <[email protected]>:
408*053f45beSAndroid Build Coastguard Worker        http://groups.google.com/group/comp.std.c/msg/346fc464319b1ee5
409*053f45beSAndroid Build Coastguard Worker 
410*053f45beSAndroid Build Coastguard Worker    Note that our _SDT_NARG is called with an extra 0 arg that's not
411*053f45beSAndroid Build Coastguard Worker    counted, so we don't have to worry about the behavior of macros
412*053f45beSAndroid Build Coastguard Worker    called without any arguments.  */
413*053f45beSAndroid Build Coastguard Worker 
414*053f45beSAndroid Build Coastguard Worker #define _SDT_NARG(...) __SDT_NARG(__VA_ARGS__, 12,11,10,9,8,7,6,5,4,3,2,1,0)
415*053f45beSAndroid Build Coastguard Worker #define __SDT_NARG(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12, N, ...) N
416*053f45beSAndroid Build Coastguard Worker #ifdef SDT_USE_VARIADIC
417*053f45beSAndroid Build Coastguard Worker #define _SDT_PROBE_N(provider, name, N, ...) \
418*053f45beSAndroid Build Coastguard Worker   _SDT_PROBE(provider, name, N, (__VA_ARGS__))
419*053f45beSAndroid Build Coastguard Worker #define STAP_PROBEV(provider, name, ...) \
420*053f45beSAndroid Build Coastguard Worker   _SDT_PROBE_N(provider, name, _SDT_NARG(0, ##__VA_ARGS__), ##__VA_ARGS__)
421*053f45beSAndroid Build Coastguard Worker #endif
422*053f45beSAndroid Build Coastguard Worker 
423*053f45beSAndroid Build Coastguard Worker /* These macros are for use in asm statements.  You must compile
424*053f45beSAndroid Build Coastguard Worker    with -std=gnu99 or -std=c99 to use the STAP_PROBE_ASM macro.
425*053f45beSAndroid Build Coastguard Worker 
426*053f45beSAndroid Build Coastguard Worker    The STAP_PROBE_ASM macro generates a quoted string to be used in the
427*053f45beSAndroid Build Coastguard Worker    template portion of the asm statement, concatenated with strings that
428*053f45beSAndroid Build Coastguard Worker    contain the actual assembly code around the probe site.
429*053f45beSAndroid Build Coastguard Worker 
430*053f45beSAndroid Build Coastguard Worker    For example:
431*053f45beSAndroid Build Coastguard Worker 
432*053f45beSAndroid Build Coastguard Worker 	asm ("before\n"
433*053f45beSAndroid Build Coastguard Worker 	     STAP_PROBE_ASM(provider, fooprobe, %eax 4(%esi))
434*053f45beSAndroid Build Coastguard Worker 	     "after");
435*053f45beSAndroid Build Coastguard Worker 
436*053f45beSAndroid Build Coastguard Worker    emits the assembly code for "before\nafter", with a probe in between.
437*053f45beSAndroid Build Coastguard Worker    The probe arguments are the %eax register, and the value of the memory
438*053f45beSAndroid Build Coastguard Worker    word located 4 bytes past the address in the %esi register.  Note that
439*053f45beSAndroid Build Coastguard Worker    because this is a simple asm, not a GNU C extended asm statement, these
440*053f45beSAndroid Build Coastguard Worker    % characters do not need to be doubled to generate literal %reg names.
441*053f45beSAndroid Build Coastguard Worker 
442*053f45beSAndroid Build Coastguard Worker    In a GNU C extended asm statement, the probe arguments can be specified
443*053f45beSAndroid Build Coastguard Worker    using the macro STAP_PROBE_ASM_TEMPLATE(n) for n arguments.  The paired
444*053f45beSAndroid Build Coastguard Worker    macro STAP_PROBE_ASM_OPERANDS gives the C values of these probe arguments,
445*053f45beSAndroid Build Coastguard Worker    and appears in the input operand list of the asm statement.  For example:
446*053f45beSAndroid Build Coastguard Worker 
447*053f45beSAndroid Build Coastguard Worker 	asm ("someinsn %0,%1\n" // %0 is output operand, %1 is input operand
448*053f45beSAndroid Build Coastguard Worker 	     STAP_PROBE_ASM(provider, fooprobe, STAP_PROBE_ASM_TEMPLATE(3))
449*053f45beSAndroid Build Coastguard Worker 	     "otherinsn %[namedarg]"
450*053f45beSAndroid Build Coastguard Worker 	     : "r" (outvar)
451*053f45beSAndroid Build Coastguard Worker 	     : "g" (some_value), [namedarg] "i" (1234),
452*053f45beSAndroid Build Coastguard Worker 	       STAP_PROBE_ASM_OPERANDS(3, some_value, some_ptr->field, 1234));
453*053f45beSAndroid Build Coastguard Worker 
454*053f45beSAndroid Build Coastguard Worker     This is just like writing:
455*053f45beSAndroid Build Coastguard Worker 
456*053f45beSAndroid Build Coastguard Worker 	STAP_PROBE3(provider, fooprobe, some_value, some_ptr->field, 1234));
457*053f45beSAndroid Build Coastguard Worker 
458*053f45beSAndroid Build Coastguard Worker     but the probe site is right between "someinsn" and "otherinsn".
459*053f45beSAndroid Build Coastguard Worker 
460*053f45beSAndroid Build Coastguard Worker     The probe arguments in STAP_PROBE_ASM can be given as assembly
461*053f45beSAndroid Build Coastguard Worker     operands instead, even inside a GNU C extended asm statement.
462*053f45beSAndroid Build Coastguard Worker     Note that these can use operand templates like %0 or %[name],
463*053f45beSAndroid Build Coastguard Worker     and likewise they must write %%reg for a literal operand of %reg.  */
464*053f45beSAndroid Build Coastguard Worker 
465*053f45beSAndroid Build Coastguard Worker #define _SDT_ASM_BODY_1(p,n,...) _SDT_ASM_BODY(p,n,_SDT_ASM_SUBSTR,(__VA_ARGS__))
466*053f45beSAndroid Build Coastguard Worker #define _SDT_ASM_BODY_2(p,n,...) _SDT_ASM_BODY(p,n,/*_SDT_ASM_STRING */,__VA_ARGS__)
467*053f45beSAndroid Build Coastguard Worker #define _SDT_ASM_BODY_N2(p,n,no,...) _SDT_ASM_BODY_ ## no(p,n,__VA_ARGS__)
468*053f45beSAndroid Build Coastguard Worker #define _SDT_ASM_BODY_N1(p,n,no,...) _SDT_ASM_BODY_N2(p,n,no,__VA_ARGS__)
469*053f45beSAndroid Build Coastguard Worker #define _SDT_ASM_BODY_N(p,n,...) _SDT_ASM_BODY_N1(p,n,_SDT_NARG(0, __VA_ARGS__),__VA_ARGS__)
470*053f45beSAndroid Build Coastguard Worker 
471*053f45beSAndroid Build Coastguard Worker #if __STDC_VERSION__ >= 199901L
472*053f45beSAndroid Build Coastguard Worker # define STAP_PROBE_ASM(provider, name, ...)		\
473*053f45beSAndroid Build Coastguard Worker   _SDT_ASM_BODY_N(provider, name, __VA_ARGS__)					\
474*053f45beSAndroid Build Coastguard Worker   _SDT_ASM_BASE
475*053f45beSAndroid Build Coastguard Worker # define STAP_PROBE_ASM_OPERANDS(n, ...) _SDT_ASM_OPERANDS_##n(__VA_ARGS__)
476*053f45beSAndroid Build Coastguard Worker #else
477*053f45beSAndroid Build Coastguard Worker # define STAP_PROBE_ASM(provider, name, args)	\
478*053f45beSAndroid Build Coastguard Worker   _SDT_ASM_BODY(provider, name, /* _SDT_ASM_STRING */, (args))	\
479*053f45beSAndroid Build Coastguard Worker   _SDT_ASM_BASE
480*053f45beSAndroid Build Coastguard Worker #endif
481*053f45beSAndroid Build Coastguard Worker #define STAP_PROBE_ASM_TEMPLATE(n) _SDT_ASM_TEMPLATE_##n,"use _SDT_ASM_TEMPLATE_"
482*053f45beSAndroid Build Coastguard Worker 
483*053f45beSAndroid Build Coastguard Worker 
484*053f45beSAndroid Build Coastguard Worker /* DTrace compatible macro names.  */
485*053f45beSAndroid Build Coastguard Worker #define DTRACE_PROBE(provider,probe)		\
486*053f45beSAndroid Build Coastguard Worker   STAP_PROBE(provider,probe)
487*053f45beSAndroid Build Coastguard Worker #define DTRACE_PROBE1(provider,probe,parm1)	\
488*053f45beSAndroid Build Coastguard Worker   STAP_PROBE1(provider,probe,parm1)
489*053f45beSAndroid Build Coastguard Worker #define DTRACE_PROBE2(provider,probe,parm1,parm2)	\
490*053f45beSAndroid Build Coastguard Worker   STAP_PROBE2(provider,probe,parm1,parm2)
491*053f45beSAndroid Build Coastguard Worker #define DTRACE_PROBE3(provider,probe,parm1,parm2,parm3) \
492*053f45beSAndroid Build Coastguard Worker   STAP_PROBE3(provider,probe,parm1,parm2,parm3)
493*053f45beSAndroid Build Coastguard Worker #define DTRACE_PROBE4(provider,probe,parm1,parm2,parm3,parm4)	\
494*053f45beSAndroid Build Coastguard Worker   STAP_PROBE4(provider,probe,parm1,parm2,parm3,parm4)
495*053f45beSAndroid Build Coastguard Worker #define DTRACE_PROBE5(provider,probe,parm1,parm2,parm3,parm4,parm5)	\
496*053f45beSAndroid Build Coastguard Worker   STAP_PROBE5(provider,probe,parm1,parm2,parm3,parm4,parm5)
497*053f45beSAndroid Build Coastguard Worker #define DTRACE_PROBE6(provider,probe,parm1,parm2,parm3,parm4,parm5,parm6) \
498*053f45beSAndroid Build Coastguard Worker   STAP_PROBE6(provider,probe,parm1,parm2,parm3,parm4,parm5,parm6)
499*053f45beSAndroid Build Coastguard Worker #define DTRACE_PROBE7(provider,probe,parm1,parm2,parm3,parm4,parm5,parm6,parm7) \
500*053f45beSAndroid Build Coastguard Worker   STAP_PROBE7(provider,probe,parm1,parm2,parm3,parm4,parm5,parm6,parm7)
501*053f45beSAndroid Build Coastguard Worker #define DTRACE_PROBE8(provider,probe,parm1,parm2,parm3,parm4,parm5,parm6,parm7,parm8) \
502*053f45beSAndroid Build Coastguard Worker   STAP_PROBE8(provider,probe,parm1,parm2,parm3,parm4,parm5,parm6,parm7,parm8)
503*053f45beSAndroid Build Coastguard Worker #define DTRACE_PROBE9(provider,probe,parm1,parm2,parm3,parm4,parm5,parm6,parm7,parm8,parm9) \
504*053f45beSAndroid Build Coastguard Worker   STAP_PROBE9(provider,probe,parm1,parm2,parm3,parm4,parm5,parm6,parm7,parm8,parm9)
505*053f45beSAndroid Build Coastguard Worker #define DTRACE_PROBE10(provider,probe,parm1,parm2,parm3,parm4,parm5,parm6,parm7,parm8,parm9,parm10) \
506*053f45beSAndroid Build Coastguard Worker   STAP_PROBE10(provider,probe,parm1,parm2,parm3,parm4,parm5,parm6,parm7,parm8,parm9,parm10)
507*053f45beSAndroid Build Coastguard Worker #define DTRACE_PROBE11(provider,probe,parm1,parm2,parm3,parm4,parm5,parm6,parm7,parm8,parm9,parm10,parm11) \
508*053f45beSAndroid Build Coastguard Worker   STAP_PROBE11(provider,probe,parm1,parm2,parm3,parm4,parm5,parm6,parm7,parm8,parm9,parm10,parm11)
509*053f45beSAndroid Build Coastguard Worker #define DTRACE_PROBE12(provider,probe,parm1,parm2,parm3,parm4,parm5,parm6,parm7,parm8,parm9,parm10,parm11,parm12) \
510*053f45beSAndroid Build Coastguard Worker   STAP_PROBE12(provider,probe,parm1,parm2,parm3,parm4,parm5,parm6,parm7,parm8,parm9,parm10,parm11,parm12)
511*053f45beSAndroid Build Coastguard Worker 
512*053f45beSAndroid Build Coastguard Worker 
513*053f45beSAndroid Build Coastguard Worker #endif /* sys/sdt.h */
514