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