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