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