This is xnu-11215.1.10. See this file in:
/*
* Copyright (c) 2007 Apple Inc. All rights reserved.
*/
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2004 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _MACH_ARM_SDT_ISA_H
#define _MACH_ARM_SDT_ISA_H
#include <stdint.h>
#if defined(__arm64__)
/*
* Only define when testing. This makes the calls into actual calls to
* test functions.
*/
/* #define DTRACE_CALL_TEST */
#define DTRACE_STRINGIFY(s) #s
#define DTRACE_TOSTRING(s) DTRACE_STRINGIFY(s)
#if defined(KERNEL)
#if (__SIZEOF_POINTER__ == 8)
#define DTRACE_LABEL(p, n) \
".pushsection __DATA_CONST, __sdt_cstring, cstring_literals\n\t" \
"1: .ascii \"" DTRACE_STRINGIFY(p##___) "\\0\"\n\t" \
"2: .ascii \"" DTRACE_STRINGIFY(n) "\\0\"\n\t" \
".popsection" "\n\t" \
".pushsection __DATA_CONST, __sdt, regular, live_support\n\t" \
".p2align 3\n\t" \
"l3_%=:\n\t" \
".quad 4f""\n\t" \
".quad 1b""\n\t" \
".quad 2b""\n\t" \
".popsection" "\n\t" \
"4:"
#else /* Not supported on arm64_32 */
#define DTRACE_LABEL(p, n)
#endif /* __SIZEOF_POINTER__ == 8 */
#else /* !KERNEL */
#define DTRACE_LABEL(p, n) \
"__dtrace_probe$" DTRACE_TOSTRING(%=__LINE__) DTRACE_STRINGIFY(_##p##___##n) ":" "\n\t"
#endif /* !KERNEL */
/*
* Testing mode that builds function call to the probe site instead of nops.
*/
#ifdef DTRACE_CALL_TEST
#define DTRACE_CALL_INSN(p, n) \
"bl _dtracetest" DTRACE_STRINGIFY(_##p##_##n) "\n\t"
#define DTRACE_CALL(p, n) \
DTRACE_LABEL(p,n) \
DTRACE_CALL_INSN(p,n)
#else /* DTRACE_CALL_TEST */
#define DTRACE_NOPS \
"nop" "\n\t"
#define DTRACE_CALL(p, n) \
DTRACE_LABEL(p,n) \
DTRACE_NOPS
#endif /* DTRACE_CALL_TEST */
#define DTRACE_PROBE(provider, name) \
do { \
asm volatile ( \
DTRACE_CALL(provider, name) \
: \
: \
: "memory" \
); \
} while(0)
#define DTRACE_PROBE1(provider, name, arg0) \
do { \
register uintptr_t __dtrace_a0 asm("x0") = (uintptr_t) arg0; \
asm volatile ( \
DTRACE_CALL(provider, name) \
: \
: "r" (__dtrace_a0) \
: "memory" \
); \
} while(0)
#define DTRACE_PROBE2(provider, name, arg0, arg1) \
do { \
register uintptr_t __dtrace_a0 asm("x0") = (uintptr_t) arg0; \
register uintptr_t __dtrace_a1 asm("x1") = (uintptr_t) arg1; \
asm volatile ( \
DTRACE_CALL(provider, name) \
: \
: "r" (__dtrace_a0), "r" (__dtrace_a1) \
: "memory" \
); \
} while(0)
#define DTRACE_PROBE3(provider, name, arg0, arg1, arg2) \
do { \
register uintptr_t __dtrace_a0 asm("x0") = (uintptr_t) arg0; \
register uintptr_t __dtrace_a1 asm("x1") = (uintptr_t) arg1; \
register uintptr_t __dtrace_a2 asm("x2") = (uintptr_t) arg2; \
asm volatile ( \
DTRACE_CALL(provider, name) \
: \
: "r" (__dtrace_a0), "r" (__dtrace_a1), "r" (__dtrace_a2) \
: "memory" \
); \
} while(0)
#define DTRACE_PROBE4(provider, name, arg0, arg1, arg2, arg3) \
do { \
register uintptr_t __dtrace_a0 asm("x0") = (uintptr_t) arg0; \
register uintptr_t __dtrace_a1 asm("x1") = (uintptr_t) arg1; \
register uintptr_t __dtrace_a2 asm("x2") = (uintptr_t) arg2; \
register uintptr_t __dtrace_a3 asm("x3") = (uintptr_t) arg3; \
asm volatile ( \
DTRACE_CALL(provider, name) \
: \
: "r" (__dtrace_a0), "r" (__dtrace_a1), "r" (__dtrace_a2), \
"r" (__dtrace_a3) \
: "memory" \
); \
} while(0)
#define DTRACE_PROBE5(provider, name, arg0, arg1, arg2, arg3, arg4) \
do { \
register uintptr_t __dtrace_a0 asm("x0") = (uintptr_t) arg0; \
register uintptr_t __dtrace_a1 asm("x1") = (uintptr_t) arg1; \
register uintptr_t __dtrace_a2 asm("x2") = (uintptr_t) arg2; \
register uintptr_t __dtrace_a3 asm("x3") = (uintptr_t) arg3; \
register uintptr_t __dtrace_a4 asm("x4") = (uintptr_t) arg4; \
asm volatile ( \
DTRACE_CALL(provider, name) \
: \
: "r" (__dtrace_a0), "r" (__dtrace_a1), "r" (__dtrace_a2), \
"r" (__dtrace_a3), "r" (__dtrace_a4) \
: "memory" \
); \
} while(0)
#define DTRACE_PROBE6(provider, name, arg0, arg1, arg2, arg3, arg4, arg5) \
do { \
register uintptr_t __dtrace_a0 asm("x0") = (uintptr_t) arg0; \
register uintptr_t __dtrace_a1 asm("x1") = (uintptr_t) arg1; \
register uintptr_t __dtrace_a2 asm("x2") = (uintptr_t) arg2; \
register uintptr_t __dtrace_a3 asm("x3") = (uintptr_t) arg3; \
register uintptr_t __dtrace_a4 asm("x4") = (uintptr_t) arg4; \
register uintptr_t __dtrace_a5 asm("x5") = (uintptr_t) arg5; \
asm volatile ( \
DTRACE_CALL(provider, name) \
: \
: "r" (__dtrace_a0), "r" (__dtrace_a1), "r" (__dtrace_a2), \
"r" (__dtrace_a3), "r" (__dtrace_a4), "r" (__dtrace_a5) \
: "memory" \
); \
} while(0)
#define DTRACE_PROBE7(provider, name, arg0, arg1, arg2, arg3, arg4, arg5, arg6) \
do { \
register uintptr_t __dtrace_a0 asm("x0") = (uintptr_t) arg0; \
register uintptr_t __dtrace_a1 asm("x1") = (uintptr_t) arg1; \
register uintptr_t __dtrace_a2 asm("x2") = (uintptr_t) arg2; \
register uintptr_t __dtrace_a3 asm("x3") = (uintptr_t) arg3; \
register uintptr_t __dtrace_a4 asm("x4") = (uintptr_t) arg4; \
register uintptr_t __dtrace_a5 asm("x5") = (uintptr_t) arg5; \
register uintptr_t __dtrace_a6 asm("x6") = (uintptr_t) arg6; \
asm volatile ( \
DTRACE_CALL(provider, name) \
: \
: "r" (__dtrace_a0), "r" (__dtrace_a1), "r" (__dtrace_a2), \
"r" (__dtrace_a3), "r" (__dtrace_a4), "r" (__dtrace_a5), \
"r" (__dtrace_a6) \
: "memory" \
); \
} while(0)
#define DTRACE_PROBE8(provider, name, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7) \
do { \
register uintptr_t __dtrace_a0 asm("x0") = (uintptr_t) arg0; \
register uintptr_t __dtrace_a1 asm("x1") = (uintptr_t) arg1; \
register uintptr_t __dtrace_a2 asm("x2") = (uintptr_t) arg2; \
register uintptr_t __dtrace_a3 asm("x3") = (uintptr_t) arg3; \
register uintptr_t __dtrace_a4 asm("x4") = (uintptr_t) arg4; \
register uintptr_t __dtrace_a5 asm("x5") = (uintptr_t) arg5; \
register uintptr_t __dtrace_a6 asm("x6") = (uintptr_t) arg6; \
register uintptr_t __dtrace_a7 asm("x7") = (uintptr_t) arg7; \
asm volatile ( \
DTRACE_CALL(provider, name) \
: \
: "r" (__dtrace_a0), "r" (__dtrace_a1), "r" (__dtrace_a2), \
"r" (__dtrace_a3), "r" (__dtrace_a4), "r" (__dtrace_a5), \
"r" (__dtrace_a6), "r" (__dtrace_a7) \
: "memory" \
); \
} while(0)
#endif /* defined (__arm64__) */
#endif /* _MACH_ARM_SDT_ISA_H */