1 /* 2 * Copyright (c) 2020 Apple Inc. All rights reserved. 3 * 4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. The rights granted to you under the License 10 * may not be used to create, or enable the creation or redistribution of, 11 * unlawful or unlicensed copies of an Apple operating system, or to 12 * circumvent, violate, or enable the circumvention or violation of, any 13 * terms of an Apple operating system software license agreement. 14 * 15 * Please obtain a copy of the License at 16 * http://www.opensource.apple.com/apsl/ and read it before using this file. 17 * 18 * The Original Code and all software distributed under the License are 19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 23 * Please see the License for the specific language governing rights and 24 * limitations under the License. 25 * 26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27 */ 28 #ifdef XNU_KERNEL_PRIVATE 29 #ifndef _COREANALYTICS_H 30 31 /* 32 * Internal macros used by coreanalytics code. 33 * Kept in a separate header file to keep the interface file cleaner. 34 * DO NOT USE DIRECTLY. 35 */ 36 #include <kern/mpsc_queue.h> 37 #include <kern/zalloc.h> 38 39 /* 40 * Macros to perform a foreach loop over variadic macro arguments. 41 * Calls a different macro for even (fe) and odd (fo) arguments. 42 */ 43 44 /* Return the 70th argument */ 45 #define _CA_NTH(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, \ 46 _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, \ 47 _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, \ 48 _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, \ 49 _60, _61, _62, _63, _64, _65, _66, _67, _68, _69, _70, N, ...) N 50 51 #define _CA_NULL_TERMINATOR "\0" 52 #define _CA_NULL_EPSILON 53 54 #define _f0(f, ...) 55 #define _f1(fe, e, fo, x, ...) fo(x) 56 #define _f2(fe, e, fo, x, ...) fe(x) e _f1(fe, e, fo, __VA_ARGS__) 57 #define _f3(fe, e, fo, x, ...) fo(x) e _f2(fe, e, fo, __VA_ARGS__) 58 #define _f4(fe, e, fo, x, ...) fe(x) e _f3(fe, e, fo, __VA_ARGS__) 59 #define _f5(fe, e, fo, x, ...) fo(x) e _f4(fe, e, fo, __VA_ARGS__) 60 #define _f6(fe, e, fo, x, ...) fe(x) e _f5(fe, e, fo, __VA_ARGS__) 61 #define _f7(fe, e, fo, x, ...) fo(x) e _f6(fe, e, fo, __VA_ARGS__) 62 #define _f8(fe, e, fo, x, ...) fe(x) e _f7(fe, e, fo, __VA_ARGS__) 63 #define _f9(fe, e, fo, x, ...) fo(x) e _f8(fe, e, fo, __VA_ARGS__) 64 #define _f10(fe, e, fo, x, ...) fe(x) e _f9(fe, e, fo, __VA_ARGS__) 65 #define _f11(fe, e, fo, x, ...) fo(x) e _f10(fe, e, fo, __VA_ARGS__) 66 #define _f12(fe, e, fo, x, ...) fe(x) e _f11(fe, e, fo, __VA_ARGS__) 67 #define _f13(fe, e, fo, x, ...) fo(x) e _f12(fe, e, fo, __VA_ARGS__) 68 #define _f14(fe, e, fo, x, ...) fe(x) e _f13(fe, e, fo, __VA_ARGS__) 69 #define _f15(fe, e, fo, x, ...) fo(x) e _f14(fe, e, fo, __VA_ARGS__) 70 #define _f16(fe, e, fo, x, ...) fe(x) e _f15(fe, e, fo, __VA_ARGS__) 71 #define _f17(fe, e, fo, x, ...) fo(x) e _f16(fe, e, fo, __VA_ARGS__) 72 #define _f18(fe, e, fo, x, ...) fe(x) e _f17(fe, e, fo, __VA_ARGS__) 73 #define _f19(fe, e, fo, x, ...) fo(x) e _f18(fe, e, fo, __VA_ARGS__) 74 #define _f20(fe, e, fo, x, ...) fe(x) e _f19(fe, e, fo, __VA_ARGS__) 75 #define _f21(fe, e, fo, x, ...) fo(x) e _f20(fe, e, fo, __VA_ARGS__) 76 #define _f22(fe, e, fo, x, ...) fe(x) e _f21(fe, e, fo, __VA_ARGS__) 77 #define _f23(fe, e, fo, x, ...) fo(x) e _f22(fe, e, fo, __VA_ARGS__) 78 #define _f24(fe, e, fo, x, ...) fe(x) e _f23(fe, e, fo, __VA_ARGS__) 79 #define _f25(fe, e, fo, x, ...) fo(x) e _f24(fe, e, fo, __VA_ARGS__) 80 #define _f26(fe, e, fo, x, ...) fe(x) e _f25(fe, e, fo, __VA_ARGS__) 81 #define _f27(fe, e, fo, x, ...) fo(x) e _f26(fe, e, fo, __VA_ARGS__) 82 #define _f28(fe, e, fo, x, ...) fe(x) e _f27(fe, e, fo, __VA_ARGS__) 83 #define _f29(fe, e, fo, x, ...) fo(x) e _f28(fe, e, fo, __VA_ARGS__) 84 #define _f30(fe, e, fo, x, ...) fe(x) e _f29(fe, e, fo, __VA_ARGS__) 85 #define _f31(fe, e, fo, x, ...) fo(x) e _f30(fe, e, fo, __VA_ARGS__) 86 #define _f32(fe, e, fo, x, ...) fe(x) e _f31(fe, e, fo, __VA_ARGS__) 87 #define _f33(fe, e, fo, x, ...) fo(x) e _f32(fe, e, fo, __VA_ARGS__) 88 #define _f34(fe, e, fo, x, ...) fe(x) e _f33(fe, e, fo, __VA_ARGS__) 89 #define _f35(fe, e, fo, x, ...) fo(x) e _f34(fe, e, fo, __VA_ARGS__) 90 #define _f36(fe, e, fo, x, ...) fe(x) e _f35(fe, e, fo, __VA_ARGS__) 91 #define _f37(fe, e, fo, x, ...) fo(x) e _f36(fe, e, fo, __VA_ARGS__) 92 #define _f38(fe, e, fo, x, ...) fe(x) e _f37(fe, e, fo, __VA_ARGS__) 93 #define _f39(fe, e, fo, x, ...) fo(x) e _f38(fe, e, fo, __VA_ARGS__) 94 #define _f40(fe, e, fo, x, ...) fe(x) e _f39(fe, e, fo, __VA_ARGS__) 95 #define _f41(fe, e, fo, x, ...) fo(x) e _f40(fe, e, fo, __VA_ARGS__) 96 #define _f42(fe, e, fo, x, ...) fe(x) e _f41(fe, e, fo, __VA_ARGS__) 97 #define _f43(fe, e, fo, x, ...) fo(x) e _f42(fe, e, fo, __VA_ARGS__) 98 #define _f44(fe, e, fo, x, ...) fe(x) e _f43(fe, e, fo, __VA_ARGS__) 99 #define _f45(fe, e, fo, x, ...) fo(x) e _f44(fe, e, fo, __VA_ARGS__) 100 #define _f46(fe, e, fo, x, ...) fe(x) e _f45(fe, e, fo, __VA_ARGS__) 101 #define _f47(fe, e, fo, x, ...) fo(x) e _f46(fe, e, fo, __VA_ARGS__) 102 #define _f48(fe, e, fo, x, ...) fe(x) e _f47(fe, e, fo, __VA_ARGS__) 103 #define _f49(fe, e, fo, x, ...) fo(x) e _f48(fe, e, fo, __VA_ARGS__) 104 #define _f50(fe, e, fo, x, ...) fe(x) e _f49(fe, e, fo, __VA_ARGS__) 105 #define _f51(fe, e, fo, x, ...) fo(x) e _f50(fe, e, fo, __VA_ARGS__) 106 #define _f52(fe, e, fo, x, ...) fe(x) e _f51(fe, e, fo, __VA_ARGS__) 107 #define _f53(fe, e, fo, x, ...) fo(x) e _f52(fe, e, fo, __VA_ARGS__) 108 #define _f54(fe, e, fo, x, ...) fe(x) e _f53(fe, e, fo, __VA_ARGS__) 109 #define _f55(fe, e, fo, x, ...) fo(x) e _f54(fe, e, fo, __VA_ARGS__) 110 #define _f56(fe, e, fo, x, ...) fe(x) e _f55(fe, e, fo, __VA_ARGS__) 111 #define _f57(fe, e, fo, x, ...) fo(x) e _f56(fe, e, fo, __VA_ARGS__) 112 #define _f58(fe, e, fo, x, ...) fe(x) e _f57(fe, e, fo, __VA_ARGS__) 113 #define _f59(fe, e, fo, x, ...) fo(x) e _f58(fe, e, fo, __VA_ARGS__) 114 #define _f60(fe, e, fo, x, ...) fe(x) e _f59(fe, e, fo, __VA_ARGS__) 115 #define _f61(fe, e, fo, x, ...) fo(x) e _f60(fe, e, fo, __VA_ARGS__) 116 #define _f62(fe, e, fo, x, ...) fe(x) e _f61(fe, e, fo, __VA_ARGS__) 117 #define _f63(fe, e, fo, x, ...) fo(x) e _f62(fe, e, fo, __VA_ARGS__) 118 #define _f64(fe, e, fo, x, ...) fe(x) e _f63(fe, e, fo, __VA_ARGS__) 119 #define _f65(fe, e, fo, x, ...) fo(x) e _f64(fe, e, fo, __VA_ARGS__) 120 #define _f66(fe, e, fo, x, ...) fe(x) e _f65(fe, e, fo, __VA_ARGS__) 121 #define _f67(fe, e, fo, x, ...) fo(x) e _f66(fe, e, fo, __VA_ARGS__) 122 #define _f68(fe, e, fo, x, ...) fe(x) e _f67(fe, e, fo, __VA_ARGS__) 123 #define _f69(fe, e, fo, x, ...) fo(x) e _f68(fe, e, fo, __VA_ARGS__) 124 #define _f70(fe, e, fo, x, ...) fe(x) e _f69(fe, e, fo, __VA_ARGS__) 125 126 #define _CA_FOREACH(fe, e, fo, ...) _CA_NTH(__VA_ARGS__, \ 127 _f70, _f69, _f68, _f67, _f66, _f65, _f64, _f63, _f62, _f61, \ 128 _f60, _f59, _f58, _f57, _f56, _f55, _f54, _f53, _f52, _f51, _f50, _f49, _f48, _f47, _f46, _f45, _f44, _f43, \ 129 _f42, _f41, _f40, _f39, _f38, _f37, _f36, _f35, _f34, _f33, _f32, _f31, _f30, _f29, _f28, _f27, _f26, _f25, \ 130 _f24, _f23, _f22, _f21, _f20, _f19, _f18, _f17, _f16, _f15, _f14, _f13, _f12, _f11, _f10, _f9, _f8, _f7, \ 131 _f6, _f5, _f4, _f3, _f2, _f1, _f0)(fe, e, fo, ##__VA_ARGS__) 132 133 #define _CA_TYPE_DECLARATION(T) __typeof__(T) 134 135 /* Stringify T before macro expansion. */ 136 #define _CA_STRINGIFY(T) #T 137 /* Stringify T after macro expansion. */ 138 #define _CA_STRINGIFY_EXPAND(T) _CA_STRINGIFY(T) 139 #define _CA_VARIABLE_DECLARATION(T) T; 140 141 #define _CA_EVENT_NAME_PREFIX(name) _ca_event_format_##name 142 143 #define _CA_EVENT_ORG "com.apple.xnu." 144 145 struct _ca_event { 146 struct mpsc_queue_chain link; 147 const char *format_str; 148 void *data; 149 }; 150 151 typedef struct _ca_event * ca_event_t; 152 153 /* 154 * DO NOT USE DIRECTLY. 155 * Use CA_EVENT_SEND instead. 156 */ 157 extern void core_analytics_send_event(ca_event_t event); 158 /* 159 * DO NOT USE DIRECTLY. 160 * Use CA_EVENT_SEND_PREEMPTION_DISABLED instead. 161 */ 162 extern void core_analytics_send_event_preemption_disabled(ca_event_t event); 163 /* 164 * DO NOT USE DIRECTLY. 165 * Use CA_EVENT_ALLOCATE instead. 166 */ 167 extern ca_event_t core_analytics_allocate_event(size_t data_size, const char *format_str, zalloc_flags_t flags); 168 /* 169 * Placeholder token. 170 * Used in an event format string to indicate that this is a static string. 171 * Only the name and type of this string are important. The contents are not used. 172 */ 173 typedef char ca_sstr; 174 175 extern size_t core_analytics_event_size(const char *event_spec); 176 177 #endif /* _COREANALYTICS_H */ 178 #endif /* XNU_KERNEL_PRIVATE */ 179