1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
// Copyright (C) 2005-2008 Red Hat Inc.
// Copyright (C) 2006 Intel Corporation.
//
// This file is part of systemtap, and is free software. You can
// redistribute it and/or modify it under the terms of the GNU General
// Public License (GPL); either version 2, or (at your option) any
// later version.
#include <string.h>
#if _LP64
#define STAP_PROBE_STRUCT_ARG(arg) \
__uint64_t arg;
#else
#define STAP_PROBE_STRUCT_ARG(arg) \
long arg __attribute__ ((aligned(8)));
#endif
#define STAP_PROBE_STRUCT(probe,type,argc) \
struct _probe_ ## probe \
{ \
char probe_name [strlen(#probe)+1]; \
int probe_type; \
STAP_PROBE_STRUCT_ARG (probe_arg); \
}; \
static volatile struct _probe_ ## probe _probe_ ## probe __attribute__ ((section (".probes"))) = {#probe,type,argc};
#ifdef USE_STAP_PROBE
#define STAP_PROBE(provider,probe) \
STAP_PROBE_STRUCT(probe,0,0) \
_stap_probe_0 (_probe_ ## probe.probe_name);
#else
#define STAP_PROBE(provider,probe) \
_probe_ ## probe: \
asm volatile ("nop"); \
STAP_PROBE_STRUCT(probe,1,(size_t)&& _probe_ ## probe) \
if (__builtin_expect(_probe_ ## probe.probe_type < 0, 0)) \
goto _probe_ ## probe;
#endif
#ifdef USE_STAP_PROBE
#define STAP_PROBE1(provider,probe,arg1) \
STAP_PROBE_STRUCT(probe,0,1) \
_stap_probe_1 (_probe_ ## probe.probe_name,(size_t)arg1);
#else
#define STAP_PROBE1(provider,probe,parm1) \
volatile typeof(parm1) probe ## _arg1 = parm1; \
_probe_ ## probe: \
asm volatile ("nop" :: "r"(probe ## _arg1)); \
STAP_PROBE_STRUCT(probe,1,(size_t)&& _probe_ ## probe) \
if (__builtin_expect(_probe_ ## probe.probe_type < 0, 0)) \
goto _probe_ ## probe;
#endif
#ifdef USE_STAP_PROBE
#define STAP_PROBE2(provider,probe,arg1,arg2) \
STAP_PROBE_STRUCT(probe,0,2) \
_stap_probe_2 (_probe_ ## probe.probe_name,(size_t)arg1,(size_t)arg2);
#else
#define STAP_PROBE2(provider,probe,parm1,parm2) \
volatile typeof(parm1) probe ## _arg1 = parm1; \
volatile typeof(parm2) probe ## _arg2 = parm2; \
_probe_ ## probe: \
asm volatile ("nop" :: "r"(probe ## _arg1), "r"(probe ## _arg2)); \
STAP_PROBE_STRUCT(probe,1,(size_t)&& _probe_ ## probe)\
if (__builtin_expect(_probe_ ## probe.probe_type < 0, 0)) \
goto _probe_ ## probe;
#endif
#ifdef USE_STAP_PROBE
#define STAP_PROBE3(provider,probe,arg1,arg2,arg3) \
STAP_PROBE_STRUCT(probe,0,3) \
_stap_probe_3 (_probe_ ## probe.probe_name,(size_t)arg1,(size_t)arg2,(size_t)arg3);
#else
#define STAP_PROBE3(provider,probe,parm1,parm2,parm3) \
volatile typeof(parm1) probe ## _arg1 = parm1; \
volatile typeof(parm2) probe ## _arg2 = parm2; \
volatile typeof(parm3) probe ## _arg3 = parm3; \
_probe_ ## probe: \
asm volatile ("nop" :: "r"(probe ## _arg1), "r"(probe ## _arg2), "r"(probe ## _arg3)); \
STAP_PROBE_STRUCT(probe,1,(size_t)&& _probe_ ## probe) \
if (__builtin_expect(_probe_ ## probe.probe_type < 0, 0)) \
goto _probe_ ## probe;
#endif
#ifdef USE_STAP_PROBE
#define STAP_PROBE4(provider,probe,arg1,arg2,arg3,arg4) \
STAP_PROBE_STRUCT(probe,0,4) \
_stap_probe_4 (_probe_ ## probe.probe_name,(size_t)arg1,(size_t)arg2,(size_t)arg3,(size_t)arg4);
#else
#define STAP_PROBE4(provider,probe,parm1,parm2,parm3,parm4) \
volatile typeof(parm1) probe ## _arg1 = parm1; \
volatile typeof(parm2) probe ## _arg2 = parm2; \
volatile typeof(parm3) probe ## _arg3 = parm3; \
volatile typeof(parm4) probe ## _arg4 = parm4; \
_probe_ ## probe: \
asm volatile ("nop" "r"(probe ## _arg1), "r"(probe ## _arg2), "r"(probe ## _arg3), "r"(probe ## _arg4)); \
STAP_PROBE_STRUCT(probe,1,(size_t)&& _probe_ ## probe) \
if (__builtin_expect(_probe_ ## probe.probe_type < 0, 0)) \
goto _probe_ ## probe;
#endif
#ifdef USE_STAP_PROBE
#define STAP_PROBE5(provider,probe,arg1,arg2,arg3,arg4,arg5) \
STAP_PROBE_STRUCT(probe,0,5) \
_stap_probe_5 (_probe_ ## probe.probe_name,(size_t)arg1,(size_t)arg2,(size_t)arg3,(size_t)arg4,(size_t)arg5);
#else
#define STAP_PROBE5(provider,probe,parm1,parm2,parm3,parm4,parm5) \
volatile typeof(parm1) probe ## _arg1 = parm1; \
volatile typeof(parm2) probe ## _arg2 = parm2; \
volatile typeof(parm3) probe ## _arg3 = parm3; \
volatile typeof(parm4) probe ## _arg4 = parm4; \
volatile typeof(parm5) probe ## _arg5 = parm5; \
_probe_ ## probe: \
asm volatile ("nop" "r"(probe ## _arg1), "r"(probe ## _arg2), "r"(probe ## _arg3), "r"(probe ## _arg4), "r"(probe ## _arg5)); \
STAP_PROBE_STRUCT(probe,1,(size_t)&& _probe_ ## probe) \
if (__builtin_expect(_probe_ ## probe.probe_type < 0, 0)) \
goto _probe_ ## probe;
#endif
#define DTRACE_PROBE(provider,probe) \
STAP_PROBE(provider,probe)
#define DTRACE_PROBE1(provider,probe,parm1) \
STAP_PROBE1(provider,probe,parm1)
#define DTRACE_PROBE2(provider,probe,parm1,parm2) \
STAP_PROBE2(provider,probe,parm1,parm2)
#define DTRACE_PROBE3(provider,probe,parm1,parm2,parm3) \
STAP_PROBE3(provider,probe,parm1,parm2,parm3)
#define DTRACE_PROBE4(provider,probe,parm1,parm2,parm3,parm4) \
STAP_PROBE4(provider,probe,parm1,parm2,parm3,parm4)
|