xref: /xnu-11215/bsd/sys/kdebug_kernel.h (revision bb611c8f)
1 /*
2  * Copyright (c) 2000-2018 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 #ifndef BSD_SYS_KDEBUG_KERNEL_H
30 #define BSD_SYS_KDEBUG_KERNEL_H
31 
32 #include <mach/boolean.h>
33 #include <mach/clock_types.h>
34 #include <stdbool.h>
35 #include <stdint.h>
36 #include <sys/cdefs.h>
37 
38 __BEGIN_DECLS
39 
40 #ifdef KERNEL
41 
42 /*
43  * To use kdebug in the kernel:
44  *
45  * #include <sys/kdebug_kernel.h>
46  *
47  * #define DBG_NETIPINIT NETDBG_CODE(DBG_NETIP, 1)
48  *
49  * void
50  * ip_init(void)
51  * {
52  *     KDBG(DBG_NETIPINIT | DBG_FUNC_START, 1, 2, 3, 4);
53  *     ...
54  *     KDBG(DBG_NETIPINIT);
55  *     ...
56  *     KDBG(DBG_NETIPINIT | DBG_FUNC_END);
57  * }
58  */
59 
60 #pragma mark - kernel tracepoints
61 
62 /*
63  * The KDBG{,_DEBUG,_RELEASE,_FILTERED} macros are the preferred method of
64  * making tracepoints.
65  *
66  * Kernel pointers must be unslid or permuted using VM_KERNEL_UNSLIDE_OR_PERM.
67  * Do not trace any sensitive data.
68  */
69 
70 /*
71  * Traced on debug and development (and release macOS) kernels.
72  */
73 #define KDBG(x, ...) KDBG_(, x, ## __VA_ARGS__, 4, 3, 2, 1, 0)
74 
75 /*
76  * Traced on debug and development (and release macOS) kernels if explicitly
77  * requested.  Omitted from tracing without a typefilter.
78  */
79 #define KDBG_FILTERED(x, ...) KDBG_(_FILTERED, x, ## __VA_ARGS__, 4, 3, 2, 1, 0)
80 
81 #ifdef KERNEL_PRIVATE
82 
83 /*
84  * Traced on debug and development (and release macOS) kernels, even if the
85  * process filter would reject it.
86  */
87 #define KDBG_RELEASE_NOPROCFILT(x, ...) \
88 	        KDBG_(_RELEASE_NOPROCFILT, x, ## __VA_ARGS__, 4, 3, 2, 1, 0)
89 
90 #endif /* KERNEL_PRIVATE */
91 
92 /*
93  * Traced on debug, development, and release kernels.
94  *
95  * Only use this tracepoint if the events are required for a shipping trace
96  * tool.
97  */
98 #define KDBG_RELEASE(x, ...) KDBG_(_RELEASE, x, ## __VA_ARGS__, 4, 3, 2, 1, 0)
99 
100 /*
101  * Traced only on debug kernels.
102  */
103 #define KDBG_DEBUG(x, ...) KDBG_(_DEBUG, x, ## __VA_ARGS__, 4, 3, 2, 1, 0)
104 
105 #pragma mark - kernel API
106 
107 #ifdef KERNEL_PRIVATE
108 
109 /*
110  * kernel_debug_string provides the same functionality as the
111  * kdebug_trace_string syscall as a KPI.  str_id is an in/out
112  * parameter that, if it's pointing to a string ID of 0, will
113  * receive a generated ID.  If it provides a value in str_id,
114  * then that will be used, instead.
115  *
116  * Returns an errno indicating the type of failure.
117  */
118 int kernel_debug_string(uint32_t debugid, uint64_t *str_id, const char *str);
119 
120 /*
121  * kernel_debug_disable disables event logging, but leaves any buffers
122  * intact.
123  */
124 void kernel_debug_disable(void);
125 
126 #endif /* KERNEL_PRIVATE */
127 
128 /*
129  * Returns true if kdebug is using continuous time for its events, and false
130  * otherwise.
131  */
132 bool kdebug_using_continuous_time(void);
133 
134 /*
135  * Returns true if kdebug will log an event with the provided debugid, and
136  * false otherwise.
137  */
138 bool kdebug_debugid_enabled(uint32_t debugid);
139 
140 /*
141  * Returns true only if the debugid is explicitly enabled by filters.  Returns
142  * false otherwise, including when no filters are active.
143  */
144 bool kdebug_debugid_explicitly_enabled(uint32_t debugid);
145 
146 uint32_t kdebug_commpage_state(void);
147 
148 #pragma mark - IOP tracing
149 
150 /*
151  * Definitions to support IOP tracing.
152  */
153 
154 typedef enum {
155 	/* Trace is now enabled; no arguments.  */
156 	KD_CALLBACK_KDEBUG_ENABLED,
157 	/* Trace is now disabled; no arguments.  */
158 	KD_CALLBACK_KDEBUG_DISABLED,
159 	/*
160 	 * Request the latest entries from the IOP and block until complete; no
161 	 * arguments.
162 	 */
163 	KD_CALLBACK_SYNC_FLUSH,
164 	/*
165 	 * The typefilter is enabled; a read-only pointer to the typefilter is
166 	 * provided, valid only while in the callback.
167 	 */
168 	KD_CALLBACK_TYPEFILTER_CHANGED,
169 } kd_callback_type;
170 
171 typedef void (*kd_callback_fn) (void *context, kd_callback_type reason,
172     void *arg);
173 
174 struct kd_callback {
175 	kd_callback_fn func;
176 	void *context;
177 	/* name of IOP, NUL-terminated */
178 	char iop_name[8];
179 };
180 
181 typedef struct kd_callback kd_callback_t;
182 
183 /*
184  * Registers an IOP for participation in tracing.
185  *
186  * The registered callback function will be called with the
187  * supplied context as the first argument, followed by a
188  * kd_callback_type and an associated void* argument.
189  *
190  * The return value is a nonzero coreid that shall be used in
191  * kernel_debug_enter() to refer to your IOP. If the allocation
192  * failed, then 0 will be returned.
193  *
194  * Caveats:
195  * Note that not all callback calls will indicate a change in
196  * state (e.g. disabling trace twice would send two disable
197  * notifications).
198  */
199 int kernel_debug_register_callback(kd_callback_t callback);
200 
201 void kernel_debug_enter(uint32_t coreid, uint32_t debugid, uint64_t timestamp,
202     uintptr_t arg1, uintptr_t arg2, uintptr_t arg3, uintptr_t arg4,
203     uintptr_t threadid);
204 
205 #pragma mark - internals
206 
207 #define KDBG_(f, x, a, b, c, d, n, ...) KDBG##n(f, x, a, b, c, d)
208 #define KDBG0(f, x, a, b, c, d) KERNEL_DEBUG_CONSTANT##f(x, 0, 0, 0, 0, 0)
209 #define KDBG1(f, x, a, b, c, d) KERNEL_DEBUG_CONSTANT##f(x, a, 0, 0, 0, 0)
210 #define KDBG2(f, x, a, b, c, d) KERNEL_DEBUG_CONSTANT##f(x, a, b, 0, 0, 0)
211 #define KDBG3(f, x, a, b, c, d) KERNEL_DEBUG_CONSTANT##f(x, a, b, c, 0, 0)
212 #define KDBG4(f, x, a, b, c, d) KERNEL_DEBUG_CONSTANT##f(x, a, b, c, d, 0)
213 
214 #ifdef XNU_KERNEL_PRIVATE
215 #define KDBG_IMPROBABLE __improbable
216 #else
217 #define KDBG_IMPROBABLE
218 #endif
219 
220 extern unsigned int kdebug_enable;
221 
222 /*
223  * The kernel debug configuration level.  These values control which events are
224  * compiled in under different build configurations.
225  *
226  * Infer the supported kernel debug event level from config option.  Use
227  * (KDEBUG_LEVEL >= KDEBUG_LEVEL_STANDARD) as a guard to protect unaudited debug
228  * code.
229  */
230 #define KDEBUG_LEVEL_NONE     0
231 #define KDEBUG_LEVEL_IST      1
232 #define KDEBUG_LEVEL_STANDARD 2
233 #define KDEBUG_LEVEL_FULL     3
234 
235 #if NO_KDEBUG
236 #define KDEBUG_LEVEL KDEBUG_LEVEL_NONE
237 #elif IST_KDEBUG
238 #define KDEBUG_LEVEL KDEBUG_LEVEL_IST
239 #elif KDEBUG
240 #define KDEBUG_LEVEL KDEBUG_LEVEL_FULL
241 #else
242 #define KDEBUG_LEVEL KDEBUG_LEVEL_STANDARD
243 /*
244  * Currently, all other kernel configurations (development, etc) build with
245  * KDEBUG_LEVEL_STANDARD.
246  */
247 #endif
248 
249 /*
250  * KERNEL_DEBUG_CONSTANT_FILTERED events are omitted from tracing unless they
251  * are explicitly requested in the typefilter.  They are not emitted when
252  * tracing without a typefilter.
253  */
254 #if (KDEBUG_LEVEL >= KDEBUG_LEVEL_STANDARD)
255 #define KERNEL_DEBUG_CONSTANT_FILTERED(x, a, b, c, d, ...)           \
256 	do {                                                             \
257 	        if (KDBG_IMPROBABLE(kdebug_enable & ~KDEBUG_ENABLE_PPT)) {   \
258 	                kernel_debug_filtered((x), (uintptr_t)(a), (uintptr_t)(b),  \
259 	                        (uintptr_t)(c), (uintptr_t)(d)); \
260 	        }                                                            \
261 	} while (0)
262 #else /* (KDEBUG_LEVEL >= KDEBUG_LEVEL_STANDARD) */
263 #define KERNEL_DEBUG_CONSTANT_FILTERED(type, x, a, b, c, d, ...) do {} while (0)
264 #endif /* (KDEBUG_LEVEL >= KDEBUG_LEVEL_STANDARD) */
265 
266 #if (KDEBUG_LEVEL >= KDEBUG_LEVEL_IST)
267 #define KERNEL_DEBUG_CONSTANT_RELEASE_NOPROCFILT(x, a, b, c, d, ...)   \
268 	do {                                                               \
269 	        if (KDBG_IMPROBABLE(kdebug_enable & ~KDEBUG_ENABLE_PPT)) {     \
270 	                kernel_debug_flags((x), (uintptr_t)(a), (uintptr_t)(b),    \
271 	                        (uintptr_t)(c), (uintptr_t)(d), KDBG_FLAG_NOPROCFILT); \
272 	        }                                                              \
273 	} while (0)
274 #else /* (KDEBUG_LEVEL >= KDEBUG_LEVEL_IST) */
275 #define KERNEL_DEBUG_CONSTANT_RELEASE_NOPROCFILT(x, a, b, c, d, ...) \
276 	do { } while (0)
277 #endif /* (KDEBUG_LEVEL >= KDEBUG_LEVEL_IST) */
278 
279 
280 #if (KDEBUG_LEVEL >= KDEBUG_LEVEL_STANDARD)
281 #define KERNEL_DEBUG_CONSTANT(x, a, b, c, d, e)                               \
282 	do {                                                                      \
283 	        if (KDBG_IMPROBABLE(kdebug_enable & ~KDEBUG_ENABLE_PPT)) {            \
284 	                kernel_debug((x), (uintptr_t)(a), (uintptr_t)(b), (uintptr_t)(c), \
285 	                        (uintptr_t)(d),(uintptr_t)(e));                               \
286 	        }                                                                     \
287 	} while (0)
288 
289 /*
290  * DO NOT USE THIS MACRO -- it breaks fundamental assumptions about ktrace and
291  * is only meant to be used by the pthread kext and other points in the kernel
292  * where the thread ID must be provided explicitly.
293  */
294 #define KERNEL_DEBUG_CONSTANT1(x, a, b, c, d, e)                               \
295 	do {                                                                       \
296 	        if (KDBG_IMPROBABLE(kdebug_enable & ~KDEBUG_ENABLE_PPT)) {             \
297 	                kernel_debug1((x), (uintptr_t)(a), (uintptr_t)(b), (uintptr_t)(c), \
298 	                (uintptr_t)(d), (uintptr_t)(e));                                   \
299 	        }                                                                      \
300 	} while (0)
301 
302 #else /* (KDEBUG_LEVEL >= KDEBUG_LEVEL_STANDARD) */
303 #define KERNEL_DEBUG_CONSTANT(x, a, b, c, d, e) do {} while (0)
304 #define KERNEL_DEBUG_CONSTANT1(x, a, b, c, d, e) do {} while (0)
305 #endif /* (KDEBUG_LEVEL >= KDEBUG_LEVEL_STANDARD) */
306 
307 /*
308  * KERNEL_DEBUG_CONSTANT_IST (in-system trace) events provide an audited subset
309  * of tracepoints for userland system tracing tools.  This tracing level was
310  * created by 8857227 to protect fairplayd and other PT_DENY_ATTACH processes.
311  * It has two effects: only KERNEL_DEBUG_CONSTANT_IST() traces are emitted and
312  * any PT_DENY_ATTACH processes will only emit basic traces as defined by the
313  * kernel_debug_filter() routine.
314  */
315 #define KERNEL_DEBUG_CONSTANT_RELEASE(x, a, b, c, d, e) \
316 	KERNEL_DEBUG_CONSTANT_IST(~KDEBUG_ENABLE_PPT, x, a, b, c, d, 0)
317 
318 #if (KDEBUG_LEVEL >= KDEBUG_LEVEL_IST)
319 #define KERNEL_DEBUG_CONSTANT_IST(type, x, a, b, c, d, e)                     \
320 	do {                                                                      \
321 	        if (KDBG_IMPROBABLE(kdebug_enable & (type))) {                        \
322 	                kernel_debug((x), (uintptr_t)(a), (uintptr_t)(b), (uintptr_t)(c), \
323 	                        (uintptr_t)(d), 0);                                           \
324 	        }                                                                     \
325 	} while (0)
326 
327 #define KERNEL_DEBUG_CONSTANT_IST1(x, a, b, c, d, e)                     \
328 	do {                                                                       \
329 	        if (KDBG_IMPROBABLE(kdebug_enable)) {                         \
330 	                kernel_debug1((x), (uintptr_t)(a), (uintptr_t)(b), (uintptr_t)(c), \
331 	                        (uintptr_t)(d), (uintptr_t)(e));                               \
332 	        }                                                                      \
333 	} while (0)
334 
335 #define KERNEL_DEBUG_EARLY(x, a, b, c, d)                                 \
336 	do {                                                                  \
337 	        kernel_debug_early((uint32_t)(x), (uintptr_t)(a), (uintptr_t)(b), \
338 	                (uintptr_t)(c), (uintptr_t)(d));                              \
339 	} while (0)
340 
341 #else /* (KDEBUG_LEVEL >= KDEBUG_LEVEL_IST) */
342 #define KERNEL_DEBUG_CONSTANT_IST(type, x, a, b, c, d, e) do {} while (0)
343 #define KERNEL_DEBUG_CONSTANT_IST1(x, a, b, c, d, e) do {} while (0)
344 #define KERNEL_DEBUG_EARLY(x, a, b, c, d) do {} while (0)
345 #endif /* (KDEBUG_LEVEL >= KDEBUG_LEVEL_IST) */
346 
347 #if NO_KDEBUG
348 #define __kdebug_constant_only __unused
349 #endif
350 
351 /*
352  * KERNEL_DEBUG events are only traced for DEBUG kernels.
353  */
354 #define KERNEL_DEBUG_CONSTANT_DEBUG(x, a, b, c, d, e) \
355 	KERNEL_DEBUG(x, a, b, c, d, e)
356 
357 #if (KDEBUG_LEVEL >= KDEBUG_LEVEL_FULL)
358 #define __kdebug_only
359 
360 #undef KERNEL_DEBUG
361 #define KERNEL_DEBUG(x, a, b, c, d, e)                                  \
362 	do {                                                                \
363 	        if (KDBG_IMPROBABLE(kdebug_enable & ~KDEBUG_ENABLE_PPT)) {      \
364 	                kernel_debug((uint32_t)(x), (uintptr_t)(a), (uintptr_t)(b), \
365 	                        (uintptr_t)(c), (uintptr_t)(d), (uintptr_t)(e));        \
366 	        }                                                               \
367 	} while (0)
368 
369 /*
370  * DO NOT USE THIS MACRO -- see warning above for KERNEL_DEBUG_CONSTANT1.
371  */
372 #define KERNEL_DEBUG1(x, a, b, c, d, e)                                  \
373 	do {                                                                 \
374 	        if (KDBG_IMPROBABLE(kdebug_enable & ~KDEBUG_ENABLE_PPT)) {       \
375 	                kernel_debug1((uint32_t)(x), (uintptr_t)(a), (uintptr_t)(b), \
376 	                        (uintptr_t)(c), (uintptr_t)(d), (uintptr_t)(e));         \
377 	        }                                                                \
378 	} while (0)
379 
380 #else /* (KDEBUG_LEVEL >= KDEBUG_LEVEL_FULL) */
381 #define __kdebug_only __unused
382 
383 #undef KERNEL_DEBUG
384 #define KERNEL_DEBUG(x, a, b, c, d, e) do {} while (0)
385 #define KERNEL_DEBUG1(x, a, b, c, d, e) do {} while (0)
386 #endif /* (KDEBUG_LEVEL >= KDEBUG_LEVEL_FULL) */
387 
388 void kernel_debug(uint32_t debugid, uintptr_t arg1, uintptr_t arg2,
389     uintptr_t arg3, uintptr_t arg4, uintptr_t arg5);
390 
391 void kernel_debug1(uint32_t debugid, uintptr_t arg1, uintptr_t arg2,
392     uintptr_t arg3, uintptr_t arg4, uintptr_t arg5);
393 
394 #define KDBG_FLAG_FILTERED 0x01
395 #define KDBG_FLAG_NOPROCFILT 0x02
396 
397 void kernel_debug_flags(uint32_t debugid, uintptr_t arg1, uintptr_t arg2,
398     uintptr_t arg3, uintptr_t arg4, uint64_t flags);
399 
400 void kernel_debug_filtered(uint32_t debugid, uintptr_t arg1, uintptr_t arg2,
401     uintptr_t arg3, uintptr_t arg4);
402 
403 #pragma mark - xnu API
404 
405 #ifdef XNU_KERNEL_PRIVATE
406 
407 /* Used in early boot to log events. */
408 void kernel_debug_early(uint32_t  debugid, uintptr_t arg1, uintptr_t arg2,
409     uintptr_t arg3, uintptr_t arg4);
410 /* Used in early boot to log strings spanning only a single tracepoint. */
411 void kernel_debug_string_early(const char *message);
412 /* Used to trace strings within kdebug tracepoints on arbitrary eventids. */
413 void kernel_debug_string_simple(uint32_t eventid, const char *str);
414 /* Only used by ktrace to reset kdebug.  ktrace_lock must be held. */
415 extern void kdebug_reset(void);
416 
417 void kdbg_dump_trace_to_file(const char *);
418 
419 enum kdebug_opts {
420 	KDOPT_WRAPPING = 0x1,
421 	KDOPT_ATBOOT = 0x2,
422 };
423 
424 void kdebug_init(unsigned int n_events, char *filterdesc,
425     enum kdebug_opts opts);
426 void kdebug_trace_start(unsigned int n_events, const char *filterdesc,
427     enum kdebug_opts opts);
428 uint64_t kdebug_wake(void);
429 void kdebug_free_early_buf(void);
430 void release_storage_unit(int cpu, uint32_t storage_unit);
431 bool allocate_storage_unit(int cpu);
432 
433 struct proc;
434 void kdbg_trace_data(struct proc *proc, long *arg_pid, long *arg_uniqueid);
435 void kdbg_trace_string(struct proc *proc, long *arg1, long *arg2, long *arg3,
436     long *arg4);
437 
438 #define KDBG_VFS_LOOKUP_FLAG_LOOKUP 0x01
439 #define KDBG_VFS_LOOKUP_FLAG_NOPROCFILT 0x02
440 void kdebug_vfs_lookup(unsigned long *path_words, int path_len, void *vnp,
441     uint32_t flags);
442 
443 #endif /* XNU_KERNEL_PRIVATE */
444 
445 #ifdef KERNEL_PRIVATE
446 
447 #define NUMPARMS 23
448 void kdebug_lookup_gen_events(long *path_words, int path_len, void *vnp,
449     bool lookup);
450 
451 #pragma mark - EnergyTracing
452 
453 #define KERNEL_DBG_IST_SANE KDBG_RELEASE
454 #define ENTR_KDTRACEFUNC KDBG_RELEASE
455 
456 // value is int64_t, quality is uint32_t
457 #define KERNEL_ENERGYTRACE(opcode, lifespan, id, quality, value)        \
458 	    ENTR_KDTRACE(kEnTrCompKernel, opcode, lifespan, id,         \
459 	                 quality, value)
460 #define KERNEL_ENTR_ASSOCIATE(par_opcode, par_act_id, sub_opcode, sub_act_id) \
461 	    ENTR_KDASSOCIATE(kEnTrCompKernel, par_opcode, par_act_id,   \
462 	                     kEnTrCompKernel, sub_opcode, sub_act_id)
463 
464 #endif /* KERNEL_PRIVATE */
465 
466 #endif /* KERNEL */
467 
468 __END_DECLS
469 
470 #endif /* !defined(BSD_SYS_KDEBUG_KERNEL_H) */
471