]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/sys/kdebug.h
xnu-2050.22.13.tar.gz
[apple/xnu.git] / bsd / sys / kdebug.h
index 9f7b789c9d35af736dd52a090ef05a2f746a16f2..ae8970aa43feced0288deb80dae14b1bff3e1ced 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2007 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2010 Apple Inc. All rights reserved.
  *
  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
  * 
@@ -47,6 +47,11 @@ __BEGIN_DECLS
 #include <kdebug.h>
 #endif /* KERNEL_BUILD */
 
+#ifdef XNU_KERNEL_PRIVATE
+#include <stdint.h>
+#include <mach/branch_predicates.h>
+#endif
+
 /*
  * types of faults that vm_fault handles
  * and creates trace entries for
@@ -77,21 +82,24 @@ __BEGIN_DECLS
 
 
 /* The Kernel Debug Classes  */
-#define DBG_MACH                       1
-#define DBG_NETWORK                    2       
-#define DBG_FSYSTEM                    3
-#define DBG_BSD                                4
-#define DBG_IOKIT                      5
-#define DBG_DRIVERS                    6
-#define DBG_TRACE           7
+#define DBG_MACH               1
+#define DBG_NETWORK            2       
+#define DBG_FSYSTEM            3
+#define DBG_BSD                        4
+#define DBG_IOKIT              5
+#define DBG_DRIVERS            6
+#define DBG_TRACE              7
 #define DBG_DLIL               8
 #define DBG_SECURITY           9
-#define DBG_MISC                       20
-#define DBG_DYLD            31
-#define DBG_QT              32
-#define DBG_APPS            33
-#define DBG_LAUNCHD         34
-#define DBG_MIG                                255
+#define DBG_CORESTORAGE                10
+#define DBG_CG                         11
+#define DBG_MISC               20
+#define DBG_DYLD               31
+#define DBG_QT                 32
+#define DBG_APPS               33
+#define DBG_LAUNCHD            34
+#define DBG_PERF                37
+#define DBG_MIG                        255
 
 /* **** The Kernel Debug Sub Classes for Mach (DBG_MACH) **** */
 #define        DBG_MACH_EXCP_KTRAP_x86 0x02    /* Kernel Traps on x86 */
@@ -114,6 +122,7 @@ __BEGIN_DECLS
 #define        DBG_MACH_MSGID_INVALID  0x50    /* Messages - invalid */
 #define DBG_MACH_LOCKS         0x60    /* new lock APIs */
 #define DBG_MACH_PMAP          0x70    /* pmap */
+#define DBG_MACH_MP            0x90    /* MP related */
 
 /* Codes for Scheduler (DBG_MACH_SCHED) */     
 #define MACH_SCHED              0x0     /* Scheduler */
@@ -127,6 +136,20 @@ __BEGIN_DECLS
 #define        MACH_DEMOTE             0x8     /* promotion undone */
 #define MACH_IDLE               0x9    /* processor idling */
 #define MACH_STACK_DEPTH        0xa    /* stack depth at switch */
+#define MACH_MOVED              0xb    /* did not use original scheduling decision */
+#define MACH_FAIRSHARE_ENTER    0xc    /* move to fairshare band */
+#define MACH_FAIRSHARE_EXIT     0xd    /* exit fairshare band */
+#define MACH_FAILSAFE           0xe    /* tripped fixed-pri/RT failsafe */
+#define MACH_BLOCK              0xf    /* thread block */
+#define MACH_WAIT              0x10    /* thread wait assertion */
+#define        MACH_GET_URGENCY        0x14    /* Urgency queried by platform */
+#define        MACH_URGENCY            0x15    /* Urgency (RT/BG/NORMAL) communicated
+                                        * to platform
+                                        */
+#define        MACH_REDISPATCH         0x16    /* "next thread" thread redispatched */
+#define        MACH_REMOTE_AST         0x17    /* AST signal issued to remote processor */
+
+#define        MACH_SCHED_LPA_BROKEN   0x18    /* last_processor affinity broken in choose_processor */
 
 /* Codes for pmap (DBG_MACH_PMAP) */     
 #define PMAP__CREATE           0x0
