1 | /*␊ |
2 | * CDDL HEADER START␊ |
3 | *␊ |
4 | * The contents of this file are subject to the terms of the␊ |
5 | * Common Development and Distribution License, Version 1.0 only␊ |
6 | * (the "License"). You may not use this file except in compliance␊ |
7 | * with the License.␊ |
8 | *␊ |
9 | * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE␊ |
10 | * or http://www.opensolaris.org/os/licensing.␊ |
11 | * See the License for the specific language governing permissions␊ |
12 | * and limitations under the License.␊ |
13 | *␊ |
14 | * When distributing Covered Code, include this CDDL HEADER in each␊ |
15 | * file and include the License file at usr/src/OPENSOLARIS.LICENSE.␊ |
16 | * If applicable, add the following below this CDDL HEADER, with the␊ |
17 | * fields enclosed by brackets "[]" replaced with your own identifying␊ |
18 | * information: Portions Copyright [yyyy] [name of copyright owner]␊ |
19 | *␊ |
20 | * CDDL HEADER END␊ |
21 | */␊ |
22 | /*␊ |
23 | * Copyright 2004 Sun Microsystems, Inc. All rights reserved.␊ |
24 | * Use is subject to license terms.␊ |
25 | */␊ |
26 | ␊ |
27 | #ifndef _MACH_I386_SDT_ISA_H␊ |
28 | #define␉_MACH_I386_SDT_ISA_H␊ |
29 | ␊ |
30 | /*␊ |
31 | * Only define when testing. This makes the calls into actual calls to␊ |
32 | * test functions.␊ |
33 | */␊ |
34 | /* #define DTRACE_CALL_TEST */␊ |
35 | ␊ |
36 | #define DTRACE_STRINGIFY(s) #s␊ |
37 | #define DTRACE_TOSTRING(s) DTRACE_STRINGIFY(s)␊ |
38 | #define DTRACE_LABEL(p, n)␉␉␉␉␉␉␉␉␉\␊ |
39 | ␉"__dtrace_probe$" DTRACE_TOSTRING(__LINE__) DTRACE_STRINGIFY(_##p##___##n) ":"␉"\n\t"␊ |
40 | ␊ |
41 | #ifdef DTRACE_CALL_TEST␊ |
42 | ␊ |
43 | #define DTRACE_CALL(p,n)␉\␊ |
44 | ␉DTRACE_LABEL(p,n)␉\␊ |
45 | ␉DTRACE_CALL_INSN(p,n)␊ |
46 | ␊ |
47 | #else␊ |
48 | ␊ |
49 | #define DTRACE_CALL(p,n)␉\␊ |
50 | ␉DTRACE_LABEL(p,n)␉\␊ |
51 | ␉DTRACE_NOPS␊ |
52 | ␊ |
53 | #endif␊ |
54 | ␊ |
55 | #ifdef __x86_64__␊ |
56 | ␊ |
57 | #define DTRACE_NOPS␉␉␉\␊ |
58 | ␉"nop"␉␉␉"\n\t"␉\␊ |
59 | ␉"nop"␉␉␉"\n\t"␉\␊ |
60 | ␉"nop"␉␉␉"\n\t"␉␊ |
61 | ␊ |
62 | #define DTRACE_CALL_INSN(p,n)␉␉␉␉␉␉\␊ |
63 | ␉"call _dtracetest" DTRACE_STRINGIFY(_##p##_##n)␉"\n\t"␊ |
64 | ␊ |
65 | #define ARG1_EXTENT␉1␊ |
66 | #define ARGS2_EXTENT␉2␊ |
67 | #define ARGS3_EXTENT␉3␊ |
68 | #define ARGS4_EXTENT␉4␊ |
69 | #define ARGS5_EXTENT␉5␊ |
70 | #define ARGS6_EXTENT␉6␊ |
71 | #define ARGS7_EXTENT␉7␊ |
72 | #define ARGS8_EXTENT␉8␊ |
73 | #define ARGS9_EXTENT␉10␉␊ |
74 | #define ARGS10_EXTENT␉10␉␊ |
75 | ␊ |
76 | #define DTRACE_CALL0ARGS(provider, name)␉␉␉␉␉␉␉\␊ |
77 | ␉asm volatile (␉␉␉␉␉␉␉␉␉␉\␊ |
78 | ␉␉ DTRACE_CALL(provider, name)␉␉␉␉␉␉\␊ |
79 | ␉);␊ |
80 | ␊ |
81 | #define DTRACE_CALL1ARG(provider, name)␉␉␉␉␉␉␉␉\␊ |
82 | ␉asm volatile ("movq\t0x0(%0),%%rdi"␉␉␉␉␉␉"\n\t"␉\␊ |
83 | ␉␉ DTRACE_CALL(provider, name)␉␉␉␉␉␉\␊ |
84 | ␉ :␉␉␉␉␉␉␉␉␉␉\␊ |
85 | ␉ : "r" (__dtrace_args)␉␉␉␉␉␉␉\␊ |
86 | ␉ : "memory", "rdi"␉␉␉␉␉␉␉␉\␊ |
87 | ␉);␊ |
88 | ␊ |
89 | #define DTRACE_CALL2ARGS(provider, name)␉␉␉␉␉␉␉\␊ |
90 | ␉asm volatile ("movq\t0x0(%0),%%rdi"␉␉␉␉␉␉"\n\t"␉\␊ |
91 | ␉ "movq\t0x8(%0),%%rsi"␉␉␉␉␉␉"\n\t"␉\␊ |
92 | ␉␉ DTRACE_CALL(provider, name)␉␉␉␉␉␉\␊ |
93 | ␉ :␉␉␉␉␉␉␉␉␉␉\␊ |
94 | ␉ : "r" (__dtrace_args)␉␉␉␉␉␉␉\␊ |
95 | ␉ : "memory", "rdi", "rsi"␉␉␉␉␉␉␉\␊ |
96 | ␉);␊ |
97 | ␊ |
98 | #define DTRACE_CALL3ARGS(provider, name)␉␉␉␉␉␉␉\␊ |
99 | ␉asm volatile ("movq\t0x0(%0),%%rdi"␉␉␉␉␉␉"\n\t"␉\␊ |
100 | ␉ "movq\t0x8(%0),%%rsi"␉␉␉␉␉␉"\n\t"␉\␊ |
101 | ␉ "movq\t0x10(%0),%%rdx"␉␉␉␉␉␉"\n\t"␉\␊ |
102 | ␉␉ DTRACE_CALL(provider, name)␉␉␉␉␉␉\␊ |
103 | ␉ :␉␉␉␉␉␉␉␉␉␉\␊ |
104 | ␉ : "r" (__dtrace_args)␉␉␉␉␉␉␉\␊ |
105 | ␉ : "memory", "rdi", "rsi", "rdx"␉␉␉␉␉␉\␊ |
106 | ␉);␊ |
107 | ␊ |
108 | #define DTRACE_CALL4ARGS(provider, name)␉␉␉␉␉␉␉\␊ |
109 | ␉asm volatile ("movq\t0x0(%0),%%rdi"␉␉␉␉␉␉"\n\t"␉\␊ |
110 | ␉ "movq\t0x8(%0),%%rsi"␉␉␉␉␉␉"\n\t"␉\␊ |
111 | ␉ "movq\t0x10(%0),%%rdx"␉␉␉␉␉␉"\n\t"␉\␊ |
112 | ␉ "movq\t0x18(%0),%%rcx"␉␉␉␉␉␉"\n\t"␉\␊ |
113 | ␉␉ DTRACE_CALL(provider, name)␉␉␉␉␉␉\␊ |
114 | ␉ :␉␉␉␉␉␉␉␉␉␉\␊ |
115 | ␉ : "r" (__dtrace_args)␉␉␉␉␉␉␉\␊ |
116 | ␉ : "memory", "rdi", "rsi", "rdx", "rcx"␉␉␉␉␉\␊ |
117 | ␉);␊ |
118 | ␊ |
119 | #define DTRACE_CALL5ARGS(provider, name)␉␉␉␉␉␉␉\␊ |
120 | ␉asm volatile ("movq\t0x0(%0),%%rdi"␉␉␉␉␉␉"\n\t"␉\␊ |
121 | ␉ "movq\t0x8(%0),%%rsi"␉␉␉␉␉␉"\n\t"␉\␊ |
122 | ␉ "movq\t0x10(%0),%%rdx"␉␉␉␉␉␉"\n\t"␉\␊ |
123 | ␉ "movq\t0x18(%0),%%rcx"␉␉␉␉␉␉"\n\t"␉\␊ |
124 | ␉ "movq\t0x20(%0),%%r8"␉␉␉␉␉␉"\n\t"␉\␊ |
125 | ␉␉ DTRACE_CALL(provider, name)␉␉␉␉␉␉\␊ |
126 | ␉ :␉␉␉␉␉␉␉␉␉␉\␊ |
127 | ␉ : "r" (__dtrace_args)␉␉␉␉␉␉␉\␊ |
128 | ␉ : "memory", "rdi", "rsi", "rdx", "rcx", "r8"␉␉␉␉\␊ |
129 | ␉);␊ |
130 | ␊ |
131 | #define DTRACE_CALL6ARGS(provider, name)␉␉␉␉␉␉␉\␊ |
132 | ␉asm volatile ("movq\t0x0(%0),%%rdi"␉␉␉␉␉␉"\n\t"␉\␊ |
133 | ␉ "movq\t0x8(%0),%%rsi"␉␉␉␉␉␉"\n\t"␉\␊ |
134 | ␉ "movq\t0x10(%0),%%rdx"␉␉␉␉␉␉"\n\t"␉\␊ |
135 | ␉ "movq\t0x18(%0),%%rcx"␉␉␉␉␉␉"\n\t"␉\␊ |
136 | ␉ "movq\t0x20(%0),%%r8"␉␉␉␉␉␉"\n\t"␉\␊ |
137 | ␉ "movq\t0x28(%0),%%r9"␉␉␉␉␉␉"\n\t"␉\␊ |
138 | ␉␉ DTRACE_CALL(provider, name)␉␉␉␉␉␉\␊ |
139 | ␉ :␉␉␉␉␉␉␉␉␉␉\␊ |
140 | ␉ : "r" (__dtrace_args)␉␉␉␉␉␉␉\␊ |
141 | ␉ : "memory", "rdi", "rsi", "rdx", "rcx", "r8", "r9"␉␉␉\␊ |
142 | ␉);␊ |
143 | ␊ |
144 | #define DTRACE_CALL7ARGS(provider, name)␉␉␉␉␉␉␉\␊ |
145 | ␉asm volatile ("subq\t$0x8,%%rsp"␉␉␉␉␉␉"\n\t"␉\␊ |
146 | ␉ "movq\t0x0(%0),%%rdi"␉␉␉␉␉␉"\n\t"␉\␊ |
147 | ␉ "movq\t0x8(%0),%%rsi"␉␉␉␉␉␉"\n\t"␉\␊ |
148 | ␉ "movq\t0x10(%0),%%rdx"␉␉␉␉␉␉"\n\t"␉\␊ |
149 | ␉ "movq\t0x18(%0),%%rcx"␉␉␉␉␉␉"\n\t"␉\␊ |
150 | ␉ "movq\t0x20(%0),%%r8"␉␉␉␉␉␉"\n\t"␉\␊ |
151 | ␉ "movq\t0x28(%0),%%r9"␉␉␉␉␉␉"\n\t"␉\␊ |
152 | ␉ "movq\t0x30(%0),%%rax"␉␉␉␉␉␉"\n\t"␉\␊ |
153 | ␉ "movq\t%%rax,0x0(%%rsp)"␉␉␉␉␉␉"\n\t"␉\␊ |
154 | ␉␉ DTRACE_CALL(provider, name)␉␉␉␉␉␉\␊ |
155 | ␉ "addq\t$0x8,%%rsp"␉␉␉␉␉␉"\n\t"␉\␊ |
156 | ␉ :␉␉␉␉␉␉␉␉␉␉\␊ |
157 | ␉ : "r" (__dtrace_args)␉␉␉␉␉␉␉\␊ |
158 | ␉ : "memory", "rdi", "rsi", "rdx", "rcx", "r8", "r9", "rax"␉␉␉\␊ |
159 | ␉);␊ |
160 | ␊ |
161 | #endif // __x86_64__␊ |
162 | ␊ |
163 | #ifdef __i386__␊ |
164 | ␊ |
165 | #define DTRACE_NOPS␉␉␉\␊ |
166 | ␉"nop"␉␉␉"\n\t"␉\␊ |
167 | ␉"leal 0(%%esi), %%esi"␉"\n\t"␉␊ |
168 | ␊ |
169 | #define DTRACE_CALL_INSN(p,n)␉␉␉␉␉␉\␊ |
170 | ␉"call _dtracetest" DTRACE_STRINGIFY(_##p##_##n)␉"\n\t"␊ |
171 | ␊ |
172 | #define ARG1_EXTENT␉1␊ |
173 | #define ARGS2_EXTENT␉2␊ |
174 | #define ARGS3_EXTENT␉4␊ |
175 | #define ARGS4_EXTENT␉4␊ |
176 | #define ARGS5_EXTENT␉8␊ |
177 | #define ARGS6_EXTENT␉8␊ |
178 | #define ARGS7_EXTENT␉8␊ |
179 | #define ARGS8_EXTENT␉8␊ |
180 | #define ARGS9_EXTENT␉12␉␊ |
181 | #define ARGS10_EXTENT␉12␉␊ |
182 | ␊ |
183 | /*␊ |
184 | * Because this code is used in the kernel, we must not touch any floating point␊ |
185 | * or specialized registers. This leaves the following registers:␊ |
186 | *␊ |
187 | * eax ; volatile, safe to use␊ |
188 | * ebx ; PIC register, gcc error when used␊ |
189 | * ecx ; volatile, safe to use␊ |
190 | * edx ; volatile, safe to use␊ |
191 | * esi ; non-volatile, otherwise safe to use␊ |
192 | * edi ; non-volatile, otherwise safe to use␊ |
193 | *␊ |
194 | * Using any of the non volatile register causes a spill to stack which is almost␊ |
195 | * certainly a net performance loss. Also, note that the array ref (__dtrace_args)␊ |
196 | * consumes one free register. If all three of the volatile regs are used for load/store,␊ |
197 | * the compiler will spill a register to hold the array ref.␊ |
198 | *␊ |
199 | * The end result is that we only pipeline two loads/stores at a time. Blech.␊ |
200 | */␊ |
201 | ␊ |
202 | #define DTRACE_CALL0ARGS(provider, name)␉␉␉␉␉␉␉\␊ |
203 | ␉asm volatile (␉␉␉␉␉␉␉␉␉␉\␊ |
204 | ␉ DTRACE_CALL(provider, name)␉␉␉␉␉␉\␊ |
205 | ␉ "# eat trailing nl +tabfrom DTRACE_CALL"␉␉␉␉␉\␊ |
206 | ␉ :␉␉␉␉␉␉␉␉␉␉\␊ |
207 | ␉ :␉␉␉␉␉␉␉␉␉␉\␊ |
208 | ␉);␊ |
209 | ␊ |
210 | #define DTRACE_CALL1ARG(provider, name)␉␉␉␉␉␉␉␉\␊ |
211 | ␉asm volatile ("subl\t$0x10,%%esp"␉␉␉␉␉␉"\n\t"␉\␊ |
212 | ␉ "movl\t0x0(%0),%%eax"␉␉␉␉␉␉"\n\t"␉\␊ |
213 | ␉ "movl\t%%eax,0x0(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
214 | ␉ DTRACE_CALL(provider, name)␉␉␉␉␉␉\␊ |
215 | "addl\t$0x10,%%esp"␉␉␉␉␉␉␉\␊ |
216 | ␉ :␉␉␉␉␉␉␉␉␉␉\␊ |
217 | ␉ : "r" (__dtrace_args)␉␉ ␉␉␉␉␉\␊ |
218 | ␉ : "memory", "eax"␉␉␉␉␉␉␉␉\␊ |
219 | ␉);␊ |
220 | ␊ |
221 | #define DTRACE_CALL2ARGS(provider, name)␉␉␉␉␉␉␉\␊ |
222 | ␉asm volatile ("subl\t$0x10,%%esp"␉␉␉␉␉␉"\n\t"␉\␊ |
223 | ␉ "movl\t0x0(%0),%%eax"␉␉␉␉␉␉"\n\t"␉\␊ |
224 | ␉␉ "movl\t0x4(%0),%%edx"␉␉␉␉␉␉"\n\t"␉\␊ |
225 | ␉ "movl\t%%eax,0x0(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
226 | ␉ "movl\t%%edx,0x4(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
227 | ␉ DTRACE_CALL(provider, name)␉␉␉␉␉␉\␊ |
228 | "addl\t$0x10,%%esp"␉␉␉␉␉␉␉\␊ |
229 | ␉ :␉␉␉␉␉␉␉␉␉␉\␊ |
230 | ␉ : "r" (__dtrace_args)␉␉␉␉␉␉␉\␊ |
231 | ␉ : "memory", "eax", "edx"␉␉␉␉␉␉␉\␊ |
232 | ␉);␊ |
233 | ␊ |
234 | #define DTRACE_CALL3ARGS(provider, name)␉␉␉␉␉␉␉\␊ |
235 | ␉asm volatile ("subl\t$0x10,%%esp"␉␉␉␉␉␉"\n\t"␉\␊ |
236 | ␉ "movl\t0x0(%0),%%eax"␉␉␉␉␉␉"\n\t"␉\␊ |
237 | ␉␉ "movl\t0x4(%0),%%edx"␉␉␉␉␉␉"\n\t"␉\␊ |
238 | ␉ "movl\t%%eax,0x0(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
239 | ␉ "movl\t%%edx,0x4(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
240 | ␉ "movl\t0x8(%0),%%eax"␉␉␉␉␉␉"\n\t"␉\␊ |
241 | ␉ "movl\t%%eax,0x8(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
242 | ␉ DTRACE_CALL(provider, name)␉␉␉␉␉␉\␊ |
243 | "addl\t$0x10,%%esp"␉␉␉␉␉␉␉\␊ |
244 | ␉ :␉␉␉␉␉␉␉␉␉␉\␊ |
245 | ␉ : "r" (__dtrace_args)␉␉␉␉␉␉␉\␊ |
246 | ␉ : "memory", "eax", "edx"␉␉␉␉␉␉␉\␊ |
247 | ␉);␊ |
248 | ␊ |
249 | #define DTRACE_CALL4ARGS(provider, name)␉␉␉␉␉␉␉\␊ |
250 | ␉asm volatile ("subl\t$0x10,%%esp"␉␉␉␉␉␉"\n\t"␉\␊ |
251 | ␉ "movl\t0x0(%0),%%eax"␉␉␉␉␉␉"\n\t"␉\␊ |
252 | ␉␉ "movl\t0x4(%0),%%edx"␉␉␉␉␉␉"\n\t"␉\␊ |
253 | ␉ "movl\t%%eax,0x0(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
254 | ␉ "movl\t%%edx,0x4(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
255 | ␉ "movl\t0x8(%0),%%eax"␉␉␉␉␉␉"\n\t"␉\␊ |
256 | ␉␉ "movl\t0xC(%0),%%edx"␉␉␉␉␉␉"\n\t"␉\␊ |
257 | ␉ "movl\t%%eax,0x8(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
258 | ␉ "movl\t%%edx,0xC(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
259 | ␉ DTRACE_CALL(provider, name)␉␉␉␉␉␉\␊ |
260 | "addl\t$0x10,%%esp"␉␉␉␉␉␉␉\␊ |
261 | ␉ :␉␉␉␉␉␉␉␉␉␉\␊ |
262 | ␉ : "r" (__dtrace_args)␉␉␉␉␉␉␉\␊ |
263 | ␉ : "memory", "eax", "edx"␉ ␉␉␉␉␉␉\␊ |
264 | ␉);␊ |
265 | ␊ |
266 | #define DTRACE_CALL5ARGS(provider, name)␉␉␉␉␉␉␉\␊ |
267 | ␉asm volatile ("subl\t$0x20,%%esp"␉␉␉␉␉␉"\n\t"␉\␊ |
268 | ␉ "movl\t0x0(%0),%%eax"␉␉␉␉␉␉"\n\t"␉\␊ |
269 | ␉␉ "movl\t0x4(%0),%%edx"␉␉␉␉␉␉"\n\t"␉\␊ |
270 | ␉ "movl\t%%eax,0x0(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
271 | ␉ "movl\t%%edx,0x4(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
272 | ␉ "movl\t0x8(%0),%%eax"␉␉␉␉␉␉"\n\t"␉\␊ |
273 | ␉␉ "movl\t0xC(%0),%%edx"␉␉␉␉␉␉"\n\t"␉\␊ |
274 | ␉ "movl\t%%eax,0x8(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
275 | ␉ "movl\t%%edx,0xC(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
276 | ␉ "movl\t0x10(%0),%%eax"␉␉␉␉␉␉"\n\t"␉\␊ |
277 | ␉ "movl\t%%eax,0x10(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
278 | ␉ DTRACE_CALL(provider, name)␉␉␉␉␉␉\␊ |
279 | "addl\t$0x20,%%esp"␉␉␉␉␉␉␉\␊ |
280 | ␉ :␉␉␉␉␉␉␉␉␉␉\␊ |
281 | ␉ : "r" (__dtrace_args)␉␉␉␉␉␉␉\␊ |
282 | ␉ : "memory", "eax", "edx"␉ ␉␉␉␉␉␉\␊ |
283 | ␉);␊ |
284 | ␊ |
285 | #define DTRACE_CALL6ARGS(provider, name)␉␉␉␉␉␉␉\␊ |
286 | ␉asm volatile ("subl\t$0x20,%%esp"␉␉␉␉␉␉"\n\t"␉\␊ |
287 | ␉ "movl\t0x0(%0),%%eax"␉␉␉␉␉␉"\n\t"␉\␊ |
288 | ␉␉ "movl\t0x4(%0),%%edx"␉␉␉␉␉␉"\n\t"␉\␊ |
289 | ␉ "movl\t%%eax,0x0(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
290 | ␉ "movl\t%%edx,0x4(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
291 | ␉ "movl\t0x8(%0),%%eax"␉␉␉␉␉␉"\n\t"␉\␊ |
292 | ␉␉ "movl\t0xC(%0),%%edx"␉␉␉␉␉␉"\n\t"␉\␊ |
293 | ␉ "movl\t%%eax,0x8(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
294 | ␉ "movl\t%%edx,0xC(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
295 | ␉ "movl\t0x10(%0),%%eax"␉␉␉␉␉␉"\n\t"␉\␊ |
296 | ␉␉ "movl\t0x14(%0),%%edx"␉␉␉␉␉␉"\n\t"␉\␊ |
297 | ␉ "movl\t%%eax,0x10(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
298 | ␉ "movl\t%%edx,0x14(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
299 | ␉ DTRACE_CALL(provider, name)␉␉␉␉␉␉\␊ |
300 | "addl\t$0x20,%%esp"␉␉␉␉␉␉␉\␊ |
301 | ␉ :␉␉␉␉␉␉␉␉␉␉\␊ |
302 | ␉ : "r" (__dtrace_args)␉␉␉␉␉␉␉\␊ |
303 | ␉ : "memory", "eax", "edx"␉ ␉␉␉␉␉␉\␊ |
304 | ␉);␊ |
305 | ␊ |
306 | #define DTRACE_CALL7ARGS(provider, name)␉␉␉␉␉␉␉\␊ |
307 | ␉asm volatile ("subl\t$0x20,%%esp"␉␉␉␉␉␉"\n\t"␉\␊ |
308 | ␉ "movl\t0x0(%0),%%eax"␉␉␉␉␉␉"\n\t"␉\␊ |
309 | ␉␉ "movl\t0x4(%0),%%edx"␉␉␉␉␉␉"\n\t"␉\␊ |
310 | ␉ "movl\t%%eax,0x0(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
311 | ␉ "movl\t%%edx,0x4(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
312 | ␉ "movl\t0x8(%0),%%eax"␉␉␉␉␉␉"\n\t"␉\␊ |
313 | ␉␉ "movl\t0xC(%0),%%edx"␉␉␉␉␉␉"\n\t"␉\␊ |
314 | ␉ "movl\t%%eax,0x8(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
315 | ␉ "movl\t%%edx,0xC(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
316 | ␉ "movl\t0x10(%0),%%eax"␉␉␉␉␉␉"\n\t"␉\␊ |
317 | ␉␉ "movl\t0x14(%0),%%edx"␉␉␉␉␉␉"\n\t"␉\␊ |
318 | ␉ "movl\t%%eax,0x10(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
319 | ␉ "movl\t%%edx,0x14(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
320 | ␉ "movl\t0x18(%0),%%eax"␉␉␉␉␉␉"\n\t"␉\␊ |
321 | ␉ "movl\t%%eax,0x18(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
322 | ␉ DTRACE_CALL(provider, name)␉␉␉␉␉␉\␊ |
323 | "addl\t$0x20,%%esp"␉␉␉␉␉␉␉\␊ |
324 | ␉ :␉␉␉␉␉␉␉␉␉␉\␊ |
325 | ␉ : "r" (__dtrace_args)␉␉␉␉␉␉␉\␊ |
326 | ␉ : "memory", "eax", "edx"␉ ␉␉␉␉␉␉\␊ |
327 | ␉);␊ |
328 | ␊ |
329 | #define DTRACE_CALL8ARGS(provider, name)␉␉␉␉␉␉␉\␊ |
330 | ␉asm volatile ("subl\t$0x20,%%esp"␉␉␉␉␉␉"\n\t"␉\␊ |
331 | ␉ "movl\t0x0(%0),%%eax"␉␉␉␉␉␉"\n\t"␉\␊ |
332 | ␉␉ "movl\t0x4(%0),%%edx"␉␉␉␉␉␉"\n\t"␉\␊ |
333 | ␉ "movl\t%%eax,0x0(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
334 | ␉ "movl\t%%edx,0x4(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
335 | ␉ "movl\t0x8(%0),%%eax"␉␉␉␉␉␉"\n\t"␉\␊ |
336 | ␉␉ "movl\t0xC(%0),%%edx"␉␉␉␉␉␉"\n\t"␉\␊ |
337 | ␉ "movl\t%%eax,0x8(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
338 | ␉ "movl\t%%edx,0xC(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
339 | ␉ "movl\t0x10(%0),%%eax"␉␉␉␉␉␉"\n\t"␉\␊ |
340 | ␉␉ "movl\t0x14(%0),%%edx"␉␉␉␉␉␉"\n\t"␉\␊ |
341 | ␉ "movl\t%%eax,0x10(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
342 | ␉ "movl\t%%edx,0x14(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
343 | ␉ "movl\t0x18(%0),%%eax"␉␉␉␉␉␉"\n\t"␉\␊ |
344 | ␉␉ "movl\t0x1C(%0),%%edx"␉␉␉␉␉␉"\n\t"␉\␊ |
345 | ␉ "movl\t%%eax,0x18(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
346 | ␉ "movl\t%%edx,0x1C(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
347 | ␉ DTRACE_CALL(provider, name)␉␉␉␉␉␉\␊ |
348 | "addl\t$0x20,%%esp"␉␉␉␉␉␉␉\␊ |
349 | ␉ :␉␉␉␉␉␉␉␉␉␉\␊ |
350 | ␉ : "r" (__dtrace_args)␉␉␉␉␉␉␉\␊ |
351 | ␉ : "memory", "eax", "edx"␉ ␉␉␉␉␉␉\␊ |
352 | ␉);␊ |
353 | ␊ |
354 | #define DTRACE_CALL9ARGS(provider, name)␉␉␉␉␉␉␉\␊ |
355 | ␉asm volatile ("subl\t$0x30,%%esp"␉␉␉␉␉␉"\n\t"␉\␊ |
356 | ␉ "movl\t0x0(%0),%%eax"␉␉␉␉␉␉"\n\t"␉\␊ |
357 | ␉␉ "movl\t0x4(%0),%%edx"␉␉␉␉␉␉"\n\t"␉\␊ |
358 | ␉ "movl\t%%eax,0x0(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
359 | ␉ "movl\t%%edx,0x4(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
360 | ␉ "movl\t0x8(%0),%%eax"␉␉␉␉␉␉"\n\t"␉\␊ |
361 | ␉␉ "movl\t0xC(%0),%%edx"␉␉␉␉␉␉"\n\t"␉\␊ |
362 | ␉ "movl\t%%eax,0x8(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
363 | ␉ "movl\t%%edx,0xC(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
364 | ␉ "movl\t0x10(%0),%%eax"␉␉␉␉␉␉"\n\t"␉\␊ |
365 | ␉␉ "movl\t0x14(%0),%%edx"␉␉␉␉␉␉"\n\t"␉\␊ |
366 | ␉ "movl\t%%eax,0x10(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
367 | ␉ "movl\t%%edx,0x14(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
368 | ␉ "movl\t0x18(%0),%%eax"␉␉␉␉␉␉"\n\t"␉\␊ |
369 | ␉␉ "movl\t0x1C(%0),%%edx"␉␉␉␉␉␉"\n\t"␉\␊ |
370 | ␉ "movl\t%%eax,0x18(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
371 | ␉ "movl\t%%edx,0x1C(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
372 | ␉ "movl\t0x20(%0),%%eax"␉␉␉␉␉␉"\n\t"␉\␊ |
373 | ␉ "movl\t%%eax,0x20(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
374 | ␉ DTRACE_CALL(provider, name)␉␉␉␉␉␉\␊ |
375 | "addl\t$0x30,%%esp"␉␉␉␉␉␉␉\␊ |
376 | ␉ :␉␉␉␉␉␉␉␉␉␉\␊ |
377 | ␉ : "r" (__dtrace_args)␉␉␉␉␉␉␉\␊ |
378 | ␉ : "memory", "eax", "edx"␉ ␉␉␉␉␉␉\␊ |
379 | ␉);␊ |
380 | ␊ |
381 | #define DTRACE_CALL10ARGS(provider, name)␉␉␉␉␉␉␉\␊ |
382 | ␉asm volatile ("subl\t$0x30,%%esp"␉␉␉␉␉␉"\n\t"␉\␊ |
383 | ␉ "movl\t0x0(%0),%%eax"␉␉␉␉␉␉"\n\t"␉\␊ |
384 | ␉␉ "movl\t0x4(%0),%%edx"␉␉␉␉␉␉"\n\t"␉\␊ |
385 | ␉ "movl\t%%eax,0x0(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
386 | ␉ "movl\t%%edx,0x4(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
387 | ␉ "movl\t0x8(%0),%%eax"␉␉␉␉␉␉"\n\t"␉\␊ |
388 | ␉␉ "movl\t0xC(%0),%%edx"␉␉␉␉␉␉"\n\t"␉\␊ |
389 | ␉ "movl\t%%eax,0x8(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
390 | ␉ "movl\t%%edx,0xC(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
391 | ␉ "movl\t0x10(%0),%%eax"␉␉␉␉␉␉"\n\t"␉\␊ |
392 | ␉␉ "movl\t0x14(%0),%%edx"␉␉␉␉␉␉"\n\t"␉\␊ |
393 | ␉ "movl\t%%eax,0x10(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
394 | ␉ "movl\t%%edx,0x14(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
395 | ␉ "movl\t0x18(%0),%%eax"␉␉␉␉␉␉"\n\t"␉\␊ |
396 | ␉␉ "movl\t0x1C(%0),%%edx"␉␉␉␉␉␉"\n\t"␉\␊ |
397 | ␉ "movl\t%%eax,0x18(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
398 | ␉ "movl\t%%edx,0x1C(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
399 | ␉ "movl\t0x20(%0),%%eax"␉␉␉␉␉␉"\n\t"␉\␊ |
400 | ␉␉ "movl\t0x24(%0),%%edx"␉␉␉␉␉␉"\n\t"␉\␊ |
401 | ␉ "movl\t%%eax,0x20(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
402 | ␉ "movl\t%%edx,0x24(%%esp)"␉␉␉␉␉␉"\n\t"␉\␊ |
403 | ␉ DTRACE_CALL(provider, name)␉␉␉␉␉␉\␊ |
404 | "addl\t$0x30,%%esp"␉␉␉␉␉␉␉\␊ |
405 | ␉ :␉␉␉␉␉␉␉␉␉␉\␊ |
406 | ␉ : "r" (__dtrace_args)␉␉␉␉␉␉␉\␊ |
407 | ␉ : "memory", "eax", "edx"␉ ␉␉␉␉␉␉\␊ |
408 | ␉);␊ |
409 | ␊ |
410 | #endif // __i386__␊ |
411 | ␊ |
412 | #endif␉/* _MACH_I386_SDT_ISA_H */␊ |
413 | |