1/*
2 * Copyright (c) 2015-2016 Apple Inc. All rights reserved.
3 *
4 * @APPLE_APACHE_LICENSE_HEADER_START@
5 *
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 *
18 * @APPLE_APACHE_LICENSE_HEADER_END@
19 */
20
21#ifndef __FIREHOSE_TYPES_PRIVATE__
22#define __FIREHOSE_TYPES_PRIVATE__
23
24#include <mach/mach_types.h>
25#include <mach/std_types.h>
26#include <os/base.h>
27
28OS_ASSUME_NONNULL_BEGIN
29
30__BEGIN_DECLS
31
32/*!
33 * @enum firehose_activity_flags_t
34 *
35 * @discussion
36 * The lower 8 bits are or-ed in the upper 8 bits of Activity ID and propagated
37 * to children activities
38 */
39OS_OPTIONS(firehose_activity_flags, unsigned long,
40 firehose_activity_flags_default = 0x0000,
41
42 firehose_activity_flags_info_mode = 0x0001,
43 firehose_activity_flags_debug_mode = 0x0002,
44 firehose_activity_flags_stream_live_mode = 0x0004,
45
46 firehose_activity_flags_precise_timestamp = 0x0080,
47 );
48
49/*!
50 * @typedef firehose_activity_id_t
51 *
52 * @abstract
53 * Opaque activity identifier.
54 *
55 * @discussion
56 * Scalar value type, not reference counted.
57 */
58typedef uint64_t firehose_activity_id_t;
59#define FIREHOSE_ACTIVITY_ID_NULL ((firehose_activity_id_t)0)
60#define FIREHOSE_ACTIVITY_ID_INVALID ((firehose_activity_id_t)~0ULL)
61#define FIREHOSE_ACTIVITY_ID_FLAGS_SHIFT 56
62#define FIREHOSE_ACTIVITY_ID_FLAGS(aid) \
63 ((firehose_activity_flags_t)((aid) >> FIREHOSE_ACTIVITY_ID_FLAGS_SHIFT))
64#define FIREHOSE_ACTIVITY_ID_MERGE_FLAGS(aid, flags) (\
65 ((firehose_activity_id_t)(aid)) | \
66 ((firehose_activity_id_t)(flags) << FIREHOSE_ACTIVITY_ID_FLAGS_SHIFT))
67
68/*!
69 * @enum firehose_stream_t
70 */
71OS_ENUM(firehose_stream, uint8_t,
72 firehose_stream_persist = 0,
73 firehose_stream_special = 1,
74 firehose_stream_memory = 2,
75 firehose_stream_metadata = 3,
76 firehose_stream_signpost = 4,
77 firehose_stream_memory_wifi = 5,
78 firehose_stream_memory_baseband = 6,
79
80 _firehose_stream_max,
81 _firehose_stream_disabled = (uint8_t)-1,
82 );
83
84/*!
85 * @enum firehose_tracepoint_namespace_t
86 *
87 * @abstract
88 * Namespaces of tracepoints.
89 */
90OS_ENUM(firehose_tracepoint_namespace, uint8_t,
91 firehose_tracepoint_namespace_activity = 0x02,
92 firehose_tracepoint_namespace_trace = 0x03,
93 firehose_tracepoint_namespace_log = 0x04,
94 firehose_tracepoint_namespace_metadata = 0x05,
95 firehose_tracepoint_namespace_signpost = 0x06,
96 firehose_tracepoint_namespace_loss = 0x07,
97 );
98
99/*!
100 * @enum firehose_tracepoint_code_t
101 *
102 * @abstract
103 * Codes of tracepoints.
104 */
105OS_ENUM(firehose_tracepoint_code, uint32_t,
106 firehose_tracepoint_code_invalid = 0x00,
107 firehose_tracepoint_code_load = 0x01,
108 firehose_tracepoint_code_unload = 0x02,
109 firehose_tracepoint_code_load_memory = 0x08,
110 firehose_tracepoint_code_load_filesystem_ftab = 0x10,
111 );
112
113/*!
114 * @typedef firehose_tracepoint_type_t
115 *
116 * @abstract
117 * Type of tracepoints.
118 */
119typedef uint8_t firehose_tracepoint_type_t;
120
121/*!
122 * @typedef firehose_tracepoint_flags_t
123 *
124 * @abstract
125 * Flags for tracepoints.
126 */
127OS_OPTIONS(firehose_tracepoint_flags, uint16_t,
128 _firehose_tracepoint_flags_base_has_current_aid = 0x0001,
129#define _firehose_tracepoint_flags_pc_style_mask (0x0007 << 1)
130 _firehose_tracepoint_flags_pc_style_none = 0x0000 << 1,
131 _firehose_tracepoint_flags_pc_style_main_exe = 0x0001 << 1,
132 _firehose_tracepoint_flags_pc_style_shared_cache = 0x0002 << 1,
133 _firehose_tracepoint_flags_pc_style_main_plugin = 0x0003 << 1,
134 _firehose_tracepoint_flags_pc_style_absolute = 0x0004 << 1,
135 _firehose_tracepoint_flags_pc_style_uuid_relative = 0x0005 << 1,
136 _firehose_tracepoint_flags_pc_style_large_shared_cache = 0x0006 << 1,
137 _firehose_tracepoint_flags_pc_style__unused7 = 0x0007 << 1,
138 _firehose_tracepoint_flags_base_has_unique_pid = 0x0010,
139 _firehose_tracepoint_flags_base_has_large_offset = 0x0020,
140 );
141
142/*
143 * Same as _OS_TRACE_DYNAMIC_BIT defined in libtrace/tracepoint_internal.h.
144 * This bit is used by logd to know how to evaluate the format
145 * string.
146 * If it is set, logd assumes that the format is "%s" and the content of the
147 * whole string is passed with the firehose_tracepoint.
148 * Otherwise it tries to find the unformatted string within the text
149 * section of the executable and expects only the content of the variables
150 * on the firehose_tracepoint.
151 */
152#define FIREHOSE_TRACEPOINT_PC_DYNAMIC_BIT 0x80000000
153
154/*
155 * Same as KERNEL_MASK defined in logd/logd_main.c
156 * It is used by logd to mask the pc before calling
157 * OSKextCopyUUIDForAddress.
158 */
159#define FIREHOSE_TRACEPOINT_PC_KERNEL_MASK 0xffff000000000000
160
161/*!
162 * @typedef firehose_tracepoint_id_t
163 *
164 * @abstract
165 * Opaque tracepoint identifier.
166 */
167typedef uint64_t firehose_tracepoint_id_t;
168
169/*!
170 * @enum _firehose_tracepoint_type_activity_t
171 *
172 * @abstract
173 * Types of Activity tracepoints (namespace activity).
174 */
175OS_ENUM(_firehose_tracepoint_type_activity, firehose_tracepoint_type_t,
176 _firehose_tracepoint_type_activity_create = 0x01,
177 _firehose_tracepoint_type_activity_swap = 0x02,
178 _firehose_tracepoint_type_activity_useraction = 0x03,
179 );
180
181/*!
182 * @enum firehose_tracepoint_flags_activity_t
183 *
184 * @abstract
185 * Flags for Activity tracepoints (namespace activity).
186 */
187OS_OPTIONS(_firehose_tracepoint_flags_activity, uint16_t,
188 _firehose_tracepoint_flags_activity_user_interface = 0x0100,
189 _firehose_tracepoint_flags_activity_has_other_aid = 0x0200,
190 );
191
192/*!
193 * @enum firehose_tracepoint_type_trace_t
194 *
195 * @abstract
196 * Types of trace tracepoints (namespace trace).
197 */
198OS_ENUM(_firehose_tracepoint_type_trace, firehose_tracepoint_type_t,
199 _firehose_tracepoint_type_trace_default = 0x00,
200 _firehose_tracepoint_type_trace_info = 0x01,
201 _firehose_tracepoint_type_trace_debug = 0x02,
202 _firehose_tracepoint_type_trace_error = 0x10,
203 _firehose_tracepoint_type_trace_fault = 0x11,
204 );
205
206/*!
207 * @enum firehose_tracepoint_type_log_t
208 *
209 * @abstract
210 * Types of Log tracepoints (namespace log).
211 */
212OS_ENUM(_firehose_tracepoint_type_log, firehose_tracepoint_type_t,
213 _firehose_tracepoint_type_log_default = 0x00,
214 _firehose_tracepoint_type_log_info = 0x01,
215 _firehose_tracepoint_type_log_debug = 0x02,
216 _firehose_tracepoint_type_log_error = 0x10,
217 _firehose_tracepoint_type_log_fault = 0x11,
218 );
219
220/*!
221 * @enum firehose_tracepoint_flags_log_t
222 *
223 * @abstract
224 * Flags for Log tracepoints (namespace log).
225 */
226OS_OPTIONS(_firehose_tracepoint_flags_log, uint16_t,
227 _firehose_tracepoint_flags_log_has_private_data = 0x0100,
228 _firehose_tracepoint_flags_log_has_subsystem = 0x0200,
229 _firehose_tracepoint_flags_log_has_rules = 0x0400,
230 _firehose_tracepoint_flags_log_has_oversize = 0x0800,
231 _firehose_tracepoint_flags_log_has_context_data = 0x1000,
232 );
233
234/*!
235 * @enum _firehose_tracepoint_type_metadata_t
236 *
237 * @abstract
238 * Types for metadata tracepoints (namespace metadata).
239 */
240OS_ENUM(_firehose_tracepoint_type_metadata, firehose_tracepoint_type_t,
241 _firehose_tracepoint_type_metadata_dyld = 0x01,
242 _firehose_tracepoint_type_metadata_subsystem = 0x02,
243 _firehose_tracepoint_type_metadata_kext = 0x03,
244 _firehose_tracepoint_type_metadata_coprocessor = 0x04,
245 );
246
247/*!
248 * @enum firehose_tracepoint_type_signpost_t
249 *
250 * @abstract
251 * Types of Log tracepoints (namespace signpost).
252 */
253OS_ENUM(_firehose_tracepoint_type_signpost, firehose_tracepoint_type_t,
254 _firehose_tracepoint_type_signpost_event = 0x00,
255 _firehose_tracepoint_type_signpost_interval_begin = 0x01,
256 _firehose_tracepoint_type_signpost_interval_end = 0x02,
257
258 _firehose_tracepoint_type_signpost_scope_mask = 0xc0,
259 _firehose_tracepoint_type_signpost_scope_thread = 0x40,
260 _firehose_tracepoint_type_signpost_scope_process = 0x80,
261 _firehose_tracepoint_type_signpost_scope_system = 0xc0,
262 );
263
264/*!
265 * @enum firehose_tracepoint_flags_signpost_t
266 *
267 * @abstract
268 * Flags for Log tracepoints (namespace signpost).
269 *
270 * When flags are shared with the log type, they should have the same values.
271 */
272OS_OPTIONS(_firehose_tracepoint_flags_signpost, uint16_t,
273 // shared with log
274 _firehose_tracepoint_flags_signpost_has_private_data = 0x0100,
275 _firehose_tracepoint_flags_signpost_has_subsystem = 0x0200,
276 _firehose_tracepoint_flags_signpost_has_rules = 0x0400,
277 _firehose_tracepoint_flags_signpost_has_oversize = 0x0800,
278 _firehose_tracepoint_flags_signpost_has_context_data = 0x1000,
279
280 // specific to signpost
281 _firehose_tracepoint_flags_signpost_has_name = 0x8000,
282 );
283
284/* MIG firehose push reply structure */
285typedef struct firehose_push_reply_s {
286 uint64_t fpr_mem_flushed_pos;
287 uint64_t fpr_io_flushed_pos;
288} firehose_push_reply_t;
289
290typedef struct firehose_buffer_map_info_s {
291 mach_vm_address_t fbmi_addr;
292 mach_vm_size_t fbmi_size;
293} firehose_buffer_map_info_t;
294
295#define FIREHOSE_PUSH_REPLY_CORRUPTED ((firehose_push_reply_t){ ~0ULL, ~0ULL })
296
297typedef union firehose_buffer_u *firehose_buffer_t;
298
299__END_DECLS
300
301 OS_ASSUME_NONNULL_END
302
303#endif // __FIREHOSE_TYPES_PRIVATE__
304