@@ -176,31 +199,32 @@ __BEGIN_DECLS
 #define DBG_IOMCURS                    5       /* Memory Cursor */
 #define DBG_IOMDESC                    6       /* Memory Descriptors */
 #define DBG_IOPOWER                    7       /* Power Managerment */
-#define DBG_IOSERVICE                  8       /* Matching etc. */
+#define DBG_IOSERVICE          8       /* Matching etc. */
 
 /* **** 9-32 reserved for internal IOKit usage **** */
 
 #define DBG_IOSTORAGE          32      /* Storage layers */
 #define        DBG_IONETWORK           33      /* Network layers */
 #define        DBG_IOKEYBOARD          34      /* Keyboard */
-#define        DBG_IOHID                       35      /* HID Devices */
-#define        DBG_IOAUDIO                     36      /* Audio */
+#define        DBG_IOHID               35      /* HID Devices */
+#define        DBG_IOAUDIO             36      /* Audio */
 #define        DBG_IOSERIAL            37      /* Serial */
-#define        DBG_IOTTY                       38      /* TTY layers */
-#define DBG_IOSAM                      39      /* SCSI Architecture Model layers */
-#define DBG_IOPARALLELATA   40 /* Parallel ATA */
+#define        DBG_IOTTY               38      /* TTY layers */
+#define DBG_IOSAM              39      /* SCSI Architecture Model layers */
+#define DBG_IOPARALLELATA      40      /* Parallel ATA */
 #define DBG_IOPARALLELSCSI     41      /* Parallel SCSI */
-#define DBG_IOSATA                     42      /* Serial-ATA */
-#define DBG_IOSAS                      43      /* SAS */
+#define DBG_IOSATA             42      /* Serial-ATA */
+#define DBG_IOSAS              43      /* SAS */
 #define DBG_IOFIBRECHANNEL     44      /* FiberChannel */
-#define DBG_IOUSB                      45      /* USB */
+#define DBG_IOUSB              45      /* USB */
 #define DBG_IOBLUETOOTH                46      /* Bluetooth */
 #define DBG_IOFIREWIRE         47      /* FireWire */
 #define DBG_IOINFINIBAND       48      /* Infiniband */
-#define DBG_IOCPUPM                    49      /* CPU Power Management */
+#define DBG_IOCPUPM            49      /* CPU Power Management */
 #define DBG_IOGRAPHICS         50      /* Graphics */
 #define DBG_HIBERNATE          51      /* hibernation related events */
 
+
 /* Backwards compatibility */
 #define        DBG_IOPOINTING          DBG_IOHID                       /* OBSOLETE: Use DBG_IOHID instead */
 #define DBG_IODISK                     DBG_IOSTORAGE           /* OBSOLETE: Use DBG_IOSTORAGE instead */
@@ -223,7 +247,9 @@ __BEGIN_DECLS
 #define DBG_DRVFIREWIRE                16      /* FireWire */
 #define DBG_DRVINFINIBAND      17      /* Infiniband */
 #define DBG_DRVGRAPHICS                18  /* Graphics */
-#define DBG_DRVSD                      19  /* Secure Digital */
+#define DBG_DRVSD              19      /* Secure Digital */
+#define DBG_DRVNAND            20      /* NAND drivers and layers */
+#define DBG_SSD                        21      /* SSD */
 
 /* Backwards compatibility */
 #define        DBG_DRVPOINTING         DBG_DRVHID              /* OBSOLETE: Use DBG_DRVHID instead */
@@ -236,7 +262,7 @@ __BEGIN_DECLS
 #define DBG_DLIL_PR_FLT 4       /* DLIL Protocol Filter */
 #define DBG_DLIL_IF_FLT 5       /* DLIL Interface FIlter */
 
-/* The Kernel Debug Sub Classes for File System */
+/* The Kernel Debug Sub Classes for File System (DBG_FSYSTEM) */
 #define DBG_FSRW      1       /* reads and writes to the filesystem */
 #define DBG_DKRW      2       /* reads and writes to the disk */
 #define DBG_FSVN      3       /* vnode operations (inc. locking/unlocking) */
@@ -244,6 +270,9 @@ __BEGIN_DECLS
 #define DBG_JOURNAL   5       /* journaling operations */
 #define DBG_IOCTL     6       /* ioctl to the disk */
 #define DBG_BOOTCACHE 7       /* bootcache operations */
