1/*
2 * Copyright (c) 2000-2010 Apple Inc. All rights reserved.
3 *
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. The rights granted to you under the License
10 * may not be used to create, or enable the creation or redistribution of,
11 * unlawful or unlicensed copies of an Apple operating system, or to
12 * circumvent, violate, or enable the circumvention or violation of, any
13 * terms of an Apple operating system software license agreement.
14 *
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
17 *
18 * The Original Code and all software distributed under the License are
19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23 * Please see the License for the specific language governing rights and
24 * limitations under the License.
25 *
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27 */
28
29/* 	Copyright (c) 1997 Apple Computer, Inc.  All rights reserved.
30 *
31 * kdebug.h -   kernel_debug definitions
32 *
33 */
34
35#ifndef BSD_SYS_KDEBUG_H
36#define BSD_SYS_KDEBUG_H
37
38#include <sys/appleapiopts.h>
39#include <sys/cdefs.h>
40__BEGIN_DECLS
41
42#ifdef __APPLE_API_UNSTABLE
43
44#include <mach/clock_types.h>
45#include <stdint.h>
46#if	defined(KERNEL_BUILD)
47#include <kdebug.h>
48#endif /* KERNEL_BUILD */
49
50#ifdef	XNU_KERNEL_PRIVATE
51#include <stdint.h>
52#include <mach/branch_predicates.h>
53#endif
54
55/*
56 * types of faults that vm_fault handles
57 * and creates trace entries for
58 */
59#define DBG_ZERO_FILL_FAULT   1
60#define DBG_PAGEIN_FAULT      2
61#define DBG_COW_FAULT         3
62#define DBG_CACHE_HIT_FAULT   4
63#define DBG_NZF_PAGE_FAULT    5
64#define DBG_GUARD_FAULT	      6
65#define DBG_PAGEINV_FAULT     7
66#define DBG_PAGEIND_FAULT     8
67
68
69/* The debug code consists of the following
70*
71* ----------------------------------------------------------------------
72*|              |               |                               |Func   |
73*| Class (8)    | SubClass (8)  |          Code (14)            |Qual(2)|
74* ----------------------------------------------------------------------
75* The class specifies the higher level
76*/
77
78/* The Function qualifiers  */
79#define DBG_FUNC_START		1
80#define DBG_FUNC_END		2
81#define DBG_FUNC_NONE		0
82
83
84/* The Kernel Debug Classes  */
85#define DBG_MACH		1
86#define DBG_NETWORK		2
87#define DBG_FSYSTEM		3
88#define DBG_BSD			4
89#define DBG_IOKIT		5
90#define DBG_DRIVERS		6
91#define DBG_TRACE           	7
92#define DBG_DLIL	        8
93#define DBG_SECURITY		9
94#define DBG_CORESTORAGE		10
95#define DBG_CG         		11
96#define DBG_MISC		20
97#define DBG_DYLD           	31
98#define DBG_QT              	32
99#define DBG_APPS            	33
100#define DBG_LAUNCHD         	34
101#define DBG_PERF                37
102#define DBG_MIG			255
103
104/* **** The Kernel Debug Sub Classes for Mach (DBG_MACH) **** */
105#define	DBG_MACH_EXCP_KTRAP_x86	0x02	/* Kernel Traps on x86 */
106#define	DBG_MACH_EXCP_DFLT	0x03	/* Data Translation Fault */
107#define	DBG_MACH_EXCP_IFLT	0x04	/* Inst Translation Fault */
108#define	DBG_MACH_EXCP_INTR	0x05	/* Interrupts */
109#define	DBG_MACH_EXCP_ALNG	0x06	/* Alignment Exception */
110#define	DBG_MACH_EXCP_UTRAP_x86	0x07	/* User Traps on x86 */
111#define	DBG_MACH_EXCP_FP	0x08	/* FP Unavail */
112#define	DBG_MACH_EXCP_DECI	0x09	/* Decrementer Interrupt */
113#define	DBG_MACH_CHUD		0x0A	/* CHUD */
114#define	DBG_MACH_EXCP_SC	0x0C	/* System Calls */
115#define	DBG_MACH_EXCP_TRACE	0x0D	/* Trace exception */
116#define	DBG_MACH_EXCP_EMUL	0x0E	/* Instruction emulated */
117#define	DBG_MACH_IHDLR		0x10	/* Interrupt Handlers */
118#define	DBG_MACH_IPC		0x20	/* Inter Process Comm */
119#define	DBG_MACH_VM		0x30	/* Virtual Memory */
120#define	DBG_MACH_LEAKS		0x31    /* alloc/free */
121#define	DBG_MACH_SCHED		0x40	/* Scheduler */
122#define	DBG_MACH_MSGID_INVALID	0x50	/* Messages - invalid */
123#define DBG_MACH_LOCKS		0x60	/* new lock APIs */
124#define DBG_MACH_PMAP		0x70	/* pmap */
125#define DBG_MACH_MP		0x90	/* MP related */
126
127/* Codes for Scheduler (DBG_MACH_SCHED) */
128#define MACH_SCHED              0x0     /* Scheduler */
129#define MACH_STACK_ATTACH       0x1     /* stack_attach() */
130#define MACH_STACK_HANDOFF      0x2     /* stack_handoff() */
131#define MACH_CALL_CONT          0x3     /* call_continuation() */
132#define MACH_CALLOUT            0x4     /* callouts */
133#define MACH_STACK_DETACH       0x5
134#define MACH_MAKE_RUNNABLE      0x6     /* make thread runnable */
135#define	MACH_PROMOTE            0x7	/* promoted due to resource */
136#define	MACH_DEMOTE             0x8	/* promotion undone */
137#define MACH_IDLE               0x9	/* processor idling */
138#define MACH_STACK_DEPTH        0xa	/* stack depth at switch */
139#define MACH_MOVED              0xb	/* did not use original scheduling decision */
140#define MACH_FAIRSHARE_ENTER    0xc	/* move to fairshare band */
141#define MACH_FAIRSHARE_EXIT     0xd	/* exit fairshare band */
142#define MACH_FAILSAFE           0xe	/* tripped fixed-pri/RT failsafe */
143#define MACH_BLOCK              0xf	/* thread block */
144#define MACH_WAIT		0x10	/* thread wait assertion */
145#define	MACH_GET_URGENCY	0x14	/* Urgency queried by platform */
146#define	MACH_URGENCY		0x15	/* Urgency (RT/BG/NORMAL) communicated
147   					 * to platform
148					 */
149#define	MACH_REDISPATCH		0x16	/* "next thread" thread redispatched */
150#define	MACH_REMOTE_AST		0x17	/* AST signal issued to remote processor */
151
152#define	MACH_SCHED_LPA_BROKEN	0x18	/* last_processor affinity broken in choose_processor */
153
154/* Codes for pmap (DBG_MACH_PMAP) */
155#define PMAP__CREATE		0x0
156#define PMAP__DESTROY		0x1
157#define PMAP__PROTECT		0x2
158#define PMAP__PAGE_PROTECT	0x3
159#define PMAP__ENTER		0x4
160#define PMAP__REMOVE		0x5
161#define PMAP__NEST		0x6
162#define PMAP__UNNEST		0x7
163#define PMAP__FLUSH_TLBS	0x8
164#define PMAP__UPDATE_INTERRUPT	0x9
165#define PMAP__ATTRIBUTE_CLEAR	0xa
166
167/* **** The Kernel Debug Sub Classes for Network (DBG_NETWORK) **** */
168#define DBG_NETIP	1	/* Internet Protocol */
169#define DBG_NETARP	2	/* Address Resolution Protocol */
170#define	DBG_NETUDP	3	/* User Datagram Protocol */
171#define	DBG_NETTCP	4	/* Transmission Control Protocol */
172#define	DBG_NETICMP	5	/* Internet Control Message Protocol */
173#define	DBG_NETIGMP	6	/* Internet Group Management Protocol */
174#define	DBG_NETRIP	7	/* Routing Information Protocol */
175#define	DBG_NETOSPF	8	/* Open Shortest Path First */
176#define	DBG_NETISIS	9	/* Intermediate System to Intermediate System */
177#define	DBG_NETSNMP	10	/* Simple Network Management Protocol */
178#define DBG_NETSOCK	11	/* Socket Layer */
179
180/* For Apple talk */
181#define	DBG_NETAARP	100	/* Apple ARP */
182#define	DBG_NETDDP	101	/* Datagram Delivery Protocol */
183#define	DBG_NETNBP	102	/* Name Binding Protocol */
184#define	DBG_NETZIP	103	/* Zone Information Protocol */
185#define	DBG_NETADSP	104	/* Name Binding Protocol */
186#define	DBG_NETATP	105	/* Apple Transaction Protocol */
187#define	DBG_NETASP	106	/* Apple Session Protocol */
188#define	DBG_NETAFP	107	/* Apple Filing Protocol */
189#define	DBG_NETRTMP	108	/* Routing Table Maintenance Protocol */
190#define	DBG_NETAURP	109	/* Apple Update Routing Protocol */
191#define	DBG_NETIPSEC	128	/* IPsec Protocol  */
192
193/* **** The Kernel Debug Sub Classes for IOKIT (DBG_IOKIT) **** */
194#define DBG_IOINTC			0	/* Interrupt controller */
195#define DBG_IOWORKLOOP		1	/* Work from work loop */
196#define DBG_IOINTES			2	/* Interrupt event source */
197#define DBG_IOCLKES			3	/* Clock event source */
198#define DBG_IOCMDQ			4	/* Command queue latencies */
199#define DBG_IOMCURS			5	/* Memory Cursor */
200#define DBG_IOMDESC			6	/* Memory Descriptors */
201#define DBG_IOPOWER			7	/* Power Managerment */
202#define DBG_IOSERVICE		8	/* Matching etc. */
203
204/* **** 9-32 reserved for internal IOKit usage **** */
205
206#define DBG_IOSTORAGE		32	/* Storage layers */
207#define	DBG_IONETWORK		33	/* Network layers */
208#define	DBG_IOKEYBOARD		34	/* Keyboard */
209#define	DBG_IOHID		35	/* HID Devices */
210#define	DBG_IOAUDIO		36	/* Audio */
211#define	DBG_IOSERIAL		37	/* Serial */
212#define	DBG_IOTTY		38	/* TTY layers */
213#define DBG_IOSAM		39	/* SCSI Architecture Model layers */
214#define DBG_IOPARALLELATA   	40	/* Parallel ATA */
215#define DBG_IOPARALLELSCSI	41	/* Parallel SCSI */
216#define DBG_IOSATA		42	/* Serial-ATA */
217#define DBG_IOSAS		43	/* SAS */
218#define DBG_IOFIBRECHANNEL	44	/* FiberChannel */
219#define DBG_IOUSB		45	/* USB */
220#define DBG_IOBLUETOOTH		46	/* Bluetooth */
221#define DBG_IOFIREWIRE		47	/* FireWire */
222#define DBG_IOINFINIBAND	48	/* Infiniband */
223#define DBG_IOCPUPM		49	/* CPU Power Management */
224#define DBG_IOGRAPHICS		50	/* Graphics */
225#define DBG_HIBERNATE		51	/* hibernation related events */
226
227
228/* Backwards compatibility */
229#define	DBG_IOPOINTING		DBG_IOHID			/* OBSOLETE: Use DBG_IOHID instead */
230#define DBG_IODISK			DBG_IOSTORAGE		/* OBSOLETE: Use DBG_IOSTORAGE instead */
231
232/* **** The Kernel Debug Sub Classes for Device Drivers (DBG_DRIVERS) **** */
233#define DBG_DRVSTORAGE		1	/* Storage layers */
234#define	DBG_DRVNETWORK		2	/* Network layers */
235#define	DBG_DRVKEYBOARD		3	/* Keyboard */
236#define	DBG_DRVHID			4	/* HID Devices */
237#define	DBG_DRVAUDIO		5	/* Audio */
238#define	DBG_DRVSERIAL		7	/* Serial */
239#define DBG_DRVSAM			8	/* SCSI Architecture Model layers */
240#define DBG_DRVPARALLELATA  9	/* Parallel ATA */
241#define DBG_DRVPARALLELSCSI	10	/* Parallel SCSI */
242#define DBG_DRVSATA			11	/* Serial ATA */
243#define DBG_DRVSAS			12	/* SAS */
244#define DBG_DRVFIBRECHANNEL	13	/* FiberChannel */
245#define DBG_DRVUSB			14	/* USB */
246#define DBG_DRVBLUETOOTH	15	/* Bluetooth */
247#define DBG_DRVFIREWIRE		16	/* FireWire */
248#define DBG_DRVINFINIBAND	17	/* Infiniband */
249#define DBG_DRVGRAPHICS		18  /* Graphics */
250#define DBG_DRVSD		19 	/* Secure Digital */
251#define DBG_DRVNAND		20	/* NAND drivers and layers */
252#define DBG_SSD			21	/* SSD */
253
254/* Backwards compatibility */
255#define	DBG_DRVPOINTING		DBG_DRVHID		/* OBSOLETE: Use DBG_DRVHID instead */
256#define DBG_DRVDISK			DBG_DRVSTORAGE	/* OBSOLETE: Use DBG_DRVSTORAGE instead */
257
258/* **** The Kernel Debug Sub Classes for the DLIL Layer (DBG_DLIL) **** */
259#define DBG_DLIL_STATIC 1       /* Static DLIL code */
260#define DBG_DLIL_PR_MOD 2       /* DLIL Protocol Module */
261#define DBG_DLIL_IF_MOD 3       /* DLIL Interface Module */
262#define DBG_DLIL_PR_FLT 4       /* DLIL Protocol Filter */
263#define DBG_DLIL_IF_FLT 5       /* DLIL Interface FIlter */
264
265/* The Kernel Debug Sub Classes for File System (DBG_FSYSTEM) */
266#define DBG_FSRW      1       /* reads and writes to the filesystem */
267#define DBG_DKRW      2       /* reads and writes to the disk */
268#define DBG_FSVN      3       /* vnode operations (inc. locking/unlocking) */
269#define DBG_FSLOOOKUP 4       /* namei and other lookup-related operations */
270#define DBG_JOURNAL   5       /* journaling operations */
271#define DBG_IOCTL     6       /* ioctl to the disk */
272#define DBG_BOOTCACHE 7       /* bootcache operations */
273#define DBG_HFS       8       /* HFS-specific events; see bsd/hfs/hfs_kdebug.h */
274#define DBG_EXFAT     0xE     /* ExFAT-specific events; see the exfat project */
275#define DBG_MSDOS     0xF     /* FAT-specific events; see the msdosfs project */
276
277/* The Kernel Debug Sub Classes for BSD */
278#define DBG_BSD_PROC		0x01	/* process/signals related */
279#define	DBG_BSD_EXCP_SC		0x0C	/* System Calls */
280#define	DBG_BSD_AIO		0x0D	/* aio (POSIX async IO) */
281#define DBG_BSD_SC_EXTENDED_INFO 0x0E	/* System Calls, extended info */
282#define DBG_BSD_SC_EXTENDED_INFO2 0x0F	/* System Calls, extended info */
283
284
285/* The Codes for BSD subcode class DBG_BSD_PROC */
286#define BSD_PROC_EXIT		1	/* process exit */
287#define BSD_PROC_FRCEXIT 	2	/* Kernel force termination */
288
289/* The Kernel Debug Sub Classes for DBG_TRACE */
290#define DBG_TRACE_DATA      0
291#define DBG_TRACE_STRING    1
292#define	DBG_TRACE_INFO	    2
293
294/* The Kernel Debug Sub Classes for DBG_CORESTORAGE */
295#define DBG_CS_IO	0
296
297/* Sub-class codes for CoreGraphics (DBG_CG) are defined in its component. */
298
299/* The Kernel Debug Sub Classes for DBG_MISC */
300#define DBG_EVENT	0x10
301#define	DBG_BUFFER	0x20
302
303/* The Kernel Debug Sub Classes for DBG_DYLD */
304#define DBG_DYLD_STRING   5
305
306/* The Kernel Debug modifiers for the DBG_DKRW sub class */
307#define DKIO_DONE 	0x01
308#define DKIO_READ	0x02
309#define DKIO_ASYNC	0x04
310#define DKIO_META	0x08
311#define DKIO_PAGING	0x10
312#define DKIO_THROTTLE	0x20
313#define DKIO_PASSIVE	0x40
314#define DKIO_NOCACHE	0x80
315
316/* Kernel Debug Sub Classes for Applications (DBG_APPS) */
317#define DBG_APP_LOGINWINDOW     0x03
318#define DBG_APP_SAMBA           0x80
319
320
321/**********************************************************************/
322
323#define KDBG_CODE(Class, SubClass, code) (((Class & 0xff) << 24) | ((SubClass & 0xff) << 16) | ((code & 0x3fff)  << 2))
324
325#define KDBG_MIGCODE(msgid) ((DBG_MIG << 24) | (((msgid) & 0x3fffff)  << 2))
326
327#define MACHDBG_CODE(SubClass, code) KDBG_CODE(DBG_MACH, SubClass, code)
328#define NETDBG_CODE(SubClass, code) KDBG_CODE(DBG_NETWORK, SubClass, code)
329#define FSDBG_CODE(SubClass, code) KDBG_CODE(DBG_FSYSTEM, SubClass, code)
330#define BSDDBG_CODE(SubClass, code) KDBG_CODE(DBG_BSD, SubClass, code)
331#define IOKDBG_CODE(SubClass, code) KDBG_CODE(DBG_IOKIT, SubClass, code)
332#define DRVDBG_CODE(SubClass, code) KDBG_CODE(DBG_DRIVERS, SubClass, code)
333#define TRACEDBG_CODE(SubClass,code) KDBG_CODE(DBG_TRACE, SubClass, code)
334#define MISCDBG_CODE(SubClass,code) KDBG_CODE(DBG_MISC, SubClass, code)
335#define DLILDBG_CODE(SubClass,code) KDBG_CODE(DBG_DLIL, SubClass, code)
336#define SECURITYDBG_CODE(SubClass,code) KDBG_CODE(DBG_SECURITY, SubClass, code)
337#define DYLDDBG_CODE(SubClass,code) KDBG_CODE(DBG_DYLD, SubClass, code)
338#define QTDBG_CODE(SubClass,code) KDBG_CODE(DBG_QT, SubClass, code)
339#define APPSDBG_CODE(SubClass,code) KDBG_CODE(DBG_APPS, SubClass, code)
340#define CPUPM_CODE(code) IOKDBG_CODE(DBG_IOCPUPM, code)
341
342#define KMEM_ALLOC_CODE MACHDBG_CODE(DBG_MACH_LEAKS, 0)
343#define KMEM_ALLOC_CODE_2 MACHDBG_CODE(DBG_MACH_LEAKS, 1)
344#define KMEM_FREE_CODE MACHDBG_CODE(DBG_MACH_LEAKS, 2)
345#define KMEM_FREE_CODE_2 MACHDBG_CODE(DBG_MACH_LEAKS, 3)
346#define ZALLOC_CODE MACHDBG_CODE(DBG_MACH_LEAKS, 4)
347#define ZALLOC_CODE_2 MACHDBG_CODE(DBG_MACH_LEAKS, 5)
348#define ZFREE_CODE MACHDBG_CODE(DBG_MACH_LEAKS, 6)
349#define ZFREE_CODE_2 MACHDBG_CODE(DBG_MACH_LEAKS, 7)
350
351#define PMAP_CODE(code) MACHDBG_CODE(DBG_MACH_PMAP, code)
352
353
354/*   Usage:
355* kernel_debug((KDBG_CODE(DBG_NETWORK, DNET_PROTOCOL, 51) | DBG_FUNC_START),
356*	offset, 0, 0, 0,0)
357*
358* For ex,
359*
360* #include <sys/kdebug.h>
361*
362* #define DBG_NETIPINIT NETDBG_CODE(DBG_NETIP,1)
363*
364*
365* void
366* ip_init()
367* {
368*	register struct protosw *pr;
369*	register int i;
370*
371*	KERNEL_DEBUG(DBG_NETIPINIT | DBG_FUNC_START, 0,0,0,0,0)
372* 	--------
373*	KERNEL_DEBUG(DBG_NETIPINIT, 0,0,0,0,0)
374* 	--------
375*	KERNEL_DEBUG(DBG_NETIPINIT | DBG_FUNC_END, 0,0,0,0,0)
376* }
377*
378
379*/
380
381extern unsigned int kdebug_enable;
382#define KDEBUG_ENABLE_TRACE   0x1
383#define KDEBUG_ENABLE_ENTROPY 0x2
384#define KDEBUG_ENABLE_CHUD    0x4
385#define KDEBUG_ENABLE_PPT     0x8
386
387/*
388 * Infer the supported kernel debug event level from config option.
389 * Use (KDEBUG_LEVEL >= KDEBUG_LEVEL_STANDARD) as a guard to protect
390 * unaudited debug code.
391 */
392#define KDEBUG_LEVEL_NONE     0
393#define KDEBUG_LEVEL_IST      1
394#define KDEBUG_LEVEL_STANDARD 2
395#define KDEBUG_LEVEL_FULL     3
396
397#if NO_KDEBUG
398#define KDEBUG_LEVEL KDEBUG_LEVEL_NONE
399#elif IST_KDEBUG
400#define KDEBUG_LEVEL KDEBUG_LEVEL_IST
401#elif KDEBUG
402#define KDEBUG_LEVEL KDEBUG_LEVEL_FULL
403#else
404#define KDEBUG_LEVEL KDEBUG_LEVEL_STANDARD
405#endif
406
407#if (KDEBUG_LEVEL >= KDEBUG_LEVEL_STANDARD)
408#ifdef XNU_KERNEL_PRIVATE
409#define KERNEL_DEBUG_CONSTANT(x,a,b,c,d,e)				\
410do {									\
411	if (__improbable(kdebug_enable & ~KDEBUG_ENABLE_PPT))					\
412        kernel_debug(x,(uintptr_t)a,(uintptr_t)b,(uintptr_t)c,		\
413		       (uintptr_t)d,(uintptr_t)e);			\
414} while(0)
415
416#define KERNEL_DEBUG_CONSTANT1(x,a,b,c,d,e)				\
417do {									\
418	if (__improbable(kdebug_enable & ~KDEBUG_ENABLE_PPT))					\
419        kernel_debug1(x,(uintptr_t)a,(uintptr_t)b,(uintptr_t)c,		\
420			(uintptr_t)d,(uintptr_t)e);			\
421} while(0)
422#else	/* XNU_KERNEL_PRIVATE */
423#define KERNEL_DEBUG_CONSTANT(x,a,b,c,d,e)				\
424do {									\
425	if (kdebug_enable & ~KDEBUG_ENABLE_PPT)						\
426        kernel_debug(x,(uintptr_t)a,(uintptr_t)b,(uintptr_t)c,		\
427		       (uintptr_t)d,(uintptr_t)e);			\
428} while(0)
429
430#define KERNEL_DEBUG_CONSTANT1(x,a,b,c,d,e)				\
431do {									\
432	if (kdebug_enable & ~KDEBUG_ENABLE_PPT)						\
433        kernel_debug1(x,(uintptr_t)a,(uintptr_t)b,(uintptr_t)c,		\
434			(uintptr_t)d,(uintptr_t)e);			\
435} while(0)
436#endif /* XNU_KERNEL_PRIVATE */
437#else /* (KDEBUG_LEVEL >= KDEBUG_LEVEL_STANDARD) */
438#define KERNEL_DEBUG_CONSTANT(x,a,b,c,d,e) do { } while(0)
439#define KERNEL_DEBUG_CONSTANT1(x,a,b,c,d,e) do { } while(0)
440#endif /* (KDEBUG_LEVEL >= KDEBUG_LEVEL_STANDARD) */
441
442/*
443 * Specify KDEBUG_PPT to indicate that the event belongs to the
444 * limited PPT set.
445 */
446#define KDEBUG_COMMON (KDEBUG_ENABLE_TRACE|KDEBUG_ENABLE_ENTROPY|KDEBUG_ENABLE_CHUD|KDEBUG_ENABLE_PPT)
447#define KDEBUG_TRACE  (KDEBUG_ENABLE_TRACE|KDEBUG_ENABLE_ENTROPY|KDEBUG_ENABLE_CHUD)
448#define KDEBUG_PPT    (KDEBUG_ENABLE_PPT)
449
450/*
451 * KERNEL_DEBUG_CONSTANT_IST events provide an audited subset of
452 * tracepoints for userland system tracing tools.
453 */
454#if (KDEBUG_LEVEL >= KDEBUG_LEVEL_IST)
455#ifdef XNU_KERNEL_PRIVATE
456#define KERNEL_DEBUG_CONSTANT_IST(type,x,a,b,c,d,e)				\
457do {									\
458	if (__improbable(kdebug_enable & type))					\
459        kernel_debug(x,(uintptr_t)a,(uintptr_t)b,(uintptr_t)c,		\
460			(uintptr_t)d,(uintptr_t)e);			\
461} while(0)
462#else /* XNU_KERNEL_PRIVATE */
463#define KERNEL_DEBUG_CONSTANT_IST(type,x,a,b,c,d,e)				\
464do {									\
465	if (kdebug_enable & type)						\
466        kernel_debug(x,(uintptr_t)a,(uintptr_t)b,(uintptr_t)c,		\
467			(uintptr_t)d,(uintptr_t)e);			\
468} while(0)
469#endif /* XNU_KERNEL_PRIVATE */
470#else /* (KDEBUG_LEVEL >= KDEBUG_LEVEL_IST) */
471#define KERNEL_DEBUG_CONSTANT_IST(type,x,a,b,c,d,e) do { } while(0)
472#endif /* (KDEBUG_LEVEL >= KDEBUG_LEVEL_IST) */
473
474#if NO_KDEBUG
475#define __kdebug_constant_only __unused
476#endif
477
478extern void kernel_debug(
479		uint32_t  debugid,
480		uintptr_t arg1,
481		uintptr_t arg2,
482		uintptr_t arg3,
483		uintptr_t arg4,
484		uintptr_t arg5);
485
486extern void kernel_debug1(
487		uint32_t  debugid,
488		uintptr_t arg1,
489		uintptr_t arg2,
490		uintptr_t arg3,
491		uintptr_t arg4,
492		uintptr_t arg5);
493
494
495#if (KDEBUG_LEVEL >= KDEBUG_LEVEL_FULL)
496#ifdef	XNU_KERNEL_PRIVATE
497#define KERNEL_DEBUG(x,a,b,c,d,e)					\
498do {									\
499	if (__improbable(kdebug_enable & ~KDEBUG_ENABLE_PPT))			\
500        kernel_debug((uint32_t)x,  (uintptr_t)a, (uintptr_t)b,		\
501		     (uintptr_t)c, (uintptr_t)d, (uintptr_t)e);		\
502} while(0)
503
504#define KERNEL_DEBUG1(x,a,b,c,d,e)					\
505do {									\
506	if (__improbable(kdebug_enable & ~KDEBUG_ENABLE_PPT))			\
507        kernel_debug1((uint32_t)x,  (uintptr_t)a, (uintptr_t)b,		\
508		      (uintptr_t)c, (uintptr_t)d, (uintptr_t)e);	\
509} while(0)
510
511#define __kdebug_only
512#else /* !XNU_KERNEL_PRIVATE */
513#define KERNEL_DEBUG(x,a,b,c,d,e)					\
514do {									\
515	if (kdebug_enable & ~KDEBUG_ENABLE_PPT)				\
516        kernel_debug((uint32_t)x,  (uintptr_t)a, (uintptr_t)b,		\
517		     (uintptr_t)c, (uintptr_t)d, (uintptr_t)e);		\
518} while(0)
519
520#define KERNEL_DEBUG1(x,a,b,c,d,e)					\
521do {									\
522	if (kdebug_enable & ~KDEBUG_ENABLE_PPT)				\
523        kernel_debug1((uint32_t)x,  (uintptr_t)a, (uintptr_t)b,		\
524		      (uintptr_t)c, (uintptr_t)d, (uintptr_t)e);	\
525} while(0)
526#endif /* XNU_KERNEL_PRIVATE */
527#else /* (KDEBUG_LEVEL >= KDEBUG_LEVEL_FULL) */
528#define KERNEL_DEBUG(x,a,b,c,d,e) do {} while (0)
529#define KERNEL_DEBUG1(x,a,b,c,d,e) do {} while (0)
530
531#define __kdebug_only __unused
532#endif /* (KDEBUG_LEVEL >= KDEBUG_LEVEL_FULL) */
533
534#ifdef KERNEL_PRIVATE
535#include <mach/boolean.h>
536struct proc;
537extern void kdbg_trace_data(struct proc *proc, long *arg_pid);
538
539extern void kdbg_trace_string(struct proc *proc, long *arg1, long *arg2, long *arg3, long *arg4);
540
541extern void kdbg_dump_trace_to_file(const char *);
542void start_kern_tracing(unsigned int);
543struct task;
544extern void kdbg_get_task_name(char*, int, struct task *task);
545void disable_wrap(uint32_t *old_slowcheck, uint32_t *old_flags);
546void enable_wrap(uint32_t old_slowcheck, boolean_t lostevents);
547void release_storage_unit(int cpu,  uint32_t storage_unit);
548int allocate_storage_unit(int cpu);
549
550void trace_handler_map_ctrl_page(uintptr_t addr, unsigned long ctrl_page_size, unsigned long storage_size, unsigned long kds_ptr_size);
551void trace_handler_map_bufinfo(uintptr_t addr, unsigned long size);
552void trace_handler_unmap_bufinfo(void);
553void trace_handler_map_buffer(int index, uintptr_t addr, unsigned long size);
554void trace_handler_unmap_buffer(int index);
555void trace_set_timebases(uint64_t tsc, uint64_t ns);
556
557
558#endif  /* KERNEL_PRIVATE */
559
560
561#endif /* __APPLE_API_UNSTABLE */
562__END_DECLS
563
564
565#ifdef	PRIVATE
566#ifdef __APPLE_API_PRIVATE
567/*
568 * private kernel_debug definitions
569 */
570
571typedef struct {
572	uint64_t	timestamp;
573	uintptr_t	arg1;
574	uintptr_t	arg2;
575	uintptr_t	arg3;
576	uintptr_t	arg4;
577	uintptr_t	arg5;       /* will hold current thread */
578	uint32_t	debugid;
579#if defined(__LP64__)
580	uint32_t	cpuid;
581	uintptr_t	unused;
582#endif
583} kd_buf;
584
585#if !defined(__LP64__)
586#define KDBG_TIMESTAMP_MASK		0x00ffffffffffffffULL
587#define KDBG_CPU_MASK			0xff00000000000000ULL
588#define KDBG_CPU_SHIFT			56
589static inline void
590kdbg_set_cpu(kd_buf *kp, int cpu)
591{
592	kp->timestamp = (kp->timestamp & KDBG_TIMESTAMP_MASK) |
593				(((uint64_t) cpu) << KDBG_CPU_SHIFT);
594}
595static inline int
596kdbg_get_cpu(kd_buf *kp)
597{
598	return (int) (((kp)->timestamp & KDBG_CPU_MASK) >> KDBG_CPU_SHIFT);
599}
600static inline void
601kdbg_set_timestamp(kd_buf *kp, uint64_t thetime)
602{
603	kp->timestamp = thetime & KDBG_TIMESTAMP_MASK;
604}
605static inline uint64_t
606kdbg_get_timestamp(kd_buf *kp)
607{
608	return kp->timestamp & KDBG_TIMESTAMP_MASK;
609}
610static inline void
611kdbg_set_timestamp_and_cpu(kd_buf *kp, uint64_t thetime, int cpu)
612{
613	kp->timestamp = (thetime & KDBG_TIMESTAMP_MASK) |
614				(((uint64_t) cpu) << KDBG_CPU_SHIFT);
615}
616#else
617#define KDBG_TIMESTAMP_MASK		0xffffffffffffffffULL
618static inline void
619kdbg_set_cpu(kd_buf *kp, int cpu)
620{
621	kp->cpuid = cpu;
622}
623static inline int
624kdbg_get_cpu(kd_buf *kp)
625{
626	return kp->cpuid;
627}
628static inline void
629kdbg_set_timestamp(kd_buf *kp, uint64_t thetime)
630{
631	kp->timestamp = thetime;
632}
633static inline uint64_t
634kdbg_get_timestamp(kd_buf *kp)
635{
636	return kp->timestamp;
637}
638static inline void
639kdbg_set_timestamp_and_cpu(kd_buf *kp, uint64_t thetime, int cpu)
640{
641	kdbg_set_timestamp(kp, thetime);
642	kdbg_set_cpu(kp, cpu);
643}
644#endif
645
646/* 2^16 bits (8 kilobytes), one for each possible class/subclass combination */
647#define KDBG_TYPEFILTER_BITMAP_SIZE	        ( (256 * 256) / 8 )
648
649/* Debug Flags */
650#define	KDBG_INIT	0x001
651#define	KDBG_NOWRAP	0x002
652#define	KDBG_FREERUN	0x004
653#define	KDBG_WRAPPED	0x008
654#define	KDBG_USERFLAGS	(KDBG_FREERUN|KDBG_NOWRAP|KDBG_INIT)
655#define KDBG_PIDCHECK   0x010
656#define KDBG_MAPINIT    0x020
657#define KDBG_PIDEXCLUDE 0x040
658#define KDBG_LOCKINIT	0x080
659#define KDBG_LP64	0x100
660
661typedef struct {
662	unsigned int	type;
663	unsigned int	value1;
664	unsigned int	value2;
665	unsigned int	value3;
666	unsigned int	value4;
667
668} kd_regtype;
669
670typedef struct
671{
672	int		nkdbufs;
673	int		nolog;
674	int		flags;
675	int		nkdthreads;
676	int		bufid;
677} kbufinfo_t;
678
679typedef struct {
680	uintptr_t	thread;
681	int		valid;
682	char		command[20];
683} kd_threadmap;
684
685
686typedef struct {
687	int             version_no;
688	int             thread_count;
689	uint64_t        TOD_secs;
690	uint32_t        TOD_usecs;
691} RAW_header;
692
693#define RAW_VERSION0	0x55aa0000
694#define RAW_VERSION1	0x55aa0101
695
696
697#define	KDBG_CLASSTYPE		0x10000
698#define	KDBG_SUBCLSTYPE		0x20000
699#define	KDBG_RANGETYPE		0x40000
700#define	KDBG_TYPENONE		0x80000
701#define KDBG_CKTYPES		0xF0000
702
703#define	KDBG_RANGECHECK	0x100000
704#define	KDBG_VALCHECK	0x200000        /* Check up to 4 individual values */
705
706#define	KDBG_TYPEFILTER_CHECK	((uint32_t) 0x400000)        /* Check class and subclass against a bitmap */
707
708#define	KDBG_BUFINIT	0x80000000
709
710/* Control operations */
711#define	KDBG_EFLAGS	1
712#define	KDBG_DFLAGS	2
713#define KDBG_ENABLE	3
714#define KDBG_SETNUMBUF	4
715#define KDBG_GETNUMBUF	5
716#define KDBG_SETUP	6
717#define KDBG_REMOVE	7
718#define	KDBG_SETREGCODE	8
719#define	KDBG_GETREGCODE	9
720#define	KDBG_READTRACE	10
721#define KDBG_PIDTR      11
722#define KDBG_THRMAP     12
723#define KDBG_PIDEX      14
724#define KDBG_SETRTCDEC  15
725#define KDBG_KDGETENTROPY 16
726
727/* Minimum value allowed when setting decrementer ticks */
728#define KDBG_MINRTCDEC  2500
729
730#endif /* __APPLE_API_PRIVATE */
731#endif	/* PRIVATE */
732
733#endif /* !BSD_SYS_KDEBUG_H */
734