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