+#define DBG_HFS       8       /* HFS-specific events; see bsd/hfs/hfs_kdebug.h */
+#define DBG_EXFAT     0xE     /* ExFAT-specific events; see the exfat project */
+#define DBG_MSDOS     0xF     /* FAT-specific events; see the msdosfs project */
 
 /* The Kernel Debug Sub Classes for BSD */
 #define DBG_BSD_PROC           0x01    /* process/signals related */
@@ -256,11 +285,17 @@ __BEGIN_DECLS
 /* The Codes for BSD subcode class DBG_BSD_PROC */
 #define BSD_PROC_EXIT          1       /* process exit */
 #define BSD_PROC_FRCEXIT       2       /* Kernel force termination */
+
 /* The Kernel Debug Sub Classes for DBG_TRACE */
 #define DBG_TRACE_DATA      0
 #define DBG_TRACE_STRING    1
 #define        DBG_TRACE_INFO      2
 
+/* The Kernel Debug Sub Classes for DBG_CORESTORAGE */
+#define DBG_CS_IO      0
+
+/* Sub-class codes for CoreGraphics (DBG_CG) are defined in its component. */
+
 /* The Kernel Debug Sub Classes for DBG_MISC */
 #define DBG_EVENT      0x10
 #define        DBG_BUFFER      0x20
@@ -274,9 +309,14 @@ __BEGIN_DECLS
 #define DKIO_ASYNC     0x04
 #define DKIO_META      0x08
 #define DKIO_PAGING    0x10
+#define DKIO_THROTTLE  0x20
+#define DKIO_PASSIVE   0x40
+#define DKIO_NOCACHE   0x80
+
+/* Kernel Debug Sub Classes for Applications (DBG_APPS) */
+#define DBG_APP_LOGINWINDOW     0x03
+#define DBG_APP_SAMBA           0x80
 
-/* Codes for Application Sub Classes */
-#define DBG_APP_SAMBA  128
 
 /**********************************************************************/
 
@@ -310,6 +350,7 @@ __BEGIN_DECLS
 
 #define PMAP_CODE(code) MACHDBG_CODE(DBG_MACH_PMAP, code)
 
+
 /*   Usage:
 * kernel_debug((KDBG_CODE(DBG_NETWORK, DNET_PROTOCOL, 51) | DBG_FUNC_START), 
 *      offset, 0, 0, 0,0) 
@@ -341,28 +382,96 @@ extern unsigned int kdebug_enable;
 #define KDEBUG_ENABLE_TRACE   0x1
 #define KDEBUG_ENABLE_ENTROPY 0x2
 #define KDEBUG_ENABLE_CHUD    0x4
+#define KDEBUG_ENABLE_PPT     0x8
 
-#if    (!defined(NO_KDEBUG))
+/*
+ * Infer the supported kernel debug event level from config option.
+ * Use (KDEBUG_LEVEL >= KDEBUG_LEVEL_STANDARD) as a guard to protect
+ * unaudited debug code. 
+ */
+#define KDEBUG_LEVEL_NONE     0
+#define KDEBUG_LEVEL_IST      1
+#define KDEBUG_LEVEL_STANDARD 2
+#define KDEBUG_LEVEL_FULL     3
+
+#if NO_KDEBUG
+#define KDEBUG_LEVEL KDEBUG_LEVEL_NONE    
+#elif IST_KDEBUG
+#define KDEBUG_LEVEL KDEBUG_LEVEL_IST
+#elif KDEBUG
+#define KDEBUG_LEVEL KDEBUG_LEVEL_FULL
+#else
+#define KDEBUG_LEVEL KDEBUG_LEVEL_STANDARD
+#endif
 
