]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/sys/dtrace.h
xnu-6153.11.26.tar.gz
[apple/xnu.git] / bsd / sys / dtrace.h
index ede1f7ac3a0b9239e510f9763f55c1af606e8308..98d3628dd305bf12c6a84960548776ef50ae99c2 100644 (file)
@@ -34,8 +34,6 @@
 #ifndef _SYS_DTRACE_H
 #define _SYS_DTRACE_H
 
-/* #pragma ident       "@(#)dtrace.h   1.37    07/06/05 SMI" */
-
 #ifdef  __cplusplus
 extern "C" {
 #endif
@@ -73,12 +71,6 @@ extern "C" {
 #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 */
@@ -91,6 +83,12 @@ extern "C" {
 #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>
@@ -286,6 +284,7 @@ typedef enum dtrace_probespec {
 #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 */
@@ -342,6 +341,10 @@ typedef enum dtrace_probespec {
 #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
@@ -390,7 +393,10 @@ typedef enum dtrace_probespec {
 #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__)
@@ -408,6 +414,7 @@ typedef uint32_t dif_instr_t;
 #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)
@@ -1042,14 +1049,21 @@ typedef struct dtrace_actdesc {
         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
  *
@@ -2326,8 +2340,8 @@ extern void dtrace_probe(dtrace_id_t, uint64_t arg0, uint64_t arg1,
  * 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);
@@ -2341,7 +2355,7 @@ extern void dtrace_probe(dtrace_id_t, uint64_t arg0, uint64_t arg1,
  *
  *   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
@@ -2357,8 +2371,8 @@ extern void dtrace_probe(dtrace_id_t, uint64_t arg0, uint64_t arg1,
  *   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
  *
@@ -2384,15 +2398,15 @@ extern void dtrace_probe(dtrace_id_t, uint64_t arg0, uint64_t arg1,
  *
  * 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
  *
@@ -2415,7 +2429,7 @@ extern void dtrace_probe(dtrace_id_t, uint64_t arg0, uint64_t arg1,
  *
  * 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
@@ -2448,10 +2462,18 @@ typedef struct dtrace_helper_provdesc {
         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;
 
@@ -2493,6 +2515,9 @@ extern int (*dtrace_return_probe_ptr)(struct regs *);
 #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
@@ -2536,37 +2561,26 @@ extern void dtrace_sync(void);
 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))
@@ -2581,17 +2595,6 @@ extern void *dtrace_invop_callsite_post;
 
 #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
@@ -2602,8 +2605,13 @@ extern void *dtrace_invop_callsite_post;
 
 #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
 }