xref: /xnu-12377.81.4/tests/vm/configurator_vm_deallocate.c (revision 043036a2b3718f7f0be807e2870f8f47d3fa0796)
1 /*
2  * Copyright (c) 2024 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 
29 /*
30  * vm/configurator_vm_deallocate.c
31  *
32  * Test vm_deallocate with many different VM states.
33  */
34 
35 #include "configurator/vm_configurator_tests.h"
36 #include "configurator/vm_configurator_helpers.h"
37 #include "exc_guard_helper.h"
38 
39 T_GLOBAL_META(
40 	T_META_NAMESPACE("xnu.vm.configurator"),
41 	T_META_RADAR_COMPONENT_NAME("xnu"),
42 	T_META_RADAR_COMPONENT_VERSION("VM"),
43 	T_META_RUN_CONCURRENTLY(true),
44 	T_META_ASROOT(true),  /* required for vm submap sysctls */
45 	T_META_ALL_VALID_ARCHS(true)
46 	);
47 
48 static bool
do_successful_vm_deallocate_guarded(mach_vm_address_t start,mach_vm_size_t size)49 do_successful_vm_deallocate_guarded(mach_vm_address_t start, mach_vm_size_t size)
50 {
51 	__block kern_return_t kr;
52 	exc_guard_helper_info_t exc_info;
53 	bool caught_exception;
54 
55 	caught_exception =
56 	    block_raised_exc_guard_of_type(GUARD_TYPE_VIRT_MEMORY, &exc_info, ^{
57 		kr = mach_vm_deallocate(mach_task_self(), start, size);
58 	});
59 
60 	if (kr != KERN_SUCCESS) {
61 		T_EXPECT_MACH_SUCCESS(kr, "mach_vm_deallocate");
62 		return false;
63 	}
64 	if (caught_exception) {
65 		T_FAIL("unexpected EXC_GUARD during mach_vm_deallocate");
66 		return false;
67 	}
68 
69 	return true;
70 }
71 
72 static bool
do_vm_deallocate_holes_guarded(mach_vm_address_t start,mach_vm_size_t size)73 do_vm_deallocate_holes_guarded(mach_vm_address_t start, mach_vm_size_t size)
74 {
75 	__block kern_return_t kr;
76 	exc_guard_helper_info_t exc_info;
77 	bool caught_exception;
78 
79 	caught_exception =
80 	    block_raised_exc_guard_of_type(GUARD_TYPE_VIRT_MEMORY, &exc_info, ^{
81 		kr = mach_vm_deallocate(mach_task_self(), start, size);
82 	});
83 
84 	/* non-fatal EXC_GUARD returns success */
85 	if (kr != KERN_SUCCESS) {
86 		T_EXPECT_MACH_SUCCESS(kr, "mach_vm_deallocate guarded");
87 		return false;
88 	}
89 	if (!caught_exception) {
90 		T_FAIL("expected EXC_GUARD during mach_vm_deallocate");
91 		return false;
92 	}
93 	if (exc_info.catch_count != 1) {
94 		T_EXPECT_EQ(exc_info.catch_count, 1, "caught exception count");
95 		return false;
96 	}
97 	if (exc_info.guard_flavor != kGUARD_EXC_DEALLOC_GAP) {
98 		T_EXPECT_EQ(exc_info.guard_flavor, kGUARD_EXC_DEALLOC_GAP, "caught exception flavor");
99 		return false;
100 	}
101 
102 	return true;
103 }
104 
105 static test_result_t
successful_vm_deallocate(checker_list_t * checker_list,mach_vm_address_t start,mach_vm_size_t size)106 successful_vm_deallocate(
107 	checker_list_t *checker_list,
108 	mach_vm_address_t start,
109 	mach_vm_size_t size)
110 {
111 	kern_return_t kr;
112 
113 	checker_perform_successful_vm_deallocate(checker_list, start, size);
114 	kr = mach_vm_deallocate(mach_task_self(), start, size);
115 	if (kr != KERN_SUCCESS) {
116 		T_EXPECT_MACH_SUCCESS(kr, "mach_vm_deallocate");
117 		return TestFailed;
118 	}
119 
120 	return verify_vm_state(checker_list, "after vm_deallocate");
121 }
122 
123 static test_result_t
successful_vm_deallocate_guarded(checker_list_t * checker_list,mach_vm_address_t start,mach_vm_size_t size)124 successful_vm_deallocate_guarded(
125 	checker_list_t *checker_list,
126 	mach_vm_address_t start,
127 	mach_vm_size_t size)
128 {
129 	checker_perform_successful_vm_deallocate(checker_list, start, size);
130 	if (!do_successful_vm_deallocate_guarded(start, size)) {
131 		return TestFailed;
132 	}
133 
134 	return verify_vm_state(checker_list, "after vm_deallocate");
135 }
136 
137 static test_result_t
vm_deallocate_holes_guarded(checker_list_t * checker_list,mach_vm_address_t start,mach_vm_size_t size)138 vm_deallocate_holes_guarded(
139 	checker_list_t *checker_list,
140 	mach_vm_address_t start,
141 	mach_vm_size_t size)
142 {
143 	checker_perform_successful_vm_deallocate(checker_list, start, size);
144 	if (!do_vm_deallocate_holes_guarded(start, size)) {
145 		return TestFailed;
146 	}
147 
148 	return verify_vm_state(checker_list, "after vm_deallocate");
149 }
150 
151 static test_result_t
vm_deallocate_permanent_entry(checker_list_t * checker_list,mach_vm_address_t start,mach_vm_size_t size)152 vm_deallocate_permanent_entry(
153 	checker_list_t *checker_list,
154 	mach_vm_address_t start,
155 	mach_vm_size_t size)
156 {
157 	kern_return_t kr;
158 
159 	checker_perform_vm_deallocate_permanent(checker_list, start, size);
160 	kr = mach_vm_deallocate(mach_task_self(), start, size);
161 	if (kr != KERN_SUCCESS) {
162 		T_EXPECT_MACH_SUCCESS(kr, "mach_vm_deallocate");
163 		return TestFailed;
164 	}
165 
166 	return verify_vm_state(checker_list, "after vm_deallocate");
167 }
168 
169 static test_result_t
vm_deallocate_permanent_before_permanent(checker_list_t * checker_list,mach_vm_address_t start,mach_vm_size_t size)170 vm_deallocate_permanent_before_permanent(
171 	checker_list_t *checker_list,
172 	mach_vm_address_t start,
173 	mach_vm_size_t size)
174 {
175 	kern_return_t kr;
176 
177 	checker_perform_vm_deallocate_permanent(checker_list, start, size / 2);
178 	checker_perform_vm_deallocate_permanent(checker_list, start + size / 2, size / 2);
179 	kr = mach_vm_deallocate(mach_task_self(), start, size);
180 	if (kr != KERN_SUCCESS) {
181 		T_EXPECT_MACH_SUCCESS(kr, "mach_vm_deallocate");
182 		return TestFailed;
183 	}
184 
185 	return verify_vm_state(checker_list, "after vm_deallocate");
186 }
187 
188 static test_result_t
vm_deallocate_permanent_before_allocation(checker_list_t * checker_list,mach_vm_address_t start,mach_vm_size_t size)189 vm_deallocate_permanent_before_allocation(
190 	checker_list_t *checker_list,
191 	mach_vm_address_t start,
192 	mach_vm_size_t size)
193 {
194 	kern_return_t kr;
195 
196 	checker_perform_vm_deallocate_permanent(checker_list, start, size / 2);
197 	checker_perform_successful_vm_deallocate(checker_list, start + size / 2, size / 2);
198 	kr = mach_vm_deallocate(mach_task_self(), start, size);
199 	if (kr != KERN_SUCCESS) {
200 		T_EXPECT_MACH_SUCCESS(kr, "mach_vm_deallocate");
201 		return TestFailed;
202 	}
203 
204 	return verify_vm_state(checker_list, "after vm_deallocate");
205 }
206 
207 static test_result_t
vm_deallocate_permanent_before_hole(checker_list_t * checker_list,mach_vm_address_t start,mach_vm_size_t size)208 vm_deallocate_permanent_before_hole(
209 	checker_list_t *checker_list,
210 	mach_vm_address_t start,
211 	mach_vm_size_t size)
212 {
213 	kern_return_t kr;
214 
215 	checker_perform_vm_deallocate_permanent(checker_list, start, size / 2);
216 	/* no changes to checkers in [start + size / 2, start + size) */
217 	kr = mach_vm_deallocate(mach_task_self(), start, size);
218 	if (kr != KERN_SUCCESS) {
219 		T_EXPECT_MACH_SUCCESS(kr, "mach_vm_deallocate");
220 		return TestFailed;
221 	}
222 
223 	return verify_vm_state(checker_list, "after vm_deallocate");
224 }
225 
226 static test_result_t
vm_deallocate_permanent_after_allocation(checker_list_t * checker_list,mach_vm_address_t start,mach_vm_size_t size)227 vm_deallocate_permanent_after_allocation(
228 	checker_list_t *checker_list,
229 	mach_vm_address_t start,
230 	mach_vm_size_t size)
231 {
232 	kern_return_t kr;
233 
234 	checker_perform_successful_vm_deallocate(checker_list, start, size / 2);
235 	checker_perform_vm_deallocate_permanent(checker_list, start + size / 2, size / 2);
236 	kr = mach_vm_deallocate(mach_task_self(), start, size);
237 	if (kr != KERN_SUCCESS) {
238 		T_EXPECT_MACH_SUCCESS(kr, "mach_vm_deallocate");
239 		return TestFailed;
240 	}
241 
242 	return verify_vm_state(checker_list, "after vm_deallocate");
243 }
244 
245 static test_result_t
vm_deallocate_permanent_after_hole(checker_list_t * checker_list,mach_vm_address_t start,mach_vm_size_t size)246 vm_deallocate_permanent_after_hole(
247 	checker_list_t *checker_list,
248 	mach_vm_address_t start,
249 	mach_vm_size_t size)
250 {
251 	kern_return_t kr;
252 
253 	/* no changes to checkers in [start, start + size / 2) */
254 	checker_perform_vm_deallocate_permanent(checker_list, start + size / 2, size / 2);
255 	kr = mach_vm_deallocate(mach_task_self(), start, size);
256 	if (kr != KERN_SUCCESS) {
257 		T_EXPECT_MACH_SUCCESS(kr, "mach_vm_deallocate");
258 		return TestFailed;
259 	}
260 
261 	return verify_vm_state(checker_list, "after vm_deallocate");
262 }
263 
264 
265 static test_result_t
vm_deallocate_permanent_entry_guarded(checker_list_t * checker_list,mach_vm_address_t start,mach_vm_size_t size)266 vm_deallocate_permanent_entry_guarded(
267 	checker_list_t *checker_list,
268 	mach_vm_address_t start,
269 	mach_vm_size_t size)
270 {
271 	checker_perform_vm_deallocate_permanent(checker_list, start, size);
272 	if (!do_successful_vm_deallocate_guarded(start, size)) {
273 		return TestFailed;
274 	}
275 
276 	return verify_vm_state(checker_list, "after vm_deallocate");
277 }
278 
279 static test_result_t
vm_deallocate_permanent_before_permanent_guarded(checker_list_t * checker_list,mach_vm_address_t start,mach_vm_size_t size)280 vm_deallocate_permanent_before_permanent_guarded(
281 	checker_list_t *checker_list,
282 	mach_vm_address_t start,
283 	mach_vm_size_t size)
284 {
285 	checker_perform_vm_deallocate_permanent(checker_list, start, size / 2);
286 	checker_perform_vm_deallocate_permanent(checker_list, start + size / 2, size / 2);
287 	if (!do_successful_vm_deallocate_guarded(start, size)) {
288 		return TestFailed;
289 	}
290 
291 	return verify_vm_state(checker_list, "after vm_deallocate");
292 }
293 
294 static test_result_t
vm_deallocate_permanent_before_allocation_guarded(checker_list_t * checker_list,mach_vm_address_t start,mach_vm_size_t size)295 vm_deallocate_permanent_before_allocation_guarded(
296 	checker_list_t *checker_list,
297 	mach_vm_address_t start,
298 	mach_vm_size_t size)
299 {
300 	checker_perform_vm_deallocate_permanent(checker_list, start, size / 2);
301 	checker_perform_successful_vm_deallocate(checker_list, start + size / 2, size / 2);
302 	if (!do_successful_vm_deallocate_guarded(start, size)) {
303 		return TestFailed;
304 	}
305 
306 	return verify_vm_state(checker_list, "after vm_deallocate");
307 }
308 
309 static test_result_t
vm_deallocate_permanent_before_hole_guarded(checker_list_t * checker_list,mach_vm_address_t start,mach_vm_size_t size)310 vm_deallocate_permanent_before_hole_guarded(
311 	checker_list_t *checker_list,
312 	mach_vm_address_t start,
313 	mach_vm_size_t size)
314 {
315 	checker_perform_vm_deallocate_permanent(checker_list, start, size / 2);
316 	/* no changes to checkers in [start + size / 2, start + size) */
317 	if (!do_vm_deallocate_holes_guarded(start, size)) {
318 		return TestFailed;
319 	}
320 
321 	return verify_vm_state(checker_list, "after vm_deallocate");
322 }
323 
324 static test_result_t
vm_deallocate_permanent_after_allocation_guarded(checker_list_t * checker_list,mach_vm_address_t start,mach_vm_size_t size)325 vm_deallocate_permanent_after_allocation_guarded(
326 	checker_list_t *checker_list,
327 	mach_vm_address_t start,
328 	mach_vm_size_t size)
329 {
330 	checker_perform_successful_vm_deallocate(checker_list, start, size / 2);
331 	checker_perform_vm_deallocate_permanent(checker_list, start + size / 2, size / 2);
332 	if (!do_successful_vm_deallocate_guarded(start, size)) {
333 		return TestFailed;
334 	}
335 
336 	return verify_vm_state(checker_list, "after vm_deallocate");
337 }
338 
339 static test_result_t
vm_deallocate_permanent_after_hole_guarded(checker_list_t * checker_list,mach_vm_address_t start,mach_vm_size_t size)340 vm_deallocate_permanent_after_hole_guarded(
341 	checker_list_t *checker_list,
342 	mach_vm_address_t start,
343 	mach_vm_size_t size)
344 {
345 	/* no changes to checkers in [start, start + size / 2) */
346 	checker_perform_vm_deallocate_permanent(checker_list, start + size / 2, size / 2);
347 	if (!do_vm_deallocate_holes_guarded(start, size)) {
348 		return TestFailed;
349 	}
350 
351 	return verify_vm_state(checker_list, "after vm_deallocate");
352 }
353 
354 
355 T_DECL(vm_deallocate_unguarded,
356     "run vm_deallocate with various vm configurations; EXC_GUARD disabled")
357 {
358 	vm_tests_t tests = {
359 		.single_entry_1 = successful_vm_deallocate,
360 		.single_entry_2 = successful_vm_deallocate,
361 		.single_entry_3 = successful_vm_deallocate,
362 		.single_entry_4 = successful_vm_deallocate,
363 
364 		.multiple_entries_1 = successful_vm_deallocate,
365 		.multiple_entries_2 = successful_vm_deallocate,
366 		.multiple_entries_3 = successful_vm_deallocate,
367 		.multiple_entries_4 = successful_vm_deallocate,
368 		.multiple_entries_5 = successful_vm_deallocate,
369 		.multiple_entries_6 = successful_vm_deallocate,
370 
371 		.some_holes_1 = successful_vm_deallocate,
372 		.some_holes_2 = successful_vm_deallocate,
373 		.some_holes_3 = successful_vm_deallocate,
374 		.some_holes_4 = successful_vm_deallocate,
375 		.some_holes_5 = successful_vm_deallocate,
376 		.some_holes_6 = successful_vm_deallocate,
377 		.some_holes_7 = successful_vm_deallocate,
378 		.some_holes_8 = successful_vm_deallocate,
379 		.some_holes_9 = successful_vm_deallocate,
380 		.some_holes_10 = successful_vm_deallocate,
381 		.some_holes_11 = successful_vm_deallocate,
382 		.some_holes_12 = successful_vm_deallocate,
383 
384 		.all_holes_1 = successful_vm_deallocate,
385 		.all_holes_2 = successful_vm_deallocate,
386 		.all_holes_3 = successful_vm_deallocate,
387 		.all_holes_4 = successful_vm_deallocate,
388 
389 		.null_entry = successful_vm_deallocate,
390 		.nonresident_entry = successful_vm_deallocate,
391 		.resident_entry = successful_vm_deallocate,
392 
393 		.shared_entry = successful_vm_deallocate,
394 		.shared_entry_discontiguous = successful_vm_deallocate,
395 		.shared_entry_partial = successful_vm_deallocate,
396 		.shared_entry_pairs = successful_vm_deallocate,
397 		.shared_entry_x1000 = successful_vm_deallocate,
398 
399 		.cow_entry = successful_vm_deallocate,
400 		.cow_unreferenced = successful_vm_deallocate,
401 		.cow_nocow = successful_vm_deallocate,
402 		.nocow_cow = successful_vm_deallocate,
403 		.cow_unreadable = successful_vm_deallocate,
404 		.cow_unwriteable = successful_vm_deallocate,
405 
406 		.permanent_entry = vm_deallocate_permanent_entry,
407 		.permanent_before_permanent = vm_deallocate_permanent_before_permanent,
408 		.permanent_before_allocation = vm_deallocate_permanent_before_allocation,
409 		.permanent_before_allocation_2 = vm_deallocate_permanent_before_allocation,
410 		.permanent_before_hole = vm_deallocate_permanent_before_hole,
411 		.permanent_after_allocation = vm_deallocate_permanent_after_allocation,
412 		.permanent_after_hole = vm_deallocate_permanent_after_hole,
413 
414 		.single_submap_single_entry = successful_vm_deallocate,
415 		.single_submap_single_entry_first_pages = successful_vm_deallocate,
416 		.single_submap_single_entry_last_pages = successful_vm_deallocate,
417 		.single_submap_single_entry_middle_pages = successful_vm_deallocate,
418 		.single_submap_oversize_entry_at_start = successful_vm_deallocate,
419 		.single_submap_oversize_entry_at_end = successful_vm_deallocate,
420 		.single_submap_oversize_entry_at_both = successful_vm_deallocate,
421 
422 		.submap_before_allocation = successful_vm_deallocate,
423 		.submap_after_allocation = successful_vm_deallocate,
424 		.submap_before_hole = successful_vm_deallocate,
425 		.submap_after_hole = successful_vm_deallocate,
426 		.submap_allocation_submap_one_entry = successful_vm_deallocate,
427 		.submap_allocation_submap_two_entries = successful_vm_deallocate,
428 		.submap_allocation_submap_three_entries = successful_vm_deallocate,
429 
430 		.submap_before_allocation_ro = successful_vm_deallocate,
431 		.submap_after_allocation_ro = successful_vm_deallocate,
432 		.submap_before_hole_ro = successful_vm_deallocate,
433 		.submap_after_hole_ro = successful_vm_deallocate,
434 		.submap_allocation_submap_one_entry_ro = successful_vm_deallocate,
435 		.submap_allocation_submap_two_entries_ro = successful_vm_deallocate,
436 		.submap_allocation_submap_three_entries_ro = successful_vm_deallocate,
437 
438 		.protection_single_000_000 = successful_vm_deallocate,
439 		.protection_single_000_r00 = successful_vm_deallocate,
440 		.protection_single_000_0w0 = successful_vm_deallocate,
441 		.protection_single_000_rw0 = successful_vm_deallocate,
442 		.protection_single_r00_r00 = successful_vm_deallocate,
443 		.protection_single_r00_rw0 = successful_vm_deallocate,
444 		.protection_single_0w0_0w0 = successful_vm_deallocate,
445 		.protection_single_0w0_rw0 = successful_vm_deallocate,
446 		.protection_single_rw0_rw0 = successful_vm_deallocate,
447 
448 		.protection_pairs_000_000 = successful_vm_deallocate,
449 		.protection_pairs_000_r00 = successful_vm_deallocate,
450 		.protection_pairs_000_0w0 = successful_vm_deallocate,
451 		.protection_pairs_000_rw0 = successful_vm_deallocate,
452 		.protection_pairs_r00_000 = successful_vm_deallocate,
453 		.protection_pairs_r00_r00 = successful_vm_deallocate,
454 		.protection_pairs_r00_0w0 = successful_vm_deallocate,
455 		.protection_pairs_r00_rw0 = successful_vm_deallocate,
456 		.protection_pairs_0w0_000 = successful_vm_deallocate,
457 		.protection_pairs_0w0_r00 = successful_vm_deallocate,
458 		.protection_pairs_0w0_0w0 = successful_vm_deallocate,
459 		.protection_pairs_0w0_rw0 = successful_vm_deallocate,
460 		.protection_pairs_rw0_000 = successful_vm_deallocate,
461 		.protection_pairs_rw0_r00 = successful_vm_deallocate,
462 		.protection_pairs_rw0_0w0 = successful_vm_deallocate,
463 		.protection_pairs_rw0_rw0 = successful_vm_deallocate,
464 	};
465 
466 	disable_vm_exc_guard();
467 	run_vm_tests("vm_deallocate_unguarded", __FILE__, &tests, argc, argv);
468 }  /* T_DECL(vm_deallocate_unguarded) */
469 
470 
471 T_DECL(vm_deallocate_guarded,
472     "run vm_deallocate with various vm configurations; EXC_GUARD enabled")
473 {
474 	if (isRosetta()) {
475 		/* Rosetta doesn't deliver VM guard exceptions to the test's exception handler. */
476 		T_PASS("can't test VM guard exceptions on Rosetta");
477 		return;
478 	}
479 
480 	vm_tests_t tests = {
481 		.single_entry_1 = successful_vm_deallocate_guarded,
482 		.single_entry_2 = successful_vm_deallocate_guarded,
483 		.single_entry_3 = successful_vm_deallocate_guarded,
484 		.single_entry_4 = successful_vm_deallocate_guarded,
485 
486 		.multiple_entries_1 = successful_vm_deallocate_guarded,
487 		.multiple_entries_2 = successful_vm_deallocate_guarded,
488 		.multiple_entries_3 = successful_vm_deallocate_guarded,
489 		.multiple_entries_4 = successful_vm_deallocate_guarded,
490 		.multiple_entries_5 = successful_vm_deallocate_guarded,
491 		.multiple_entries_6 = successful_vm_deallocate_guarded,
492 
493 		.some_holes_1 = vm_deallocate_holes_guarded,
494 		.some_holes_2 = vm_deallocate_holes_guarded,
495 		.some_holes_3 = vm_deallocate_holes_guarded,
496 		.some_holes_4 = vm_deallocate_holes_guarded,
497 		.some_holes_5 = vm_deallocate_holes_guarded,
498 		.some_holes_6 = vm_deallocate_holes_guarded,
499 		.some_holes_7 = vm_deallocate_holes_guarded,
500 		.some_holes_8 = vm_deallocate_holes_guarded,
501 		.some_holes_9 = vm_deallocate_holes_guarded,
502 		.some_holes_10 = vm_deallocate_holes_guarded,
503 		.some_holes_11 = vm_deallocate_holes_guarded,
504 		.some_holes_12 = vm_deallocate_holes_guarded,
505 
506 		.all_holes_1 = vm_deallocate_holes_guarded,
507 		.all_holes_2 = vm_deallocate_holes_guarded,
508 		.all_holes_3 = vm_deallocate_holes_guarded,
509 		.all_holes_4 = vm_deallocate_holes_guarded,
510 
511 		.null_entry = successful_vm_deallocate_guarded,
512 		.nonresident_entry = successful_vm_deallocate_guarded,
513 		.resident_entry = successful_vm_deallocate_guarded,
514 
515 		.shared_entry = successful_vm_deallocate_guarded,
516 		.shared_entry_discontiguous = successful_vm_deallocate_guarded,
517 		.shared_entry_partial = successful_vm_deallocate_guarded,
518 		.shared_entry_pairs = successful_vm_deallocate_guarded,
519 		.shared_entry_x1000 = successful_vm_deallocate_guarded,
520 
521 		.cow_entry = successful_vm_deallocate_guarded,
522 		.cow_unreferenced = successful_vm_deallocate_guarded,
523 		.cow_nocow = successful_vm_deallocate_guarded,
524 		.nocow_cow = successful_vm_deallocate_guarded,
525 		.cow_unreadable = successful_vm_deallocate_guarded,
526 		.cow_unwriteable = successful_vm_deallocate_guarded,
527 
528 		.permanent_entry = vm_deallocate_permanent_entry_guarded,
529 		.permanent_before_permanent = vm_deallocate_permanent_before_permanent_guarded,
530 		.permanent_before_allocation = vm_deallocate_permanent_before_allocation_guarded,
531 		.permanent_before_allocation_2 = vm_deallocate_permanent_before_allocation_guarded,
532 		.permanent_before_hole = vm_deallocate_permanent_before_hole_guarded,
533 		.permanent_after_allocation = vm_deallocate_permanent_after_allocation_guarded,
534 		.permanent_after_hole = vm_deallocate_permanent_after_hole_guarded,
535 
536 		.single_submap_single_entry = successful_vm_deallocate_guarded,
537 		.single_submap_single_entry_first_pages = successful_vm_deallocate_guarded,
538 		.single_submap_single_entry_last_pages = successful_vm_deallocate_guarded,
539 		.single_submap_single_entry_middle_pages = successful_vm_deallocate_guarded,
540 		.single_submap_oversize_entry_at_start = successful_vm_deallocate_guarded,
541 		.single_submap_oversize_entry_at_end = successful_vm_deallocate_guarded,
542 		.single_submap_oversize_entry_at_both = successful_vm_deallocate_guarded,
543 
544 		.submap_before_allocation = successful_vm_deallocate_guarded,
545 		.submap_after_allocation = successful_vm_deallocate_guarded,
546 		.submap_before_hole = vm_deallocate_holes_guarded,
547 		.submap_after_hole = vm_deallocate_holes_guarded,
548 		.submap_allocation_submap_one_entry = successful_vm_deallocate_guarded,
549 		.submap_allocation_submap_two_entries = successful_vm_deallocate_guarded,
550 		.submap_allocation_submap_three_entries = successful_vm_deallocate_guarded,
551 
552 		.submap_before_allocation_ro = successful_vm_deallocate_guarded,
553 		.submap_after_allocation_ro = successful_vm_deallocate_guarded,
554 		.submap_before_hole_ro = vm_deallocate_holes_guarded,
555 		.submap_after_hole_ro = vm_deallocate_holes_guarded,
556 		.submap_allocation_submap_one_entry_ro = successful_vm_deallocate_guarded,
557 		.submap_allocation_submap_two_entries_ro = successful_vm_deallocate_guarded,
558 		.submap_allocation_submap_three_entries_ro = successful_vm_deallocate_guarded,
559 
560 		.protection_single_000_000 = successful_vm_deallocate_guarded,
561 		.protection_single_000_r00 = successful_vm_deallocate_guarded,
562 		.protection_single_000_0w0 = successful_vm_deallocate_guarded,
563 		.protection_single_000_rw0 = successful_vm_deallocate_guarded,
564 		.protection_single_r00_r00 = successful_vm_deallocate_guarded,
565 		.protection_single_r00_rw0 = successful_vm_deallocate_guarded,
566 		.protection_single_0w0_0w0 = successful_vm_deallocate_guarded,
567 		.protection_single_0w0_rw0 = successful_vm_deallocate_guarded,
568 		.protection_single_rw0_rw0 = successful_vm_deallocate_guarded,
569 
570 		.protection_pairs_000_000 = successful_vm_deallocate_guarded,
571 		.protection_pairs_000_r00 = successful_vm_deallocate_guarded,
572 		.protection_pairs_000_0w0 = successful_vm_deallocate_guarded,
573 		.protection_pairs_000_rw0 = successful_vm_deallocate_guarded,
574 		.protection_pairs_r00_000 = successful_vm_deallocate_guarded,
575 		.protection_pairs_r00_r00 = successful_vm_deallocate_guarded,
576 		.protection_pairs_r00_0w0 = successful_vm_deallocate_guarded,
577 		.protection_pairs_r00_rw0 = successful_vm_deallocate_guarded,
578 		.protection_pairs_0w0_000 = successful_vm_deallocate_guarded,
579 		.protection_pairs_0w0_r00 = successful_vm_deallocate_guarded,
580 		.protection_pairs_0w0_0w0 = successful_vm_deallocate_guarded,
581 		.protection_pairs_0w0_rw0 = successful_vm_deallocate_guarded,
582 		.protection_pairs_rw0_000 = successful_vm_deallocate_guarded,
583 		.protection_pairs_rw0_r00 = successful_vm_deallocate_guarded,
584 		.protection_pairs_rw0_0w0 = successful_vm_deallocate_guarded,
585 		.protection_pairs_rw0_rw0 = successful_vm_deallocate_guarded,
586 	};
587 
588 	enable_non_fatal_vm_exc_guard();
589 	run_vm_tests("vm_deallocate_guarded", __FILE__, &tests, argc, argv);
590 }  /* T_DECL(vm_deallocate_guarded) */
591