+#if (KDEBUG_LEVEL >= KDEBUG_LEVEL_STANDARD)
+#ifdef XNU_KERNEL_PRIVATE
 #define KERNEL_DEBUG_CONSTANT(x,a,b,c,d,e)                             \
 do {                                                                   \
-    if (kdebug_enable)                                                 \
+       if (__improbable(kdebug_enable & ~KDEBUG_ENABLE_PPT))                                   \
         kernel_debug(x,(uintptr_t)a,(uintptr_t)b,(uintptr_t)c,         \
                       (uintptr_t)d,(uintptr_t)e);                      \
 } while(0)
 
 #define KERNEL_DEBUG_CONSTANT1(x,a,b,c,d,e)                            \
 do {                                                                   \
-    if (kdebug_enable)                                                 \
+       if (__improbable(kdebug_enable & ~KDEBUG_ENABLE_PPT))                                   \
         kernel_debug1(x,(uintptr_t)a,(uintptr_t)b,(uintptr_t)c,                \
                        (uintptr_t)d,(uintptr_t)e);                     \
 } while(0)
+#else  /* XNU_KERNEL_PRIVATE */
+#define KERNEL_DEBUG_CONSTANT(x,a,b,c,d,e)                             \
+do {                                                                   \
+       if (kdebug_enable & ~KDEBUG_ENABLE_PPT)                                         \
+        kernel_debug(x,(uintptr_t)a,(uintptr_t)b,(uintptr_t)c,         \
+                      (uintptr_t)d,(uintptr_t)e);                      \
+} while(0)
 
-#else
+#define KERNEL_DEBUG_CONSTANT1(x,a,b,c,d,e)                            \
+do {                                                                   \
+       if (kdebug_enable & ~KDEBUG_ENABLE_PPT)                                         \
+        kernel_debug1(x,(uintptr_t)a,(uintptr_t)b,(uintptr_t)c,                \
+                       (uintptr_t)d,(uintptr_t)e);                     \
+} while(0)
+#endif /* XNU_KERNEL_PRIVATE */
+#else /* (KDEBUG_LEVEL >= KDEBUG_LEVEL_STANDARD) */
+#define KERNEL_DEBUG_CONSTANT(x,a,b,c,d,e) do { } while(0)
+#define KERNEL_DEBUG_CONSTANT1(x,a,b,c,d,e) do { } while(0)
+#endif /* (KDEBUG_LEVEL >= KDEBUG_LEVEL_STANDARD) */
+
+/* 
+ * Specify KDEBUG_PPT to indicate that the event belongs to the
+ * limited PPT set.
+ */
+#define KDEBUG_COMMON (KDEBUG_ENABLE_TRACE|KDEBUG_ENABLE_ENTROPY|KDEBUG_ENABLE_CHUD|KDEBUG_ENABLE_PPT)
+#define KDEBUG_TRACE  (KDEBUG_ENABLE_TRACE|KDEBUG_ENABLE_ENTROPY|KDEBUG_ENABLE_CHUD)
+#define KDEBUG_PPT    (KDEBUG_ENABLE_PPT)
 
-#define KERNEL_DEBUG_CONSTANT(x,a,b,c,d,e)
-#define KERNEL_DEBUG_CONSTANT1(x,a,b,c,d,e)
+/*
+ * KERNEL_DEBUG_CONSTANT_IST events provide an audited subset of
+ * tracepoints for userland system tracing tools.
+ */
+#if (KDEBUG_LEVEL >= KDEBUG_LEVEL_IST)
+#ifdef XNU_KERNEL_PRIVATE
+#define KERNEL_DEBUG_CONSTANT_IST(type,x,a,b,c,d,e)                            \
+do {                                                                   \
+       if (__improbable(kdebug_enable & type))                                 \
+        kernel_debug(x,(uintptr_t)a,(uintptr_t)b,(uintptr_t)c,         \
+                       (uintptr_t)d,(uintptr_t)e);                     \
+} while(0)
+#else /* XNU_KERNEL_PRIVATE */
+#define KERNEL_DEBUG_CONSTANT_IST(type,x,a,b,c,d,e)                            \
+do {                                                                   \
+       if (kdebug_enable & type)                                               \
+        kernel_debug(x,(uintptr_t)a,(uintptr_t)b,(uintptr_t)c,         \
+                       (uintptr_t)d,(uintptr_t)e);                     \
+} while(0)
+#endif /* XNU_KERNEL_PRIVATE */
+#else /* (KDEBUG_LEVEL >= KDEBUG_LEVEL_IST) */
+#define KERNEL_DEBUG_CONSTANT_IST(type,x,a,b,c,d,e) do { } while(0)
+#endif /* (KDEBUG_LEVEL >= KDEBUG_LEVEL_IST) */
 
