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_PPC_SDT_ISA_H 28#define _MACH_PPC_SDT_ISA_H 29 30/* #pragma ident "@(#)sdt.h 1.7 05/06/08 SMI" */ 31 32/* 33 * Only define when testing. This makes the calls into actual calls to 34 * test functions. 35 */ 36/* #define DTRACE_CALL_TEST */ 37 38#define DTRACE_STRINGIFY(s) #s 39#define DTRACE_TOSTRING(s) DTRACE_STRINGIFY(s) 40 41#if defined(KERNEL) 42/* 43 * For the kernel, set an explicit global label do the symbol can be located 44 */ 45#define DTRACE_LAB(p, n) \ 46 "__dtrace_probe$" DTRACE_TOSTRING(__LINE__) DTRACE_STRINGIFY(_##p##___##n) 47#define DTRACE_LABEL(p, n) \ 48 ".section __DATA, __data\n\t" \ 49 ".globl " DTRACE_LAB(p, n) "\n\t" \ 50 DTRACE_LAB(p, n) ":" ".long 1f""\n\t" \ 51 ".text" "\n\t" \ 52 "1:" 53#else /* !KERNEL */ 54#define DTRACE_LABEL(p, n) \ 55 "__dtrace_probe$" DTRACE_TOSTRING(__LINE__) DTRACE_STRINGIFY(_##p##___##n) ":" "\n\t" 56#endif /* !KERNEL */ 57 58#ifdef DTRACE_CALL_TEST 59 60#define DTRACE_CALL(p,n) \ 61 DTRACE_LABEL(p,n) \ 62 DTRACE_CALL_INSN(p,n) 63 64#else /* !DTRACE_CALL_TEST */ 65 66#define DTRACE_CALL(p,n) \ 67 DTRACE_LABEL(p,n) \ 68 DTRACE_NOPS 69 70#endif /* !DTRACE_CALL_TEST */ 71 72#ifdef __ppc__ 73 74#define DTRACE_NOPS \ 75 "nop" "\n\t" 76 77#define DTRACE_CALL_INSN(p,n) \ 78 "bl _dtracetest" DTRACE_STRINGIFY(_##p##_##n) "\n\t" 79 80#define ARG1_EXTENT 1 81#define ARGS2_EXTENT 2 82#define ARGS3_EXTENT 3 83#define ARGS4_EXTENT 4 84#define ARGS5_EXTENT 5 85#define ARGS6_EXTENT 6 86#define ARGS7_EXTENT 7 87#define ARGS8_EXTENT 8 88#define ARGS9_EXTENT 9 89#define ARGS10_EXTENT 10 90 91#define DTRACE_CALL0ARGS(provider, name) \ 92 asm volatile ( \ 93 DTRACE_CALL(provider, name) \ 94 "# eat trailing nl+tab from DTRACE_CALL" \ 95 : \ 96 : \ 97 ); 98 99#define DTRACE_CALL1ARG(provider, name) \ 100 asm volatile ("subi r1,r1,0x20" "\n\t" \ 101 "lwz r3,0x0(%0)" "\n\t" \ 102 DTRACE_CALL(provider, name) \ 103 "addi r1,r1,0x20" \ 104 : \ 105 : "b" (__dtrace_args) \ 106 : "memory", "r3" \ 107 ); 108 109#define DTRACE_CALL2ARGS(provider, name) \ 110 asm volatile ("subi r1,r1,0x20" "\n\t" \ 111 "lwz r3,0x0(%0)" "\n\t" \ 112 "lwz r4,0x4(%0)" "\n\t" \ 113 DTRACE_CALL(provider, name) \ 114 "addi r1,r1,0x20" \ 115 : \ 116 : "b" (__dtrace_args) \ 117 : "memory", "r3", "r4" \ 118 ); 119 120#define DTRACE_CALL3ARGS(provider, name) \ 121 asm volatile ("subi r1,r1,0x30" "\n\t" \ 122 "lwz r3,0x0(%0)" "\n\t" \ 123 "lwz r4,0x4(%0)" "\n\t" \ 124 "lwz r5,0x8(%0)" "\n\t" \ 125 DTRACE_CALL(provider, name) \ 126 "addi r1,r1,0x30" \ 127 : \ 128 : "b" (__dtrace_args) \ 129 : "memory", "r3", "r4", "r5" \ 130 ); 131 132#define DTRACE_CALL4ARGS(provider, name) \ 133 asm volatile ("subi r1,r1,0x30" "\n\t" \ 134 "lwz r3,0x0(%0)" "\n\t" \ 135 "lwz r4,0x4(%0)" "\n\t" \ 136 "lwz r5,0x8(%0)" "\n\t" \ 137 "lwz r6,0xc(%0)" "\n\t" \ 138 DTRACE_CALL(provider, name) \ 139 "addi r1,r1,0x30" \ 140 : \ 141 : "b" (__dtrace_args) \ 142 : "memory", "r3", "r4", "r5", "r6" \ 143 ); 144 145#define DTRACE_CALL5ARGS(provider, name) \ 146 asm volatile ("subi r1,r1,0x30" "\n\t" \ 147 "lwz r3,0x0(%0)" "\n\t" \ 148 "lwz r4,0x4(%0)" "\n\t" \ 149 "lwz r5,0x8(%0)" "\n\t" \ 150 "lwz r6,0xc(%0)" "\n\t" \ 151 "lwz r7,0x10(%0)" "\n\t" \ 152 DTRACE_CALL(provider, name) \ 153 "addi r1,r1,0x30" \ 154 : \ 155 : "b" (__dtrace_args) \ 156 : "memory", "r3", "r4", "r5", "r6", "r7" \ 157 ); 158 159#define DTRACE_CALL6ARGS(provider, name) \ 160 asm volatile ("subi r1,r1,0x30" "\n\t" \ 161 "lwz r3,0x0(%0)" "\n\t" \ 162 "lwz r4,0x4(%0)" "\n\t" \ 163 "lwz r5,0x8(%0)" "\n\t" \ 164 "lwz r6,0xc(%0)" "\n\t" \ 165 "lwz r7,0x10(%0)" "\n\t" \ 166 "lwz r8,0x14(%0)" "\n\t" \ 167 DTRACE_CALL(provider, name) \ 168 "addi r1,r1,0x30" \ 169 : \ 170 : "b" (__dtrace_args) \ 171 : "memory", "r3", "r4", "r5", "r6", "r7", "r8" \ 172 ); 173 174#define DTRACE_CALL7ARGS(provider, name) \ 175 asm volatile ("subi r1,r1,0x40" "\n\t" \ 176 "lwz r3,0x0(%0)" "\n\t" \ 177 "lwz r4,0x4(%0)" "\n\t" \ 178 "lwz r5,0x8(%0)" "\n\t" \ 179 "lwz r6,0xc(%0)" "\n\t" \ 180 "lwz r7,0x10(%0)" "\n\t" \ 181 "lwz r8,0x14(%0)" "\n\t" \ 182 "lwz r9,0x18(%0)" "\n\t" \ 183 DTRACE_CALL(provider, name) \ 184 "addi r1,r1,0x40" \ 185 : \ 186 : "b" (__dtrace_args) \ 187 : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9" \ 188 ); 189 190#define DTRACE_CALL8ARGS(provider, name) \ 191 asm volatile ("subi r1,r1,0x40" "\n\t" \ 192 "lwz r3,0x0(%0)" "\n\t" \ 193 "lwz r4,0x4(%0)" "\n\t" \ 194 "lwz r5,0x8(%0)" "\n\t" \ 195 "lwz r6,0xc(%0)" "\n\t" \ 196 "lwz r7,0x10(%0)" "\n\t" \ 197 "lwz r8,0x14(%0)" "\n\t" \ 198 "lwz r9,0x18(%0)" "\n\t" \ 199 "lwz r10,0x1c(%0)" "\n\t" \ 200 DTRACE_CALL(provider, name) \ 201 "addi r1,r1,0x40" \ 202 : \ 203 : "b" (__dtrace_args) \ 204 : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10" \ 205 ); 206 207#define DTRACE_CALL9ARGS(provider, name) \ 208 asm volatile ("subi r1,r1,0x40" "\n\t" \ 209 "lwz r3,0x0(%0)" "\n\t" \ 210 "lwz r4,0x4(%0)" "\n\t" \ 211 "lwz r5,0x8(%0)" "\n\t" \ 212 "lwz r6,0xc(%0)" "\n\t" \ 213 "lwz r7,0x10(%0)" "\n\t" \ 214 "lwz r8,0x14(%0)" "\n\t" \ 215 "lwz r9,0x18(%0)" "\n\t" \ 216 "lwz r10,0x1c(%0)" "\n\t" \ 217 "lwz r11,0x20(%0)" "\n\t" \ 218 "stw r11,0x38(r1)" "\n\t" \ 219 DTRACE_CALL(provider, name) \ 220 "addi r1,r1,0x40" \ 221 : \ 222 : "b" (__dtrace_args) \ 223 : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11" \ 224 ); 225 226#define DTRACE_CALL10ARGS(provider, name) \ 227 asm volatile ("subi r1,r1,0x40" "\n\t" \ 228 "lwz r3,0x0(%0)" "\n\t" \ 229 "lwz r4,0x4(%0)" "\n\t" \ 230 "lwz r5,0x8(%0)" "\n\t" \ 231 "lwz r6,0xc(%0)" "\n\t" \ 232 "lwz r7,0x10(%0)" "\n\t" \ 233 "lwz r8,0x14(%0)" "\n\t" \ 234 "lwz r9,0x18(%0)" "\n\t" \ 235 "lwz r10,0x1c(%0)" "\n\t" \ 236 "lwz r11,0x20(%0)" "\n\t" \ 237 "lwz r12,0x24(%0)" "\n\t" \ 238 "stw r11,0x38(r1)" "\n\t" \ 239 "stw r12,0x3c(r1)" "\n\t" \ 240 DTRACE_CALL(provider, name) \ 241 "addi r1,r1,0x40" \ 242 : \ 243 : "b" (__dtrace_args) \ 244 : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12" \ 245 ); 246 247#endif // __ppc__ 248 249#ifdef __ppc64__ 250 251#define DTRACE_NOPS \ 252 "nop" "\n\t" 253 254#define DTRACE_CALL_INSN(p,n) \ 255 "bl _dtracetest" DTRACE_STRINGIFY(_##p##_##n) "\n\t" 256 257#define ARG1_EXTENT 1 258#define ARGS2_EXTENT 2 259#define ARGS3_EXTENT 3 260#define ARGS4_EXTENT 4 261#define ARGS5_EXTENT 5 262#define ARGS6_EXTENT 6 263#define ARGS7_EXTENT 7 264#define ARGS8_EXTENT 8 265#define ARGS9_EXTENT 9 266#define ARGS10_EXTENT 10 267 268#define DTRACE_CALL0ARGS(provider, name) \ 269 asm volatile ("subi r1,r1,0x30" "\n\t" \ 270 DTRACE_CALL(provider, name) \ 271 "addi r1,r1,0x30" \ 272 : \ 273 : \ 274 : \ 275 ); 276 277#define DTRACE_CALL1ARG(provider, name) \ 278 asm volatile ("ld r3,0x0(%0)" "\n\t" \ 279 "subi r1,r1,0x38" "\n\t" \ 280 DTRACE_CALL(provider, name) \ 281 "addi r1,r1,0x38" \ 282 : \ 283 : "b" (__dtrace_args) \ 284 : "memory", "r3" \ 285 ); 286 287#define DTRACE_CALL2ARGS(provider, name) \ 288 asm volatile ("subi r1,r1,0x40" "\n\t" \ 289 "ld r3,0x0(%0)" "\n\t" \ 290 "ld r4,0x8(%0)" "\n\t" \ 291 DTRACE_CALL(provider, name) \ 292 "addi r1,r1,0x40" \ 293 : \ 294 : "b" (__dtrace_args) \ 295 : "memory", "r3", "r4" \ 296 ); 297 298#define DTRACE_CALL3ARGS(provider, name) \ 299 asm volatile ("subi r1,r1,0x48" "\n\t" \ 300 "ld r3,0x0(%0)" "\n\t" \ 301 "ld r4,0x8(%0)" "\n\t" \ 302 "ld r5,0x10(%0)" "\n\t" \ 303 DTRACE_CALL(provider, name) \ 304 "addi r1,r1,0x48" \ 305 : \ 306 : "b" (__dtrace_args) \ 307 : "memory", "r3", "r4", "r5" \ 308 ); 309 310#define DTRACE_CALL4ARGS(provider, name) \ 311 asm volatile ("subi r1,r1,0x50" "\n\t" \ 312 "ld r3,0x0(%0)" "\n\t" \ 313 "ld r4,0x8(%0)" "\n\t" \ 314 "ld r5,0x10(%0)" "\n\t" \ 315 "ld r6,0x18(%0)" "\n\t" \ 316 DTRACE_CALL(provider, name) \ 317 "addi r1,r1,0x50" \ 318 : \ 319 : "b" (__dtrace_args) \ 320 : "memory", "r3", "r4", "r5", "r6" \ 321 ); 322 323#define DTRACE_CALL5ARGS(provider, name) \ 324 asm volatile ("subi r1,r1,0x58" "\n\t" \ 325 "ld r3,0x0(%0)" "\n\t" \ 326 "ld r4,0x8(%0)" "\n\t" \ 327 "ld r5,0x10(%0)" "\n\t" \ 328 "ld r6,0x18(%0)" "\n\t" \ 329 "ld r7,0x20(%0)" "\n\t" \ 330 DTRACE_CALL(provider, name) \ 331 "addi r1,r1,0x58" \ 332 : \ 333 : "b" (__dtrace_args) \ 334 : "memory", "r3", "r4", "r5", "r6", "r7" \ 335 ); 336 337#define DTRACE_CALL6ARGS(provider, name) \ 338 asm volatile ("subi r1,r1,0x60" "\n\t" \ 339 "ld r3,0x0(%0)" "\n\t" \ 340 "ld r4,0x8(%0)" "\n\t" \ 341 "ld r5,0x10(%0)" "\n\t" \ 342 "ld r6,0x18(%0)" "\n\t" \ 343 "ld r7,0x20(%0)" "\n\t" \ 344 "ld r8,0x28(%0)" "\n\t" \ 345 DTRACE_CALL(provider, name) \ 346 "addi r1,r1,0x60" \ 347 : \ 348 : "b" (__dtrace_args) \ 349 : "memory", "r3", "r4", "r5", "r6", "r7", "r8" \ 350 ); 351 352#define DTRACE_CALL7ARGS(provider, name) \ 353 asm volatile ("subi r1,r1,0x68" "\n\t" \ 354 "ld r3,0x0(%0)" "\n\t" \ 355 "ld r4,0x8(%0)" "\n\t" \ 356 "ld r5,0x10(%0)" "\n\t" \ 357 "ld r6,0x18(%0)" "\n\t" \ 358 "ld r7,0x20(%0)" "\n\t" \ 359 "ld r8,0x28(%0)" "\n\t" \ 360 "ld r9,0x30(%0)" "\n\t" \ 361 DTRACE_CALL(provider, name) \ 362 "addi r1,r1,0x68" \ 363 : \ 364 : "b" (__dtrace_args) \ 365 : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9" \ 366 ); 367 368#define DTRACE_CALL8ARGS(provider, name) \ 369 asm volatile ("subi r1,r1,0x70" "\n\t" \ 370 "ld r3,0x0(%0)" "\n\t" \ 371 "ld r4,0x8(%0)" "\n\t" \ 372 "ld r5,0x10(%0)" "\n\t" \ 373 "ld r6,0x18(%0)" "\n\t" \ 374 "ld r7,0x20(%0)" "\n\t" \ 375 "ld r8,0x28(%0)" "\n\t" \ 376 "ld r9,0x30(%0)" "\n\t" \ 377 "ld r10,0x38(%0)" "\n\t" \ 378 DTRACE_CALL(provider, name) \ 379 "addi r1,r1,0x70" \ 380 : \ 381 : "b" (__dtrace_args) \ 382 : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10" \ 383 ); 384 385#define DTRACE_CALL9ARGS(provider, name) \ 386 asm volatile ("subi r1,r1,0x78" "\n\t" \ 387 "ld r3,0x0(%0)" "\n\t" \ 388 "ld r4,0x8(%0)" "\n\t" \ 389 "ld r5,0x10(%0)" "\n\t" \ 390 "ld r6,0x18(%0)" "\n\t" \ 391 "ld r7,0x20(%0)" "\n\t" \ 392 "ld r8,0x28(%0)" "\n\t" \ 393 "ld r9,0x30(%0)" "\n\t" \ 394 "ld r10,0x38(%0)" "\n\t" \ 395 "ld r11,0x40(%0)" "\n\t" \ 396 "std r11,0x70(r1)" "\n\t" \ 397 DTRACE_CALL(provider, name) \ 398 "addi r1,r1,0x78" \ 399 : \ 400 : "b" (__dtrace_args) \ 401 : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11" \ 402 ); 403 404#define DTRACE_CALL10ARGS(provider, name) \ 405 asm volatile ("subi r1,r1,0x80" "\n\t" \ 406 "ld r3,0x0(%0)" "\n\t" \ 407 "ld r4,0x8(%0)" "\n\t" \ 408 "ld r5,0x10(%0)" "\n\t" \ 409 "ld r6,0x18(%0)" "\n\t" \ 410 "ld r7,0x20(%0)" "\n\t" \ 411 "ld r8,0x28(%0)" "\n\t" \ 412 "ld r9,0x30(%0)" "\n\t" \ 413 "ld r10,0x38(%0)" "\n\t" \ 414 "ld r11,0x40(%0)" "\n\t" \ 415 "ld r12,0x48(%0)" "\n\t" \ 416 "std r11,0x70(r1)" "\n\t" \ 417 "std r12,0x78(r1)" "\n\t" \ 418 DTRACE_CALL(provider, name) \ 419 "addi r1,r1,0x80" \ 420 : \ 421 : "b" (__dtrace_args) \ 422 : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12" \ 423 ); 424 425#endif // __ppc64__ 426 427#endif /* _MACH_PPC_SDT_ISA_H */ 428