]> git.saurik.com Git - apple/xnu.git/blame - libkern/firehose/tracepoint_private.h
xnu-3789.1.32.tar.gz
[apple/xnu.git] / libkern / firehose / tracepoint_private.h
CommitLineData
39037602
A
1/*
2 * Copyright (c) 2013-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_ACTIVITY__
22#define __FIREHOSE_ACTIVITY__
23
24#include <machine/cpu_capabilities.h>
25#include <mach/mach_time.h>
26#include <os/base.h>
27#if KERNEL
28#include <atm/atm_internal.h>
29#endif
30#include "firehose_types_private.h"
31
32OS_ASSUME_NONNULL_BEGIN
33
34/*!
35 * @typedef firehose_tracepoint_id_u
36 *
37 * @abstract
38 * Broken down tracepoint identifier.
39 */
40typedef union {
41 struct {
42 firehose_tracepoint_namespace_t _namespace;
43 firehose_tracepoint_type_t _type;
44 firehose_tracepoint_flags_t _flags;
45 uint32_t _code;
46 } ftid;
47 firehose_tracepoint_id_t ftid_value;
48} firehose_tracepoint_id_u;
49
50#define FIREHOSE_STAMP_SLOP (1ULL << 36) // ~1minute
51
52/*!
53 * @typedef firehose_trace_uuid_info_t
54 *
55 * @abstract
56 * Info needed by logd when kexts are loaded or unloaded
57 *
58 */
59typedef struct firehose_trace_uuid_info_s {
60 uuid_t ftui_uuid; /* uuid of binary */
61 uint64_t ftui_address; /* load address */
62 uint64_t ftui_size; /* load size */
63 char ftui_path[]; /* full path of binary - Unused in the kernel*/
64} *firehose_trace_uuid_info_t;
65
66/*!
67 * @typedef firehose_tracepoint_t
68 */
69typedef struct firehose_tracepoint_s {
70 firehose_tracepoint_id_u ft_id;
71 uint64_t ft_thread;
72 union {
73 struct {
74 uint64_t ft_timestamp_delta : 48;
75 uint64_t ft_length : 16;
76 };
77 uint64_t ft_stamp_and_length;
78 };
79 uint8_t ft_data[];
80} *firehose_tracepoint_t;
81
82#define FIREHOSE_TRACE_ID_MAKE(ns, type, flags, code) \
83 (((firehose_tracepoint_id_u){ .ftid = { \
84 ._namespace = ns, \
85 ._type = type, \
86 ._flags = flags, \
87 ._code = code, \
88 } }).ftid_value)
89
90#define FIREHOSE_TRACE_ID_SET_NS(tid, ns) \
91 ((tid).ftid._namespace = firehose_tracepoint_namespace_##ns)
92
93#define FIREHOSE_TRACE_ID_SET_TYPE(tid, ns, type) \
94 ((tid).ftid._type = _firehose_tracepoint_type_##ns##_##type)
95
96#define FIREHOSE_TRACE_ID_HAS_FLAG(tid, ns, flag) \
97 ((tid).ftid._flags & _firehose_tracepoint_flags_##ns##_##flag)
98#define FIREHOSE_TRACE_ID_SET_FLAG(tid, ns, flag) \
99 ((void)((tid).ftid._flags |= _firehose_tracepoint_flags_##ns##_##flag))
100#define FIREHOSE_TRACE_ID_CLEAR_FLAG(tid, ns, flag) \
101 ((void)((tid).ftid._flags &= ~_firehose_tracepoint_flags_##ns##_##flag))
102
103#define FIREHOSE_TRACE_ID_SET_CODE(tid, code) \
104 ((tid).ftid._code = code)
105
106__BEGIN_DECLS
107
108#if __has_feature(address_sanitizer)
109__attribute__((no_sanitize("address")))
110#endif
111__OSX_AVAILABLE(10.12) __IOS_AVAILABLE(10.0)
112__TVOS_AVAILABLE(10.0) __WATCHOS_AVAILABLE(3.0)
113OS_ALWAYS_INLINE
114static inline bool
115firehose_precise_timestamps_enabled(void)
116{
117#if KERNEL
118 return (atm_get_diagnostic_config() & 0x80) == 0;
119#else
120 return (*((volatile uint32_t *)_COMM_PAGE_ATM_DIAGNOSTIC_CONFIG) & 0x80) == 0;
121#endif
122}
123
124#if __has_feature(address_sanitizer)
125__attribute__((no_sanitize("address")))
126#endif
127__OSX_AVAILABLE(10.12) __IOS_AVAILABLE(10.0)
128__TVOS_AVAILABLE(10.0) __WATCHOS_AVAILABLE(3.0)
129OS_ALWAYS_INLINE
130static inline uint64_t
131firehose_tracepoint_time(firehose_activity_flags_t flags)
132{
133 if (firehose_precise_timestamps_enabled() ||
134 (flags & firehose_activity_flags_precise_timestamp)) {
135 return mach_continuous_time();
136 } else {
137 return mach_continuous_approximate_time();
138 }
139}
140
141#ifdef KERNEL
142__OSX_AVAILABLE(10.12) __IOS_AVAILABLE(10.0)
143__TVOS_AVAILABLE(10.0) __WATCHOS_AVAILABLE(3.0)
144void
145firehose_trace_metadata(firehose_stream_t stream, firehose_tracepoint_id_u ftid,
146 uint64_t stamp, const void* pubdata, size_t publen);
147#endif
148__END_DECLS
149
150OS_ASSUME_NONNULL_END
151
152#endif // __FIREHOSE_FIREHOSE__