+#if NO_KDEBUG
 #define __kdebug_constant_only __unused
 #endif
 
@@ -383,33 +492,47 @@ extern void kernel_debug1(
                uintptr_t arg5);
 
 
-#if    (KDEBUG && (!defined(NO_KDEBUG)))
-
+#if (KDEBUG_LEVEL >= KDEBUG_LEVEL_FULL)
+#ifdef XNU_KERNEL_PRIVATE
 #define KERNEL_DEBUG(x,a,b,c,d,e)                                      \
 do {                                                                   \
-    if (kdebug_enable)                                                 \
+       if (__improbable(kdebug_enable & ~KDEBUG_ENABLE_PPT))                   \
         kernel_debug((uint32_t)x,  (uintptr_t)a, (uintptr_t)b,         \
                     (uintptr_t)c, (uintptr_t)d, (uintptr_t)e);         \
 } while(0)
 
 #define KERNEL_DEBUG1(x,a,b,c,d,e)                                     \
 do {                                                                   \
-    if (kdebug_enable)                                                 \
+       if (__improbable(kdebug_enable & ~KDEBUG_ENABLE_PPT))                   \
         kernel_debug1((uint32_t)x,  (uintptr_t)a, (uintptr_t)b,                \
                      (uintptr_t)c, (uintptr_t)d, (uintptr_t)e);        \
 } while(0)
 
 #define __kdebug_only
+#else /* !XNU_KERNEL_PRIVATE */
+#define KERNEL_DEBUG(x,a,b,c,d,e)                                      \
+do {                                                                   \
+       if (kdebug_enable & ~KDEBUG_ENABLE_PPT)                         \
+        kernel_debug((uint32_t)x,  (uintptr_t)a, (uintptr_t)b,         \
+                    (uintptr_t)c, (uintptr_t)d, (uintptr_t)e);         \
+} while(0)
 
-#else
-
+#define KERNEL_DEBUG1(x,a,b,c,d,e)                                     \
+do {                                                                   \
+       if (kdebug_enable & ~KDEBUG_ENABLE_PPT)                         \
+        kernel_debug1((uint32_t)x,  (uintptr_t)a, (uintptr_t)b,                \
+                     (uintptr_t)c, (uintptr_t)d, (uintptr_t)e);        \
+} while(0)
+#endif /* XNU_KERNEL_PRIVATE */
+#else /* (KDEBUG_LEVEL >= KDEBUG_LEVEL_FULL) */
 #define KERNEL_DEBUG(x,a,b,c,d,e) do {} while (0)
 #define KERNEL_DEBUG1(x,a,b,c,d,e) do {} while (0)
 
 #define __kdebug_only __unused
-#endif
+#endif /* (KDEBUG_LEVEL >= KDEBUG_LEVEL_FULL) */
 
 #ifdef KERNEL_PRIVATE
+#include <mach/boolean.h>
 struct proc;
 extern void kdbg_trace_data(struct proc *proc, long *arg_pid);
 
