/ duct-tape / xnu / bsd / sys / kdebug_kernel.h
kdebug_kernel.h
  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) */