xref: /xnu-12377.41.6/osfmk/vm/vm_sanitize_telemetry.h (revision bbb1b6f9e71b8cdde6e5cd6f4841f207dee3d828)
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