1 /* 2 * Copyright (c) 2023 Apple Computer, 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 29 #ifndef _VM_SANITIZE_TELEMETRY_H_ 30 #define _VM_SANITIZE_TELEMETRY_H_ 31 32 #include <stdint.h> 33 #include <sys/kdebug_triage.h> 34 35 #pragma mark Methods 36 37 /* 38 * When adopting telemetry in a new method, add an enum for it here, at the 39 * bottom. 40 * DO NOT change the existing order or positions, we expect current values to 41 * stay the same. 42 */ 43 __enum_closed_decl(vm_sanitize_method_t, uint64_t, { 44 VM_SANITIZE_METHOD_MACH_MAKE_MEMORY_ENTRY = 1, 45 VM_SANITIZE_METHOD_MACH_MEMORY_ENTRY_PAGE_OP, 46 VM_SANITIZE_METHOD_MACH_MEMORY_ENTRY_RANGE_OP, 47 VM_SANITIZE_METHOD_MACH_MEMORY_ENTRY_MAP_SIZE, 48 VM_SANITIZE_METHOD_MACH_MEMORY_OBJECT_MEMORY_ENTRY, 49 VM_SANITIZE_METHOD_VM_ALLOCATE_FIXED, 50 VM_SANITIZE_METHOD_VM_ALLOCATE_ANYWHERE, 51 VM_SANITIZE_METHOD_VM_DEALLOCATE, 52 VM_SANITIZE_METHOD_MUNMAP, 53 VM_SANITIZE_METHOD_VM_MAP_REMAP, 54 VM_SANITIZE_METHOD_MMAP, 55 VM_SANITIZE_METHOD_MAP_WITH_LINKING_NP, 56 VM_SANITIZE_METHOD_ENTER_MEM_OBJ, 57 VM_SANITIZE_METHOD_ENTER_MEM_OBJ_CTL, 58 VM_SANITIZE_METHOD_MREMAP_ENCRYPTED, 59 VM_SANITIZE_METHOD_VM_WIRE_USER, 60 VM_SANITIZE_METHOD_VM_UNWIRE_USER, 61 VM_SANITIZE_METHOD_VM_MAP_WIRE, 62 VM_SANITIZE_METHOD_VM_MAP_UNWIRE, 63 VM_SANITIZE_METHOD_VSLOCK, 64 VM_SANITIZE_METHOD_VSUNLOCK, 65 VM_SANITIZE_METHOD_VM_MAP_COPY_OVERWRITE, 66 VM_SANITIZE_METHOD_VM_MAP_COPYIN, 67 VM_SANITIZE_METHOD_VM_MAP_READ_USER, 68 VM_SANITIZE_METHOD_VM_MAP_WRITE_USER, 69 VM_SANITIZE_METHOD_MACH_VM_INHERIT, 70 VM_SANITIZE_METHOD_VM_INHERIT, 71 VM_SANITIZE_METHOD_VM32_INHERIT, 72 VM_SANITIZE_METHOD_VM_MAP_INHERIT, 73 VM_SANITIZE_METHOD_MINHERIT, 74 VM_SANITIZE_METHOD_MACH_VM_PROTECT, 75 VM_SANITIZE_METHOD_VM_PROTECT, 76 VM_SANITIZE_METHOD_VM32_PROTECT, 77 VM_SANITIZE_METHOD_VM_MAP_PROTECT, 78 VM_SANITIZE_METHOD_MPROTECT, 79 VM_SANITIZE_METHOD_USERACC, 80 VM_SANITIZE_METHOD_VM_MAP_MSYNC, 81 VM_SANITIZE_METHOD_MSYNC, 82 VM_SANITIZE_METHOD_VM_MAP_MACHINE_ATTRIBUTE, 83 VM_SANITIZE_METHOD_MINCORE, 84 VM_SANITIZE_METHOD_VM_MAP_PAGE_RANGE_INFO, 85 VM_SANITIZE_METHOD_VM_MAP_PAGE_RANGE_QUERY, 86 VM_SANITIZE_METHOD_VM_BEHAVIOR_SET, 87 VM_SANITIZE_METHOD_MADVISE, 88 VM_SANITIZE_METHOD_MACH_VM_DEFERRED_RECLAMATION_BUFFER_INIT, 89 VM_SANITIZE_METHOD_MACH_VM_RANGE_CREATE, 90 VM_SANITIZE_METHOD_SHARED_REGION_MAP_AND_SLIDE_2_NP, 91 VM_SANITIZE_METHOD_TEST, 92 }); 93 94 #pragma mark Checkers 95 96 /* 97 * When adopting telemetry in a new checker, add an enum for it here, at the 98 * bottom. 99 * DO NOT change the existing order or positions, we expect current values to 100 * stay the same. 101 */ 102 __enum_closed_decl(vm_sanitize_checker_t, uint64_t, { 103 VM_SANITIZE_CHECKER_ADDR_SIZE = 1, /* arg1=addr, arg2=size, arg3=pgmask */ 104 VM_SANITIZE_CHECKER_PROT_CUR_MAX, /* arg1=cur_prot, arg2=max_prot, arg3=extra_mask */ 105 }); 106 107 /* 108 * Add any new values at the bottom. 109 * DO NOT change the existing order or positions, we expect current values to 110 * stay the same. 111 */ 112 __enum_closed_decl(vm_sanitize_checker_count_t, uint64_t, { 113 VM_SANITIZE_CHECKER_COUNT_1 = 1, 114 VM_SANITIZE_CHECKER_COUNT_2, 115 VM_SANITIZE_CHECKER_COUNT_3, 116 VM_SANITIZE_CHECKER_COUNT_4, 117 VM_SANITIZE_CHECKER_COUNT_5, 118 }); 119 120 #pragma mark KTriage enums 121 122 enum vm_sanitize_subsys_error_codes { 123 KDBG_TRIAGE_VM_SANITIZE_PREFIX = 0, 124 125 // value 0 is also used for skipping ktriage 126 KDBG_TRIAGE_VM_SANITIZE_SKIP = KDBG_TRIAGE_VM_SANITIZE_PREFIX, 127 128 KDBG_TRIAGE_VM_SANITIZE_MACH_MAKE_MEMORY_ENTRY = 1, 129 KDBG_TRIAGE_VM_SANITIZE_MACH_MEMORY_ENTRY_PAGE_OP, 130 KDBG_TRIAGE_VM_SANITIZE_MACH_MEMORY_ENTRY_RANGE_OP, 131 KDBG_TRIAGE_VM_SANITIZE_MACH_MEMORY_ENTRY_MAP_SIZE, 132 KDBG_TRIAGE_VM_SANITIZE_MACH_MEMORY_OBJECT_MEMORY_ENTRY, 133 KDBG_TRIAGE_VM_SANITIZE_VM_ALLOCATE_FIXED, 134 KDBG_TRIAGE_VM_SANITIZE_VM_ALLOCATE_ANYWHERE, 135 KDBG_TRIAGE_VM_SANITIZE_VM_DEALLOCATE, 136 KDBG_TRIAGE_VM_SANITIZE_MUNMAP, 137 KDBG_TRIAGE_VM_SANITIZE_VM_MAP_REMAP, 138 KDBG_TRIAGE_VM_SANITIZE_MMAP, 139 KDBG_TRIAGE_VM_SANITIZE_MAP_WITH_LINKING_NP, 140 KDBG_TRIAGE_VM_SANITIZE_ENTER_MEM_OBJ, 141 KDBG_TRIAGE_VM_SANITIZE_ENTER_MEM_OBJ_CTL, 142 KDBG_TRIAGE_VM_SANITIZE_MREMAP_ENCRYPTED, 143 KDBG_TRIAGE_VM_SANITIZE_VM_WIRE_USER, 144 KDBG_TRIAGE_VM_SANITIZE_VM_UNWIRE_USER, 145 KDBG_TRIAGE_VM_SANITIZE_VM_MAP_WIRE, 146 KDBG_TRIAGE_VM_SANITIZE_VM_MAP_UNWIRE, 147 KDBG_TRIAGE_VM_SANITIZE_VSLOCK, 148 KDBG_TRIAGE_VM_SANITIZE_VSUNLOCK, 149 KDBG_TRIAGE_VM_SANITIZE_VM_MAP_COPY_OVERWRITE, 150 KDBG_TRIAGE_VM_SANITIZE_VM_MAP_COPYIN, 151 KDBG_TRIAGE_VM_SANITIZE_VM_MAP_READ_USER, 152 KDBG_TRIAGE_VM_SANITIZE_VM_MAP_WRITE_USER, 153 KDBG_TRIAGE_VM_SANITIZE_MACH_VM_INHERIT, 154 KDBG_TRIAGE_VM_SANITIZE_VM_INHERIT, 155 KDBG_TRIAGE_VM_SANITIZE_VM32_INHERIT, 156 KDBG_TRIAGE_VM_SANITIZE_VM_MAP_INHERIT, 157 KDBG_TRIAGE_VM_SANITIZE_MINHERIT, 158 KDBG_TRIAGE_VM_SANITIZE_MACH_VM_PROTECT, 159 KDBG_TRIAGE_VM_SANITIZE_VM_PROTECT, 160 KDBG_TRIAGE_VM_SANITIZE_VM32_PROTECT, 161 KDBG_TRIAGE_VM_SANITIZE_VM_MAP_PROTECT, 162 KDBG_TRIAGE_VM_SANITIZE_MPROTECT, 163 KDBG_TRIAGE_VM_SANITIZE_USERACC, 164 KDBG_TRIAGE_VM_SANITIZE_VM_MAP_MSYNC, 165 KDBG_TRIAGE_VM_SANITIZE_MSYNC, 166 KDBG_TRIAGE_VM_SANITIZE_VM_MAP_MACHINE_ATTRIBUTE, 167 KDBG_TRIAGE_VM_SANITIZE_MINCORE, 168 KDBG_TRIAGE_VM_SANITIZE_VM_MAP_PAGE_RANGE_INFO, 169 KDBG_TRIAGE_VM_SANITIZE_VM_MAP_PAGE_RANGE_QUERY, 170 KDBG_TRIAGE_VM_SANITIZE_VM_BEHAVIOR_SET, 171 KDBG_TRIAGE_VM_SANITIZE_MADVISE, 172 KDBG_TRIAGE_VM_SANITIZE_MACH_VM_DEFERRED_RECLAMATION_BUFFER_INIT, 173 KDBG_TRIAGE_VM_SANITIZE_MACH_VM_RANGE_CREATE, 174 KDBG_TRIAGE_VM_SANITIZE_SHARED_REGION_MAP_AND_SLIDE_2_NP, 175 KDBG_TRIAGE_VM_SANITIZE_TEST, 176 177 KDBG_TRIAGE_VM_SANITIZE_MAX 178 }; 179 #define VM_SANITIZE_MAX_TRIAGE_STRINGS (KDBG_TRIAGE_VM_SANITIZE_MAX) 180 181 #pragma mark Telemetry API 182 183 /*! 184 * @function vm_sanitize_send_telemetry 185 * @abstract Send telemetry using CoreAnalytics when a VM API function returns 186 * a return code affected by the VM API Hygiene work. 187 * @param method An instance of the method enums above, indicating which VM 188 * API method is returning the error. 189 * @param checker An instance of the checker enums above, indicating which VM 190 * checker/sanitizer caused the error. 191 * @param checker_count An instance of the checker count enums above. Used to 192 * distinguish in cases where the same checker can be called multiple times by 193 * the same function. 194 * @param ktriage_code The enum to be used for ktriage. Pass 0 to skip ktriage. 195 * @param arg1 First argument. Interpretation depends on checker. 196 * @param arg2 Second argument. Interpretation depends on checker. 197 * @param arg3 Third argument. Interpretation depends on checker. 198 * @param arg4 Fourth argument. Interpretation depends on checker. 199 * @param future_ret The error code that will be returned long term when this 200 * checker fails with this method. 201 * @param past_ret The error code that would have been returned in the same 202 * circumstances before the VM API Hygiene work. 203 * 204 * @note There is no \p current_ret argument, and what the method is returning 205 * today should be passed as \p future_ret or \p past_ret as appropriate. 206 */ 207 void vm_sanitize_send_telemetry( 208 vm_sanitize_method_t method, 209 vm_sanitize_checker_t checker, 210 vm_sanitize_checker_count_t checker_count, 211 enum vm_sanitize_subsys_error_codes ktriage_code, 212 uint64_t arg1, 213 uint64_t arg2, 214 uint64_t arg3, 215 uint64_t arg4, 216 uint64_t future_ret, 217 uint64_t past_ret); 218 219 #endif /* _VM_SANITIZE_TELEMETRY_H_ */ 220