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