#ifndef _SYS_DTRACE_H
#define _SYS_DTRACE_H
-/* #pragma ident "@(#)dtrace.h 1.37 07/06/05 SMI" */
-
#ifdef __cplusplus
extern "C" {
#endif
#endif
#endif
-#ifdef KERNEL
-#ifndef _KERNEL
-#define _KERNEL /* Solaris vs. Darwin */
-#endif
-#endif
-
#if defined(__BIG_ENDIAN__)
#if !defined(_BIG_ENDIAN)
#define _BIG_ENDIAN /* Solaris vs. Darwin */
#error Unknown endian-ness
#endif
+#ifdef KERNEL
+#ifndef _KERNEL
+#define _KERNEL /* Solaris vs. Darwin */
+#endif
+#endif
+
#include <sys/types.h>
#include <sys/param.h>
#include <stdint.h>
#define DIF_OP_RLDX 77 /* rldx [r1], rd */
#define DIF_OP_XLATE 78 /* xlate xlrindex, rd */
#define DIF_OP_XLARG 79 /* xlarg xlrindex, rd */
+#define DIF_OP_STRIP 80 /* strip r1, key, rd */
#define DIF_INTOFF_MAX 0xffff /* highest integer table offset */
#define DIF_STROFF_MAX 0xffff /* highest string table offset */
#define DIF_VAR_DISPATCHQADDR 0x0201 /* Apple specific dispatch queue addr */
#define DIF_VAR_MACHTIMESTAMP 0x0202 /* mach_absolute_timestamp() */
#define DIF_VAR_CPU 0x0203 /* cpu number */
+#define DIF_VAR_CPUINSTRS 0x0204 /* cpu instructions */
+#define DIF_VAR_CPUCYCLES 0x0205 /* cpu cycles */
+#define DIF_VAR_VINSTRS 0x0206 /* virtual instructions */
+#define DIF_VAR_VCYCLES 0x0207 /* virtual cycles */
#endif /* __APPLE __ */
#define DIF_SUBR_RAND 0
#define DIF_SUBR_INET_NTOA6 43
#define DIF_SUBR_TOUPPER 44
#define DIF_SUBR_TOLOWER 45
-#define DIF_SUBR_MAX 46 /* max subroutine value */
+#define DIF_SUBR_JSON 46
+#define DIF_SUBR_STRTOLL 47
+#define DIF_SUBR_STRIP 48
+#define DIF_SUBR_MAX 48 /* max subroutine value */
/* Apple-specific subroutines */
#if defined(__APPLE__)
#define DIF_INSTR_R2(i) (((i) >> 8) & 0xff)
#define DIF_INSTR_RD(i) ((i) & 0xff)
#define DIF_INSTR_RS(i) ((i) & 0xff)
+#define DIF_INSTR_IMM2(i) (((i) >> 8) & 0xff)
#define DIF_INSTR_LABEL(i) ((i) & 0xffffff)
#define DIF_INSTR_VAR(i) (((i) >> 8) & 0xffff)
#define DIF_INSTR_INTEGER(i) (((i) >> 8) & 0xffff)
int dtad_refcnt; /* reference count */
} dtrace_actdesc_t;
+
typedef struct dtrace_ecbdesc {
dtrace_actdesc_t *dted_action; /* action description(s) */
dtrace_preddesc_t dted_pred; /* predicate description */
dtrace_probedesc_t dted_probe; /* probe description */
uint64_t dted_uarg; /* library argument */
int dted_refcnt; /* reference count */
+ uint64_t dted_probegen; /* matched probe generation */
} dtrace_ecbdesc_t;
+/*
+ * APPLE NOTE: The kernel always rebuild dtrace_ecbdesc structures
+ * coming from userspace, so there is no dted_probegen manipulation risk
+ */
+
/*
* DTrace Metadata Description Structures
*
* a meta provider. This structure consists of the following members:
*
* dtms_create_probe() <-- Add a new probe to a created provider
- * dtms_provide_pid() <-- Create a new provider for a given process
- * dtms_remove_pid() <-- Remove a previously created provider
+ * dtms_provide_proc() <-- Create a new provider for a given process
+ * dtms_remove_proc() <-- Remove a previously created provider
*
* 1.2 void dtms_create_probe(void *arg, void *parg,
* dtrace_helper_probedesc_t *probedesc);
*
* The first argument is the cookie as passed to dtrace_meta_register().
* The second argument is the provider cookie for the associated provider;
- * this is obtained from the return value of dtms_provide_pid(). The third
+ * this is obtained from the return value of dtms_provide_proc(). The third
* argument is the helper probe description.
*
* 1.2.3 Return value
* such that the provider may (and is expected to) call provider-related
* DTrace provider APIs including dtrace_probe_create().
*
- * 1.3 void *dtms_provide_pid(void *arg, dtrace_meta_provider_t *mprov,
- * pid_t pid)
+ * 1.3 void *dtms_provide_proc(void *arg, dtrace_meta_provider_t *mprov,
+ * proc_t *proc)
*
* 1.3.1 Overview
*
*
* 1.3.4 Caller's context
*
- * dtms_provide_pid() is called from either ioctl() or module load context.
+ * dtms_provide_proc() is called from either ioctl() or module load context.
* The DTrace framework is locked in such a way that meta providers may not
* register or unregister. This means that the meta provider cannot call
* dtrace_meta_register() or dtrace_meta_unregister(). However, the context
* is such that the provider may -- and is expected to -- call
* provider-related DTrace provider APIs including dtrace_register().
*
- * 1.4 void dtms_remove_pid(void *arg, dtrace_meta_provider_t *mprov,
- * pid_t pid)
+ * 1.4 void dtms_remove_proc(void *arg, dtrace_meta_provider_t *mprov,
+ * proc_t proc)
*
* 1.4.1 Overview
*
*
* 1.4.4 Caller's context
*
- * dtms_remove_pid() is called from either ioctl() or exit() context.
+ * dtms_remove_proc() is called from either ioctl() or exit() context.
* The DTrace framework is locked in such a way that meta providers may not
* register or unregister. This means that the meta provider cannot call
* dtrace_meta_register() or dtrace_meta_unregister(). However, the context
dtrace_pattr_t dthpv_pattr; /* stability attributes */
} dtrace_helper_provdesc_t;
+/*
+ * APPLE NOTE: dtms_provide_pid and dtms_remove_pid are replaced with
+ * dtms_provide_proc on Darwin, and a proc reference need to be held
+ * for the duration of the call.
+ *
+ * This is due to the fact that proc_find is not re-entrant on Darwin.
+ */
+
typedef struct dtrace_mops {
void (*dtms_create_probe)(void *, void *, dtrace_helper_probedesc_t *);
- void *(*dtms_provide_pid)(void *, dtrace_helper_provdesc_t *, pid_t);
- void (*dtms_remove_pid)(void *, dtrace_helper_provdesc_t *, pid_t);
+ void *(*dtms_provide_proc)(void *, dtrace_helper_provdesc_t *, proc_t*);
+ void (*dtms_remove_proc)(void *, dtrace_helper_provdesc_t *, proc_t*);
char* (*dtms_provider_name)(void *);
} dtrace_mops_t;
#if defined (__i386__) || defined(__x86_64__)
extern int (*dtrace_pid_probe_ptr)(x86_saved_state_t *regs);
extern int (*dtrace_return_probe_ptr)(x86_saved_state_t* regs);
+#elif defined (__arm__) || defined(__arm64__)
+extern int (*dtrace_pid_probe_ptr)(arm_saved_state_t *regs);
+extern int (*dtrace_return_probe_ptr)(arm_saved_state_t *regs);
#else
#error architecture not supported
#endif
extern void dtrace_toxic_ranges(void (*)(uintptr_t, uintptr_t));
extern void dtrace_xcall(processorid_t, dtrace_xcall_t, void *);
-extern int dtrace_safe_defer_signal(void);
-extern void dtrace_safe_synchronous_signal(void);
-
-extern int dtrace_mach_aframes(void);
-
-#if !defined(__APPLE__)
-#if defined(__i386) || defined(__amd64)
+#if defined(__i386__) || defined(__x86_64__)
extern int dtrace_instr_size(uchar_t *instr);
extern int dtrace_instr_size_isa(uchar_t *, model_t, int *);
extern void dtrace_invop_add(int (*)(uintptr_t, uintptr_t *, uintptr_t));
extern void dtrace_invop_remove(int (*)(uintptr_t, uintptr_t *, uintptr_t));
-extern void dtrace_invop_callsite(void);
+extern void *dtrace_invop_callsite_pre;
+extern void *dtrace_invop_callsite_post;
#endif
-#ifdef __sparc
-extern int dtrace_blksuword32(uintptr_t, uint32_t *, int);
-extern void dtrace_getfsr(uint64_t *);
+#if defined(__arm__)
+extern int dtrace_instr_size(uint32_t instr, int thumb_mode);
#endif
-#else
-#if defined(__i386__) || defined(__x86_64__)
-extern int dtrace_instr_size(uchar_t *instr);
-extern int dtrace_instr_size_isa(uchar_t *, model_t, int *);
-extern void dtrace_invop_add(int (*)(uintptr_t, uintptr_t *, uintptr_t));
+#if defined(__arm__) || defined(__arm64__)
+extern void dtrace_invop_add(int (*)(uintptr_t, uintptr_t *, uintptr_t));
extern void dtrace_invop_remove(int (*)(uintptr_t, uintptr_t *, uintptr_t));
extern void *dtrace_invop_callsite_pre;
extern void *dtrace_invop_callsite_post;
#endif
-
#undef proc_t
-#endif /* __APPLE__ */
#define DTRACE_CPUFLAG_ISSET(flag) \
(cpu_core[CPU->cpu_id].cpuc_dtrace_flags & (flag))
#endif /* _ASM */
-#if !defined(__APPLE__)
-#if defined(__i386) || defined(__amd64)
-
-#define DTRACE_INVOP_PUSHL_EBP 1
-#define DTRACE_INVOP_POPL_EBP 2
-#define DTRACE_INVOP_LEAVE 3
-#define DTRACE_INVOP_NOP 4
-#define DTRACE_INVOP_RET 5
-
-#endif
-#else
#if defined(__i386__) || defined(__x86_64__)
#define DTRACE_INVOP_PUSHL_EBP 1
#endif
+#if defined(__arm__) || defined(__arm64__)
-#endif /* __APPLE__ */
+#define DTRACE_INVOP_NOP 4
+#define DTRACE_INVOP_RET 5
+#define DTRACE_INVOP_B 6
+
+#endif
#ifdef __cplusplus
}