xref: /xnu-11215/bsd/sys/kdebug_kernel.h (revision aca3beaa)
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  * Convert an absolute time to a kdebug timestamp.
136  */
137 extern uint64_t kdebug_timestamp_from_absolute(uint64_t abstime);
138 
139 /*
140  * Convert a continuous time to a kdebug timestamp.
141  */
142 extern uint64_t kdebug_timestamp_from_continuous(uint64_t conttime);
143 
144 /*
145  * Capture a kdebug timestamp for the current time.
146  */
147 extern uint64_t kdebug_timestamp(void);
148 
149 /*
150  * Returns true if kdebug will log an event with the provided debugid, and
151  * false otherwise.
152  */
153 bool kdebug_debugid_enabled(uint32_t debugid);
154 
155 /*
156  * Returns true only if the debugid is explicitly enabled by filters.  Returns
157  * false otherwise, including when no filters are active.
158  */
159 bool kdebug_debugid_explicitly_enabled(uint32_t debugid);
160 
161 uint32_t kdebug_commpage_state(void);
162 
163 #pragma mark - Coprocessor/IOP tracing
164 
165 typedef enum {
166 	/* Trace is now enabled. */
167 	KD_CALLBACK_KDEBUG_ENABLED,
168 	/*
169 	 * Trace is being disabled, but events are still accepted for the duration
170 	 * of the callback.
171 	 */
172 	KD_CALLBACK_KDEBUG_DISABLED,
173 	/*
174 	 * Request the latest events from the IOP and block until complete.  Any
175 	 * events that occur prior to this callback being called may be dropped by
176 	 * the trace system.
177 	 */
178 	KD_CALLBACK_SYNC_FLUSH,
179 	/*
180 	 * The typefilter is being used.
181 	 *
182 	 * A read-only pointer to the typefilter is provided as the argument, valid
183 	 * only in the callback.
184 	 */
185 	KD_CALLBACK_TYPEFILTER_CHANGED,
186 	/*
187 	 * The coprocessor should emit data that snapshots the current state of the
188 	 * system.
189 	 */
190 	KD_CALLBACK_SNAPSHOT_STATE,
191 } kd_callback_type;
192 
193 __options_decl(kdebug_coproc_flags_t, uint32_t, {
194 	/*
195 	 * Event timestamps from this coprocessor are in the continuous timebase.
196 	 */
197 	KDCP_CONTINUOUS_TIME = 0x001,
198 });
199 
200 typedef void (*kd_callback_fn)(void *context, kd_callback_type reason,
201     void *arg);
202 
203 /*
204  * Register a coprocessor for participation in tracing.
205  *
206  * The `callback` function will be called with the provided `context` when
207  * necessary, according to the `kd_callback_type`s.
208  *
209  * The positive core ID is returned on success, or -1 on failure.
210  */
211 int kdebug_register_coproc(const char *name, kdebug_coproc_flags_t flags,
212     kd_callback_fn callback, void *context);
213 
214 void kernel_debug_enter(uint32_t coreid, uint32_t debugid, uint64_t timestamp,
215     uintptr_t arg1, uintptr_t arg2, uintptr_t arg3, uintptr_t arg4,
216     uintptr_t threadid);
217 
218 /*
219  * Legacy definitions for the prior IOP tracing.
220  */
221 
222 struct kd_callback {
223 	kd_callback_fn func;
224 	void *context;
225 	/* name of IOP, NUL-terminated */
226 	char iop_name[8];
227 };
228 typedef struct kd_callback kd_callback_t;
229 
230 __kpi_deprecated("use kdebug_register_coproc instead")
231 int kernel_debug_register_callback(kd_callback_t callback);
232 
233 #pragma mark - internals
234 
235 #define KDBG_(f, x, a, b, c, d, n, ...) KDBG##n(f, x, a, b, c, d)
236 #define KDBG0(f, x, a, b, c, d) KERNEL_DEBUG_CONSTANT##f(x, 0, 0, 0, 0, 0)
237 #define KDBG1(f, x, a, b, c, d) KERNEL_DEBUG_CONSTANT##f(x, a, 0, 0, 0, 0)
238 #define KDBG2(f, x, a, b, c, d) KERNEL_DEBUG_CONSTANT##f(x, a, b, 0, 0, 0)
239 #define KDBG3(f, x, a, b, c, d) KERNEL_DEBUG_CONSTANT##f(x, a, b, c, 0, 0)
240 #define KDBG4(f, x, a, b, c, d) KERNEL_DEBUG_CONSTANT##f(x, a, b, c, d, 0)
241 
242 #ifdef XNU_KERNEL_PRIVATE
243 #define KDBG_IMPROBABLE __improbable
244 #else
245 #define KDBG_IMPROBABLE
246 #endif
247 
248 extern unsigned int kdebug_enable;
249 
250 /*
251  * The kernel debug configuration level.  These values control which events are
252  * compiled in under different build configurations.
253  *
254  * Infer the supported kernel debug event level from config option.  Use
255  * (KDEBUG_LEVEL >= KDEBUG_LEVEL_STANDARD) as a guard to protect unaudited debug
256  * code.
257  */
258 #define KDEBUG_LEVEL_NONE     0
259 #define KDEBUG_LEVEL_IST      1
260 #define KDEBUG_LEVEL_STANDARD 2
261 #define KDEBUG_LEVEL_FULL     3
262 
263 #if NO_KDEBUG
264 #define KDEBUG_LEVEL KDEBUG_LEVEL_NONE
265 #elif IST_KDEBUG
266 #define KDEBUG_LEVEL KDEBUG_LEVEL_IST
267 #elif KDEBUG
268 #define KDEBUG_LEVEL KDEBUG_LEVEL_FULL
269 #else
270 #define KDEBUG_LEVEL KDEBUG_LEVEL_STANDARD
271 /*
272  * Currently, all other kernel configurations (development, etc) build with
273  * KDEBUG_LEVEL_STANDARD.
274  */
275 #endif
276 
277 /*
278  * KERNEL_DEBUG_CONSTANT_FILTERED events are omitted from tracing unless they
279  * are explicitly requested in the typefilter.  They are not emitted when
280  * tracing without a typefilter.
281  */
282 #if (KDEBUG_LEVEL >= KDEBUG_LEVEL_STANDARD)
283 #define KERNEL_DEBUG_CONSTANT_FILTERED(x, a, b, c, d, ...)           \
284 	do {                                                             \
285 	        if (KDBG_IMPROBABLE(kdebug_enable & ~KDEBUG_ENABLE_PPT)) {   \
286 	                kernel_debug_filtered((x), (uintptr_t)(a), (uintptr_t)(b),  \
287 	                        (uintptr_t)(c), (uintptr_t)(d)); \
288 	        }                                                            \
289 	} while (0)
290 #else /* (KDEBUG_LEVEL >= KDEBUG_LEVEL_STANDARD) */
291 #define KERNEL_DEBUG_CONSTANT_FILTERED(type, x, a, b, c, d, ...) do {} while (0)
292 #endif /* (KDEBUG_LEVEL >= KDEBUG_LEVEL_STANDARD) */
293 
294 #if (KDEBUG_LEVEL >= KDEBUG_LEVEL_IST)
295 #define KERNEL_DEBUG_CONSTANT_RELEASE_NOPROCFILT(x, a, b, c, d, ...)   \
296 	do {                                                               \
297 	        if (KDBG_IMPROBABLE(kdebug_enable & ~KDEBUG_ENABLE_PPT)) {     \
298 	                kernel_debug_flags((x), (uintptr_t)(a), (uintptr_t)(b),    \
299 	                        (uintptr_t)(c), (uintptr_t)(d), KDBG_FLAG_NOPROCFILT); \
300 	        }                                                              \
301 	} while (0)
302 #else /* (KDEBUG_LEVEL >= KDEBUG_LEVEL_IST) */
303 #define KERNEL_DEBUG_CONSTANT_RELEASE_NOPROCFILT(x, a, b, c, d, ...) \
304 	do { } while (0)
305 #endif /* (KDEBUG_LEVEL >= KDEBUG_LEVEL_IST) */
306 
307 
308 #if (KDEBUG_LEVEL >= KDEBUG_LEVEL_STANDARD)
309 #define KERNEL_DEBUG_CONSTANT(x, a, b, c, d, e)                               \
310 	do {                                                                      \
311 	        if (KDBG_IMPROBABLE(kdebug_enable & ~KDEBUG_ENABLE_PPT)) {            \
312 	                kernel_debug((x), (uintptr_t)(a), (uintptr_t)(b), (uintptr_t)(c), \
313 	                        (uintptr_t)(d),(uintptr_t)(e));                               \
314 	        }                                                                     \
315 	} while (0)
316 
317 /*
318  * DO NOT USE THIS MACRO -- it breaks fundamental assumptions about ktrace and
319  * is only meant to be used by the pthread kext and other points in the kernel
320  * where the thread ID must be provided explicitly.
321  */
322 #define KERNEL_DEBUG_CONSTANT1(x, a, b, c, d, e)                               \
323 	do {                                                                       \
324 	        if (KDBG_IMPROBABLE(kdebug_enable & ~KDEBUG_ENABLE_PPT)) {             \
325 	                kernel_debug1((x), (uintptr_t)(a), (uintptr_t)(b), (uintptr_t)(c), \
326 	                (uintptr_t)(d), (uintptr_t)(e));                                   \
327 	        }                                                                      \
328 	} while (0)
329 
330 #else /* (KDEBUG_LEVEL >= KDEBUG_LEVEL_STANDARD) */
331 #define KERNEL_DEBUG_CONSTANT(x, a, b, c, d, e) do {} while (0)
332 #define KERNEL_DEBUG_CONSTANT1(x, a, b, c, d, e) do {} while (0)
333 #endif /* (KDEBUG_LEVEL >= KDEBUG_LEVEL_STANDARD) */
334 
335 /*
336  * KERNEL_DEBUG_CONSTANT_IST (in-system trace) events provide an audited subset
337  * of tracepoints for userland system tracing tools.  This tracing level was
338  * created by 8857227 to protect fairplayd and other PT_DENY_ATTACH processes.
339  * It has two effects: only KERNEL_DEBUG_CONSTANT_IST() traces are emitted and
340  * any PT_DENY_ATTACH processes will only emit basic traces as defined by the
341  * kernel_debug_filter() routine.
342  */
343 #define KERNEL_DEBUG_CONSTANT_RELEASE(x, a, b, c, d, e) \
344 	KERNEL_DEBUG_CONSTANT_IST(~KDEBUG_ENABLE_PPT, x, a, b, c, d, 0)
345 
346 #if (KDEBUG_LEVEL >= KDEBUG_LEVEL_IST)
347 #define KERNEL_DEBUG_CONSTANT_IST(type, x, a, b, c, d, e)                     \
348 	do {                                                                      \
349 	        if (KDBG_IMPROBABLE(kdebug_enable & (type))) {                        \
350 	                kernel_debug((x), (uintptr_t)(a), (uintptr_t)(b), (uintptr_t)(c), \
351 	                        (uintptr_t)(d), 0);                                           \
352 	        }                                                                     \
353 	} while (0)
354 
355 #define KERNEL_DEBUG_CONSTANT_IST1(x, a, b, c, d, e)                     \
356 	do {                                                                       \
357 	        if (KDBG_IMPROBABLE(kdebug_enable)) {                         \
358 	                kernel_debug1((x), (uintptr_t)(a), (uintptr_t)(b), (uintptr_t)(c), \
359 	                        (uintptr_t)(d), (uintptr_t)(e));                               \
360 	        }                                                                      \
361 	} while (0)
362 
363 #define KERNEL_DEBUG_EARLY(x, a, b, c, d)                                 \
364 	do {                                                                  \
365 	        kernel_debug_early((uint32_t)(x), (uintptr_t)(a), (uintptr_t)(b), \
366 	                (uintptr_t)(c), (uintptr_t)(d));                              \
367 	} while (0)
368 
369 #else /* (KDEBUG_LEVEL >= KDEBUG_LEVEL_IST) */
370 #define KERNEL_DEBUG_CONSTANT_IST(type, x, a, b, c, d, e) do {} while (0)
371 #define KERNEL_DEBUG_CONSTANT_IST1(x, a, b, c, d, e) do {} while (0)
372 #define KERNEL_DEBUG_EARLY(x, a, b, c, d) do {} while (0)
373 #endif /* (KDEBUG_LEVEL >= KDEBUG_LEVEL_IST) */
374 
375 #if NO_KDEBUG
376 #define __kdebug_constant_only __unused
377 #endif
378 
379 /*
380  * KERNEL_DEBUG events are only traced for DEBUG kernels.
381  */
382 #define KERNEL_DEBUG_CONSTANT_DEBUG(x, a, b, c, d, e) \
383 	KERNEL_DEBUG(x, a, b, c, d, e)
384 
385 #if (KDEBUG_LEVEL >= KDEBUG_LEVEL_FULL)
386 #define __kdebug_only
387 
388 #undef KERNEL_DEBUG
389 #define KERNEL_DEBUG(x, a, b, c, d, e)                                  \
390 	do {                                                                \
391 	        if (KDBG_IMPROBABLE(kdebug_enable & ~KDEBUG_ENABLE_PPT)) {      \
392 	                kernel_debug((uint32_t)(x), (uintptr_t)(a), (uintptr_t)(b), \
393 	                        (uintptr_t)(c), (uintptr_t)(d), (uintptr_t)(e));        \
394 	        }                                                               \
395 	} while (0)
396 
397 /*
398  * DO NOT USE THIS MACRO -- see warning above for KERNEL_DEBUG_CONSTANT1.
399  */
400 #define KERNEL_DEBUG1(x, a, b, c, d, e)                                  \
401 	do {                                                                 \
402 	        if (KDBG_IMPROBABLE(kdebug_enable & ~KDEBUG_ENABLE_PPT)) {       \
403 	                kernel_debug1((uint32_t)(x), (uintptr_t)(a), (uintptr_t)(b), \
404 	                        (uintptr_t)(c), (uintptr_t)(d), (uintptr_t)(e));         \
405 	        }                                                                \
406 	} while (0)
407 
408 #else /* (KDEBUG_LEVEL >= KDEBUG_LEVEL_FULL) */
409 #define __kdebug_only __unused
410 
411 #undef KERNEL_DEBUG
412 #define KERNEL_DEBUG(x, a, b, c, d, e) do {} while (0)
413 #define KERNEL_DEBUG1(x, a, b, c, d, e) do {} while (0)
414 #endif /* (KDEBUG_LEVEL >= KDEBUG_LEVEL_FULL) */
415 
416 void kernel_debug(uint32_t debugid, uintptr_t arg1, uintptr_t arg2,
417     uintptr_t arg3, uintptr_t arg4, uintptr_t arg5);
418 
419 void kernel_debug1(uint32_t debugid, uintptr_t arg1, uintptr_t arg2,
420     uintptr_t arg3, uintptr_t arg4, uintptr_t arg5);
421 
422 #define KDBG_FLAG_FILTERED 0x01
423 #define KDBG_FLAG_NOPROCFILT 0x02
424 
425 void kernel_debug_flags(uint32_t debugid, uintptr_t arg1, uintptr_t arg2,
426     uintptr_t arg3, uintptr_t arg4, uint64_t flags);
427 
428 void kernel_debug_filtered(uint32_t debugid, uintptr_t arg1, uintptr_t arg2,
429     uintptr_t arg3, uintptr_t arg4);
430 
431 #pragma mark - xnu API
432 
433 #ifdef XNU_KERNEL_PRIVATE
434 
435 void kdebug_startup(void);
436 
437 /* Used in early boot to log events. */
438 void kernel_debug_early(uint32_t  debugid, uintptr_t arg1, uintptr_t arg2,
439     uintptr_t arg3, uintptr_t arg4);
440 /* Used in early boot to log strings spanning only a single tracepoint. */
441 void kernel_debug_string_early(const char *message);
442 /* Used to trace strings within kdebug tracepoints on arbitrary eventids. */
443 void kernel_debug_string_simple(uint32_t eventid, const char *str);
444 /* Only used by ktrace to reset kdebug.  ktrace_lock must be held. */
445 extern void kdebug_reset(void);
446 
447 void kdbg_dump_trace_to_file(const char *, bool reenable);
448 
449 enum kdebug_opts {
450 	KDOPT_WRAPPING = 0x1,
451 	KDOPT_ATBOOT = 0x2,
452 };
453 
454 enum kdebug_mode {
455 	KDEBUG_MODE_TRACE = 0x1, /* General purpose tracing.*/
456 	KDEBUG_MODE_TRIAGE = 0x2, /* Collect more information to triage failures / gain insight into in-kernel operations of a thread.*/
457 };
458 
459 
460 int kdbg_bootstrap(bool early_trace, int mode);
461 void kdebug_init(unsigned int n_events, char *filterdesc,
462     enum kdebug_opts opts);
463 void kdebug_trace_start(unsigned int n_events, const char *filterdesc,
464     enum kdebug_opts opts);
465 uint64_t kdebug_wake(void);
466 void kdebug_free_early_buf(void);
467 
468 
469 struct proc;
470 void kdbg_trace_data(struct proc *proc, long *arg_pid, long *arg_uniqueid);
471 
472 #define KDBG_VFS_LOOKUP_FLAG_LOOKUP 0x01
473 #define KDBG_VFS_LOOKUP_FLAG_NOPROCFILT 0x02
474 void kdebug_vfs_lookup(unsigned long *path_words, int path_len, void *vnp,
475     uint32_t flags);
476 
477 void ktriage_extract(uint64_t thread_id, void *buf, uint32_t bufsz);
478 
479 #endif /* XNU_KERNEL_PRIVATE */
480 
481 #ifdef KERNEL_PRIVATE
482 
483 typedef struct ktriage_strings {
484 	int num_strings;
485 	const char **strings;
486 } ktriage_strings_t;
487 
488 int ktriage_register_subsystem_strings(uint8_t subsystem, ktriage_strings_t *subsystem_strings);
489 int ktriage_unregister_subsystem_strings(uint8_t subsystem);
490 
491 void ktriage_record(uint64_t thread_id, uint64_t debugid, uintptr_t arg);
492 
493 #define NUMPARMS 23
494 void kdebug_lookup_gen_events(long *path_words, int path_len, void *vnp,
495     bool lookup);
496 
497 #pragma mark - EnergyTracing
498 
499 #define KERNEL_DBG_IST_SANE KDBG_RELEASE
500 #define ENTR_KDTRACEFUNC KDBG_RELEASE
501 
502 // value is int64_t, quality is uint32_t
503 #define KERNEL_ENERGYTRACE(opcode, lifespan, id, quality, value)        \
504 	    ENTR_KDTRACE(kEnTrCompKernel, opcode, lifespan, id,         \
505 	                 quality, value)
506 #define KERNEL_ENTR_ASSOCIATE(par_opcode, par_act_id, sub_opcode, sub_act_id) \
507 	    ENTR_KDASSOCIATE(kEnTrCompKernel, par_opcode, par_act_id,   \
508 	                     kEnTrCompKernel, sub_opcode, sub_act_id)
509 
510 #endif /* KERNEL_PRIVATE */
511 
512 #endif /* KERNEL */
513 
514 __END_DECLS
515 
516 #endif /* !defined(BSD_SYS_KDEBUG_KERNEL_H) */
517