@@ -417,6 +540,21 @@ extern void kdbg_trace_string(struct proc *proc, long *arg1, long *arg2, long *a
 
 extern void kdbg_dump_trace_to_file(const char *);
 void start_kern_tracing(unsigned int);
+struct task;
+extern void kdbg_get_task_name(char*, int, struct task *task);
+void disable_wrap(uint32_t *old_slowcheck, uint32_t *old_flags);
+void enable_wrap(uint32_t old_slowcheck, boolean_t lostevents);
+void release_storage_unit(int cpu,  uint32_t storage_unit);
+int allocate_storage_unit(int cpu);
+
+void trace_handler_map_ctrl_page(uintptr_t addr, unsigned long ctrl_page_size, unsigned long storage_size, unsigned long kds_ptr_size);
+void trace_handler_map_bufinfo(uintptr_t addr, unsigned long size);
+void trace_handler_unmap_bufinfo(void);
+void trace_handler_map_buffer(int index, uintptr_t addr, unsigned long size);
+void trace_handler_unmap_buffer(int index);
+void trace_set_timebases(uint64_t tsc, uint64_t ns);
+
+
 #endif  /* KERNEL_PRIVATE */
 
 
@@ -446,7 +584,7 @@ typedef struct {
 
 #if !defined(__LP64__)
 #define KDBG_TIMESTAMP_MASK            0x00ffffffffffffffULL
-#define KDBG_CPU_MASK                  0x0f00000000000000ULL
+#define KDBG_CPU_MASK                  0xff00000000000000ULL
 #define KDBG_CPU_SHIFT                 56
 static inline void
 kdbg_set_cpu(kd_buf *kp, int cpu)
@@ -460,9 +598,9 @@ kdbg_get_cpu(kd_buf *kp)
        return (int) (((kp)->timestamp & KDBG_CPU_MASK) >> KDBG_CPU_SHIFT);
 }
 static inline void
-kdbg_set_timestamp(kd_buf *kp, uint64_t time)
+kdbg_set_timestamp(kd_buf *kp, uint64_t thetime)
 {
-       kp->timestamp = time & KDBG_TIMESTAMP_MASK;
+       kp->timestamp = thetime & KDBG_TIMESTAMP_MASK;
 }
 static inline uint64_t
 kdbg_get_timestamp(kd_buf *kp)
@@ -470,9 +608,9 @@ kdbg_get_timestamp(kd_buf *kp)
        return kp->timestamp & KDBG_TIMESTAMP_MASK;
 }
 static inline void
-kdbg_set_timestamp_and_cpu(kd_buf *kp, uint64_t time, int cpu)
+kdbg_set_timestamp_and_cpu(kd_buf *kp, uint64_t thetime, int cpu)
 {
-       kp->timestamp = (time & KDBG_TIMESTAMP_MASK) | 
+       kp->timestamp = (thetime & KDBG_TIMESTAMP_MASK) | 
                                (((uint64_t) cpu) << KDBG_CPU_SHIFT);
 }
 #else
@@ -488,9 +626,9 @@ kdbg_get_cpu(kd_buf *kp)
        return kp->cpuid;
 }
 static inline void
-kdbg_set_timestamp(kd_buf *kp, uint64_t time)
+kdbg_set_timestamp(kd_buf *kp, uint64_t thetime)
 {
-       kp->timestamp = time;
+       kp->timestamp = thetime;
 }
 static inline uint64_t
 kdbg_get_timestamp(kd_buf *kp)
@@ -498,13 +636,16 @@ kdbg_get_timestamp(kd_buf *kp)
        return kp->timestamp;
 }
 static inline void
-kdbg_set_timestamp_and_cpu(kd_buf *kp, uint64_t time, int cpu)
+kdbg_set_timestamp_and_cpu(kd_buf *kp, uint64_t thetime, int cpu)
 {
-       kdbg_set_timestamp(kp, time);
+       kdbg_set_timestamp(kp, thetime);
        kdbg_set_cpu(kp, cpu);
 }
 #endif
 
+/* 2^16 bits (8 kilobytes), one for each possible class/subclass combination */
+#define KDBG_TYPEFILTER_BITMAP_SIZE            ( (256 * 256) / 8 )
+
 /* Debug Flags */
 #define        KDBG_INIT       0x001
 #define        KDBG_NOWRAP     0x002
@@ -541,6 +682,18 @@ typedef struct {
        char            command[20];
 } kd_threadmap;
 
+
+typedef struct {
+       int             version_no;
+       int             thread_count;
+       uint64_t        TOD_secs;
+       uint32_t        TOD_usecs;
+} RAW_header;
+
+#define RAW_VERSION0   0x55aa0000
+#define RAW_VERSION1   0x55aa0101
+
+
 #define        KDBG_CLASSTYPE          0x10000
 #define        KDBG_SUBCLSTYPE         0x20000
 #define        KDBG_RANGETYPE          0x40000
@@ -550,6 +703,8 @@ typedef struct {
 #define        KDBG_RANGECHECK 0x100000
 #define        KDBG_VALCHECK   0x200000        /* Check up to 4 individual values */
 
+#define        KDBG_TYPEFILTER_CHECK   ((uint32_t) 0x400000)        /* Check class and subclass against a bitmap */ 
+
 #define        KDBG_BUFINIT    0x80000000
 
 /* Control operations */