xref: /xnu-12377.41.6/libkern/os/log.h (revision bbb1b6f9e71b8cdde6e5cd6f4841f207dee3d828)
1*bbb1b6f9SApple OSS Distributions /*
2*bbb1b6f9SApple OSS Distributions  * Copyright (c) 2015-2023 Apple Inc. All rights reserved.
3*bbb1b6f9SApple OSS Distributions  *
4*bbb1b6f9SApple OSS Distributions  * @APPLE_LICENSE_HEADER_START@
5*bbb1b6f9SApple OSS Distributions  *
6*bbb1b6f9SApple OSS Distributions  * This file contains Original Code and/or Modifications of Original Code
7*bbb1b6f9SApple OSS Distributions  * as defined in and that are subject to the Apple Public Source License
8*bbb1b6f9SApple OSS Distributions  * Version 2.0 (the 'License'). You may not use this file except in
9*bbb1b6f9SApple OSS Distributions  * compliance with the License. Please obtain a copy of the License at
10*bbb1b6f9SApple OSS Distributions  * http://www.opensource.apple.com/apsl/ and read it before using this
11*bbb1b6f9SApple OSS Distributions  * file.
12*bbb1b6f9SApple OSS Distributions  *
13*bbb1b6f9SApple OSS Distributions  * The Original Code and all software distributed under the License are
14*bbb1b6f9SApple OSS Distributions  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15*bbb1b6f9SApple OSS Distributions  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16*bbb1b6f9SApple OSS Distributions  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17*bbb1b6f9SApple OSS Distributions  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18*bbb1b6f9SApple OSS Distributions  * Please see the License for the specific language governing rights and
19*bbb1b6f9SApple OSS Distributions  * limitations under the License.
20*bbb1b6f9SApple OSS Distributions  *
21*bbb1b6f9SApple OSS Distributions  * @APPLE_LICENSE_HEADER_END@
22*bbb1b6f9SApple OSS Distributions  */
23*bbb1b6f9SApple OSS Distributions 
24*bbb1b6f9SApple OSS Distributions #ifndef __os_log_h
25*bbb1b6f9SApple OSS Distributions #define __os_log_h
26*bbb1b6f9SApple OSS Distributions 
27*bbb1b6f9SApple OSS Distributions #include <os/object.h>
28*bbb1b6f9SApple OSS Distributions #include <stdint.h>
29*bbb1b6f9SApple OSS Distributions #include <stdbool.h>
30*bbb1b6f9SApple OSS Distributions 
31*bbb1b6f9SApple OSS Distributions #ifndef __has_attribute
32*bbb1b6f9SApple OSS Distributions #define __has_attribute(x) 0
33*bbb1b6f9SApple OSS Distributions #endif
34*bbb1b6f9SApple OSS Distributions 
35*bbb1b6f9SApple OSS Distributions #ifndef __has_builtin
36*bbb1b6f9SApple OSS Distributions #define __has_builtin(x) 0
37*bbb1b6f9SApple OSS Distributions #endif
38*bbb1b6f9SApple OSS Distributions 
39*bbb1b6f9SApple OSS Distributions #if __has_attribute(not_tail_called)
40*bbb1b6f9SApple OSS Distributions #define OS_LOG_NOTAILCALL __attribute__((not_tail_called))
41*bbb1b6f9SApple OSS Distributions #define OS_LOG_NOTAILCALL_MARKER
42*bbb1b6f9SApple OSS Distributions #else
43*bbb1b6f9SApple OSS Distributions #define OS_LOG_NOTAILCALL
44*bbb1b6f9SApple OSS Distributions #define OS_LOG_NOTAILCALL_MARKER __asm__("")
45*bbb1b6f9SApple OSS Distributions #endif
46*bbb1b6f9SApple OSS Distributions 
47*bbb1b6f9SApple OSS Distributions __BEGIN_DECLS
48*bbb1b6f9SApple OSS Distributions 
49*bbb1b6f9SApple OSS Distributions extern void *__dso_handle;
50*bbb1b6f9SApple OSS Distributions 
51*bbb1b6f9SApple OSS Distributions #ifdef XNU_KERNEL_PRIVATE
52*bbb1b6f9SApple OSS Distributions extern bool startup_serial_logging_active;
53*bbb1b6f9SApple OSS Distributions extern uint64_t startup_serial_num_procs;
54*bbb1b6f9SApple OSS Distributions #endif /* XNU_KERNEL_PRIVATE */
55*bbb1b6f9SApple OSS Distributions 
56*bbb1b6f9SApple OSS Distributions #ifdef KERNEL
57*bbb1b6f9SApple OSS Distributions #define OS_LOG_BUFFER_MAX_SIZE 256
58*bbb1b6f9SApple OSS Distributions #else
59*bbb1b6f9SApple OSS Distributions #define OS_LOG_BUFFER_MAX_SIZE 1024
60*bbb1b6f9SApple OSS Distributions #endif
61*bbb1b6f9SApple OSS Distributions 
62*bbb1b6f9SApple OSS Distributions // The OS_LOG_BUFFER_MAX_SIZE limit includes the metadata that
63*bbb1b6f9SApple OSS Distributions // must be included in the os_log firehose buffer
64*bbb1b6f9SApple OSS Distributions #define OS_LOG_DATA_MAX_SIZE (OS_LOG_BUFFER_MAX_SIZE - 16)
65*bbb1b6f9SApple OSS Distributions 
66*bbb1b6f9SApple OSS Distributions OS_ALWAYS_INLINE
67*bbb1b6f9SApple OSS Distributions static inline void
68*bbb1b6f9SApple OSS Distributions     _os_log_verify_format_str(__unused const char *msg, ...)
69*bbb1b6f9SApple OSS Distributions __osloglike(1, 2);
70*bbb1b6f9SApple OSS Distributions 
71*bbb1b6f9SApple OSS Distributions OS_ALWAYS_INLINE
72*bbb1b6f9SApple OSS Distributions static inline void
_os_log_verify_format_str(__unused const char * msg,...)73*bbb1b6f9SApple OSS Distributions _os_log_verify_format_str(__unused const char *msg, ...)                                       /* placeholder */
74*bbb1b6f9SApple OSS Distributions {
75*bbb1b6f9SApple OSS Distributions }
76*bbb1b6f9SApple OSS Distributions 
77*bbb1b6f9SApple OSS Distributions #if OS_OBJECT_USE_OBJC
78*bbb1b6f9SApple OSS Distributions OS_OBJECT_DECL(os_log);
79*bbb1b6f9SApple OSS Distributions #else
80*bbb1b6f9SApple OSS Distributions typedef struct os_log_s *os_log_t;
81*bbb1b6f9SApple OSS Distributions #endif /* OS_OBJECT_USE_OBJC */
82*bbb1b6f9SApple OSS Distributions 
83*bbb1b6f9SApple OSS Distributions /*!
84*bbb1b6f9SApple OSS Distributions  * @const OS_LOG_DISABLED
85*bbb1b6f9SApple OSS Distributions  *
86*bbb1b6f9SApple OSS Distributions  * @discussion
87*bbb1b6f9SApple OSS Distributions  * Use this to disable a specific log message.
88*bbb1b6f9SApple OSS Distributions  */
89*bbb1b6f9SApple OSS Distributions #define OS_LOG_DISABLED NULL
90*bbb1b6f9SApple OSS Distributions 
91*bbb1b6f9SApple OSS Distributions /*!
92*bbb1b6f9SApple OSS Distributions  * @const OS_LOG_DEFAULT
93*bbb1b6f9SApple OSS Distributions  *
94*bbb1b6f9SApple OSS Distributions  * @discussion
95*bbb1b6f9SApple OSS Distributions  * Use this to log a message in accordance with current system settings.
96*bbb1b6f9SApple OSS Distributions  */
97*bbb1b6f9SApple OSS Distributions #define OS_LOG_DEFAULT OS_OBJECT_GLOBAL_OBJECT(os_log_t, _os_log_default)
98*bbb1b6f9SApple OSS Distributions OS_EXPORT
99*bbb1b6f9SApple OSS Distributions struct os_log_s _os_log_default;
100*bbb1b6f9SApple OSS Distributions 
101*bbb1b6f9SApple OSS Distributions /*!
102*bbb1b6f9SApple OSS Distributions  * @enum os_log_type_t
103*bbb1b6f9SApple OSS Distributions  *
104*bbb1b6f9SApple OSS Distributions  * @discussion
105*bbb1b6f9SApple OSS Distributions  * Supported log message types.
106*bbb1b6f9SApple OSS Distributions  *
107*bbb1b6f9SApple OSS Distributions  * @constant OS_LOG_TYPE_DEFAULT
108*bbb1b6f9SApple OSS Distributions  * Equivalent type for "os_log()" messages, i.e., default messages that are always
109*bbb1b6f9SApple OSS Distributions  * captured to memory or disk.
110*bbb1b6f9SApple OSS Distributions  *
111*bbb1b6f9SApple OSS Distributions  * @constant OS_LOG_TYPE_INFO
112*bbb1b6f9SApple OSS Distributions  * Equivalent type for "os_log_info()" messages, i.e., Additional informational messages.
113*bbb1b6f9SApple OSS Distributions  *
114*bbb1b6f9SApple OSS Distributions  * @constant OS_LOG_TYPE_DEBUG
115*bbb1b6f9SApple OSS Distributions  * Equivalent type for "os_log_debug()" messages, i.e., Debug messages.
116*bbb1b6f9SApple OSS Distributions  *
117*bbb1b6f9SApple OSS Distributions  * @constant OS_LOG_TYPE_ERROR
118*bbb1b6f9SApple OSS Distributions  * Equivalent type for "os_log_error()" messages, i.e., local process error messages.
119*bbb1b6f9SApple OSS Distributions  *
120*bbb1b6f9SApple OSS Distributions  * @constant OS_LOG_TYPE_FAULT
121*bbb1b6f9SApple OSS Distributions  * Equivalent type for "os_log_fault()" messages, i.e., a system error that involves
122*bbb1b6f9SApple OSS Distributions  * potentially more than one process, usually used by daemons and services.
123*bbb1b6f9SApple OSS Distributions  */
124*bbb1b6f9SApple OSS Distributions OS_ENUM(os_log_type, uint8_t,
125*bbb1b6f9SApple OSS Distributions     OS_LOG_TYPE_DEFAULT = 0x00,
126*bbb1b6f9SApple OSS Distributions     OS_LOG_TYPE_INFO    = 0x01,
127*bbb1b6f9SApple OSS Distributions     OS_LOG_TYPE_DEBUG   = 0x02,
128*bbb1b6f9SApple OSS Distributions     OS_LOG_TYPE_ERROR   = 0x10,
129*bbb1b6f9SApple OSS Distributions     OS_LOG_TYPE_FAULT   = 0x11);
130*bbb1b6f9SApple OSS Distributions 
131*bbb1b6f9SApple OSS Distributions /*!
132*bbb1b6f9SApple OSS Distributions  * @function os_log_create
133*bbb1b6f9SApple OSS Distributions  *
134*bbb1b6f9SApple OSS Distributions  * @abstract
135*bbb1b6f9SApple OSS Distributions  * Creates a log object to be used with other log related functions.
136*bbb1b6f9SApple OSS Distributions  *
137*bbb1b6f9SApple OSS Distributions  * @discussion
138*bbb1b6f9SApple OSS Distributions  * Creates a log object to be used with other log related functions. The log
139*bbb1b6f9SApple OSS Distributions  * object serves two purposes: (1) tag related messages by subsystem and
140*bbb1b6f9SApple OSS Distributions  * category name for easy filtering, and (2) control logging system behavior for
141*bbb1b6f9SApple OSS Distributions  * messages.
142*bbb1b6f9SApple OSS Distributions  *
143*bbb1b6f9SApple OSS Distributions  * @param subsystem
144*bbb1b6f9SApple OSS Distributions  * The identifier of the given subsystem should be in reverse DNS form (i.e.,
145*bbb1b6f9SApple OSS Distributions  * com.company.mysubsystem). This string must be a constant string, not
146*bbb1b6f9SApple OSS Distributions  * dynamically generated.
147*bbb1b6f9SApple OSS Distributions  *
148*bbb1b6f9SApple OSS Distributions  * @param category
149*bbb1b6f9SApple OSS Distributions  * The category within the given subsystem that specifies the settings for the
150*bbb1b6f9SApple OSS Distributions  * log object. This string must be a constant string, not dynamically generated.
151*bbb1b6f9SApple OSS Distributions  *
152*bbb1b6f9SApple OSS Distributions  * @result
153*bbb1b6f9SApple OSS Distributions  * Returns an os_log_t value to be passed to other os_log API calls. This should
154*bbb1b6f9SApple OSS Distributions  * be called once at log initialization and rely on system to detect changes to
155*bbb1b6f9SApple OSS Distributions  * settings.
156*bbb1b6f9SApple OSS Distributions  *
157*bbb1b6f9SApple OSS Distributions  * A value will always be returned to allow for dynamic enablement.
158*bbb1b6f9SApple OSS Distributions  */
159*bbb1b6f9SApple OSS Distributions OS_EXPORT OS_NOTHROW OS_WARN_RESULT OS_OBJECT_RETURNS_RETAINED
160*bbb1b6f9SApple OSS Distributions os_log_t
161*bbb1b6f9SApple OSS Distributions os_log_create(const char *subsystem, const char *category);
162*bbb1b6f9SApple OSS Distributions 
163*bbb1b6f9SApple OSS Distributions /*!
164*bbb1b6f9SApple OSS Distributions  * @function os_log_info_enabled
165*bbb1b6f9SApple OSS Distributions  *
166*bbb1b6f9SApple OSS Distributions  * @abstract
167*bbb1b6f9SApple OSS Distributions  * Returns if additional information log messages are enabled for a particular
168*bbb1b6f9SApple OSS Distributions  * log object.
169*bbb1b6f9SApple OSS Distributions  *
170*bbb1b6f9SApple OSS Distributions  * @discussion
171*bbb1b6f9SApple OSS Distributions  * Returns if additional information log messages are enabled for a particular
172*bbb1b6f9SApple OSS Distributions  * log object.
173*bbb1b6f9SApple OSS Distributions  *
174*bbb1b6f9SApple OSS Distributions  * @param log
175*bbb1b6f9SApple OSS Distributions  * Pass OS_LOG_DEFAULT or a log object previously created with os_log_create.
176*bbb1b6f9SApple OSS Distributions  *
177*bbb1b6f9SApple OSS Distributions  * @result
178*bbb1b6f9SApple OSS Distributions  * Returns ‘true’ if additional information log messages are enabled.
179*bbb1b6f9SApple OSS Distributions  */
180*bbb1b6f9SApple OSS Distributions OS_EXPORT OS_NOTHROW OS_WARN_RESULT
181*bbb1b6f9SApple OSS Distributions bool
182*bbb1b6f9SApple OSS Distributions os_log_info_enabled(os_log_t log);
183*bbb1b6f9SApple OSS Distributions 
184*bbb1b6f9SApple OSS Distributions /*!
185*bbb1b6f9SApple OSS Distributions  * @function os_log_debug_enabled
186*bbb1b6f9SApple OSS Distributions  *
187*bbb1b6f9SApple OSS Distributions  * @abstract
188*bbb1b6f9SApple OSS Distributions  * Returns if debug log messages are enabled for a particular log object.
189*bbb1b6f9SApple OSS Distributions  *
190*bbb1b6f9SApple OSS Distributions  * @discussion
191*bbb1b6f9SApple OSS Distributions  * Returns if debug log messages are enabled for a particular log object.
192*bbb1b6f9SApple OSS Distributions  *
193*bbb1b6f9SApple OSS Distributions  * @param log
194*bbb1b6f9SApple OSS Distributions  * Pass OS_LOG_DEFAULT or a log object previously created with os_log_create.
195*bbb1b6f9SApple OSS Distributions  *
196*bbb1b6f9SApple OSS Distributions  * @result
197*bbb1b6f9SApple OSS Distributions  * Returns ‘true’ if debug log messages are enabled.
198*bbb1b6f9SApple OSS Distributions  */
199*bbb1b6f9SApple OSS Distributions OS_EXPORT OS_NOTHROW OS_WARN_RESULT
200*bbb1b6f9SApple OSS Distributions bool
201*bbb1b6f9SApple OSS Distributions os_log_debug_enabled(os_log_t log);
202*bbb1b6f9SApple OSS Distributions 
203*bbb1b6f9SApple OSS Distributions /*!
204*bbb1b6f9SApple OSS Distributions  * @function os_log
205*bbb1b6f9SApple OSS Distributions  *
206*bbb1b6f9SApple OSS Distributions  * @abstract
207*bbb1b6f9SApple OSS Distributions  * Insert a log message into the Unified Logging and Tracing system.
208*bbb1b6f9SApple OSS Distributions  *
209*bbb1b6f9SApple OSS Distributions  * @discussion
210*bbb1b6f9SApple OSS Distributions  * Insert a log message into the Unified Logging and Tracing system in
211*bbb1b6f9SApple OSS Distributions  * accordance with the preferences specified by the provided log object.
212*bbb1b6f9SApple OSS Distributions  * These messages cannot be disabled and therefore always captured either
213*bbb1b6f9SApple OSS Distributions  * to memory or disk.
214*bbb1b6f9SApple OSS Distributions  *
215*bbb1b6f9SApple OSS Distributions  * When an os_activity_id_t is present, the log message will also be scoped by
216*bbb1b6f9SApple OSS Distributions  * that identifier.  Activities provide granular filtering of log messages
217*bbb1b6f9SApple OSS Distributions  * across threads and processes.
218*bbb1b6f9SApple OSS Distributions  *
219*bbb1b6f9SApple OSS Distributions  * There is a physical cap of 256 bytes per entry for dynamic content,
220*bbb1b6f9SApple OSS Distributions  * i.e., %s and %@, that can be written to the persistence store.  As such,
221*bbb1b6f9SApple OSS Distributions  * all content exceeding the limit will be truncated before written to disk.
222*bbb1b6f9SApple OSS Distributions  * Live streams will continue to show the full content.
223*bbb1b6f9SApple OSS Distributions  *
224*bbb1b6f9SApple OSS Distributions  * @param log
225*bbb1b6f9SApple OSS Distributions  * Pass OS_LOG_DEFAULT or a log object previously created with os_log_create.
226*bbb1b6f9SApple OSS Distributions  *
227*bbb1b6f9SApple OSS Distributions  * @param format
228*bbb1b6f9SApple OSS Distributions  * A format string to generate a human-readable log message when the log
229*bbb1b6f9SApple OSS Distributions  * line is decoded.  This string must be a constant string, not dynamically
230*bbb1b6f9SApple OSS Distributions  * generated.  Supports all standard printf types and %@ (objects).
231*bbb1b6f9SApple OSS Distributions  */
232*bbb1b6f9SApple OSS Distributions #define os_log(log, format, ...) \
233*bbb1b6f9SApple OSS Distributions     os_log_with_type(log, OS_LOG_TYPE_DEFAULT, format, ##__VA_ARGS__)
234*bbb1b6f9SApple OSS Distributions 
235*bbb1b6f9SApple OSS Distributions /*!
236*bbb1b6f9SApple OSS Distributions  * @function os_log_info
237*bbb1b6f9SApple OSS Distributions  *
238*bbb1b6f9SApple OSS Distributions  * @abstract
239*bbb1b6f9SApple OSS Distributions  * Insert a development log message into the Unified Logging and Tracing system.
240*bbb1b6f9SApple OSS Distributions  *
241*bbb1b6f9SApple OSS Distributions  * @discussion
242*bbb1b6f9SApple OSS Distributions  * Insert a log message into the Unified Logging and Tracing system in
243*bbb1b6f9SApple OSS Distributions  * accordance with the preferences specified by the provided log object.
244*bbb1b6f9SApple OSS Distributions  *
245*bbb1b6f9SApple OSS Distributions  * When an os_activity_id_t is present, the log message will also be scoped by
246*bbb1b6f9SApple OSS Distributions  * that identifier.  Activities provide granular filtering of log messages
247*bbb1b6f9SApple OSS Distributions  * across threads and processes.
248*bbb1b6f9SApple OSS Distributions  *
249*bbb1b6f9SApple OSS Distributions  * There is a physical cap of 256 bytes per entry for dynamic content,
250*bbb1b6f9SApple OSS Distributions  * i.e., %s and %@, that can be written to the persistence store.  As such,
251*bbb1b6f9SApple OSS Distributions  * all content exceeding the limit will be truncated before written to disk.
252*bbb1b6f9SApple OSS Distributions  * Live streams will continue to show the full content.
253*bbb1b6f9SApple OSS Distributions  *
254*bbb1b6f9SApple OSS Distributions  * @param log
255*bbb1b6f9SApple OSS Distributions  * Pass OS_LOG_DEFAULT or a log object previously created with os_log_create.
256*bbb1b6f9SApple OSS Distributions  *
257*bbb1b6f9SApple OSS Distributions  * @param format
258*bbb1b6f9SApple OSS Distributions  * A format string to generate a human-readable log message when the log
259*bbb1b6f9SApple OSS Distributions  * line is decoded.  This string must be a constant string, not dynamically
260*bbb1b6f9SApple OSS Distributions  * generated.  Supports all standard printf types and %@ (objects).
261*bbb1b6f9SApple OSS Distributions  */
262*bbb1b6f9SApple OSS Distributions #define os_log_info(log, format, ...) \
263*bbb1b6f9SApple OSS Distributions     os_log_with_type(log, OS_LOG_TYPE_INFO, format, ##__VA_ARGS__)
264*bbb1b6f9SApple OSS Distributions 
265*bbb1b6f9SApple OSS Distributions /*!
266*bbb1b6f9SApple OSS Distributions  * @function os_log_debug
267*bbb1b6f9SApple OSS Distributions  *
268*bbb1b6f9SApple OSS Distributions  * @abstract
269*bbb1b6f9SApple OSS Distributions  * Insert a debug log message into the Unified Logging and Tracing system.
270*bbb1b6f9SApple OSS Distributions  *
271*bbb1b6f9SApple OSS Distributions  * @discussion
272*bbb1b6f9SApple OSS Distributions  * Insert a debug log message into the Unified Logging and Tracing system in
273*bbb1b6f9SApple OSS Distributions  * accordance with the preferences specified by the provided log object.
274*bbb1b6f9SApple OSS Distributions  *
275*bbb1b6f9SApple OSS Distributions  * When an os_activity_id_t is present, the log message will also be scoped by
276*bbb1b6f9SApple OSS Distributions  * that identifier.  Activities provide granular filtering of log messages
277*bbb1b6f9SApple OSS Distributions  * across threads and processes.
278*bbb1b6f9SApple OSS Distributions  *
279*bbb1b6f9SApple OSS Distributions  * There is a physical cap of 256 bytes per entry for dynamic content,
280*bbb1b6f9SApple OSS Distributions  * i.e., %s and %@, that can be written to the persistence store.  As such,
281*bbb1b6f9SApple OSS Distributions  * all content exceeding the limit will be truncated before written to disk.
282*bbb1b6f9SApple OSS Distributions  * Live streams will continue to show the full content.
283*bbb1b6f9SApple OSS Distributions  *
284*bbb1b6f9SApple OSS Distributions  * @param log
285*bbb1b6f9SApple OSS Distributions  * Pass OS_LOG_DEFAULT or a log object previously created with os_log_create.
286*bbb1b6f9SApple OSS Distributions  *
287*bbb1b6f9SApple OSS Distributions  * @param format
288*bbb1b6f9SApple OSS Distributions  * A format string to generate a human-readable log message when the log
289*bbb1b6f9SApple OSS Distributions  * line is decoded.  This string must be a constant string, not dynamically
290*bbb1b6f9SApple OSS Distributions  * generated.  Supports all standard printf types and %@ (objects).
291*bbb1b6f9SApple OSS Distributions  */
292*bbb1b6f9SApple OSS Distributions #define os_log_debug(log, format, ...) \
293*bbb1b6f9SApple OSS Distributions     os_log_with_type(log, OS_LOG_TYPE_DEBUG, format, ##__VA_ARGS__)
294*bbb1b6f9SApple OSS Distributions 
295*bbb1b6f9SApple OSS Distributions /*!
296*bbb1b6f9SApple OSS Distributions  * @function os_log_error
297*bbb1b6f9SApple OSS Distributions  *
298*bbb1b6f9SApple OSS Distributions  * @abstract
299*bbb1b6f9SApple OSS Distributions  * Insert an error log message into the Unified Logging and Tracing system.
300*bbb1b6f9SApple OSS Distributions  *
301*bbb1b6f9SApple OSS Distributions  * @discussion
302*bbb1b6f9SApple OSS Distributions  * Insert an error log message into the Unified Logging and Tracing system.
303*bbb1b6f9SApple OSS Distributions  *
304*bbb1b6f9SApple OSS Distributions  * When an os_activity_id_t is present, the log message will also be scoped by
305*bbb1b6f9SApple OSS Distributions  * that identifier.  Activities provide granular filtering of log messages
306*bbb1b6f9SApple OSS Distributions  * across threads and processes.
307*bbb1b6f9SApple OSS Distributions  *
308*bbb1b6f9SApple OSS Distributions  * There is a physical cap of 256 bytes per entry for dynamic content,
309*bbb1b6f9SApple OSS Distributions  * i.e., %s and %@, that can be written to the persistence store.  As such,
310*bbb1b6f9SApple OSS Distributions  * all content exceeding the limit will be truncated before written to disk.
311*bbb1b6f9SApple OSS Distributions  * Live streams will continue to show the full content.
312*bbb1b6f9SApple OSS Distributions  *
313*bbb1b6f9SApple OSS Distributions  * @param log
314*bbb1b6f9SApple OSS Distributions  * Pass OS_LOG_DEFAULT or a log object previously created with os_log_create.
315*bbb1b6f9SApple OSS Distributions  *
316*bbb1b6f9SApple OSS Distributions  * @param format
317*bbb1b6f9SApple OSS Distributions  * A format string to generate a human-readable log message when the log
318*bbb1b6f9SApple OSS Distributions  * line is decoded.  This string must be a constant string, not dynamically
319*bbb1b6f9SApple OSS Distributions  * generated.  Supports all standard printf types and %@ (objects).
320*bbb1b6f9SApple OSS Distributions  */
321*bbb1b6f9SApple OSS Distributions #define os_log_error(log, format, ...) \
322*bbb1b6f9SApple OSS Distributions     os_log_with_type(log, OS_LOG_TYPE_ERROR, format, ##__VA_ARGS__)
323*bbb1b6f9SApple OSS Distributions 
324*bbb1b6f9SApple OSS Distributions /*!
325*bbb1b6f9SApple OSS Distributions  * @function os_log_fault
326*bbb1b6f9SApple OSS Distributions  *
327*bbb1b6f9SApple OSS Distributions  * @abstract
328*bbb1b6f9SApple OSS Distributions  * Insert a fault log message into the Unified Logging and Tracing system.
329*bbb1b6f9SApple OSS Distributions  *
330*bbb1b6f9SApple OSS Distributions  * @discussion
331*bbb1b6f9SApple OSS Distributions  * Log a fault message issue into the Unified Logging and Tracing system
332*bbb1b6f9SApple OSS Distributions  * signifying a multi-process (i.e., system error) related issue, either
333*bbb1b6f9SApple OSS Distributions  * due to interaction via IPC or some other.  Faults will gather information
334*bbb1b6f9SApple OSS Distributions  * from the entire process chain and record it for later inspection.
335*bbb1b6f9SApple OSS Distributions  *
336*bbb1b6f9SApple OSS Distributions  * When an os_activity_id_t is present, the log message will also be scoped by
337*bbb1b6f9SApple OSS Distributions  * that identifier.  Activities provide granular filtering of log messages
338*bbb1b6f9SApple OSS Distributions  * across threads and processes.
339*bbb1b6f9SApple OSS Distributions  *
340*bbb1b6f9SApple OSS Distributions  * There is a physical cap of 256 bytes per entry for dynamic content,
341*bbb1b6f9SApple OSS Distributions  * i.e., %s and %@, that can be written to the persistence store.  As such,
342*bbb1b6f9SApple OSS Distributions  * all content exceeding the limit will be truncated before written to disk.
343*bbb1b6f9SApple OSS Distributions  * Live streams will continue to show the full content.
344*bbb1b6f9SApple OSS Distributions  *
345*bbb1b6f9SApple OSS Distributions  * @param log
346*bbb1b6f9SApple OSS Distributions  * Pass OS_LOG_DEFAULT or a log object previously created with os_log_create.
347*bbb1b6f9SApple OSS Distributions  *
348*bbb1b6f9SApple OSS Distributions  * @param format
349*bbb1b6f9SApple OSS Distributions  * A format string to generate a human-readable log message when the log
350*bbb1b6f9SApple OSS Distributions  * line is decoded.  This string must be a constant string, not dynamically
351*bbb1b6f9SApple OSS Distributions  * generated.  Supports all standard printf types and %@ (objects).
352*bbb1b6f9SApple OSS Distributions  */
353*bbb1b6f9SApple OSS Distributions #define os_log_fault(log, format, ...) \
354*bbb1b6f9SApple OSS Distributions     os_log_with_type(log, OS_LOG_TYPE_FAULT, format, ##__VA_ARGS__)
355*bbb1b6f9SApple OSS Distributions 
356*bbb1b6f9SApple OSS Distributions /*!
357*bbb1b6f9SApple OSS Distributions  * @function os_log_with_type
358*bbb1b6f9SApple OSS Distributions  *
359*bbb1b6f9SApple OSS Distributions  * @abstract
360*bbb1b6f9SApple OSS Distributions  * Log a message using a specific type.
361*bbb1b6f9SApple OSS Distributions  *
362*bbb1b6f9SApple OSS Distributions  * @discussion
363*bbb1b6f9SApple OSS Distributions  * Will log a message with the provided os_log_type_t.
364*bbb1b6f9SApple OSS Distributions  *
365*bbb1b6f9SApple OSS Distributions  * @param log
366*bbb1b6f9SApple OSS Distributions  * Pass OS_LOG_DEFAULT or a log object previously created with os_log_create.
367*bbb1b6f9SApple OSS Distributions  *
368*bbb1b6f9SApple OSS Distributions  * @param type
369*bbb1b6f9SApple OSS Distributions  * Pass a valid type from os_log_type_t.
370*bbb1b6f9SApple OSS Distributions  *
371*bbb1b6f9SApple OSS Distributions  * @param format
372*bbb1b6f9SApple OSS Distributions  * A format string to generate a human-readable log message when the log
373*bbb1b6f9SApple OSS Distributions  * line is decoded.  This string must be a constant string, not dynamically
374*bbb1b6f9SApple OSS Distributions  * generated.  Supports all standard printf types and %@ (objects).
375*bbb1b6f9SApple OSS Distributions  */
376*bbb1b6f9SApple OSS Distributions #define os_log_with_type(log, type, format, ...) __extension__({                            \
377*bbb1b6f9SApple OSS Distributions     _Static_assert(__builtin_constant_p(format), "format string must be constant");         \
378*bbb1b6f9SApple OSS Distributions     __attribute__((section("__TEXT,__os_log"))) static const char _os_log_fmt[] = format;   \
379*bbb1b6f9SApple OSS Distributions     if (0) {                                                                                \
380*bbb1b6f9SApple OSS Distributions 	_os_log_verify_format_str(format, ##__VA_ARGS__);                                   \
381*bbb1b6f9SApple OSS Distributions     } else {                                                                                  \
382*bbb1b6f9SApple OSS Distributions 	_os_log_internal(&__dso_handle, log, type, _os_log_fmt, ##__VA_ARGS__);             \
383*bbb1b6f9SApple OSS Distributions     }                                                                                       \
384*bbb1b6f9SApple OSS Distributions     __asm__(""); /* avoid tailcall */                                                       \
385*bbb1b6f9SApple OSS Distributions })
386*bbb1b6f9SApple OSS Distributions 
387*bbb1b6f9SApple OSS Distributions /*!
388*bbb1b6f9SApple OSS Distributions  * @function os_log_at_time
389*bbb1b6f9SApple OSS Distributions  *
390*bbb1b6f9SApple OSS Distributions  * @abstract
391*bbb1b6f9SApple OSS Distributions  * Log a message using a specific type and a timestamp.
392*bbb1b6f9SApple OSS Distributions  *
393*bbb1b6f9SApple OSS Distributions  * @discussion
394*bbb1b6f9SApple OSS Distributions  * Will log a message with the provided os_log_type_t and a timestamp
395*bbb1b6f9SApple OSS Distributions  * signifying a moment of a log message creation.
396*bbb1b6f9SApple OSS Distributions  *
397*bbb1b6f9SApple OSS Distributions  * @param log
398*bbb1b6f9SApple OSS Distributions  * Pass OS_LOG_DEFAULT or a log object previously created with os_log_create.
399*bbb1b6f9SApple OSS Distributions  *
400*bbb1b6f9SApple OSS Distributions  * @param type
401*bbb1b6f9SApple OSS Distributions  * Pass a valid type from os_log_type_t.
402*bbb1b6f9SApple OSS Distributions  *
403*bbb1b6f9SApple OSS Distributions  * @param ts
404*bbb1b6f9SApple OSS Distributions  * Pass a uint64_t value (timestamp) of mach continuous time clock.
405*bbb1b6f9SApple OSS Distributions  *
406*bbb1b6f9SApple OSS Distributions  * @param format
407*bbb1b6f9SApple OSS Distributions  * A format string to generate a human-readable log message when the log
408*bbb1b6f9SApple OSS Distributions  * line is decoded. This string must be a constant string, not dynamically
409*bbb1b6f9SApple OSS Distributions  * generated. Supports all standard printf types.
410*bbb1b6f9SApple OSS Distributions  */
411*bbb1b6f9SApple OSS Distributions #define os_log_at_time(log, type, ts, format, ...) __extension__({                          \
412*bbb1b6f9SApple OSS Distributions     _Static_assert(__builtin_constant_p(format), "format string must be constant");         \
413*bbb1b6f9SApple OSS Distributions     __attribute__((section("__TEXT,__os_log"))) static const char _os_log_fmt[] = format;   \
414*bbb1b6f9SApple OSS Distributions     if (0) {                                                                                \
415*bbb1b6f9SApple OSS Distributions 	_os_log_verify_format_str(format, ##__VA_ARGS__);                                   \
416*bbb1b6f9SApple OSS Distributions     } else {                                                                                  \
417*bbb1b6f9SApple OSS Distributions 	_os_log_at_time(&__dso_handle, log, type, ts, _os_log_fmt, ##__VA_ARGS__);          \
418*bbb1b6f9SApple OSS Distributions     }                                                                                       \
419*bbb1b6f9SApple OSS Distributions     __asm__(""); /* avoid tailcall */                                                       \
420*bbb1b6f9SApple OSS Distributions })
421*bbb1b6f9SApple OSS Distributions 
422*bbb1b6f9SApple OSS Distributions /*!
423*bbb1b6f9SApple OSS Distributions  * @function os_log_driverKit
424*bbb1b6f9SApple OSS Distributions  *
425*bbb1b6f9SApple OSS Distributions  * @abstract
426*bbb1b6f9SApple OSS Distributions  * Log a message using a specific type. This variant should be called only from dexts.
427*bbb1b6f9SApple OSS Distributions  *
428*bbb1b6f9SApple OSS Distributions  * @discussion
429*bbb1b6f9SApple OSS Distributions  * Will log a message with the provided os_log_type_t.
430*bbb1b6f9SApple OSS Distributions  *
431*bbb1b6f9SApple OSS Distributions  * @param log
432*bbb1b6f9SApple OSS Distributions  * Pass OS_LOG_DEFAULT or a log object previously created with os_log_create.
433*bbb1b6f9SApple OSS Distributions  *
434*bbb1b6f9SApple OSS Distributions  * @param type
435*bbb1b6f9SApple OSS Distributions  * Pass a valid type from os_log_type_t.
436*bbb1b6f9SApple OSS Distributions  *
437*bbb1b6f9SApple OSS Distributions  * @param format
438*bbb1b6f9SApple OSS Distributions  * A format string to generate a human-readable log message when the log
439*bbb1b6f9SApple OSS Distributions  * line is decoded.  This string must be a constant string, not dynamically
440*bbb1b6f9SApple OSS Distributions  * generated.  Supports all standard printf types and %@ (objects).
441*bbb1b6f9SApple OSS Distributions  *
442*bbb1b6f9SApple OSS Distributions  * @result
443*bbb1b6f9SApple OSS Distributions  * Returns EPERM if the caller is not a driverKit process, 0 in case of success.
444*bbb1b6f9SApple OSS Distributions  */
445*bbb1b6f9SApple OSS Distributions #define os_log_driverKit(out, log, type, format, ...) __extension__({                            \
446*bbb1b6f9SApple OSS Distributions     _Static_assert(__builtin_constant_p(format), "format string must be constant");         \
447*bbb1b6f9SApple OSS Distributions     __attribute__((section("__TEXT,__os_log"))) static const char _os_log_fmt[] = format;   \
448*bbb1b6f9SApple OSS Distributions     if (0) {                                                                                \
449*bbb1b6f9SApple OSS Distributions 	_os_log_verify_format_str(format, ##__VA_ARGS__);                                   \
450*bbb1b6f9SApple OSS Distributions     } else {                                                                                  \
451*bbb1b6f9SApple OSS Distributions 	(*(out)) = _os_log_internal_driverKit(&__dso_handle, log, type, _os_log_fmt, ##__VA_ARGS__);                 \
452*bbb1b6f9SApple OSS Distributions     }                                                                                       \
453*bbb1b6f9SApple OSS Distributions     __asm__(""); /* avoid tailcall */                                                       \
454*bbb1b6f9SApple OSS Distributions })
455*bbb1b6f9SApple OSS Distributions 
456*bbb1b6f9SApple OSS Distributions /*!
457*bbb1b6f9SApple OSS Distributions  * @function os_log_coprocessor
458*bbb1b6f9SApple OSS Distributions  *
459*bbb1b6f9SApple OSS Distributions  * @abstract
460*bbb1b6f9SApple OSS Distributions  * IOP logging function, intended for use by RTBuddy for coprocessor os log
461*bbb1b6f9SApple OSS Distributions  * functionality only.
462*bbb1b6f9SApple OSS Distributions  */
463*bbb1b6f9SApple OSS Distributions bool
464*bbb1b6f9SApple OSS Distributions os_log_coprocessor(void *buff, uint64_t buff_len, os_log_type_t type,
465*bbb1b6f9SApple OSS Distributions     const char *uuid, uint64_t timestamp, uint32_t offset, bool stream_log);
466*bbb1b6f9SApple OSS Distributions 
467*bbb1b6f9SApple OSS Distributions /*!
468*bbb1b6f9SApple OSS Distributions  * @function os_log_coprocessor_register
469*bbb1b6f9SApple OSS Distributions  *
470*bbb1b6f9SApple OSS Distributions  * @abstract
471*bbb1b6f9SApple OSS Distributions  * IOP metadata registration, intended for use by RTBuddy for coprocessor os log
472*bbb1b6f9SApple OSS Distributions  * functionality only. Will be removed after all user code will be updated to
473*bbb1b6f9SApple OSS Distributions  * use os_log_coprocessor_register_with_type.
474*bbb1b6f9SApple OSS Distributions  */
475*bbb1b6f9SApple OSS Distributions void
476*bbb1b6f9SApple OSS Distributions os_log_coprocessor_register(const char *uuid, const char *file_path, bool copy);
477*bbb1b6f9SApple OSS Distributions 
478*bbb1b6f9SApple OSS Distributions typedef enum {
479*bbb1b6f9SApple OSS Distributions 	os_log_coproc_register_memory,
480*bbb1b6f9SApple OSS Distributions 	os_log_coproc_register_harvest_fs_ftab,
481*bbb1b6f9SApple OSS Distributions } os_log_coproc_reg_t;
482*bbb1b6f9SApple OSS Distributions 
483*bbb1b6f9SApple OSS Distributions /*!
484*bbb1b6f9SApple OSS Distributions  * @function os_log_coprocessor_register_with_type
485*bbb1b6f9SApple OSS Distributions  *
486*bbb1b6f9SApple OSS Distributions  * @abstract
487*bbb1b6f9SApple OSS Distributions  * IOP metadata registration, intended for use by RTBuddy for coprocessor os log
488*bbb1b6f9SApple OSS Distributions  * functionality only.
489*bbb1b6f9SApple OSS Distributions  */
490*bbb1b6f9SApple OSS Distributions void
491*bbb1b6f9SApple OSS Distributions os_log_coprocessor_register_with_type(const char *uuid, const char *file_path, os_log_coproc_reg_t register_type);
492*bbb1b6f9SApple OSS Distributions 
493*bbb1b6f9SApple OSS Distributions #ifdef XNU_KERNEL_PRIVATE
494*bbb1b6f9SApple OSS Distributions #define os_log_with_startup_serial_and_type(log, type, format, ...) __extension__({ \
495*bbb1b6f9SApple OSS Distributions     if (startup_serial_logging_active) { printf(format, ##__VA_ARGS__); }           \
496*bbb1b6f9SApple OSS Distributions     else { os_log_with_type(log, type, format, ##__VA_ARGS__); }                    \
497*bbb1b6f9SApple OSS Distributions })
498*bbb1b6f9SApple OSS Distributions #define os_log_with_startup_serial(log, format, ...) \
499*bbb1b6f9SApple OSS Distributions     os_log_with_startup_serial_and_type(log, OS_LOG_TYPE_DEFAULT, format, ##__VA_ARGS__)
500*bbb1b6f9SApple OSS Distributions #define os_log_info_with_startup_serial(log, format, ...) \
501*bbb1b6f9SApple OSS Distributions     os_log_with_startup_serial_and_type(log, OS_LOG_TYPE_INFO, format, ##__VA_ARGS__)
502*bbb1b6f9SApple OSS Distributions #define os_log_debug_with_startup_serial(log, format, ...) \
503*bbb1b6f9SApple OSS Distributions     os_log_with_startup_serial_and_type(log, OS_LOG_TYPE_DEBUG, format, ##__VA_ARGS__)
504*bbb1b6f9SApple OSS Distributions #define os_log_error_with_startup_serial(log, format, ...) \
505*bbb1b6f9SApple OSS Distributions     os_log_with_startup_serial_and_type(log, OS_LOG_TYPE_ERROR, format, ##__VA_ARGS__)
506*bbb1b6f9SApple OSS Distributions #define os_log_fault_with_startup_serial(log, format, ...) \
507*bbb1b6f9SApple OSS Distributions     os_log_with_startup_serial_and_type(log, OS_LOG_TYPE_FAULT, format, ##__VA_ARGS__)
508*bbb1b6f9SApple OSS Distributions #endif /* XNU_KERNEL_PRIVATE */
509*bbb1b6f9SApple OSS Distributions 
510*bbb1b6f9SApple OSS Distributions /*!
511*bbb1b6f9SApple OSS Distributions  * @function _os_log_internal
512*bbb1b6f9SApple OSS Distributions  *
513*bbb1b6f9SApple OSS Distributions  * @abstract
514*bbb1b6f9SApple OSS Distributions  * Internal function used by macros.
515*bbb1b6f9SApple OSS Distributions  */
516*bbb1b6f9SApple OSS Distributions OS_EXPORT OS_NOTHROW
517*bbb1b6f9SApple OSS Distributions void
518*bbb1b6f9SApple OSS Distributions _os_log_internal(void *dso, os_log_t log, os_log_type_t type, const char *message, ...)
519*bbb1b6f9SApple OSS Distributions __osloglike(4, 5);
520*bbb1b6f9SApple OSS Distributions 
521*bbb1b6f9SApple OSS Distributions /*!
522*bbb1b6f9SApple OSS Distributions  * @function _os_log_internal_driverKit
523*bbb1b6f9SApple OSS Distributions  *
524*bbb1b6f9SApple OSS Distributions  * @abstract
525*bbb1b6f9SApple OSS Distributions  * Internal function used by macros.
526*bbb1b6f9SApple OSS Distributions  */
527*bbb1b6f9SApple OSS Distributions OS_EXPORT OS_NOTHROW
528*bbb1b6f9SApple OSS Distributions int
529*bbb1b6f9SApple OSS Distributions _os_log_internal_driverKit(void *dso, os_log_t log, os_log_type_t type, const char *message, ...)
530*bbb1b6f9SApple OSS Distributions __osloglike(4, 5);
531*bbb1b6f9SApple OSS Distributions 
532*bbb1b6f9SApple OSS Distributions /*!
533*bbb1b6f9SApple OSS Distributions  * @function _os_log_internal_props
534*bbb1b6f9SApple OSS Distributions  *
535*bbb1b6f9SApple OSS Distributions  * @abstract
536*bbb1b6f9SApple OSS Distributions  * Internal function used by macros.
537*bbb1b6f9SApple OSS Distributions  */
538*bbb1b6f9SApple OSS Distributions OS_EXPORT OS_NOTHROW
539*bbb1b6f9SApple OSS Distributions void
540*bbb1b6f9SApple OSS Distributions _os_log_at_time(void *dso, os_log_t log, os_log_type_t type, uint64_t ts, const char *message, ...)
541*bbb1b6f9SApple OSS Distributions __osloglike(5, 6);
542*bbb1b6f9SApple OSS Distributions 
543*bbb1b6f9SApple OSS Distributions __END_DECLS
544*bbb1b6f9SApple OSS Distributions 
545*bbb1b6f9SApple OSS Distributions #endif /* __os_log_h */
546