/*
- * Copyright (c) 2000-2007 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2010 Apple Inc. All rights reserved.
*
* @APPLE_OSREFERENCE_LICENSE_HEADER_START@
*
#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
/* 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 */
#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 */
#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
#define DBG_NETIPSEC 128 /* IPsec Protocol */
/* **** The Kernel Debug Sub Classes for IOKIT (DBG_IOKIT) **** */
+#define DBG_IOINTC 0 /* Interrupt controller */
#define DBG_IOWORKLOOP 1 /* Work from work loop */
#define DBG_IOINTES 2 /* Interrupt event source */
#define DBG_IOCLKES 3 /* Clock event source */
#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_DRVFIREWIRE 16 /* FireWire */
#define DBG_DRVINFINIBAND 17 /* Infiniband */
#define DBG_DRVGRAPHICS 18 /* Graphics */
+#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 */
#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) */
#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 */
/* 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
#define DKIO_ASYNC 0x04
#define DKIO_META 0x08
#define DKIO_PAGING 0x10
+#define DKIO_THROTTLE 0x20
+#define DKIO_PASSIVE 0x40
+#define DKIO_NOCACHE 0x80
/* Codes for Application Sub Classes */
#define DBG_APP_SAMBA 128
+
/**********************************************************************/
#define KDBG_CODE(Class, SubClass, code) (((Class & 0xff) << 24) | ((SubClass & 0xff) << 16) | ((code & 0x3fff) << 2))
#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)
#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
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);
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 */
#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)
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)
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
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)
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
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
#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 */