]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/sys/dtrace_impl.h
xnu-2422.115.4.tar.gz
[apple/xnu.git] / bsd / sys / dtrace_impl.h
index 4d75ea53d3063e544cb21dfe94e7171b0349d16c..2b02707c7ea678c52174384585ae36d20901331e 100644 (file)
  */
 
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
 #ifndef _SYS_DTRACE_IMPL_H
 #define        _SYS_DTRACE_IMPL_H
 
-/* #pragma ident       "@(#)dtrace_impl.h      1.21    06/05/19 SMI" */
+/* #pragma ident       "@(#)dtrace_impl.h      1.23    07/02/16 SMI" */
 
 #ifdef __cplusplus
 extern "C" {
@@ -910,6 +910,8 @@ typedef struct dtrace_mstate {
        int dtms_ipl;                           /* cached interrupt pri lev */
        int dtms_fltoffs;                       /* faulting DIFO offset */
        uintptr_t dtms_strtok;                  /* saved strtok() pointer */
+       uint32_t dtms_access;                   /* memory access rights */
+       dtrace_difo_t *dtms_difo;               /* current dif object */
 } dtrace_mstate_t;
 
 #define        DTRACE_COND_OWNER       0x1
@@ -918,6 +920,12 @@ typedef struct dtrace_mstate {
 
 #define        DTRACE_PROBEKEY_MAXDEPTH        8       /* max glob recursion depth */
 
+/*
+ * Access flag used by dtrace_mstate.dtms_access.
+ */
+#define        DTRACE_ACCESS_KERNEL    0x1             /* the priv to read kmem */
+
+
 /*
  * DTrace Activity
  *
@@ -970,6 +978,7 @@ typedef enum dtrace_activity {
        DTRACE_ACTIVITY_KILLED                  /* killed */
 } dtrace_activity_t;
 
+#if defined(__APPLE__)
 /*
  * DTrace dof modes
  *
@@ -1000,6 +1009,46 @@ typedef enum dtrace_activity {
 #define DTRACE_DOF_MODE_LAZY_OFF       2
 #define DTRACE_DOF_MODE_NON_LAZY       3
 
+/*
+ * dtrace kernel symbol modes are used to control when the kernel may dispose of
+ * symbol information used by the fbt/sdt provider. The kernel itself, as well as
+ * every kext, has symbol table/nlist info that has historically been preserved
+ * for dtrace's use. This allowed dtrace to be lazy about allocating fbt/sdt probes,
+ * at the expense of keeping the symbol info in the kernel permanently.
+ *
+ * Starting in 10.7+, fbt probes may be created from userspace, in the same
+ * fashion as pid probes. The kernel allows dtrace "first right of refusal"
+ * whenever symbol data becomes available (such as a kext load). If dtrace is
+ * active, it will immediately read/copy the needed data, and then the kernel
+ * may free it. If dtrace is not active, it returns immediately, having done
+ * no work or allocations, and the symbol data is freed. Should dtrace need
+ * this data later, it is expected that the userspace client will push the
+ * data into the kernel via ioctl calls.
+ *
+ * The kernel symbol modes are used to control what dtrace does with symbol data:
+ *
+ * DTRACE_KERNEL_SYMBOLS_NEVER                 Effectively disables fbt/sdt
+ * DTRACE_KERNEL_SYMBOLS_FROM_KERNEL           Immediately read/copy symbol data
+ * DTRACE_KERNEL_SYMBOLS_FROM_USERSPACE                Wait for symbols from userspace
+ * DTRACE_KERNEL_SYMBOLS_ALWAYS_FROM_KERNEL    Immediately read/copy symbol data
+ *
+ * It is legal to transition between DTRACE_KERNEL_SYMBOLS_FROM_KERNEL and 
+ * DTRACE_KERNEL_SYMBOLS_FROM_USERSPACE. The DTRACE_KERNEL_SYMBOLS_NEVER and
+ * DTRACE_KERNEL_SYMBOLS_ALWAYS_FROM_KERNEL are permanent modes, intended to
+ * disable fbt probes entirely, or prevent any symbols being loaded from
+ * userspace.
+*
+ * The kernel symbol mode is kept in dtrace_kernel_symbol_mode, which is protected
+ * by the dtrace_lock.
+ */
+
+#define DTRACE_KERNEL_SYMBOLS_NEVER                    0
+#define DTRACE_KERNEL_SYMBOLS_FROM_KERNEL              1
+#define DTRACE_KERNEL_SYMBOLS_FROM_USERSPACE           2
+#define DTRACE_KERNEL_SYMBOLS_ALWAYS_FROM_KERNEL       3
+       
+#endif /* __APPLE__ */
+
 /*
  * DTrace Helper Implementation
  *
@@ -1166,6 +1215,8 @@ struct dtrace_provider {
        void *dtpv_arg;                         /* provider argument */
        uint_t dtpv_defunct;                    /* boolean: defunct provider */
        struct dtrace_provider *dtpv_next;      /* next provider */
+       uint64_t probe_count;                   /* no. of associated probes */
+       uint64_t ecb_count;                     /* no. of associated enabled ECBs */
 };
 
 struct dtrace_meta {
@@ -1222,7 +1273,7 @@ typedef struct dtrace_anon {
 /*
  * DTrace Error Debugging
  */
-#ifdef DEBUG
+#if DEBUG
 #define        DTRACE_ERRDEBUG
 #endif
 
@@ -1259,21 +1310,21 @@ typedef struct dtrace_toxrange {
 } dtrace_toxrange_t;
 
 extern uint64_t dtrace_getarg(int, int);
-extern greg_t dtrace_getfp(void);
 extern int dtrace_getipl(void);
 extern uintptr_t dtrace_caller(int);
 extern uint32_t dtrace_cas32(uint32_t *, uint32_t, uint32_t);
 extern void *dtrace_casptr(void *, void *, void *);
 #if !defined(__APPLE__)
-extern void dtrace_copyin(uintptr_t, uintptr_t, size_t);
-extern void dtrace_copyinstr(uintptr_t, uintptr_t, size_t);
-extern void dtrace_copyout(uintptr_t, uintptr_t, size_t);
-extern void dtrace_copyoutstr(uintptr_t, uintptr_t, size_t);
+extern void dtrace_copyin(uintptr_t, uintptr_t, size_t, volatile uint16_t *);
+extern void dtrace_copyinstr(uintptr_t, uintptr_t, size_t, volatile uint16_t *);
+extern void dtrace_copyout(uintptr_t, uintptr_t, size_t, volatile uint16_t *);
+extern void dtrace_copyoutstr(uintptr_t, uintptr_t, size_t,
+    volatile uint16_t *);
 #else
-extern void dtrace_copyin(user_addr_t, uintptr_t, size_t);
-extern void dtrace_copyinstr(user_addr_t, uintptr_t, size_t);
-extern void dtrace_copyout(uintptr_t, user_addr_t, size_t);
-extern void dtrace_copyoutstr(uintptr_t, user_addr_t, size_t);
+extern void dtrace_copyin(user_addr_t, uintptr_t, size_t, volatile uint16_t *);
+extern void dtrace_copyinstr(user_addr_t, uintptr_t, size_t, volatile uint16_t *);
+extern void dtrace_copyout(uintptr_t, user_addr_t, size_t, volatile uint16_t *);
+extern void dtrace_copyoutstr(uintptr_t, user_addr_t, size_t, volatile uint16_t *);
 #endif /* __APPLE__ */
 extern void dtrace_getpcstack(pc_t *, int, int, uint32_t *);
 #if !defined(__APPLE__)
@@ -1304,6 +1355,7 @@ extern void dtrace_probe_error(dtrace_state_t *, dtrace_epid_t, int, int,
 extern int dtrace_assfail(const char *, const char *, int);
 extern int dtrace_attached(void);
 extern hrtime_t dtrace_gethrestime(void);
+extern void dtrace_isa_init(void);
 
 #ifdef __sparc
 extern void dtrace_flush_windows(void);
@@ -1312,7 +1364,7 @@ extern uint_t dtrace_getotherwin(void);
 extern uint_t dtrace_getfprs(void);
 #else
 extern void dtrace_copy(uintptr_t, uintptr_t, size_t);
-extern void dtrace_copystr(uintptr_t, uintptr_t, size_t);
+extern void dtrace_copystr(uintptr_t, uintptr_t, size_t, volatile uint16_t *);
 #endif
 
 /*
@@ -1328,7 +1380,7 @@ extern void dtrace_copystr(uintptr_t, uintptr_t, size_t);
  * ASSERT.)
  */
 #undef ASSERT
-#ifdef DEBUG
+#if DEBUG
 #define        ASSERT(EX)      ((void)((EX) || \
                        dtrace_assfail(#EX, __FILE__, __LINE__)))
 #else