xref: /xnu-11215.41.3/osfmk/tests/vm_parameter_validation_kern.c (revision 33de042d024d46de5ff4e89f2471de6608e37fa4)
1*33de042dSApple OSS Distributions #include <sys/cdefs.h>
2*33de042dSApple OSS Distributions #include <kern/zalloc.h>
3*33de042dSApple OSS Distributions 
4*33de042dSApple OSS Distributions #include "vm_parameter_validation.h"
5*33de042dSApple OSS Distributions 
6*33de042dSApple OSS Distributions #pragma clang diagnostic ignored "-Wdeclaration-after-statement"
7*33de042dSApple OSS Distributions #pragma clang diagnostic ignored "-Wincompatible-function-pointer-types"
8*33de042dSApple OSS Distributions #pragma clang diagnostic ignored "-Wmissing-prototypes"
9*33de042dSApple OSS Distributions #pragma clang diagnostic ignored "-Wpedantic"
10*33de042dSApple OSS Distributions #pragma clang diagnostic ignored "-Wgcc-compat"
11*33de042dSApple OSS Distributions 
12*33de042dSApple OSS Distributions #pragma clang diagnostic ignored "-Wunused-variable"
13*33de042dSApple OSS Distributions 
14*33de042dSApple OSS Distributions 
15*33de042dSApple OSS Distributions // Kernel sysctl test prints its output into a userspace buffer.
16*33de042dSApple OSS Distributions // fixme these global variables prevent test concurrency
17*33de042dSApple OSS Distributions 
18*33de042dSApple OSS Distributions static user_addr_t SYSCTL_OUTPUT_BUF;
19*33de042dSApple OSS Distributions static user_addr_t SYSCTL_OUTPUT_END;
20*33de042dSApple OSS Distributions 
21*33de042dSApple OSS Distributions // This is a read/write fd passed from userspace.
22*33de042dSApple OSS Distributions // It's passed to make it easier for kernel tests to interact with a file.
23*33de042dSApple OSS Distributions static int file_descriptor;
24*33de042dSApple OSS Distributions 
25*33de042dSApple OSS Distributions // Output to create a golden test result in kern test, controlled by
26*33de042dSApple OSS Distributions // vm_parameter_validation_kern_golden=1
27*33de042dSApple OSS Distributions bool kernel_generate_golden = FALSE;
28*33de042dSApple OSS Distributions 
29*33de042dSApple OSS Distributions // vprintf() to a userspace buffer
30*33de042dSApple OSS Distributions // output is incremented to point at the new nul terminator
31*33de042dSApple OSS Distributions static void
user_vprintf(user_addr_t * output,user_addr_t output_end,const char * format,va_list args)32*33de042dSApple OSS Distributions user_vprintf(user_addr_t *output, user_addr_t output_end, const char *format, va_list args) __printflike(3, 0)
33*33de042dSApple OSS Distributions {
34*33de042dSApple OSS Distributions 	extern int vsnprintf(char *, size_t, const char *, va_list) __printflike(3, 0);
35*33de042dSApple OSS Distributions 	char linebuf[1024];
36*33de042dSApple OSS Distributions 	size_t printed;
37*33de042dSApple OSS Distributions 
38*33de042dSApple OSS Distributions 	printed = vsnprintf(linebuf, sizeof(linebuf), format, args);
39*33de042dSApple OSS Distributions 	assert(printed < sizeof(linebuf) - 1);
40*33de042dSApple OSS Distributions 	assert(*output + printed + 1 < output_end);
41*33de042dSApple OSS Distributions 	copyout(linebuf, *output, printed + 1);
42*33de042dSApple OSS Distributions 	*output += printed;
43*33de042dSApple OSS Distributions }
44*33de042dSApple OSS Distributions 
45*33de042dSApple OSS Distributions void
testprintf(const char * format,...)46*33de042dSApple OSS Distributions testprintf(const char *format, ...)
47*33de042dSApple OSS Distributions {
48*33de042dSApple OSS Distributions 	va_list args;
49*33de042dSApple OSS Distributions 	va_start(args, format);
50*33de042dSApple OSS Distributions 	user_vprintf(&SYSCTL_OUTPUT_BUF, SYSCTL_OUTPUT_END, format, args);
51*33de042dSApple OSS Distributions 	va_end(args);
52*33de042dSApple OSS Distributions }
53*33de042dSApple OSS Distributions 
54*33de042dSApple OSS Distributions // Utils
55*33de042dSApple OSS Distributions 
56*33de042dSApple OSS Distributions static mach_port_t
make_a_mem_object(vm_size_t size)57*33de042dSApple OSS Distributions make_a_mem_object(vm_size_t size)
58*33de042dSApple OSS Distributions {
59*33de042dSApple OSS Distributions 	ipc_port_t out_handle;
60*33de042dSApple OSS Distributions 	kern_return_t kr = mach_memory_object_memory_entry_64((host_t)1, /*internal=*/ true, size, VM_PROT_READ | VM_PROT_WRITE, 0, &out_handle);
61*33de042dSApple OSS Distributions 	assert(kr == 0);
62*33de042dSApple OSS Distributions 	return out_handle;
63*33de042dSApple OSS Distributions }
64*33de042dSApple OSS Distributions 
65*33de042dSApple OSS Distributions static mach_port_t
make_a_mem_entry(MAP_T map,vm_size_t size)66*33de042dSApple OSS Distributions make_a_mem_entry(MAP_T map, vm_size_t size)
67*33de042dSApple OSS Distributions {
68*33de042dSApple OSS Distributions 	mach_port_t port;
69*33de042dSApple OSS Distributions 	memory_object_size_t s = (memory_object_size_t)size;
70*33de042dSApple OSS Distributions 	kern_return_t kr = mach_make_memory_entry_64(map, &s, (memory_object_offset_t)0, MAP_MEM_NAMED_CREATE | MAP_MEM_LEDGER_TAGGED, &port, MACH_PORT_NULL);
71*33de042dSApple OSS Distributions 	assert(kr == 0);
72*33de042dSApple OSS Distributions 	return port;
73*33de042dSApple OSS Distributions }
74*33de042dSApple OSS Distributions 
75*33de042dSApple OSS Distributions // Test functions
76*33de042dSApple OSS Distributions 
77*33de042dSApple OSS Distributions static results_t *
test_vm_map_copy_overwrite(kern_return_t (* func)(MAP_T dst_map,vm_map_copy_t copy,mach_vm_address_t start,mach_vm_size_t size),const char * testname)78*33de042dSApple OSS Distributions test_vm_map_copy_overwrite(kern_return_t (*func)(MAP_T dst_map, vm_map_copy_t copy, mach_vm_address_t start, mach_vm_size_t size), const char * testname)
79*33de042dSApple OSS Distributions {
80*33de042dSApple OSS Distributions 	// source map: has an allocation bigger than our
81*33de042dSApple OSS Distributions 	// "reasonable" trial sizes, to copy from
82*33de042dSApple OSS Distributions 	MAP_T src_map SMART_MAP;
83*33de042dSApple OSS Distributions 	allocation_t src_alloc SMART_ALLOCATE_VM(src_map, TEST_ALLOC_SIZE, VM_PROT_READ);
84*33de042dSApple OSS Distributions 
85*33de042dSApple OSS Distributions 	// dest map: has an allocation bigger than our
86*33de042dSApple OSS Distributions 	// "reasonable" trial sizes, to copy-overwrite on
87*33de042dSApple OSS Distributions 	MAP_T dst_map SMART_MAP;
88*33de042dSApple OSS Distributions 	allocation_t dst_alloc SMART_ALLOCATE_VM(dst_map, TEST_ALLOC_SIZE, VM_PROT_DEFAULT);
89*33de042dSApple OSS Distributions 
90*33de042dSApple OSS Distributions 	// We test dst/size parameters.
91*33de042dSApple OSS Distributions 	// We don't test the contents of the vm_map_copy_t.
92*33de042dSApple OSS Distributions 	start_size_trials_t *trials SMART_START_SIZE_TRIALS(dst_alloc.addr);
93*33de042dSApple OSS Distributions 	results_t *results = alloc_results(testname, trials->count);
94*33de042dSApple OSS Distributions 
95*33de042dSApple OSS Distributions 	for (unsigned i = 0; i < trials->count; i++) {
96*33de042dSApple OSS Distributions 		start_size_trial_t trial = trials->list[i];
97*33de042dSApple OSS Distributions 
98*33de042dSApple OSS Distributions 		// Copy from the source.
99*33de042dSApple OSS Distributions 		vm_map_copy_t copy;
100*33de042dSApple OSS Distributions 		kern_return_t kr = vm_map_copyin(src_map, src_alloc.addr, src_alloc.size, false, &copy);
101*33de042dSApple OSS Distributions 		assert(kr == 0);
102*33de042dSApple OSS Distributions 		assert(copy);  // null copy won't exercise the sanitization path
103*33de042dSApple OSS Distributions 
104*33de042dSApple OSS Distributions 		// Copy-overwrite to the destination.
105*33de042dSApple OSS Distributions 		kern_return_t ret = func(dst_map, copy, trial.start, trial.size);
106*33de042dSApple OSS Distributions 
107*33de042dSApple OSS Distributions 		if (ret != KERN_SUCCESS) {
108*33de042dSApple OSS Distributions 			vm_map_copy_discard(copy);
109*33de042dSApple OSS Distributions 		}
110*33de042dSApple OSS Distributions 		append_result(results, ret, trial.name);
111*33de042dSApple OSS Distributions 	}
112*33de042dSApple OSS Distributions 	return results;
113*33de042dSApple OSS Distributions }
114*33de042dSApple OSS Distributions 
115*33de042dSApple OSS Distributions /*
116*33de042dSApple OSS Distributions  * This function temporarily allocates a writeable allocation in kernel_map, and a read only allocation in a temporary map.
117*33de042dSApple OSS Distributions  * It's used to test a function such as vm_map_read_user which copies in data to a kernel pointer that must be writeable.
118*33de042dSApple OSS Distributions  */
119*33de042dSApple OSS Distributions static results_t *
test_src_kerneldst_size(kern_return_t (* func)(MAP_T map,vm_map_offset_t src,void * dst,vm_size_t length),const char * testname)120*33de042dSApple OSS Distributions test_src_kerneldst_size(kern_return_t (*func)(MAP_T map, vm_map_offset_t src, void * dst, vm_size_t length), const char * testname)
121*33de042dSApple OSS Distributions {
122*33de042dSApple OSS Distributions 	MAP_T map SMART_MAP;
123*33de042dSApple OSS Distributions 	allocation_t src_base SMART_ALLOCATE_VM(map, TEST_ALLOC_SIZE, VM_PROT_READ);
124*33de042dSApple OSS Distributions 	allocation_t dst_base SMART_ALLOCATE_VM(kernel_map, TEST_ALLOC_SIZE, VM_PROT_DEFAULT);
125*33de042dSApple OSS Distributions 	src_dst_size_trials_t * trials SMART_SRC_DST_SIZE_TRIALS();
126*33de042dSApple OSS Distributions 	results_t *results = alloc_results(testname, trials->count);
127*33de042dSApple OSS Distributions 
128*33de042dSApple OSS Distributions 	for (unsigned i = 0; i < trials->count; i++) {
129*33de042dSApple OSS Distributions 		src_dst_size_trial_t trial = trials->list[i];
130*33de042dSApple OSS Distributions 		trial = slide_trial_src(trial, src_base.addr);
131*33de042dSApple OSS Distributions 		trial = slide_trial_dst(trial, dst_base.addr);
132*33de042dSApple OSS Distributions 		int ret = func(map, trial.src, (void *)trial.dst, trial.size);
133*33de042dSApple OSS Distributions 		append_result(results, ret, trial.name);
134*33de042dSApple OSS Distributions 	}
135*33de042dSApple OSS Distributions 	return results;
136*33de042dSApple OSS Distributions }
137*33de042dSApple OSS Distributions 
138*33de042dSApple OSS Distributions /*
139*33de042dSApple OSS Distributions  * This function temporarily allocates a read only allocation in kernel_map, and a writeable allocation in a temporary map.
140*33de042dSApple OSS Distributions  * It's used to test a function such as vm_map_write_user which copies data from a kernel pointer to a writeable userspace address.
141*33de042dSApple OSS Distributions  */
142*33de042dSApple OSS Distributions static results_t *
test_kernelsrc_dst_size(kern_return_t (* func)(MAP_T map,void * src,vm_map_offset_t dst,vm_size_t length),const char * testname)143*33de042dSApple OSS Distributions test_kernelsrc_dst_size(kern_return_t (*func)(MAP_T map, void *src, vm_map_offset_t dst, vm_size_t length), const char * testname)
144*33de042dSApple OSS Distributions {
145*33de042dSApple OSS Distributions 	MAP_T map SMART_MAP;
146*33de042dSApple OSS Distributions 	allocation_t src_base SMART_ALLOCATE_VM(kernel_map, TEST_ALLOC_SIZE, VM_PROT_READ);
147*33de042dSApple OSS Distributions 	allocation_t dst_base SMART_ALLOCATE_VM(map, TEST_ALLOC_SIZE, VM_PROT_DEFAULT);
148*33de042dSApple OSS Distributions 	src_dst_size_trials_t * trials SMART_SRC_DST_SIZE_TRIALS();
149*33de042dSApple OSS Distributions 	results_t *results = alloc_results(testname, trials->count);
150*33de042dSApple OSS Distributions 
151*33de042dSApple OSS Distributions 	for (unsigned i = 0; i < trials->count; i++) {
152*33de042dSApple OSS Distributions 		src_dst_size_trial_t trial = trials->list[i];
153*33de042dSApple OSS Distributions 		trial = slide_trial_src(trial, src_base.addr);
154*33de042dSApple OSS Distributions 		trial = slide_trial_dst(trial, dst_base.addr);
155*33de042dSApple OSS Distributions 		int ret = func(map, (void *)trial.src, trial.dst, trial.size);
156*33de042dSApple OSS Distributions 		append_result(results, ret, trial.name);
157*33de042dSApple OSS Distributions 	}
158*33de042dSApple OSS Distributions 	return results;
159*33de042dSApple OSS Distributions }
160*33de042dSApple OSS Distributions 
161*33de042dSApple OSS Distributions 
162*33de042dSApple OSS Distributions /////////////////////////////////////////////////////
163*33de042dSApple OSS Distributions // Mach tests
164*33de042dSApple OSS Distributions 
165*33de042dSApple OSS Distributions 
166*33de042dSApple OSS Distributions static kern_return_t
call_mach_vm_read(MAP_T map,mach_vm_address_t start,mach_vm_size_t size)167*33de042dSApple OSS Distributions call_mach_vm_read(MAP_T map, mach_vm_address_t start, mach_vm_size_t size)
168*33de042dSApple OSS Distributions {
169*33de042dSApple OSS Distributions 	vm_offset_t out_addr;
170*33de042dSApple OSS Distributions 	mach_msg_type_number_t out_size;
171*33de042dSApple OSS Distributions 	kern_return_t kr = mach_vm_read(map, start, size, &out_addr, &out_size);
172*33de042dSApple OSS Distributions 	if (kr == 0) {
173*33de042dSApple OSS Distributions 		// we didn't call through MIG so out_addr is really a vm_map_copy_t
174*33de042dSApple OSS Distributions 		vm_map_copy_discard((vm_map_copy_t)out_addr);
175*33de042dSApple OSS Distributions 	}
176*33de042dSApple OSS Distributions 	return kr;
177*33de042dSApple OSS Distributions }
178*33de042dSApple OSS Distributions 
179*33de042dSApple OSS Distributions static inline void
check_vm_map_copyin_outparam_changes(kern_return_t * kr,vm_map_copy_t copy,vm_map_copy_t saved_copy)180*33de042dSApple OSS Distributions check_vm_map_copyin_outparam_changes(kern_return_t * kr, vm_map_copy_t copy, vm_map_copy_t saved_copy)
181*33de042dSApple OSS Distributions {
182*33de042dSApple OSS Distributions 	if (*kr == KERN_SUCCESS) {
183*33de042dSApple OSS Distributions 		if (copy == saved_copy) {
184*33de042dSApple OSS Distributions 			*kr = OUT_PARAM_BAD;
185*33de042dSApple OSS Distributions 		}
186*33de042dSApple OSS Distributions 	} else {
187*33de042dSApple OSS Distributions 		if (copy != saved_copy) {
188*33de042dSApple OSS Distributions 			*kr = OUT_PARAM_BAD;
189*33de042dSApple OSS Distributions 		}
190*33de042dSApple OSS Distributions 	}
191*33de042dSApple OSS Distributions }
192*33de042dSApple OSS Distributions 
193*33de042dSApple OSS Distributions static kern_return_t
call_vm_map_copyin(MAP_T map,mach_vm_address_t start,mach_vm_size_t size)194*33de042dSApple OSS Distributions call_vm_map_copyin(MAP_T map, mach_vm_address_t start, mach_vm_size_t size)
195*33de042dSApple OSS Distributions {
196*33de042dSApple OSS Distributions 	vm_map_copy_t invalid_initial_value = INVALID_INITIAL_COPY;
197*33de042dSApple OSS Distributions 	vm_map_copy_t copy = invalid_initial_value;
198*33de042dSApple OSS Distributions 	kern_return_t kr = vm_map_copyin(map, start, size, false, &copy);
199*33de042dSApple OSS Distributions 	if (kr == 0) {
200*33de042dSApple OSS Distributions 		vm_map_copy_discard(copy);
201*33de042dSApple OSS Distributions 	}
202*33de042dSApple OSS Distributions 	check_vm_map_copyin_outparam_changes(&kr, copy, invalid_initial_value);
203*33de042dSApple OSS Distributions 	return kr;
204*33de042dSApple OSS Distributions }
205*33de042dSApple OSS Distributions 
206*33de042dSApple OSS Distributions static kern_return_t
call_copyoutmap_atomic32(MAP_T map,vm_map_offset_t addr)207*33de042dSApple OSS Distributions call_copyoutmap_atomic32(MAP_T map, vm_map_offset_t addr)
208*33de042dSApple OSS Distributions {
209*33de042dSApple OSS Distributions 	uint32_t data = 0;
210*33de042dSApple OSS Distributions 	kern_return_t kr = copyoutmap_atomic32(map, data, addr);
211*33de042dSApple OSS Distributions 	return kr;
212*33de042dSApple OSS Distributions }
213*33de042dSApple OSS Distributions 
214*33de042dSApple OSS Distributions 
215*33de042dSApple OSS Distributions static kern_return_t
call_mach_vm_allocate__flags(MAP_T map,mach_vm_address_t * start,mach_vm_size_t size,int flags)216*33de042dSApple OSS Distributions call_mach_vm_allocate__flags(MAP_T map, mach_vm_address_t * start, mach_vm_size_t size, int flags)
217*33de042dSApple OSS Distributions {
218*33de042dSApple OSS Distributions 	mach_vm_address_t saved_start = *start;
219*33de042dSApple OSS Distributions 	kern_return_t kr = mach_vm_allocate_external(map, start, size, flags);
220*33de042dSApple OSS Distributions 	check_mach_vm_allocate_outparam_changes(&kr, *start, size, saved_start, flags, map);
221*33de042dSApple OSS Distributions 	return kr;
222*33de042dSApple OSS Distributions }
223*33de042dSApple OSS Distributions 
224*33de042dSApple OSS Distributions static kern_return_t
call_mach_vm_allocate__start_size_fixed(MAP_T map,mach_vm_address_t * start,mach_vm_size_t size)225*33de042dSApple OSS Distributions call_mach_vm_allocate__start_size_fixed(MAP_T map, mach_vm_address_t * start, mach_vm_size_t size)
226*33de042dSApple OSS Distributions {
227*33de042dSApple OSS Distributions 	mach_vm_address_t saved_start = *start;
228*33de042dSApple OSS Distributions 	kern_return_t kr = mach_vm_allocate_external(map, start, size, VM_FLAGS_FIXED);
229*33de042dSApple OSS Distributions 	check_mach_vm_allocate_outparam_changes(&kr, *start, size, saved_start, VM_FLAGS_FIXED, map);
230*33de042dSApple OSS Distributions 	return kr;
231*33de042dSApple OSS Distributions }
232*33de042dSApple OSS Distributions 
233*33de042dSApple OSS Distributions static kern_return_t
call_mach_vm_allocate__start_size_anywhere(MAP_T map,mach_vm_address_t * start,mach_vm_size_t size)234*33de042dSApple OSS Distributions call_mach_vm_allocate__start_size_anywhere(MAP_T map, mach_vm_address_t * start, mach_vm_size_t size)
235*33de042dSApple OSS Distributions {
236*33de042dSApple OSS Distributions 	mach_vm_address_t saved_start = *start;
237*33de042dSApple OSS Distributions 	kern_return_t kr = mach_vm_allocate_external(map, start, size, VM_FLAGS_ANYWHERE);
238*33de042dSApple OSS Distributions 	check_mach_vm_allocate_outparam_changes(&kr, *start, size, saved_start, VM_FLAGS_ANYWHERE, map);
239*33de042dSApple OSS Distributions 	return kr;
240*33de042dSApple OSS Distributions }
241*33de042dSApple OSS Distributions 
242*33de042dSApple OSS Distributions static kern_return_t
call_mach_vm_allocate_kernel__flags(MAP_T map,mach_vm_address_t * start,mach_vm_size_t size,int flags)243*33de042dSApple OSS Distributions call_mach_vm_allocate_kernel__flags(MAP_T map, mach_vm_address_t * start, mach_vm_size_t size, int flags)
244*33de042dSApple OSS Distributions {
245*33de042dSApple OSS Distributions 	mach_vm_address_t saved_start = *start;
246*33de042dSApple OSS Distributions 	kern_return_t kr = mach_vm_allocate_kernel(map, start, size,
247*33de042dSApple OSS Distributions 	    FLAGS_AND_TAG(flags, VM_KERN_MEMORY_OSFMK));
248*33de042dSApple OSS Distributions 	check_mach_vm_allocate_outparam_changes(&kr, *start, size, saved_start, flags, map);
249*33de042dSApple OSS Distributions 	return kr;
250*33de042dSApple OSS Distributions }
251*33de042dSApple OSS Distributions 
252*33de042dSApple OSS Distributions static kern_return_t
call_mach_vm_allocate_kernel__start_size_fixed(MAP_T map,mach_vm_address_t * start,mach_vm_size_t size)253*33de042dSApple OSS Distributions call_mach_vm_allocate_kernel__start_size_fixed(MAP_T map, mach_vm_address_t * start, mach_vm_size_t size)
254*33de042dSApple OSS Distributions {
255*33de042dSApple OSS Distributions 	mach_vm_address_t saved_start = *start;
256*33de042dSApple OSS Distributions 	mach_vm_address_t minus_two_kb16 = -2 * KB16;
257*33de042dSApple OSS Distributions 
258*33de042dSApple OSS Distributions 	if (*start + size >= minus_two_kb16) {
259*33de042dSApple OSS Distributions 		// Allocation actually works fine here. Deallocation does not.
260*33de042dSApple OSS Distributions 		// It triggers a end < start assertion in pmap. Seems like some offset is added to the end of the region, which is -KB16 in these cases which overflows.
261*33de042dSApple OSS Distributions 		return PANIC;
262*33de042dSApple OSS Distributions 	}
263*33de042dSApple OSS Distributions 	mach_vm_address_t before = *start;
264*33de042dSApple OSS Distributions 
265*33de042dSApple OSS Distributions 	kern_return_t kr = mach_vm_allocate_kernel(map, start, size,
266*33de042dSApple OSS Distributions 	    FLAGS_AND_TAG(VM_FLAGS_FIXED, VM_KERN_MEMORY_OSFMK));
267*33de042dSApple OSS Distributions 	check_mach_vm_allocate_outparam_changes(&kr, *start, size, saved_start, VM_FLAGS_FIXED, map);
268*33de042dSApple OSS Distributions 
269*33de042dSApple OSS Distributions 
270*33de042dSApple OSS Distributions 	return kr;
271*33de042dSApple OSS Distributions }
272*33de042dSApple OSS Distributions 
273*33de042dSApple OSS Distributions static kern_return_t
call_mach_vm_allocate_kernel__start_size_anywhere(MAP_T map,mach_vm_address_t * start,mach_vm_size_t size)274*33de042dSApple OSS Distributions call_mach_vm_allocate_kernel__start_size_anywhere(MAP_T map, mach_vm_address_t * start, mach_vm_size_t size)
275*33de042dSApple OSS Distributions {
276*33de042dSApple OSS Distributions 	mach_vm_address_t saved_start = *start;
277*33de042dSApple OSS Distributions 	mach_vm_address_t minus_two_kb16 = -2 * KB16;
278*33de042dSApple OSS Distributions 	if (*start + size >= minus_two_kb16) {
279*33de042dSApple OSS Distributions 		// Allocation actually works fine here. Deallocation does not.
280*33de042dSApple OSS Distributions 		// It triggers a end < start assertion in pmap. Seems like some offset is added to the end of the region, which is -KB16 in these cases which overflows.
281*33de042dSApple OSS Distributions 		return PANIC;
282*33de042dSApple OSS Distributions 	}
283*33de042dSApple OSS Distributions 	kern_return_t kr = mach_vm_allocate_kernel(map, start, size,
284*33de042dSApple OSS Distributions 	    FLAGS_AND_TAG(VM_FLAGS_ANYWHERE, VM_KERN_MEMORY_OSFMK));
285*33de042dSApple OSS Distributions 	check_mach_vm_allocate_outparam_changes(&kr, *start, size, saved_start, VM_FLAGS_ANYWHERE, map);
286*33de042dSApple OSS Distributions 	return kr;
287*33de042dSApple OSS Distributions }
288*33de042dSApple OSS Distributions 
289*33de042dSApple OSS Distributions 
290*33de042dSApple OSS Distributions 
291*33de042dSApple OSS Distributions static kern_return_t
call_vm_allocate__flags(MAP_T map,mach_vm_address_t * start,mach_vm_size_t size,int flags)292*33de042dSApple OSS Distributions call_vm_allocate__flags(MAP_T map, mach_vm_address_t * start, mach_vm_size_t size, int flags)
293*33de042dSApple OSS Distributions {
294*33de042dSApple OSS Distributions 	mach_vm_address_t saved_start = *start;
295*33de042dSApple OSS Distributions 	kern_return_t kr = vm_allocate(map, (vm_address_t *) start, (vm_size_t) size, flags);
296*33de042dSApple OSS Distributions 	check_mach_vm_allocate_outparam_changes(&kr, *start, size, saved_start, flags, map);
297*33de042dSApple OSS Distributions 	return kr;
298*33de042dSApple OSS Distributions }
299*33de042dSApple OSS Distributions 
300*33de042dSApple OSS Distributions static kern_return_t
call_vm_allocate__start_size_fixed(MAP_T map,mach_vm_address_t * start,mach_vm_size_t size)301*33de042dSApple OSS Distributions call_vm_allocate__start_size_fixed(MAP_T map, mach_vm_address_t * start, mach_vm_size_t size)
302*33de042dSApple OSS Distributions {
303*33de042dSApple OSS Distributions 	mach_vm_address_t saved_start = *start;
304*33de042dSApple OSS Distributions 	kern_return_t kr = vm_allocate(map, (vm_address_t *) start, (vm_size_t) size, VM_FLAGS_FIXED);
305*33de042dSApple OSS Distributions 	check_mach_vm_allocate_outparam_changes(&kr, *start, size, saved_start, VM_FLAGS_FIXED, map);
306*33de042dSApple OSS Distributions 	return kr;
307*33de042dSApple OSS Distributions }
308*33de042dSApple OSS Distributions 
309*33de042dSApple OSS Distributions static kern_return_t
call_vm_allocate__start_size_anywhere(MAP_T map,mach_vm_address_t * start,mach_vm_size_t size)310*33de042dSApple OSS Distributions call_vm_allocate__start_size_anywhere(MAP_T map, mach_vm_address_t * start, mach_vm_size_t size)
311*33de042dSApple OSS Distributions {
312*33de042dSApple OSS Distributions 	mach_vm_address_t saved_start = *start;
313*33de042dSApple OSS Distributions 	kern_return_t kr = vm_allocate(map, (vm_address_t *) start, (vm_size_t) size, VM_FLAGS_ANYWHERE);
314*33de042dSApple OSS Distributions 	check_mach_vm_allocate_outparam_changes(&kr, *start, size, saved_start, VM_FLAGS_ANYWHERE, map);
315*33de042dSApple OSS Distributions 	return kr;
316*33de042dSApple OSS Distributions }
317*33de042dSApple OSS Distributions 
318*33de042dSApple OSS Distributions static kern_return_t
call_mach_vm_deallocate(MAP_T map,mach_vm_address_t start,mach_vm_size_t size)319*33de042dSApple OSS Distributions call_mach_vm_deallocate(MAP_T map, mach_vm_address_t start, mach_vm_size_t size)
320*33de042dSApple OSS Distributions {
321*33de042dSApple OSS Distributions 	kern_return_t kr = mach_vm_deallocate(map, start, size);
322*33de042dSApple OSS Distributions 	return kr;
323*33de042dSApple OSS Distributions }
324*33de042dSApple OSS Distributions 
325*33de042dSApple OSS Distributions static kern_return_t
call_vm_deallocate(MAP_T map,mach_vm_address_t start,mach_vm_size_t size)326*33de042dSApple OSS Distributions call_vm_deallocate(MAP_T map, mach_vm_address_t start, mach_vm_size_t size)
327*33de042dSApple OSS Distributions {
328*33de042dSApple OSS Distributions 	kern_return_t kr = vm_deallocate(map, (vm_address_t) start, (vm_size_t) size);
329*33de042dSApple OSS Distributions 	return kr;
330*33de042dSApple OSS Distributions }
331*33de042dSApple OSS Distributions 
332*33de042dSApple OSS Distributions // Including sys/systm.h caused things to blow up
333*33de042dSApple OSS Distributions int     vslock(user_addr_t addr, user_size_t len);
334*33de042dSApple OSS Distributions int     vsunlock(user_addr_t addr, user_size_t len, int dirtied);
335*33de042dSApple OSS Distributions static int
call_vslock(void * start,size_t size)336*33de042dSApple OSS Distributions call_vslock(void * start, size_t size)
337*33de042dSApple OSS Distributions {
338*33de042dSApple OSS Distributions 	int kr = vslock((user_addr_t) start, (user_size_t) size);
339*33de042dSApple OSS Distributions 	if (kr == KERN_SUCCESS) {
340*33de042dSApple OSS Distributions 		(void) vsunlock((user_addr_t) start, (user_size_t) size, 0);
341*33de042dSApple OSS Distributions 	}
342*33de042dSApple OSS Distributions 
343*33de042dSApple OSS Distributions 	return kr;
344*33de042dSApple OSS Distributions }
345*33de042dSApple OSS Distributions 
346*33de042dSApple OSS Distributions static int
call_vsunlock_undirtied(void * start,size_t size)347*33de042dSApple OSS Distributions call_vsunlock_undirtied(void * start, size_t size)
348*33de042dSApple OSS Distributions {
349*33de042dSApple OSS Distributions 	int kr = vslock((user_addr_t) start, (user_size_t) size);
350*33de042dSApple OSS Distributions 	if (kr == EINVAL) {
351*33de042dSApple OSS Distributions 		// Invalid vslock arguments should also be
352*33de042dSApple OSS Distributions 		// invalid vsunlock arguments. Test it.
353*33de042dSApple OSS Distributions 	} else if (kr != KERN_SUCCESS) {
354*33de042dSApple OSS Distributions 		// vslock failed, and vsunlock of non-locked memory panics
355*33de042dSApple OSS Distributions 		return PANIC;
356*33de042dSApple OSS Distributions 	}
357*33de042dSApple OSS Distributions 	kr = vsunlock((user_addr_t) start, (user_size_t) size, 0);
358*33de042dSApple OSS Distributions 	return kr;
359*33de042dSApple OSS Distributions }
360*33de042dSApple OSS Distributions 
361*33de042dSApple OSS Distributions static int
call_vsunlock_dirtied(void * start,size_t size)362*33de042dSApple OSS Distributions call_vsunlock_dirtied(void * start, size_t size)
363*33de042dSApple OSS Distributions {
364*33de042dSApple OSS Distributions 	int kr = vslock((user_addr_t) start, (user_size_t) size);
365*33de042dSApple OSS Distributions 	if (kr == EINVAL) {
366*33de042dSApple OSS Distributions 		// Invalid vslock arguments should also be
367*33de042dSApple OSS Distributions 		// invalid vsunlock arguments. Test it.
368*33de042dSApple OSS Distributions 	} else if (kr != KERN_SUCCESS) {
369*33de042dSApple OSS Distributions 		// vslock failed, and vsunlock of non-locked memory panics
370*33de042dSApple OSS Distributions 		return PANIC;
371*33de042dSApple OSS Distributions 	}
372*33de042dSApple OSS Distributions 	kr = vsunlock((user_addr_t) start, (user_size_t) size, 1);
373*33de042dSApple OSS Distributions 	return kr;
374*33de042dSApple OSS Distributions }
375*33de042dSApple OSS Distributions 
376*33de042dSApple OSS Distributions #if XNU_PLATFORM_MacOSX
377*33de042dSApple OSS Distributions // vm_map_wire_and_extract() implemented on macOS only
378*33de042dSApple OSS Distributions 
379*33de042dSApple OSS Distributions static inline void
check_vm_map_wire_and_extract_out_params_changes(kern_return_t * kr,ppnum_t physpage)380*33de042dSApple OSS Distributions check_vm_map_wire_and_extract_out_params_changes(kern_return_t * kr, ppnum_t physpage)
381*33de042dSApple OSS Distributions {
382*33de042dSApple OSS Distributions 	if (*kr != KERN_SUCCESS) {
383*33de042dSApple OSS Distributions 		if (physpage != 0) {
384*33de042dSApple OSS Distributions 			*kr = OUT_PARAM_BAD;
385*33de042dSApple OSS Distributions 		}
386*33de042dSApple OSS Distributions 	}
387*33de042dSApple OSS Distributions }
388*33de042dSApple OSS Distributions 
389*33de042dSApple OSS Distributions 
390*33de042dSApple OSS Distributions static kern_return_t
call_vm_map_wire_and_extract_user_wired(MAP_T map,mach_vm_address_t start)391*33de042dSApple OSS Distributions call_vm_map_wire_and_extract_user_wired(MAP_T map, mach_vm_address_t start)
392*33de042dSApple OSS Distributions {
393*33de042dSApple OSS Distributions 	if (will_wire_function_panic_due_to_alignment(start, start + VM_MAP_PAGE_SIZE(map))) {
394*33de042dSApple OSS Distributions 		return PANIC;
395*33de042dSApple OSS Distributions 	}
396*33de042dSApple OSS Distributions 	if (will_wire_function_panic_due_to_vm_tag(start)) {
397*33de042dSApple OSS Distributions 		return BUSTED;
398*33de042dSApple OSS Distributions 	}
399*33de042dSApple OSS Distributions 
400*33de042dSApple OSS Distributions 	ppnum_t physpage = INVALID_INITIAL_PPNUM;
401*33de042dSApple OSS Distributions 	kern_return_t kr = vm_map_wire_and_extract(map, start, VM_PROT_DEFAULT, TRUE, &physpage);
402*33de042dSApple OSS Distributions 	check_vm_map_wire_and_extract_out_params_changes(&kr, physpage);
403*33de042dSApple OSS Distributions 	return kr;
404*33de042dSApple OSS Distributions }
405*33de042dSApple OSS Distributions 
406*33de042dSApple OSS Distributions static kern_return_t
call_vm_map_wire_and_extract_non_user_wired(MAP_T map,mach_vm_address_t start)407*33de042dSApple OSS Distributions call_vm_map_wire_and_extract_non_user_wired(MAP_T map, mach_vm_address_t start)
408*33de042dSApple OSS Distributions {
409*33de042dSApple OSS Distributions 	if (will_wire_function_panic_due_to_alignment(start, start + VM_MAP_PAGE_SIZE(map))) {
410*33de042dSApple OSS Distributions 		return PANIC;
411*33de042dSApple OSS Distributions 	}
412*33de042dSApple OSS Distributions 	if (will_wire_function_panic_due_to_vm_tag(start)) {
413*33de042dSApple OSS Distributions 		return BUSTED;
414*33de042dSApple OSS Distributions 	}
415*33de042dSApple OSS Distributions 	ppnum_t physpage = INVALID_INITIAL_PPNUM;
416*33de042dSApple OSS Distributions 	kern_return_t kr = vm_map_wire_and_extract(map, start, VM_PROT_DEFAULT, FALSE, &physpage);
417*33de042dSApple OSS Distributions 	check_vm_map_wire_and_extract_out_params_changes(&kr, physpage);
418*33de042dSApple OSS Distributions 	return kr;
419*33de042dSApple OSS Distributions }
420*33de042dSApple OSS Distributions 
421*33de042dSApple OSS Distributions static kern_return_t
call_vm_map_wire_and_extract_vm_prot_t_user_wired(MAP_T map,mach_vm_address_t start,mach_vm_size_t size,vm_prot_t prot)422*33de042dSApple OSS Distributions call_vm_map_wire_and_extract_vm_prot_t_user_wired(MAP_T map, mach_vm_address_t start, mach_vm_size_t size, vm_prot_t prot)
423*33de042dSApple OSS Distributions {
424*33de042dSApple OSS Distributions 	(void) size;
425*33de042dSApple OSS Distributions 	if (will_wire_function_panic_due_to_alignment(start, start + VM_MAP_PAGE_SIZE(map))) {
426*33de042dSApple OSS Distributions 		return PANIC;
427*33de042dSApple OSS Distributions 	}
428*33de042dSApple OSS Distributions 	if (will_wire_function_panic_due_to_vm_tag(start)) {
429*33de042dSApple OSS Distributions 		return BUSTED;
430*33de042dSApple OSS Distributions 	}
431*33de042dSApple OSS Distributions 
432*33de042dSApple OSS Distributions 	ppnum_t physpage = INVALID_INITIAL_PPNUM;
433*33de042dSApple OSS Distributions 	kern_return_t kr = vm_map_wire_and_extract(map, start, prot, TRUE, &physpage);
434*33de042dSApple OSS Distributions 	check_vm_map_wire_and_extract_out_params_changes(&kr, physpage);
435*33de042dSApple OSS Distributions 	return kr;
436*33de042dSApple OSS Distributions }
437*33de042dSApple OSS Distributions 
438*33de042dSApple OSS Distributions static kern_return_t
call_vm_map_wire_and_extract_vm_prot_t_non_user_wired(MAP_T map,mach_vm_address_t start,mach_vm_size_t size,vm_prot_t prot)439*33de042dSApple OSS Distributions call_vm_map_wire_and_extract_vm_prot_t_non_user_wired(MAP_T map, mach_vm_address_t start, mach_vm_size_t size, vm_prot_t prot)
440*33de042dSApple OSS Distributions {
441*33de042dSApple OSS Distributions 	(void) size;
442*33de042dSApple OSS Distributions 	if (will_wire_function_panic_due_to_alignment(start, start + VM_MAP_PAGE_SIZE(map))) {
443*33de042dSApple OSS Distributions 		return PANIC;
444*33de042dSApple OSS Distributions 	}
445*33de042dSApple OSS Distributions 	if (will_wire_function_panic_due_to_vm_tag(start)) {
446*33de042dSApple OSS Distributions 		return BUSTED;
447*33de042dSApple OSS Distributions 	}
448*33de042dSApple OSS Distributions 
449*33de042dSApple OSS Distributions 	ppnum_t physpage = INVALID_INITIAL_PPNUM;
450*33de042dSApple OSS Distributions 	kern_return_t kr = vm_map_wire_and_extract(map, start, prot, FALSE, &physpage);
451*33de042dSApple OSS Distributions 	check_vm_map_wire_and_extract_out_params_changes(&kr, physpage);
452*33de042dSApple OSS Distributions 	return kr;
453*33de042dSApple OSS Distributions }
454*33de042dSApple OSS Distributions 
455*33de042dSApple OSS Distributions #endif // XNU_PLATFORM_MacOSX
456*33de042dSApple OSS Distributions 
457*33de042dSApple OSS Distributions extern kern_return_t    vm_map_wire_external(
458*33de042dSApple OSS Distributions 	vm_map_t                map,
459*33de042dSApple OSS Distributions 	vm_map_offset_t         start,
460*33de042dSApple OSS Distributions 	vm_map_offset_t         end,
461*33de042dSApple OSS Distributions 	vm_prot_t               access_type,
462*33de042dSApple OSS Distributions 	boolean_t               user_wire);
463*33de042dSApple OSS Distributions 
464*33de042dSApple OSS Distributions static kern_return_t
call_vm_map_wire_external_user_wired(MAP_T map,mach_vm_address_t start,mach_vm_address_t end)465*33de042dSApple OSS Distributions call_vm_map_wire_external_user_wired(MAP_T map, mach_vm_address_t start, mach_vm_address_t end)
466*33de042dSApple OSS Distributions {
467*33de042dSApple OSS Distributions 	if (will_wire_function_panic_due_to_alignment(start, end)) {
468*33de042dSApple OSS Distributions 		return PANIC;
469*33de042dSApple OSS Distributions 	}
470*33de042dSApple OSS Distributions 	if (will_wire_function_panic_due_to_vm_tag(start)) {
471*33de042dSApple OSS Distributions 		return BUSTED;
472*33de042dSApple OSS Distributions 	}
473*33de042dSApple OSS Distributions 
474*33de042dSApple OSS Distributions 	kern_return_t kr = vm_map_wire_external(map, start, end, VM_PROT_DEFAULT, TRUE);
475*33de042dSApple OSS Distributions 	return kr;
476*33de042dSApple OSS Distributions }
477*33de042dSApple OSS Distributions 
478*33de042dSApple OSS Distributions static kern_return_t
call_vm_map_wire_external_non_user_wired(MAP_T map,mach_vm_address_t start,mach_vm_address_t end)479*33de042dSApple OSS Distributions call_vm_map_wire_external_non_user_wired(MAP_T map, mach_vm_address_t start, mach_vm_address_t end)
480*33de042dSApple OSS Distributions {
481*33de042dSApple OSS Distributions 	if (will_wire_function_panic_due_to_alignment(start, end)) {
482*33de042dSApple OSS Distributions 		return PANIC;
483*33de042dSApple OSS Distributions 	}
484*33de042dSApple OSS Distributions 	if (will_wire_function_panic_due_to_vm_tag(start)) {
485*33de042dSApple OSS Distributions 		return BUSTED;
486*33de042dSApple OSS Distributions 	}
487*33de042dSApple OSS Distributions 
488*33de042dSApple OSS Distributions 	kern_return_t kr = vm_map_wire_external(map, start, end, VM_PROT_DEFAULT, FALSE);
489*33de042dSApple OSS Distributions 	if (kr == KERN_SUCCESS) {
490*33de042dSApple OSS Distributions 		(void) vm_map_unwire(map, start, end, FALSE);
491*33de042dSApple OSS Distributions 	}
492*33de042dSApple OSS Distributions 	return kr;
493*33de042dSApple OSS Distributions }
494*33de042dSApple OSS Distributions 
495*33de042dSApple OSS Distributions static kern_return_t
call_vm_map_wire_kernel_user_wired(MAP_T map,mach_vm_address_t start,mach_vm_address_t end)496*33de042dSApple OSS Distributions call_vm_map_wire_kernel_user_wired(MAP_T map, mach_vm_address_t start, mach_vm_address_t end)
497*33de042dSApple OSS Distributions {
498*33de042dSApple OSS Distributions 	if (will_wire_function_panic_due_to_alignment(start, end)) {
499*33de042dSApple OSS Distributions 		return PANIC;
500*33de042dSApple OSS Distributions 	}
501*33de042dSApple OSS Distributions 	kern_return_t kr = vm_map_wire_kernel(map, start, end, VM_PROT_DEFAULT, VM_KERN_MEMORY_OSFMK, TRUE);
502*33de042dSApple OSS Distributions 	return kr;
503*33de042dSApple OSS Distributions }
504*33de042dSApple OSS Distributions 
505*33de042dSApple OSS Distributions static kern_return_t
call_vm_map_wire_kernel_non_user_wired(MAP_T map,mach_vm_address_t start,mach_vm_address_t end)506*33de042dSApple OSS Distributions call_vm_map_wire_kernel_non_user_wired(MAP_T map, mach_vm_address_t start, mach_vm_address_t end)
507*33de042dSApple OSS Distributions {
508*33de042dSApple OSS Distributions 	if (will_wire_function_panic_due_to_alignment(start, end)) {
509*33de042dSApple OSS Distributions 		return PANIC;
510*33de042dSApple OSS Distributions 	}
511*33de042dSApple OSS Distributions 	kern_return_t kr = vm_map_wire_kernel(map, start, end, VM_PROT_DEFAULT, VM_KERN_MEMORY_OSFMK, FALSE);
512*33de042dSApple OSS Distributions 	if (kr == KERN_SUCCESS) {
513*33de042dSApple OSS Distributions 		(void) vm_map_unwire(map, start, end, FALSE);
514*33de042dSApple OSS Distributions 	}
515*33de042dSApple OSS Distributions 	return kr;
516*33de042dSApple OSS Distributions }
517*33de042dSApple OSS Distributions 
518*33de042dSApple OSS Distributions static kern_return_t
call_vm_map_wire_external_vm_prot_t_user_wired(MAP_T map,mach_vm_address_t start,mach_vm_size_t size,vm_prot_t prot)519*33de042dSApple OSS Distributions call_vm_map_wire_external_vm_prot_t_user_wired(MAP_T map, mach_vm_address_t start, mach_vm_size_t size, vm_prot_t prot)
520*33de042dSApple OSS Distributions {
521*33de042dSApple OSS Distributions 	mach_vm_address_t end;
522*33de042dSApple OSS Distributions 	if (__builtin_add_overflow(start, size, &end)) {
523*33de042dSApple OSS Distributions 		return BUSTED;
524*33de042dSApple OSS Distributions 	}
525*33de042dSApple OSS Distributions 
526*33de042dSApple OSS Distributions 	if (will_wire_function_panic_due_to_alignment(start, end)) {
527*33de042dSApple OSS Distributions 		return PANIC;
528*33de042dSApple OSS Distributions 	}
529*33de042dSApple OSS Distributions 	if (will_wire_function_panic_due_to_vm_tag(start)) {
530*33de042dSApple OSS Distributions 		return BUSTED;
531*33de042dSApple OSS Distributions 	}
532*33de042dSApple OSS Distributions 
533*33de042dSApple OSS Distributions 
534*33de042dSApple OSS Distributions 	ppnum_t physpage;
535*33de042dSApple OSS Distributions 	kern_return_t kr = vm_map_wire_external(map, start, end, prot, TRUE);
536*33de042dSApple OSS Distributions 	return kr;
537*33de042dSApple OSS Distributions }
538*33de042dSApple OSS Distributions 
539*33de042dSApple OSS Distributions static kern_return_t
call_vm_map_wire_external_vm_prot_t_non_user_wired(MAP_T map,mach_vm_address_t start,mach_vm_size_t size,vm_prot_t prot)540*33de042dSApple OSS Distributions call_vm_map_wire_external_vm_prot_t_non_user_wired(MAP_T map, mach_vm_address_t start, mach_vm_size_t size, vm_prot_t prot)
541*33de042dSApple OSS Distributions {
542*33de042dSApple OSS Distributions 	mach_vm_address_t end;
543*33de042dSApple OSS Distributions 	if (__builtin_add_overflow(start, size, &end)) {
544*33de042dSApple OSS Distributions 		return BUSTED;
545*33de042dSApple OSS Distributions 	}
546*33de042dSApple OSS Distributions 	if (will_wire_function_panic_due_to_alignment(start, end)) {
547*33de042dSApple OSS Distributions 		return PANIC;
548*33de042dSApple OSS Distributions 	}
549*33de042dSApple OSS Distributions 	if (will_wire_function_panic_due_to_vm_tag(start)) {
550*33de042dSApple OSS Distributions 		return BUSTED;
551*33de042dSApple OSS Distributions 	}
552*33de042dSApple OSS Distributions 
553*33de042dSApple OSS Distributions 
554*33de042dSApple OSS Distributions 	ppnum_t physpage;
555*33de042dSApple OSS Distributions 	kern_return_t kr = vm_map_wire_external(map, start, end, prot, FALSE);
556*33de042dSApple OSS Distributions 	if (kr == KERN_SUCCESS) {
557*33de042dSApple OSS Distributions 		(void) vm_map_unwire(map, start, end, FALSE);
558*33de042dSApple OSS Distributions 	}
559*33de042dSApple OSS Distributions 	return kr;
560*33de042dSApple OSS Distributions }
561*33de042dSApple OSS Distributions 
562*33de042dSApple OSS Distributions static kern_return_t
call_vm_map_wire_kernel_vm_prot_t_user_wired(MAP_T map,mach_vm_address_t start,mach_vm_size_t size,vm_prot_t prot)563*33de042dSApple OSS Distributions call_vm_map_wire_kernel_vm_prot_t_user_wired(MAP_T map, mach_vm_address_t start, mach_vm_size_t size, vm_prot_t prot)
564*33de042dSApple OSS Distributions {
565*33de042dSApple OSS Distributions 	mach_vm_address_t end;
566*33de042dSApple OSS Distributions 	if (__builtin_add_overflow(start, size, &end)) {
567*33de042dSApple OSS Distributions 		return BUSTED;
568*33de042dSApple OSS Distributions 	}
569*33de042dSApple OSS Distributions 	if (will_wire_function_panic_due_to_alignment(start, end)) {
570*33de042dSApple OSS Distributions 		return PANIC;
571*33de042dSApple OSS Distributions 	}
572*33de042dSApple OSS Distributions 
573*33de042dSApple OSS Distributions 	ppnum_t physpage;
574*33de042dSApple OSS Distributions 	kern_return_t kr = vm_map_wire_kernel(map, start, end, prot, VM_KERN_MEMORY_OSFMK, TRUE);
575*33de042dSApple OSS Distributions 	return kr;
576*33de042dSApple OSS Distributions }
577*33de042dSApple OSS Distributions 
578*33de042dSApple OSS Distributions static kern_return_t
call_vm_map_wire_kernel_vm_prot_t_non_user_wired(MAP_T map,mach_vm_address_t start,mach_vm_size_t size,vm_prot_t prot)579*33de042dSApple OSS Distributions call_vm_map_wire_kernel_vm_prot_t_non_user_wired(MAP_T map, mach_vm_address_t start, mach_vm_size_t size, vm_prot_t prot)
580*33de042dSApple OSS Distributions {
581*33de042dSApple OSS Distributions 	mach_vm_address_t end;
582*33de042dSApple OSS Distributions 	if (__builtin_add_overflow(start, size, &end)) {
583*33de042dSApple OSS Distributions 		return BUSTED;
584*33de042dSApple OSS Distributions 	}
585*33de042dSApple OSS Distributions 	if (will_wire_function_panic_due_to_alignment(start, end)) {
586*33de042dSApple OSS Distributions 		return PANIC;
587*33de042dSApple OSS Distributions 	}
588*33de042dSApple OSS Distributions 
589*33de042dSApple OSS Distributions 	ppnum_t physpage;
590*33de042dSApple OSS Distributions 	kern_return_t kr = vm_map_wire_kernel(map, start, end, prot, VM_KERN_MEMORY_OSFMK, FALSE);
591*33de042dSApple OSS Distributions 	if (kr == KERN_SUCCESS) {
592*33de042dSApple OSS Distributions 		(void) vm_map_unwire(map, start, end, FALSE);
593*33de042dSApple OSS Distributions 	}
594*33de042dSApple OSS Distributions 	return kr;
595*33de042dSApple OSS Distributions }
596*33de042dSApple OSS Distributions 
597*33de042dSApple OSS Distributions 
598*33de042dSApple OSS Distributions static kern_return_t
call_vm_map_kernel_tag_user_wired(MAP_T map,mach_vm_address_t start,mach_vm_address_t end,vm_tag_t tag)599*33de042dSApple OSS Distributions call_vm_map_kernel_tag_user_wired(MAP_T map, mach_vm_address_t start, mach_vm_address_t end, vm_tag_t tag)
600*33de042dSApple OSS Distributions {
601*33de042dSApple OSS Distributions 	if (will_wire_function_panic_due_to_alignment(start, end)) {
602*33de042dSApple OSS Distributions 		return PANIC;
603*33de042dSApple OSS Distributions 	}
604*33de042dSApple OSS Distributions 	if (tag == VM_KERN_MEMORY_NONE) {
605*33de042dSApple OSS Distributions 		return PANIC;
606*33de042dSApple OSS Distributions 	}
607*33de042dSApple OSS Distributions 	kern_return_t kr = vm_map_wire_kernel(map, start, end, VM_PROT_DEFAULT, tag, TRUE);
608*33de042dSApple OSS Distributions 	if (kr == KERN_SUCCESS) {
609*33de042dSApple OSS Distributions 		(void) vm_map_unwire(map, start, end, TRUE);
610*33de042dSApple OSS Distributions 	}
611*33de042dSApple OSS Distributions 	return kr;
612*33de042dSApple OSS Distributions }
613*33de042dSApple OSS Distributions 
614*33de042dSApple OSS Distributions static kern_return_t
call_vm_map_kernel_tag_non_user_wired(MAP_T map,mach_vm_address_t start,mach_vm_address_t end,vm_tag_t tag)615*33de042dSApple OSS Distributions call_vm_map_kernel_tag_non_user_wired(MAP_T map, mach_vm_address_t start, mach_vm_address_t end, vm_tag_t tag)
616*33de042dSApple OSS Distributions {
617*33de042dSApple OSS Distributions 	if (will_wire_function_panic_due_to_alignment(start, end)) {
618*33de042dSApple OSS Distributions 		return PANIC;
619*33de042dSApple OSS Distributions 	}
620*33de042dSApple OSS Distributions 	if (tag == VM_KERN_MEMORY_NONE) {
621*33de042dSApple OSS Distributions 		return PANIC;
622*33de042dSApple OSS Distributions 	}
623*33de042dSApple OSS Distributions 	kern_return_t kr = vm_map_wire_kernel(map, start, end, VM_PROT_DEFAULT, tag, FALSE);
624*33de042dSApple OSS Distributions 	if (kr == KERN_SUCCESS) {
625*33de042dSApple OSS Distributions 		(void) vm_map_unwire(map, start, end, FALSE);
626*33de042dSApple OSS Distributions 	}
627*33de042dSApple OSS Distributions 	return kr;
628*33de042dSApple OSS Distributions }
629*33de042dSApple OSS Distributions 
630*33de042dSApple OSS Distributions 
631*33de042dSApple OSS Distributions static kern_return_t
call_mach_vm_wire_level_monitor(int64_t requested_pages)632*33de042dSApple OSS Distributions call_mach_vm_wire_level_monitor(int64_t requested_pages)
633*33de042dSApple OSS Distributions {
634*33de042dSApple OSS Distributions 	kern_return_t kr = mach_vm_wire_level_monitor(requested_pages);
635*33de042dSApple OSS Distributions 	return kr;
636*33de042dSApple OSS Distributions }
637*33de042dSApple OSS Distributions 
638*33de042dSApple OSS Distributions static kern_return_t
call_vm_map_unwire_user_wired(MAP_T map,mach_vm_address_t start,mach_vm_address_t end)639*33de042dSApple OSS Distributions call_vm_map_unwire_user_wired(MAP_T map, mach_vm_address_t start, mach_vm_address_t end)
640*33de042dSApple OSS Distributions {
641*33de042dSApple OSS Distributions 	if (will_wire_function_panic_due_to_alignment(start, end)) {
642*33de042dSApple OSS Distributions 		return PANIC;
643*33de042dSApple OSS Distributions 	}
644*33de042dSApple OSS Distributions 
645*33de042dSApple OSS Distributions 	kern_return_t kr = vm_map_unwire(map, start, end, TRUE);
646*33de042dSApple OSS Distributions 	return kr;
647*33de042dSApple OSS Distributions }
648*33de042dSApple OSS Distributions 
649*33de042dSApple OSS Distributions 
650*33de042dSApple OSS Distributions static kern_return_t
call_vm_map_unwire_non_user_wired(MAP_T map,mach_vm_address_t start,mach_vm_address_t end)651*33de042dSApple OSS Distributions call_vm_map_unwire_non_user_wired(MAP_T map, mach_vm_address_t start, mach_vm_address_t end)
652*33de042dSApple OSS Distributions {
653*33de042dSApple OSS Distributions 	if (will_wire_function_panic_due_to_alignment(start, end)) {
654*33de042dSApple OSS Distributions 		return PANIC;
655*33de042dSApple OSS Distributions 	}
656*33de042dSApple OSS Distributions 
657*33de042dSApple OSS Distributions 	kern_return_t kr = vm_map_wire_kernel(map, start, end, VM_PROT_DEFAULT, VM_KERN_MEMORY_OSFMK, FALSE);
658*33de042dSApple OSS Distributions 	if (kr) {
659*33de042dSApple OSS Distributions 		return PANIC;
660*33de042dSApple OSS Distributions 	}
661*33de042dSApple OSS Distributions 	kr = vm_map_unwire(map, start, end, FALSE);
662*33de042dSApple OSS Distributions 	return kr;
663*33de042dSApple OSS Distributions }
664*33de042dSApple OSS Distributions 
665*33de042dSApple OSS Distributions #ifndef __x86_64__
666*33de042dSApple OSS Distributions extern const vm_map_address_t physmap_base;
667*33de042dSApple OSS Distributions extern const vm_map_address_t physmap_end;
668*33de042dSApple OSS Distributions #endif
669*33de042dSApple OSS Distributions 
670*33de042dSApple OSS Distributions /*
671*33de042dSApple OSS Distributions  * This function duplicates the panicking checks done in copy_validate.
672*33de042dSApple OSS Distributions  * size==0 is returned as success earlier in copyin/out than copy_validate is called, so we ignore that case.
673*33de042dSApple OSS Distributions  */
674*33de042dSApple OSS Distributions static bool
will_copyio_panic_in_copy_validate(void * kernel_addr,vm_size_t size)675*33de042dSApple OSS Distributions will_copyio_panic_in_copy_validate(void *kernel_addr, vm_size_t size)
676*33de042dSApple OSS Distributions {
677*33de042dSApple OSS Distributions 	if (size == 0) {
678*33de042dSApple OSS Distributions 		return false;
679*33de042dSApple OSS Distributions 	}
680*33de042dSApple OSS Distributions 	extern const int copysize_limit_panic;
681*33de042dSApple OSS Distributions 	if (size > copysize_limit_panic) {
682*33de042dSApple OSS Distributions 		return true;
683*33de042dSApple OSS Distributions 	}
684*33de042dSApple OSS Distributions 
685*33de042dSApple OSS Distributions 	/*
686*33de042dSApple OSS Distributions 	 * copyio is architecture specific and has different checks per arch.
687*33de042dSApple OSS Distributions 	 */
688*33de042dSApple OSS Distributions #ifdef __x86_64__
689*33de042dSApple OSS Distributions 	if ((vm_offset_t) kernel_addr < VM_MIN_KERNEL_AND_KEXT_ADDRESS) {
690*33de042dSApple OSS Distributions 		return true;
691*33de042dSApple OSS Distributions 	}
692*33de042dSApple OSS Distributions #else /* not __x86_64__ */
693*33de042dSApple OSS Distributions 	uintptr_t kernel_addr_last;
694*33de042dSApple OSS Distributions 	if (os_add_overflow((uintptr_t) kernel_addr, size, &kernel_addr_last)) {
695*33de042dSApple OSS Distributions 		return true;
696*33de042dSApple OSS Distributions 	}
697*33de042dSApple OSS Distributions 
698*33de042dSApple OSS Distributions 	bool in_kva = (VM_KERNEL_STRIP_UPTR(kernel_addr) >= VM_MIN_KERNEL_ADDRESS) &&
699*33de042dSApple OSS Distributions 	    (VM_KERNEL_STRIP_UPTR(kernel_addr_last) <= VM_MAX_KERNEL_ADDRESS);
700*33de042dSApple OSS Distributions 	bool in_physmap = (VM_KERNEL_STRIP_UPTR(kernel_addr) >= physmap_base) &&
701*33de042dSApple OSS Distributions 	    (VM_KERNEL_STRIP_UPTR(kernel_addr_last) <= physmap_end);
702*33de042dSApple OSS Distributions 
703*33de042dSApple OSS Distributions 	if (!(in_kva || in_physmap)) {
704*33de042dSApple OSS Distributions 		return true;
705*33de042dSApple OSS Distributions 	}
706*33de042dSApple OSS Distributions #endif /* not __x86_64__ */
707*33de042dSApple OSS Distributions 
708*33de042dSApple OSS Distributions 	return false;
709*33de042dSApple OSS Distributions }
710*33de042dSApple OSS Distributions 
711*33de042dSApple OSS Distributions static kern_return_t
call_copyinmap(MAP_T map,vm_map_offset_t fromaddr,void * todata,vm_size_t length)712*33de042dSApple OSS Distributions call_copyinmap(MAP_T map, vm_map_offset_t fromaddr, void * todata, vm_size_t length)
713*33de042dSApple OSS Distributions {
714*33de042dSApple OSS Distributions 	if (will_copyio_panic_in_copy_validate(todata, length)) {
715*33de042dSApple OSS Distributions 		return PANIC;
716*33de042dSApple OSS Distributions 	}
717*33de042dSApple OSS Distributions 
718*33de042dSApple OSS Distributions 	kern_return_t kr = copyinmap(map, fromaddr, todata, length);
719*33de042dSApple OSS Distributions 	return kr;
720*33de042dSApple OSS Distributions }
721*33de042dSApple OSS Distributions 
722*33de042dSApple OSS Distributions static kern_return_t
call_copyoutmap(MAP_T map,void * fromdata,vm_map_offset_t toaddr,vm_size_t length)723*33de042dSApple OSS Distributions call_copyoutmap(MAP_T map, void * fromdata, vm_map_offset_t toaddr, vm_size_t length)
724*33de042dSApple OSS Distributions {
725*33de042dSApple OSS Distributions 	if (will_copyio_panic_in_copy_validate(fromdata, length)) {
726*33de042dSApple OSS Distributions 		return PANIC;
727*33de042dSApple OSS Distributions 	}
728*33de042dSApple OSS Distributions 
729*33de042dSApple OSS Distributions 	kern_return_t kr = copyoutmap(map, fromdata, toaddr, length);
730*33de042dSApple OSS Distributions 	return kr;
731*33de042dSApple OSS Distributions }
732*33de042dSApple OSS Distributions 
733*33de042dSApple OSS Distributions static kern_return_t
call_vm_map_read_user(MAP_T map,vm_map_address_t src_addr,void * ptr,vm_size_t size)734*33de042dSApple OSS Distributions call_vm_map_read_user(MAP_T map, vm_map_address_t src_addr, void * ptr, vm_size_t size)
735*33de042dSApple OSS Distributions {
736*33de042dSApple OSS Distributions 	if (will_copyio_panic_in_copy_validate(ptr, size)) {
737*33de042dSApple OSS Distributions 		return PANIC;
738*33de042dSApple OSS Distributions 	}
739*33de042dSApple OSS Distributions 
740*33de042dSApple OSS Distributions 	kern_return_t kr = vm_map_read_user(map, src_addr, ptr, size);
741*33de042dSApple OSS Distributions 	return kr;
742*33de042dSApple OSS Distributions }
743*33de042dSApple OSS Distributions 
744*33de042dSApple OSS Distributions static kern_return_t
call_vm_map_write_user(MAP_T map,void * ptr,vm_map_address_t dst_addr,vm_size_t size)745*33de042dSApple OSS Distributions call_vm_map_write_user(MAP_T map, void * ptr, vm_map_address_t dst_addr, vm_size_t size)
746*33de042dSApple OSS Distributions {
747*33de042dSApple OSS Distributions 	if (will_copyio_panic_in_copy_validate(ptr, size)) {
748*33de042dSApple OSS Distributions 		return PANIC;
749*33de042dSApple OSS Distributions 	}
750*33de042dSApple OSS Distributions 
751*33de042dSApple OSS Distributions 	kern_return_t kr = vm_map_write_user(map, ptr, dst_addr, size);
752*33de042dSApple OSS Distributions 	return kr;
753*33de042dSApple OSS Distributions }
754*33de042dSApple OSS Distributions 
755*33de042dSApple OSS Distributions static kern_return_t
call_vm_map_copyout(MAP_T dst_map,vm_map_copy_t copy)756*33de042dSApple OSS Distributions call_vm_map_copyout(MAP_T dst_map, vm_map_copy_t copy)
757*33de042dSApple OSS Distributions {
758*33de042dSApple OSS Distributions 	// save this value because `copy` is destroyed by vm_map_copyout_size()
759*33de042dSApple OSS Distributions 	mach_vm_size_t copy_size = copy ? copy->size : 0;
760*33de042dSApple OSS Distributions 	vm_map_address_t dst_addr;
761*33de042dSApple OSS Distributions 	kern_return_t kr = vm_map_copyout(dst_map, &dst_addr, copy);
762*33de042dSApple OSS Distributions 	if (kr == KERN_SUCCESS) {
763*33de042dSApple OSS Distributions 		if (copy != NULL) {
764*33de042dSApple OSS Distributions 			(void) mach_vm_deallocate(dst_map, dst_addr, copy_size);
765*33de042dSApple OSS Distributions 		}
766*33de042dSApple OSS Distributions 	}
767*33de042dSApple OSS Distributions 	return kr;
768*33de042dSApple OSS Distributions }
769*33de042dSApple OSS Distributions 
770*33de042dSApple OSS Distributions static kern_return_t
call_vm_map_copyout_size(MAP_T dst_map,vm_map_copy_t copy,mach_vm_size_t size)771*33de042dSApple OSS Distributions call_vm_map_copyout_size(MAP_T dst_map, vm_map_copy_t copy, mach_vm_size_t size)
772*33de042dSApple OSS Distributions {
773*33de042dSApple OSS Distributions 	// save this value because `copy` is destroyed by vm_map_copyout_size()
774*33de042dSApple OSS Distributions 	mach_vm_size_t copy_size = copy ? copy->size : 0;
775*33de042dSApple OSS Distributions 	vm_map_address_t dst_addr;
776*33de042dSApple OSS Distributions 	kern_return_t kr = vm_map_copyout_size(dst_map, &dst_addr, copy, size);
777*33de042dSApple OSS Distributions 	if (kr == KERN_SUCCESS) {
778*33de042dSApple OSS Distributions 		if (copy != NULL) {
779*33de042dSApple OSS Distributions 			(void) mach_vm_deallocate(dst_map, dst_addr, copy_size);
780*33de042dSApple OSS Distributions 		}
781*33de042dSApple OSS Distributions 	}
782*33de042dSApple OSS Distributions 	return kr;
783*33de042dSApple OSS Distributions }
784*33de042dSApple OSS Distributions 
785*33de042dSApple OSS Distributions static kern_return_t
call_vm_map_copy_overwrite_interruptible(MAP_T dst_map,vm_map_copy_t copy,mach_vm_address_t dst_addr,mach_vm_size_t copy_size)786*33de042dSApple OSS Distributions call_vm_map_copy_overwrite_interruptible(MAP_T dst_map, vm_map_copy_t copy, mach_vm_address_t dst_addr, mach_vm_size_t copy_size)
787*33de042dSApple OSS Distributions {
788*33de042dSApple OSS Distributions 	kern_return_t kr = vm_map_copy_overwrite(dst_map, dst_addr, copy, copy_size, TRUE);
789*33de042dSApple OSS Distributions 	return kr;
790*33de042dSApple OSS Distributions }
791*33de042dSApple OSS Distributions 
792*33de042dSApple OSS Distributions static kern_return_t
call_vm_map_copy_overwrite_non_interruptible(MAP_T dst_map,vm_map_copy_t copy,mach_vm_address_t dst_addr,mach_vm_size_t copy_size)793*33de042dSApple OSS Distributions call_vm_map_copy_overwrite_non_interruptible(MAP_T dst_map, vm_map_copy_t copy, mach_vm_address_t dst_addr, mach_vm_size_t copy_size)
794*33de042dSApple OSS Distributions {
795*33de042dSApple OSS Distributions 	kern_return_t kr = vm_map_copy_overwrite(dst_map, dst_addr, copy, copy_size, FALSE);
796*33de042dSApple OSS Distributions 	return kr;
797*33de042dSApple OSS Distributions }
798*33de042dSApple OSS Distributions 
799*33de042dSApple OSS Distributions // Mach memory entry ownership
800*33de042dSApple OSS Distributions 
801*33de042dSApple OSS Distributions extern kern_return_t
802*33de042dSApple OSS Distributions mach_memory_entry_ownership(
803*33de042dSApple OSS Distributions 	ipc_port_t      entry_port,
804*33de042dSApple OSS Distributions 	task_t          owner,
805*33de042dSApple OSS Distributions 	int             ledger_tag,
806*33de042dSApple OSS Distributions 	int             ledger_flags);
807*33de042dSApple OSS Distributions 
808*33de042dSApple OSS Distributions static kern_return_t
call_mach_memory_entry_ownership__ledger_tag(MAP_T map __unused,int ledger_tag)809*33de042dSApple OSS Distributions call_mach_memory_entry_ownership__ledger_tag(MAP_T map __unused, int ledger_tag)
810*33de042dSApple OSS Distributions {
811*33de042dSApple OSS Distributions 	mach_port_t mementry = make_a_mem_entry(map, TEST_ALLOC_SIZE + 1);
812*33de042dSApple OSS Distributions 	kern_return_t kr = mach_memory_entry_ownership(mementry, TASK_NULL, ledger_tag, 0);
813*33de042dSApple OSS Distributions 	mach_memory_entry_port_release(mementry);
814*33de042dSApple OSS Distributions 	return kr;
815*33de042dSApple OSS Distributions }
816*33de042dSApple OSS Distributions 
817*33de042dSApple OSS Distributions static kern_return_t
call_mach_memory_entry_ownership__ledger_flag(MAP_T map __unused,int ledger_flag)818*33de042dSApple OSS Distributions call_mach_memory_entry_ownership__ledger_flag(MAP_T map __unused, int ledger_flag)
819*33de042dSApple OSS Distributions {
820*33de042dSApple OSS Distributions 	mach_port_t mementry = make_a_mem_entry(map, TEST_ALLOC_SIZE + 1);
821*33de042dSApple OSS Distributions 	kern_return_t kr = mach_memory_entry_ownership(mementry, TASK_NULL, VM_LEDGER_TAG_DEFAULT, ledger_flag);
822*33de042dSApple OSS Distributions 	mach_memory_entry_port_release(mementry);
823*33de042dSApple OSS Distributions 	return kr;
824*33de042dSApple OSS Distributions }
825*33de042dSApple OSS Distributions 
826*33de042dSApple OSS Distributions static inline void
check_mach_memory_entry_map_size_outparam_changes(kern_return_t * kr,mach_vm_size_t map_size,mach_vm_size_t invalid_initial_size)827*33de042dSApple OSS Distributions check_mach_memory_entry_map_size_outparam_changes(kern_return_t * kr, mach_vm_size_t map_size,
828*33de042dSApple OSS Distributions     mach_vm_size_t invalid_initial_size)
829*33de042dSApple OSS Distributions {
830*33de042dSApple OSS Distributions 	if (*kr == KERN_SUCCESS) {
831*33de042dSApple OSS Distributions 		if (map_size == invalid_initial_size) {
832*33de042dSApple OSS Distributions 			*kr = OUT_PARAM_BAD;
833*33de042dSApple OSS Distributions 		}
834*33de042dSApple OSS Distributions 	} else {
835*33de042dSApple OSS Distributions 		if (map_size != invalid_initial_size) {
836*33de042dSApple OSS Distributions 			*kr = OUT_PARAM_BAD;
837*33de042dSApple OSS Distributions 		}
838*33de042dSApple OSS Distributions 	}
839*33de042dSApple OSS Distributions }
840*33de042dSApple OSS Distributions 
841*33de042dSApple OSS Distributions static kern_return_t
call_mach_memory_entry_map_size__start_size(MAP_T map,mach_vm_address_t start,mach_vm_size_t size)842*33de042dSApple OSS Distributions call_mach_memory_entry_map_size__start_size(MAP_T map, mach_vm_address_t start, mach_vm_size_t size)
843*33de042dSApple OSS Distributions {
844*33de042dSApple OSS Distributions 	mach_port_t mementry;
845*33de042dSApple OSS Distributions 	mach_vm_address_t addr;
846*33de042dSApple OSS Distributions 	memory_object_size_t s = (memory_object_size_t)TEST_ALLOC_SIZE + 1;
847*33de042dSApple OSS Distributions 	/*
848*33de042dSApple OSS Distributions 	 * INVALID_INITIAL_SIZE is guaranteed to never be the correct map_size
849*33de042dSApple OSS Distributions 	 * from the mach_memory_entry_map_size calls we make. map_size should represent the size of the
850*33de042dSApple OSS Distributions 	 * copy that would result, and INVALID_INITIAL_SIZE is completely unrelated to the sizes we pass
851*33de042dSApple OSS Distributions 	 * and not page aligned.
852*33de042dSApple OSS Distributions 	 */
853*33de042dSApple OSS Distributions 	mach_vm_size_t invalid_initial_size = INVALID_INITIAL_SIZE;
854*33de042dSApple OSS Distributions 
855*33de042dSApple OSS Distributions 	mach_vm_size_t map_size = invalid_initial_size;
856*33de042dSApple OSS Distributions 
857*33de042dSApple OSS Distributions 	kern_return_t kr = mach_vm_allocate_kernel(map, &addr, s, FLAGS_AND_TAG(VM_FLAGS_ANYWHERE, VM_KERN_MEMORY_OSFMK));
858*33de042dSApple OSS Distributions 	assert(kr == 0);
859*33de042dSApple OSS Distributions 	kr = mach_make_memory_entry_64(map, &s, (memory_object_offset_t)addr, MAP_MEM_VM_SHARE, &mementry, MACH_PORT_NULL);
860*33de042dSApple OSS Distributions 	assert(kr == 0);
861*33de042dSApple OSS Distributions 	kr = mach_memory_entry_map_size(mementry, map, start, size, &map_size);
862*33de042dSApple OSS Distributions 	check_mach_memory_entry_map_size_outparam_changes(&kr, map_size, invalid_initial_size);
863*33de042dSApple OSS Distributions 	mach_memory_entry_port_release(mementry);
864*33de042dSApple OSS Distributions 	(void)mach_vm_deallocate(map, addr, s);
865*33de042dSApple OSS Distributions 	return kr;
866*33de042dSApple OSS Distributions }
867*33de042dSApple OSS Distributions 
868*33de042dSApple OSS Distributions static inline void
check_mach_memory_entry_outparam_changes(kern_return_t * kr,mach_vm_size_t size,mach_port_t out_handle,mach_port_t saved_handle)869*33de042dSApple OSS Distributions check_mach_memory_entry_outparam_changes(kern_return_t * kr, mach_vm_size_t size,
870*33de042dSApple OSS Distributions     mach_port_t out_handle, mach_port_t saved_handle)
871*33de042dSApple OSS Distributions {
872*33de042dSApple OSS Distributions 	/*
873*33de042dSApple OSS Distributions 	 * mach_make_memory_entry overwrites *size to be 0 on failure.
874*33de042dSApple OSS Distributions 	 */
875*33de042dSApple OSS Distributions 	if (*kr != KERN_SUCCESS) {
876*33de042dSApple OSS Distributions 		if (size != 0) {
877*33de042dSApple OSS Distributions 			*kr = OUT_PARAM_BAD;
878*33de042dSApple OSS Distributions 		}
879*33de042dSApple OSS Distributions 		if (out_handle != saved_handle) {
880*33de042dSApple OSS Distributions 			*kr = OUT_PARAM_BAD;
881*33de042dSApple OSS Distributions 		}
882*33de042dSApple OSS Distributions 	}
883*33de042dSApple OSS Distributions }
884*33de042dSApple OSS Distributions // mach_make_memory_entry and variants
885*33de042dSApple OSS Distributions 
886*33de042dSApple OSS Distributions #define IMPL(FN, T)                                                               \
887*33de042dSApple OSS Distributions 	static kern_return_t                                                      \
888*33de042dSApple OSS Distributions 	call_ ## FN ## __start_size__memonly(MAP_T map, T start, T size)                      \
889*33de042dSApple OSS Distributions 	{                                                                         \
890*33de042dSApple OSS Distributions 	        mach_port_t memobject = make_a_mem_object(TEST_ALLOC_SIZE + 1);          \
891*33de042dSApple OSS Distributions 	        T io_size = size;                                                 \
892*33de042dSApple OSS Distributions 	        mach_port_t invalid_handle_value = INVALID_INITIAL_MACH_PORT;     \
893*33de042dSApple OSS Distributions 	        mach_port_t out_handle = invalid_handle_value;                    \
894*33de042dSApple OSS Distributions 	        kern_return_t kr = FN(map, &io_size, start,                       \
895*33de042dSApple OSS Distributions 	                              VM_PROT_READ | MAP_MEM_ONLY, &out_handle, memobject); \
896*33de042dSApple OSS Distributions 	        if (kr == 0) {                                                    \
897*33de042dSApple OSS Distributions 	                if (out_handle) mach_memory_entry_port_release(out_handle); \
898*33de042dSApple OSS Distributions 	        }                                                                 \
899*33de042dSApple OSS Distributions 	        mach_memory_entry_port_release(memobject);                        \
900*33de042dSApple OSS Distributions 	        check_mach_memory_entry_outparam_changes(&kr, io_size, out_handle,\
901*33de042dSApple OSS Distributions 	                                                 invalid_handle_value);   \
902*33de042dSApple OSS Distributions 	        return kr;                                                        \
903*33de042dSApple OSS Distributions 	}                                                                         \
904*33de042dSApple OSS Distributions                                                                                   \
905*33de042dSApple OSS Distributions 	static kern_return_t                                                      \
906*33de042dSApple OSS Distributions 	call_ ## FN ## __start_size__namedcreate(MAP_T map, T start, T size)                  \
907*33de042dSApple OSS Distributions 	{                                                                         \
908*33de042dSApple OSS Distributions 	        mach_port_t memobject = make_a_mem_object(TEST_ALLOC_SIZE + 1);          \
909*33de042dSApple OSS Distributions 	        T io_size = size;                                                 \
910*33de042dSApple OSS Distributions 	        mach_port_t invalid_handle_value = INVALID_INITIAL_MACH_PORT;     \
911*33de042dSApple OSS Distributions 	        mach_port_t out_handle = invalid_handle_value;                    \
912*33de042dSApple OSS Distributions 	        kern_return_t kr = FN(map, &io_size, start,                       \
913*33de042dSApple OSS Distributions 	                              VM_PROT_READ | MAP_MEM_NAMED_CREATE, &out_handle, memobject); \
914*33de042dSApple OSS Distributions 	        if (kr == 0) {                                                    \
915*33de042dSApple OSS Distributions 	                if (out_handle) mach_memory_entry_port_release(out_handle); \
916*33de042dSApple OSS Distributions 	        }                                                                 \
917*33de042dSApple OSS Distributions 	        mach_memory_entry_port_release(memobject);                        \
918*33de042dSApple OSS Distributions 	        check_mach_memory_entry_outparam_changes(&kr, io_size, out_handle,\
919*33de042dSApple OSS Distributions 	                                                 invalid_handle_value);   \
920*33de042dSApple OSS Distributions 	        return kr;                                                        \
921*33de042dSApple OSS Distributions 	}                                                                         \
922*33de042dSApple OSS Distributions                                                                                   \
923*33de042dSApple OSS Distributions 	static kern_return_t                                                      \
924*33de042dSApple OSS Distributions 	call_ ## FN ## __start_size__copy(MAP_T map, T start, T size)                         \
925*33de042dSApple OSS Distributions 	{                                                                         \
926*33de042dSApple OSS Distributions 	        mach_port_t memobject = make_a_mem_object(TEST_ALLOC_SIZE + 1);          \
927*33de042dSApple OSS Distributions 	        T io_size = size;                                                 \
928*33de042dSApple OSS Distributions 	        mach_port_t invalid_handle_value = INVALID_INITIAL_MACH_PORT;     \
929*33de042dSApple OSS Distributions 	        mach_port_t out_handle = invalid_handle_value;                    \
930*33de042dSApple OSS Distributions 	        kern_return_t kr = FN(map, &io_size, start,                       \
931*33de042dSApple OSS Distributions 	                              VM_PROT_READ | MAP_MEM_VM_COPY, &out_handle, memobject); \
932*33de042dSApple OSS Distributions 	        if (kr == 0) {                                                    \
933*33de042dSApple OSS Distributions 	                if (out_handle) mach_memory_entry_port_release(out_handle); \
934*33de042dSApple OSS Distributions 	        }                                                                 \
935*33de042dSApple OSS Distributions 	        mach_memory_entry_port_release(memobject);                        \
936*33de042dSApple OSS Distributions 	        check_mach_memory_entry_outparam_changes(&kr, io_size, out_handle,\
937*33de042dSApple OSS Distributions 	                                                 invalid_handle_value);   \
938*33de042dSApple OSS Distributions 	        return kr;                                                        \
939*33de042dSApple OSS Distributions 	}                                                                         \
940*33de042dSApple OSS Distributions                                                                                   \
941*33de042dSApple OSS Distributions 	static kern_return_t                                                      \
942*33de042dSApple OSS Distributions 	call_ ## FN ## __start_size__share(MAP_T map, T start, T size)            \
943*33de042dSApple OSS Distributions 	{                                                                         \
944*33de042dSApple OSS Distributions 	        mach_port_t memobject = make_a_mem_object(TEST_ALLOC_SIZE + 1);          \
945*33de042dSApple OSS Distributions 	        T io_size = size;                                                 \
946*33de042dSApple OSS Distributions 	        mach_port_t invalid_handle_value = INVALID_INITIAL_MACH_PORT;     \
947*33de042dSApple OSS Distributions 	        mach_port_t out_handle = invalid_handle_value;                    \
948*33de042dSApple OSS Distributions 	        kern_return_t kr = FN(map, &io_size, start,                       \
949*33de042dSApple OSS Distributions 	                              VM_PROT_READ | MAP_MEM_VM_SHARE, &out_handle, memobject); \
950*33de042dSApple OSS Distributions 	        if (kr == 0) {                                                    \
951*33de042dSApple OSS Distributions 	                if (out_handle) mach_memory_entry_port_release(out_handle); \
952*33de042dSApple OSS Distributions 	        }                                                                 \
953*33de042dSApple OSS Distributions 	        mach_memory_entry_port_release(memobject);                        \
954*33de042dSApple OSS Distributions 	        check_mach_memory_entry_outparam_changes(&kr, io_size, out_handle,\
955*33de042dSApple OSS Distributions 	                                                 invalid_handle_value);   \
956*33de042dSApple OSS Distributions 	        return kr;                                                        \
957*33de042dSApple OSS Distributions 	}                                                                         \
958*33de042dSApple OSS Distributions                                                                                   \
959*33de042dSApple OSS Distributions 	static kern_return_t                                                      \
960*33de042dSApple OSS Distributions 	call_ ## FN ## __start_size__namedreuse(MAP_T map, T start, T size)       \
961*33de042dSApple OSS Distributions 	{                                                                         \
962*33de042dSApple OSS Distributions 	        mach_port_t memobject = make_a_mem_object(TEST_ALLOC_SIZE + 1);          \
963*33de042dSApple OSS Distributions 	        T io_size = size;                                                 \
964*33de042dSApple OSS Distributions 	        mach_port_t invalid_handle_value = INVALID_INITIAL_MACH_PORT;     \
965*33de042dSApple OSS Distributions 	        mach_port_t out_handle = invalid_handle_value;                    \
966*33de042dSApple OSS Distributions 	        kern_return_t kr = FN(map, &io_size, start,                       \
967*33de042dSApple OSS Distributions 	                              VM_PROT_READ | MAP_MEM_NAMED_REUSE, &out_handle, memobject); \
968*33de042dSApple OSS Distributions 	        if (kr == 0) {                                                    \
969*33de042dSApple OSS Distributions 	                if (out_handle) mach_memory_entry_port_release(out_handle); \
970*33de042dSApple OSS Distributions 	        }                                                                 \
971*33de042dSApple OSS Distributions 	        mach_memory_entry_port_release(memobject);                        \
972*33de042dSApple OSS Distributions 	        check_mach_memory_entry_outparam_changes(&kr, io_size, out_handle,\
973*33de042dSApple OSS Distributions 	                                                 invalid_handle_value);   \
974*33de042dSApple OSS Distributions 	        return kr;                                                        \
975*33de042dSApple OSS Distributions 	}                                                                         \
976*33de042dSApple OSS Distributions                                                                                   \
977*33de042dSApple OSS Distributions 	static kern_return_t                                                      \
978*33de042dSApple OSS Distributions 	call_ ## FN ## __vm_prot(MAP_T map, T start, T size, vm_prot_t prot)      \
979*33de042dSApple OSS Distributions 	{                                                                         \
980*33de042dSApple OSS Distributions 	        mach_port_t memobject = make_a_mem_object(TEST_ALLOC_SIZE + 1);          \
981*33de042dSApple OSS Distributions 	        T io_size = size;                                                 \
982*33de042dSApple OSS Distributions 	        mach_port_t invalid_handle_value = INVALID_INITIAL_MACH_PORT;     \
983*33de042dSApple OSS Distributions 	        mach_port_t out_handle = invalid_handle_value;                    \
984*33de042dSApple OSS Distributions 	        kern_return_t kr = FN(map, &io_size, start,                       \
985*33de042dSApple OSS Distributions 	                              prot, &out_handle, memobject); \
986*33de042dSApple OSS Distributions 	        if (kr == 0) {                                                    \
987*33de042dSApple OSS Distributions 	                if (out_handle) mach_memory_entry_port_release(out_handle); \
988*33de042dSApple OSS Distributions 	        }                                                                 \
989*33de042dSApple OSS Distributions 	        mach_memory_entry_port_release(memobject);                        \
990*33de042dSApple OSS Distributions 	        check_mach_memory_entry_outparam_changes(&kr, io_size, out_handle,\
991*33de042dSApple OSS Distributions 	                                                 invalid_handle_value);   \
992*33de042dSApple OSS Distributions 	        return kr;                                                        \
993*33de042dSApple OSS Distributions 	}
994*33de042dSApple OSS Distributions 
IMPL(mach_make_memory_entry_64,mach_vm_address_t)995*33de042dSApple OSS Distributions IMPL(mach_make_memory_entry_64, mach_vm_address_t)
996*33de042dSApple OSS Distributions IMPL(mach_make_memory_entry, vm_size_t)
997*33de042dSApple OSS Distributions static kern_return_t
998*33de042dSApple OSS Distributions mach_make_memory_entry_internal_retyped(
999*33de042dSApple OSS Distributions 	vm_map_t                target_map,
1000*33de042dSApple OSS Distributions 	memory_object_size_t    *size,
1001*33de042dSApple OSS Distributions 	memory_object_offset_t  offset,
1002*33de042dSApple OSS Distributions 	vm_prot_t               permission,
1003*33de042dSApple OSS Distributions 	ipc_port_t              *object_handle,
1004*33de042dSApple OSS Distributions 	ipc_port_t              parent_handle)
1005*33de042dSApple OSS Distributions {
1006*33de042dSApple OSS Distributions 	vm_named_entry_kernel_flags_t   vmne_kflags = VM_NAMED_ENTRY_KERNEL_FLAGS_NONE;
1007*33de042dSApple OSS Distributions 	if (permission & MAP_MEM_LEDGER_TAGGED) {
1008*33de042dSApple OSS Distributions 		vmne_kflags.vmnekf_ledger_tag = VM_LEDGER_TAG_DEFAULT;
1009*33de042dSApple OSS Distributions 	}
1010*33de042dSApple OSS Distributions 	return mach_make_memory_entry_internal(target_map, size, offset, permission, vmne_kflags, object_handle, parent_handle);
1011*33de042dSApple OSS Distributions }
1012*33de042dSApple OSS Distributions IMPL(mach_make_memory_entry_internal_retyped, mach_vm_address_t)
1013*33de042dSApple OSS Distributions 
1014*33de042dSApple OSS Distributions #undef IMPL
1015*33de042dSApple OSS Distributions 
1016*33de042dSApple OSS Distributions // mach_vm_map/mach_vm_map_external/mach_vm_map_kernel/vm_map/vm_map_external infra
1017*33de042dSApple OSS Distributions 
1018*33de042dSApple OSS Distributions typedef kern_return_t (*map_fn_t)(vm_map_t target_task,
1019*33de042dSApple OSS Distributions     mach_vm_address_t *address,
1020*33de042dSApple OSS Distributions     mach_vm_size_t size,
1021*33de042dSApple OSS Distributions     mach_vm_offset_t mask,
1022*33de042dSApple OSS Distributions     int flags,
1023*33de042dSApple OSS Distributions     mem_entry_name_port_t object,
1024*33de042dSApple OSS Distributions     memory_object_offset_t offset,
1025*33de042dSApple OSS Distributions     boolean_t copy,
1026*33de042dSApple OSS Distributions     vm_prot_t cur_protection,
1027*33de042dSApple OSS Distributions     vm_prot_t max_protection,
1028*33de042dSApple OSS Distributions     vm_inherit_t inheritance);
1029*33de042dSApple OSS Distributions 
1030*33de042dSApple OSS Distributions static kern_return_t
call_map_fn__allocate_fixed(map_fn_t fn,MAP_T map,mach_vm_address_t start,mach_vm_size_t size)1031*33de042dSApple OSS Distributions call_map_fn__allocate_fixed(map_fn_t fn, MAP_T map, mach_vm_address_t start, mach_vm_size_t size)
1032*33de042dSApple OSS Distributions {
1033*33de042dSApple OSS Distributions 	mach_vm_address_t out_addr = start;
1034*33de042dSApple OSS Distributions 	kern_return_t kr = fn(map, &out_addr, size, 0, VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE,
1035*33de042dSApple OSS Distributions 	    0, 0, 0, 0, 0, VM_INHERIT_NONE);
1036*33de042dSApple OSS Distributions 	// fixed-overwrite with pre-existing allocation, don't deallocate
1037*33de042dSApple OSS Distributions 	return kr;
1038*33de042dSApple OSS Distributions }
1039*33de042dSApple OSS Distributions 
1040*33de042dSApple OSS Distributions static kern_return_t
call_map_fn__allocate_fixed_copy(map_fn_t fn,MAP_T map,mach_vm_address_t start,mach_vm_size_t size)1041*33de042dSApple OSS Distributions call_map_fn__allocate_fixed_copy(map_fn_t fn, MAP_T map, mach_vm_address_t start, mach_vm_size_t size)
1042*33de042dSApple OSS Distributions {
1043*33de042dSApple OSS Distributions 	mach_vm_address_t out_addr = start;
1044*33de042dSApple OSS Distributions 	kern_return_t kr = fn(map, &out_addr, size, 0, VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE,
1045*33de042dSApple OSS Distributions 	    0, 0, true, 0, 0, VM_INHERIT_NONE);
1046*33de042dSApple OSS Distributions 	// fixed-overwrite with pre-existing allocation, don't deallocate
1047*33de042dSApple OSS Distributions 	return kr;
1048*33de042dSApple OSS Distributions }
1049*33de042dSApple OSS Distributions 
1050*33de042dSApple OSS Distributions static kern_return_t
call_map_fn__allocate_anywhere(map_fn_t fn,MAP_T map,mach_vm_address_t start_hint,mach_vm_size_t size)1051*33de042dSApple OSS Distributions call_map_fn__allocate_anywhere(map_fn_t fn, MAP_T map, mach_vm_address_t start_hint, mach_vm_size_t size)
1052*33de042dSApple OSS Distributions {
1053*33de042dSApple OSS Distributions 	mach_vm_address_t out_addr = start_hint;
1054*33de042dSApple OSS Distributions 	kern_return_t kr = fn(map, &out_addr, size, 0, VM_FLAGS_ANYWHERE, 0, 0, 0, 0, 0, VM_INHERIT_NONE);
1055*33de042dSApple OSS Distributions 	if (kr == 0) {
1056*33de042dSApple OSS Distributions 		(void)mach_vm_deallocate(map, out_addr, size);
1057*33de042dSApple OSS Distributions 	}
1058*33de042dSApple OSS Distributions 	return kr;
1059*33de042dSApple OSS Distributions }
1060*33de042dSApple OSS Distributions 
1061*33de042dSApple OSS Distributions static kern_return_t
call_map_fn__memobject_fixed(map_fn_t fn,MAP_T map,mach_vm_address_t start,mach_vm_size_t size)1062*33de042dSApple OSS Distributions call_map_fn__memobject_fixed(map_fn_t fn, MAP_T map, mach_vm_address_t start, mach_vm_size_t size)
1063*33de042dSApple OSS Distributions {
1064*33de042dSApple OSS Distributions 	mach_port_t memobject = make_a_mem_object(TEST_ALLOC_SIZE + 1);
1065*33de042dSApple OSS Distributions 	mach_vm_address_t out_addr = start;
1066*33de042dSApple OSS Distributions 	kern_return_t kr = fn(map, &out_addr, size, 0, VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE,
1067*33de042dSApple OSS Distributions 	    memobject, KB16, false, VM_PROT_DEFAULT, VM_PROT_DEFAULT, VM_INHERIT_DEFAULT);
1068*33de042dSApple OSS Distributions 	// fixed-overwrite with pre-existing allocation, don't deallocate
1069*33de042dSApple OSS Distributions 	mach_memory_entry_port_release(memobject);
1070*33de042dSApple OSS Distributions 	return kr;
1071*33de042dSApple OSS Distributions }
1072*33de042dSApple OSS Distributions 
1073*33de042dSApple OSS Distributions static kern_return_t
call_map_fn__memobject_fixed_copy(map_fn_t fn,MAP_T map,mach_vm_address_t start,mach_vm_size_t size)1074*33de042dSApple OSS Distributions call_map_fn__memobject_fixed_copy(map_fn_t fn, MAP_T map, mach_vm_address_t start, mach_vm_size_t size)
1075*33de042dSApple OSS Distributions {
1076*33de042dSApple OSS Distributions 	mach_port_t memobject = make_a_mem_object(TEST_ALLOC_SIZE + 1);
1077*33de042dSApple OSS Distributions 	mach_vm_address_t out_addr = start;
1078*33de042dSApple OSS Distributions 	kern_return_t kr = fn(map, &out_addr, size, 0, VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE,
1079*33de042dSApple OSS Distributions 	    memobject, KB16, true, VM_PROT_DEFAULT, VM_PROT_DEFAULT, VM_INHERIT_DEFAULT);
1080*33de042dSApple OSS Distributions 	// fixed-overwrite with pre-existing allocation, don't deallocate
1081*33de042dSApple OSS Distributions 	mach_memory_entry_port_release(memobject);
1082*33de042dSApple OSS Distributions 	return kr;
1083*33de042dSApple OSS Distributions }
1084*33de042dSApple OSS Distributions 
1085*33de042dSApple OSS Distributions static kern_return_t
call_map_fn__memobject_anywhere(map_fn_t fn,MAP_T map,mach_vm_address_t start_hint,mach_vm_size_t size)1086*33de042dSApple OSS Distributions call_map_fn__memobject_anywhere(map_fn_t fn, MAP_T map, mach_vm_address_t start_hint, mach_vm_size_t size)
1087*33de042dSApple OSS Distributions {
1088*33de042dSApple OSS Distributions 	mach_port_t memobject = make_a_mem_object(TEST_ALLOC_SIZE + 1);
1089*33de042dSApple OSS Distributions 	mach_vm_address_t out_addr = start_hint;
1090*33de042dSApple OSS Distributions 	kern_return_t kr = fn(map, &out_addr, size, 0, VM_FLAGS_ANYWHERE, memobject,
1091*33de042dSApple OSS Distributions 	    KB16, false, VM_PROT_DEFAULT, VM_PROT_DEFAULT, VM_INHERIT_DEFAULT);
1092*33de042dSApple OSS Distributions 	if (kr == 0) {
1093*33de042dSApple OSS Distributions 		(void)mach_vm_deallocate(map, out_addr, size);
1094*33de042dSApple OSS Distributions 	}
1095*33de042dSApple OSS Distributions 	mach_memory_entry_port_release(memobject);
1096*33de042dSApple OSS Distributions 	return kr;
1097*33de042dSApple OSS Distributions }
1098*33de042dSApple OSS Distributions 
1099*33de042dSApple OSS Distributions static kern_return_t
helper_call_map_fn__memobject__ssoo(map_fn_t fn,MAP_T map,int flags,bool copy,mach_vm_address_t start,mach_vm_size_t size,vm_object_offset_t offset,mach_vm_size_t obj_size)1100*33de042dSApple OSS Distributions helper_call_map_fn__memobject__ssoo(map_fn_t fn, MAP_T map, int flags, bool copy, mach_vm_address_t start, mach_vm_size_t size, vm_object_offset_t offset, mach_vm_size_t obj_size)
1101*33de042dSApple OSS Distributions {
1102*33de042dSApple OSS Distributions 	mach_port_t memobject = make_a_mem_object(obj_size);
1103*33de042dSApple OSS Distributions 	mach_vm_address_t out_addr = start;
1104*33de042dSApple OSS Distributions 	kern_return_t kr = fn(map, &out_addr, size, 0, flags, memobject,
1105*33de042dSApple OSS Distributions 	    offset, copy, VM_PROT_DEFAULT, VM_PROT_DEFAULT, VM_INHERIT_DEFAULT);
1106*33de042dSApple OSS Distributions 	deallocate_if_not_fixed_overwrite(kr, map, out_addr, size, flags);
1107*33de042dSApple OSS Distributions 	mach_memory_entry_port_release(memobject);
1108*33de042dSApple OSS Distributions 	return kr;
1109*33de042dSApple OSS Distributions }
1110*33de042dSApple OSS Distributions 
1111*33de042dSApple OSS Distributions static kern_return_t
call_map_fn__memobject_fixed__start_size_offset_object(map_fn_t fn,MAP_T map,mach_vm_address_t start,mach_vm_size_t size,vm_object_offset_t offset,mach_vm_size_t obj_size)1112*33de042dSApple OSS Distributions call_map_fn__memobject_fixed__start_size_offset_object(map_fn_t fn, MAP_T map, mach_vm_address_t start, mach_vm_size_t size, vm_object_offset_t offset, mach_vm_size_t obj_size)
1113*33de042dSApple OSS Distributions {
1114*33de042dSApple OSS Distributions 	return helper_call_map_fn__memobject__ssoo(fn, map, VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE, false, start, size, offset, obj_size);
1115*33de042dSApple OSS Distributions }
1116*33de042dSApple OSS Distributions 
1117*33de042dSApple OSS Distributions static kern_return_t
call_map_fn__memobject_fixed_copy__start_size_offset_object(map_fn_t fn,MAP_T map,mach_vm_address_t start,mach_vm_size_t size,vm_object_offset_t offset,mach_vm_size_t obj_size)1118*33de042dSApple OSS Distributions call_map_fn__memobject_fixed_copy__start_size_offset_object(map_fn_t fn, MAP_T map, mach_vm_address_t start, mach_vm_size_t size, vm_object_offset_t offset, mach_vm_size_t obj_size)
1119*33de042dSApple OSS Distributions {
1120*33de042dSApple OSS Distributions 	return helper_call_map_fn__memobject__ssoo(fn, map, VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE, true, start, size, offset, obj_size);
1121*33de042dSApple OSS Distributions }
1122*33de042dSApple OSS Distributions 
1123*33de042dSApple OSS Distributions static kern_return_t
call_map_fn__memobject_anywhere__start_size_offset_object(map_fn_t fn,MAP_T map,mach_vm_address_t start,mach_vm_size_t size,vm_object_offset_t offset,mach_vm_size_t obj_size)1124*33de042dSApple OSS Distributions call_map_fn__memobject_anywhere__start_size_offset_object(map_fn_t fn, MAP_T map, mach_vm_address_t start, mach_vm_size_t size, vm_object_offset_t offset, mach_vm_size_t obj_size)
1125*33de042dSApple OSS Distributions {
1126*33de042dSApple OSS Distributions 	return helper_call_map_fn__memobject__ssoo(fn, map, VM_FLAGS_ANYWHERE, false, start, size, offset, obj_size);
1127*33de042dSApple OSS Distributions }
1128*33de042dSApple OSS Distributions 
1129*33de042dSApple OSS Distributions static kern_return_t
help_call_map_fn__allocate__inherit(map_fn_t fn,MAP_T map,int flags,bool copy,mach_vm_address_t start,mach_vm_size_t size,vm_inherit_t inherit)1130*33de042dSApple OSS Distributions help_call_map_fn__allocate__inherit(map_fn_t fn, MAP_T map, int flags, bool copy, mach_vm_address_t start, mach_vm_size_t size, vm_inherit_t inherit)
1131*33de042dSApple OSS Distributions {
1132*33de042dSApple OSS Distributions 	mach_vm_address_t out_addr = start;
1133*33de042dSApple OSS Distributions 	kern_return_t kr = fn(map, &out_addr, size, 0, flags,
1134*33de042dSApple OSS Distributions 	    0, KB16, copy, VM_PROT_DEFAULT, VM_PROT_DEFAULT, inherit);
1135*33de042dSApple OSS Distributions 	deallocate_if_not_fixed_overwrite(kr, map, out_addr, size, flags);
1136*33de042dSApple OSS Distributions 	return kr;
1137*33de042dSApple OSS Distributions }
1138*33de042dSApple OSS Distributions 
1139*33de042dSApple OSS Distributions static kern_return_t
call_map_fn__allocate_fixed__inherit(map_fn_t fn,MAP_T map,mach_vm_address_t start,mach_vm_size_t size,vm_inherit_t inherit)1140*33de042dSApple OSS Distributions call_map_fn__allocate_fixed__inherit(map_fn_t fn, MAP_T map, mach_vm_address_t start, mach_vm_size_t size, vm_inherit_t inherit)
1141*33de042dSApple OSS Distributions {
1142*33de042dSApple OSS Distributions 	return help_call_map_fn__allocate__inherit(fn, map, VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE, false, start, size, inherit);
1143*33de042dSApple OSS Distributions }
1144*33de042dSApple OSS Distributions 
1145*33de042dSApple OSS Distributions static kern_return_t
call_map_fn__allocate_fixed_copy__inherit(map_fn_t fn,MAP_T map,mach_vm_address_t start,mach_vm_size_t size,vm_inherit_t inherit)1146*33de042dSApple OSS Distributions call_map_fn__allocate_fixed_copy__inherit(map_fn_t fn, MAP_T map, mach_vm_address_t start, mach_vm_size_t size, vm_inherit_t inherit)
1147*33de042dSApple OSS Distributions {
1148*33de042dSApple OSS Distributions 	return help_call_map_fn__allocate__inherit(fn, map, VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE, true, start, size, inherit);
1149*33de042dSApple OSS Distributions }
1150*33de042dSApple OSS Distributions 
1151*33de042dSApple OSS Distributions static kern_return_t
call_map_fn__allocate_anywhere__inherit(map_fn_t fn,MAP_T map,mach_vm_address_t start,mach_vm_size_t size,vm_inherit_t inherit)1152*33de042dSApple OSS Distributions call_map_fn__allocate_anywhere__inherit(map_fn_t fn, MAP_T map, mach_vm_address_t start, mach_vm_size_t size, vm_inherit_t inherit)
1153*33de042dSApple OSS Distributions {
1154*33de042dSApple OSS Distributions 	return help_call_map_fn__allocate__inherit(fn, map, VM_FLAGS_ANYWHERE, false, start, size, inherit);
1155*33de042dSApple OSS Distributions }
1156*33de042dSApple OSS Distributions 
1157*33de042dSApple OSS Distributions static kern_return_t
help_call_map_fn__memobject__inherit(map_fn_t fn,MAP_T map,int flags,bool copy,mach_vm_address_t start,mach_vm_size_t size,vm_inherit_t inherit)1158*33de042dSApple OSS Distributions help_call_map_fn__memobject__inherit(map_fn_t fn, MAP_T map, int flags, bool copy, mach_vm_address_t start, mach_vm_size_t size, vm_inherit_t inherit)
1159*33de042dSApple OSS Distributions {
1160*33de042dSApple OSS Distributions 	mach_port_t memobject = make_a_mem_object(TEST_ALLOC_SIZE + 1);
1161*33de042dSApple OSS Distributions 	mach_vm_address_t out_addr = start;
1162*33de042dSApple OSS Distributions 	kern_return_t kr = fn(map, &out_addr, size, 0, flags,
1163*33de042dSApple OSS Distributions 	    memobject, KB16, copy, VM_PROT_DEFAULT, VM_PROT_DEFAULT, inherit);
1164*33de042dSApple OSS Distributions 	deallocate_if_not_fixed_overwrite(kr, map, out_addr, size, flags);
1165*33de042dSApple OSS Distributions 	mach_memory_entry_port_release(memobject);
1166*33de042dSApple OSS Distributions 	return kr;
1167*33de042dSApple OSS Distributions }
1168*33de042dSApple OSS Distributions 
1169*33de042dSApple OSS Distributions static kern_return_t
call_map_fn__memobject_fixed__inherit(map_fn_t fn,MAP_T map,mach_vm_address_t start,mach_vm_size_t size,vm_inherit_t inherit)1170*33de042dSApple OSS Distributions call_map_fn__memobject_fixed__inherit(map_fn_t fn, MAP_T map, mach_vm_address_t start, mach_vm_size_t size, vm_inherit_t inherit)
1171*33de042dSApple OSS Distributions {
1172*33de042dSApple OSS Distributions 	return help_call_map_fn__memobject__inherit(fn, map, VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE, false, start, size, inherit);
1173*33de042dSApple OSS Distributions }
1174*33de042dSApple OSS Distributions 
1175*33de042dSApple OSS Distributions static kern_return_t
call_map_fn__memobject_fixed_copy__inherit(map_fn_t fn,MAP_T map,mach_vm_address_t start,mach_vm_size_t size,vm_inherit_t inherit)1176*33de042dSApple OSS Distributions call_map_fn__memobject_fixed_copy__inherit(map_fn_t fn, MAP_T map, mach_vm_address_t start, mach_vm_size_t size, vm_inherit_t inherit)
1177*33de042dSApple OSS Distributions {
1178*33de042dSApple OSS Distributions 	return help_call_map_fn__memobject__inherit(fn, map, VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE, true, start, size, inherit);
1179*33de042dSApple OSS Distributions }
1180*33de042dSApple OSS Distributions 
1181*33de042dSApple OSS Distributions static kern_return_t
call_map_fn__memobject_anywhere__inherit(map_fn_t fn,MAP_T map,mach_vm_address_t start,mach_vm_size_t size,vm_inherit_t inherit)1182*33de042dSApple OSS Distributions call_map_fn__memobject_anywhere__inherit(map_fn_t fn, MAP_T map, mach_vm_address_t start, mach_vm_size_t size, vm_inherit_t inherit)
1183*33de042dSApple OSS Distributions {
1184*33de042dSApple OSS Distributions 	return help_call_map_fn__memobject__inherit(fn, map, VM_FLAGS_ANYWHERE, false, start, size, inherit);
1185*33de042dSApple OSS Distributions }
1186*33de042dSApple OSS Distributions 
1187*33de042dSApple OSS Distributions static kern_return_t
call_map_fn__allocate__flags(map_fn_t fn,MAP_T map,mach_vm_address_t * start,mach_vm_size_t size,int flags)1188*33de042dSApple OSS Distributions call_map_fn__allocate__flags(map_fn_t fn, MAP_T map, mach_vm_address_t * start, mach_vm_size_t size, int flags)
1189*33de042dSApple OSS Distributions {
1190*33de042dSApple OSS Distributions 	kern_return_t kr = fn(map, start, size, 0, flags,
1191*33de042dSApple OSS Distributions 	    0, KB16, false, VM_PROT_DEFAULT, VM_PROT_DEFAULT, VM_INHERIT_DEFAULT);
1192*33de042dSApple OSS Distributions 	deallocate_if_not_fixed_overwrite(kr, map, *start, size, flags);
1193*33de042dSApple OSS Distributions 	return kr;
1194*33de042dSApple OSS Distributions }
1195*33de042dSApple OSS Distributions 
1196*33de042dSApple OSS Distributions static kern_return_t
call_map_fn__allocate_copy__flags(map_fn_t fn,MAP_T map,mach_vm_address_t * start,mach_vm_size_t size,int flags)1197*33de042dSApple OSS Distributions call_map_fn__allocate_copy__flags(map_fn_t fn, MAP_T map, mach_vm_address_t * start, mach_vm_size_t size, int flags)
1198*33de042dSApple OSS Distributions {
1199*33de042dSApple OSS Distributions 	kern_return_t kr = fn(map, start, size, 0, flags,
1200*33de042dSApple OSS Distributions 	    0, KB16, false, VM_PROT_DEFAULT, VM_PROT_DEFAULT, VM_INHERIT_DEFAULT);
1201*33de042dSApple OSS Distributions 	deallocate_if_not_fixed_overwrite(kr, map, *start, size, flags);
1202*33de042dSApple OSS Distributions 	return kr;
1203*33de042dSApple OSS Distributions }
1204*33de042dSApple OSS Distributions 
1205*33de042dSApple OSS Distributions static kern_return_t
call_map_fn__memobject__flags(map_fn_t fn,MAP_T map,mach_vm_address_t * start,mach_vm_size_t size,int flags)1206*33de042dSApple OSS Distributions call_map_fn__memobject__flags(map_fn_t fn, MAP_T map, mach_vm_address_t * start, mach_vm_size_t size, int flags)
1207*33de042dSApple OSS Distributions {
1208*33de042dSApple OSS Distributions 	mach_port_t memobject = make_a_mem_object(TEST_ALLOC_SIZE + 1);
1209*33de042dSApple OSS Distributions 	kern_return_t kr = fn(map, start, size, 0, flags,
1210*33de042dSApple OSS Distributions 	    memobject, KB16, false, VM_PROT_DEFAULT, VM_PROT_DEFAULT, VM_INHERIT_DEFAULT);
1211*33de042dSApple OSS Distributions 	deallocate_if_not_fixed_overwrite(kr, map, *start, size, flags);
1212*33de042dSApple OSS Distributions 	mach_memory_entry_port_release(memobject);
1213*33de042dSApple OSS Distributions 	return kr;
1214*33de042dSApple OSS Distributions }
1215*33de042dSApple OSS Distributions 
1216*33de042dSApple OSS Distributions static kern_return_t
call_map_fn__memobject_copy__flags(map_fn_t fn,MAP_T map,mach_vm_address_t * start,mach_vm_size_t size,int flags)1217*33de042dSApple OSS Distributions call_map_fn__memobject_copy__flags(map_fn_t fn, MAP_T map, mach_vm_address_t * start, mach_vm_size_t size, int flags)
1218*33de042dSApple OSS Distributions {
1219*33de042dSApple OSS Distributions 	mach_port_t memobject = make_a_mem_object(TEST_ALLOC_SIZE + 1);
1220*33de042dSApple OSS Distributions 	kern_return_t kr = fn(map, start, size, 0, flags,
1221*33de042dSApple OSS Distributions 	    memobject, KB16, true, VM_PROT_DEFAULT, VM_PROT_DEFAULT, VM_INHERIT_DEFAULT);
1222*33de042dSApple OSS Distributions 	deallocate_if_not_fixed_overwrite(kr, map, *start, size, flags);
1223*33de042dSApple OSS Distributions 	mach_memory_entry_port_release(memobject);
1224*33de042dSApple OSS Distributions 	return kr;
1225*33de042dSApple OSS Distributions }
1226*33de042dSApple OSS Distributions 
1227*33de042dSApple OSS Distributions static kern_return_t
help_call_map_fn__allocate__prot_pairs(map_fn_t fn,MAP_T map,int flags,bool copy,vm_prot_t cur,vm_prot_t max)1228*33de042dSApple OSS Distributions help_call_map_fn__allocate__prot_pairs(map_fn_t fn, MAP_T map, int flags, bool copy, vm_prot_t cur, vm_prot_t max)
1229*33de042dSApple OSS Distributions {
1230*33de042dSApple OSS Distributions 	mach_vm_address_t out_addr = 0;
1231*33de042dSApple OSS Distributions 	kern_return_t kr = fn(map, &out_addr, KB16, 0, flags,
1232*33de042dSApple OSS Distributions 	    0, KB16, copy, cur, max, VM_INHERIT_DEFAULT);
1233*33de042dSApple OSS Distributions 	deallocate_if_not_fixed_overwrite(kr, map, out_addr, KB16, flags);
1234*33de042dSApple OSS Distributions 	return kr;
1235*33de042dSApple OSS Distributions }
1236*33de042dSApple OSS Distributions 
1237*33de042dSApple OSS Distributions static kern_return_t
call_map_fn__allocate_fixed__prot_pairs(map_fn_t fn,MAP_T map,vm_prot_t cur,vm_prot_t max)1238*33de042dSApple OSS Distributions call_map_fn__allocate_fixed__prot_pairs(map_fn_t fn, MAP_T map, vm_prot_t cur, vm_prot_t max)
1239*33de042dSApple OSS Distributions {
1240*33de042dSApple OSS Distributions 	return help_call_map_fn__allocate__prot_pairs(fn, map, VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE, false, cur, max);
1241*33de042dSApple OSS Distributions }
1242*33de042dSApple OSS Distributions 
1243*33de042dSApple OSS Distributions static kern_return_t
call_map_fn__allocate_fixed_copy__prot_pairs(map_fn_t fn,MAP_T map,vm_prot_t cur,vm_prot_t max)1244*33de042dSApple OSS Distributions call_map_fn__allocate_fixed_copy__prot_pairs(map_fn_t fn, MAP_T map, vm_prot_t cur, vm_prot_t max)
1245*33de042dSApple OSS Distributions {
1246*33de042dSApple OSS Distributions 	return help_call_map_fn__allocate__prot_pairs(fn, map, VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE, true, cur, max);
1247*33de042dSApple OSS Distributions }
1248*33de042dSApple OSS Distributions 
1249*33de042dSApple OSS Distributions static kern_return_t
call_map_fn__allocate_anywhere__prot_pairs(map_fn_t fn,MAP_T map,vm_prot_t cur,vm_prot_t max)1250*33de042dSApple OSS Distributions call_map_fn__allocate_anywhere__prot_pairs(map_fn_t fn, MAP_T map, vm_prot_t cur, vm_prot_t max)
1251*33de042dSApple OSS Distributions {
1252*33de042dSApple OSS Distributions 	return help_call_map_fn__allocate__prot_pairs(fn, map, VM_FLAGS_ANYWHERE, false, cur, max);
1253*33de042dSApple OSS Distributions }
1254*33de042dSApple OSS Distributions 
1255*33de042dSApple OSS Distributions static kern_return_t
help_call_map_fn__memobject__prot_pairs(map_fn_t fn,MAP_T map,int flags,bool copy,vm_prot_t cur,vm_prot_t max)1256*33de042dSApple OSS Distributions help_call_map_fn__memobject__prot_pairs(map_fn_t fn, MAP_T map, int flags, bool copy, vm_prot_t cur, vm_prot_t max)
1257*33de042dSApple OSS Distributions {
1258*33de042dSApple OSS Distributions 	mach_port_t memobject = make_a_mem_object(TEST_ALLOC_SIZE + 1);
1259*33de042dSApple OSS Distributions 	mach_vm_address_t out_addr = 0;
1260*33de042dSApple OSS Distributions 	kern_return_t kr = fn(map, &out_addr, KB16, 0, flags,
1261*33de042dSApple OSS Distributions 	    memobject, KB16, copy, cur, max, VM_INHERIT_DEFAULT);
1262*33de042dSApple OSS Distributions 	deallocate_if_not_fixed_overwrite(kr, map, out_addr, KB16, flags);
1263*33de042dSApple OSS Distributions 	mach_memory_entry_port_release(memobject);
1264*33de042dSApple OSS Distributions 	return kr;
1265*33de042dSApple OSS Distributions }
1266*33de042dSApple OSS Distributions 
1267*33de042dSApple OSS Distributions static kern_return_t
call_map_fn__memobject_fixed__prot_pairs(map_fn_t fn,MAP_T map,vm_prot_t cur,vm_prot_t max)1268*33de042dSApple OSS Distributions call_map_fn__memobject_fixed__prot_pairs(map_fn_t fn, MAP_T map, vm_prot_t cur, vm_prot_t max)
1269*33de042dSApple OSS Distributions {
1270*33de042dSApple OSS Distributions 	return help_call_map_fn__memobject__prot_pairs(fn, map, VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE, false, cur, max);
1271*33de042dSApple OSS Distributions }
1272*33de042dSApple OSS Distributions 
1273*33de042dSApple OSS Distributions static kern_return_t
call_map_fn__memobject_fixed_copy__prot_pairs(map_fn_t fn,MAP_T map,vm_prot_t cur,vm_prot_t max)1274*33de042dSApple OSS Distributions call_map_fn__memobject_fixed_copy__prot_pairs(map_fn_t fn, MAP_T map, vm_prot_t cur, vm_prot_t max)
1275*33de042dSApple OSS Distributions {
1276*33de042dSApple OSS Distributions 	return help_call_map_fn__memobject__prot_pairs(fn, map, VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE, true, cur, max);
1277*33de042dSApple OSS Distributions }
1278*33de042dSApple OSS Distributions 
1279*33de042dSApple OSS Distributions static kern_return_t
call_map_fn__memobject_anywhere__prot_pairs(map_fn_t fn,MAP_T map,vm_prot_t cur,vm_prot_t max)1280*33de042dSApple OSS Distributions call_map_fn__memobject_anywhere__prot_pairs(map_fn_t fn, MAP_T map, vm_prot_t cur, vm_prot_t max)
1281*33de042dSApple OSS Distributions {
1282*33de042dSApple OSS Distributions 	return help_call_map_fn__memobject__prot_pairs(fn, map, VM_FLAGS_ANYWHERE, false, cur, max);
1283*33de042dSApple OSS Distributions }
1284*33de042dSApple OSS Distributions 
1285*33de042dSApple OSS Distributions // wrappers
1286*33de042dSApple OSS Distributions 
1287*33de042dSApple OSS Distributions static bool
dealloc_would_panic(mach_vm_address_t start,mach_vm_size_t size)1288*33de042dSApple OSS Distributions dealloc_would_panic(mach_vm_address_t start, mach_vm_size_t size)
1289*33de042dSApple OSS Distributions {
1290*33de042dSApple OSS Distributions 	return (start > 0xffffffffffffbffd) ||
1291*33de042dSApple OSS Distributions 	       (size > 0x8000000000);
1292*33de042dSApple OSS Distributions }
1293*33de042dSApple OSS Distributions 
1294*33de042dSApple OSS Distributions kern_return_t
mach_vm_map_wrapped(vm_map_t target_task,mach_vm_address_t * address,mach_vm_size_t size,mach_vm_offset_t mask,int flags,mem_entry_name_port_t object,memory_object_offset_t offset,boolean_t copy,vm_prot_t cur_protection,vm_prot_t max_protection,vm_inherit_t inheritance)1295*33de042dSApple OSS Distributions mach_vm_map_wrapped(vm_map_t target_task,
1296*33de042dSApple OSS Distributions     mach_vm_address_t *address,
1297*33de042dSApple OSS Distributions     mach_vm_size_t size,
1298*33de042dSApple OSS Distributions     mach_vm_offset_t mask,
1299*33de042dSApple OSS Distributions     int flags,
1300*33de042dSApple OSS Distributions     mem_entry_name_port_t object,
1301*33de042dSApple OSS Distributions     memory_object_offset_t offset,
1302*33de042dSApple OSS Distributions     boolean_t copy,
1303*33de042dSApple OSS Distributions     vm_prot_t cur_protection,
1304*33de042dSApple OSS Distributions     vm_prot_t max_protection,
1305*33de042dSApple OSS Distributions     vm_inherit_t inheritance)
1306*33de042dSApple OSS Distributions {
1307*33de042dSApple OSS Distributions 	if (dealloc_would_panic(*address, size)) {
1308*33de042dSApple OSS Distributions 		return PANIC;
1309*33de042dSApple OSS Distributions 	}
1310*33de042dSApple OSS Distributions 	mach_vm_address_t saved_addr = *address;
1311*33de042dSApple OSS Distributions 	kern_return_t kr = mach_vm_map(target_task, address, size, mask, flags, object, offset, copy, cur_protection, max_protection, inheritance);
1312*33de042dSApple OSS Distributions 	check_mach_vm_map_outparam_changes(&kr, *address, saved_addr, flags, target_task);
1313*33de042dSApple OSS Distributions 	return kr;
1314*33de042dSApple OSS Distributions }
1315*33de042dSApple OSS Distributions 
1316*33de042dSApple OSS Distributions // missing forward declaration
1317*33de042dSApple OSS Distributions kern_return_t
1318*33de042dSApple OSS Distributions mach_vm_map_external(
1319*33de042dSApple OSS Distributions 	vm_map_t                target_map,
1320*33de042dSApple OSS Distributions 	mach_vm_offset_t        *address,
1321*33de042dSApple OSS Distributions 	mach_vm_size_t          initial_size,
1322*33de042dSApple OSS Distributions 	mach_vm_offset_t        mask,
1323*33de042dSApple OSS Distributions 	int                     flags,
1324*33de042dSApple OSS Distributions 	ipc_port_t              port,
1325*33de042dSApple OSS Distributions 	vm_object_offset_t      offset,
1326*33de042dSApple OSS Distributions 	boolean_t               copy,
1327*33de042dSApple OSS Distributions 	vm_prot_t               cur_protection,
1328*33de042dSApple OSS Distributions 	vm_prot_t               max_protection,
1329*33de042dSApple OSS Distributions 	vm_inherit_t            inheritance);
1330*33de042dSApple OSS Distributions kern_return_t
mach_vm_map_external_wrapped(vm_map_t target_task,mach_vm_address_t * address,mach_vm_size_t size,mach_vm_offset_t mask,int flags,mem_entry_name_port_t object,memory_object_offset_t offset,boolean_t copy,vm_prot_t cur_protection,vm_prot_t max_protection,vm_inherit_t inheritance)1331*33de042dSApple OSS Distributions mach_vm_map_external_wrapped(vm_map_t target_task,
1332*33de042dSApple OSS Distributions     mach_vm_address_t *address,
1333*33de042dSApple OSS Distributions     mach_vm_size_t size,
1334*33de042dSApple OSS Distributions     mach_vm_offset_t mask,
1335*33de042dSApple OSS Distributions     int flags,
1336*33de042dSApple OSS Distributions     mem_entry_name_port_t object,
1337*33de042dSApple OSS Distributions     memory_object_offset_t offset,
1338*33de042dSApple OSS Distributions     boolean_t copy,
1339*33de042dSApple OSS Distributions     vm_prot_t cur_protection,
1340*33de042dSApple OSS Distributions     vm_prot_t max_protection,
1341*33de042dSApple OSS Distributions     vm_inherit_t inheritance)
1342*33de042dSApple OSS Distributions {
1343*33de042dSApple OSS Distributions 	if (dealloc_would_panic(*address, size)) {
1344*33de042dSApple OSS Distributions 		return PANIC;
1345*33de042dSApple OSS Distributions 	}
1346*33de042dSApple OSS Distributions 	mach_vm_address_t saved_addr = *address;
1347*33de042dSApple OSS Distributions 	kern_return_t kr = mach_vm_map_external(target_task, address, size, mask, flags, object, offset, copy, cur_protection, max_protection, inheritance);
1348*33de042dSApple OSS Distributions 	check_mach_vm_map_outparam_changes(&kr, *address, saved_addr, flags, target_task);
1349*33de042dSApple OSS Distributions 	return kr;
1350*33de042dSApple OSS Distributions }
1351*33de042dSApple OSS Distributions 
1352*33de042dSApple OSS Distributions kern_return_t
mach_vm_map_kernel_wrapped(vm_map_t target_task,mach_vm_address_t * address,mach_vm_size_t size,mach_vm_offset_t mask,int flags,mem_entry_name_port_t object,memory_object_offset_t offset,boolean_t copy,vm_prot_t cur_protection,vm_prot_t max_protection,vm_inherit_t inheritance)1353*33de042dSApple OSS Distributions mach_vm_map_kernel_wrapped(vm_map_t target_task,
1354*33de042dSApple OSS Distributions     mach_vm_address_t *address,
1355*33de042dSApple OSS Distributions     mach_vm_size_t size,
1356*33de042dSApple OSS Distributions     mach_vm_offset_t mask,
1357*33de042dSApple OSS Distributions     int flags,
1358*33de042dSApple OSS Distributions     mem_entry_name_port_t object,
1359*33de042dSApple OSS Distributions     memory_object_offset_t offset,
1360*33de042dSApple OSS Distributions     boolean_t copy,
1361*33de042dSApple OSS Distributions     vm_prot_t cur_protection,
1362*33de042dSApple OSS Distributions     vm_prot_t max_protection,
1363*33de042dSApple OSS Distributions     vm_inherit_t inheritance)
1364*33de042dSApple OSS Distributions {
1365*33de042dSApple OSS Distributions 	if (dealloc_would_panic(*address, size)) {
1366*33de042dSApple OSS Distributions 		return PANIC;
1367*33de042dSApple OSS Distributions 	}
1368*33de042dSApple OSS Distributions 	vm_map_kernel_flags_t vmk_flags = VM_MAP_KERNEL_FLAGS_NONE;
1369*33de042dSApple OSS Distributions 
1370*33de042dSApple OSS Distributions 	vm_map_kernel_flags_set_vmflags(&vmk_flags, flags);
1371*33de042dSApple OSS Distributions 	mach_vm_address_t saved_addr = *address;
1372*33de042dSApple OSS Distributions 	kern_return_t kr = mach_vm_map_kernel(target_task, address, size, mask, vmk_flags, object, offset, copy, cur_protection, max_protection, inheritance);
1373*33de042dSApple OSS Distributions 	check_mach_vm_map_outparam_changes(&kr, *address, saved_addr, flags, target_task);
1374*33de042dSApple OSS Distributions 	return kr;
1375*33de042dSApple OSS Distributions }
1376*33de042dSApple OSS Distributions 
1377*33de042dSApple OSS Distributions struct file_control_return {
1378*33de042dSApple OSS Distributions 	void * control;
1379*33de042dSApple OSS Distributions 	void * fp;
1380*33de042dSApple OSS Distributions 	void * vp;
1381*33de042dSApple OSS Distributions 	int fd;
1382*33de042dSApple OSS Distributions };
1383*33de042dSApple OSS Distributions 
1384*33de042dSApple OSS Distributions static inline void
check_vm_map_enter_mem_object_control_outparam_changes(kern_return_t * kr,mach_vm_address_t addr,mach_vm_address_t saved_start,int flags,MAP_T map)1385*33de042dSApple OSS Distributions check_vm_map_enter_mem_object_control_outparam_changes(kern_return_t * kr, mach_vm_address_t addr,
1386*33de042dSApple OSS Distributions     mach_vm_address_t saved_start, int flags, MAP_T map)
1387*33de042dSApple OSS Distributions {
1388*33de042dSApple OSS Distributions 	if (*kr == KERN_SUCCESS) {
1389*33de042dSApple OSS Distributions 		if (is_fixed(flags)) {
1390*33de042dSApple OSS Distributions 			if (addr != truncate_vm_map_addr_with_flags(map, saved_start, flags)) {
1391*33de042dSApple OSS Distributions 				*kr = OUT_PARAM_BAD;
1392*33de042dSApple OSS Distributions 			}
1393*33de042dSApple OSS Distributions 		}
1394*33de042dSApple OSS Distributions 	} else {
1395*33de042dSApple OSS Distributions 		if (saved_start != addr) {
1396*33de042dSApple OSS Distributions 			*kr = OUT_PARAM_BAD;
1397*33de042dSApple OSS Distributions 		}
1398*33de042dSApple OSS Distributions 	}
1399*33de042dSApple OSS Distributions }
1400*33de042dSApple OSS Distributions 
1401*33de042dSApple OSS Distributions struct file_control_return get_control_from_fd(int fd);
1402*33de042dSApple OSS Distributions void cleanup_control_related_data(struct file_control_return info);
1403*33de042dSApple OSS Distributions kern_return_t
vm_map_enter_mem_object_control_wrapped(vm_map_t target_map,mach_vm_address_t * address,mach_vm_size_t size,vm_map_offset_t mask,int flags,mem_entry_name_port_t object __unused,memory_object_offset_t offset,boolean_t copy,vm_prot_t cur_protection,vm_prot_t max_protection,vm_inherit_t inheritance)1404*33de042dSApple OSS Distributions vm_map_enter_mem_object_control_wrapped(
1405*33de042dSApple OSS Distributions 	vm_map_t                target_map,
1406*33de042dSApple OSS Distributions 	mach_vm_address_t      *address,
1407*33de042dSApple OSS Distributions 	mach_vm_size_t          size,
1408*33de042dSApple OSS Distributions 	vm_map_offset_t         mask,
1409*33de042dSApple OSS Distributions 	int                     flags,
1410*33de042dSApple OSS Distributions 	mem_entry_name_port_t   object __unused,
1411*33de042dSApple OSS Distributions 	memory_object_offset_t  offset,
1412*33de042dSApple OSS Distributions 	boolean_t               copy,
1413*33de042dSApple OSS Distributions 	vm_prot_t               cur_protection,
1414*33de042dSApple OSS Distributions 	vm_prot_t               max_protection,
1415*33de042dSApple OSS Distributions 	vm_inherit_t            inheritance)
1416*33de042dSApple OSS Distributions {
1417*33de042dSApple OSS Distributions 	mach_vm_address_t start = vm_map_trunc_page(*address, VM_MAP_PAGE_MASK(target_map));
1418*33de042dSApple OSS Distributions 	mach_vm_address_t end = round_up_page(*address + size, PAGE_SIZE);
1419*33de042dSApple OSS Distributions 	mach_vm_address_t end_offset;
1420*33de042dSApple OSS Distributions 	if (__builtin_add_overflow(end - start, offset, &end_offset)) {
1421*33de042dSApple OSS Distributions 		return PANIC;
1422*33de042dSApple OSS Distributions 	}
1423*33de042dSApple OSS Distributions 
1424*33de042dSApple OSS Distributions 	vm_map_offset_t         vmmaddr;
1425*33de042dSApple OSS Distributions 	vmmaddr = (vm_map_offset_t) *address;
1426*33de042dSApple OSS Distributions 
1427*33de042dSApple OSS Distributions 	if (dealloc_would_panic(*address, size)) {
1428*33de042dSApple OSS Distributions 		return PANIC;
1429*33de042dSApple OSS Distributions 	}
1430*33de042dSApple OSS Distributions 	vm_map_kernel_flags_t vmk_flags = VM_MAP_KERNEL_FLAGS_NONE;
1431*33de042dSApple OSS Distributions 
1432*33de042dSApple OSS Distributions 	vm_map_kernel_flags_set_vmflags(&vmk_flags, flags);
1433*33de042dSApple OSS Distributions 	struct file_control_return control_info = get_control_from_fd(file_descriptor);
1434*33de042dSApple OSS Distributions 	kern_return_t kr = vm_map_enter_mem_object_control(target_map, &vmmaddr, size, mask, vmk_flags, (memory_object_control_t) control_info.control, offset, copy, cur_protection, max_protection, inheritance);
1435*33de042dSApple OSS Distributions 	check_vm_map_enter_mem_object_control_outparam_changes(&kr, vmmaddr, *address, flags, target_map);
1436*33de042dSApple OSS Distributions 
1437*33de042dSApple OSS Distributions 	*address = vmmaddr;
1438*33de042dSApple OSS Distributions 
1439*33de042dSApple OSS Distributions 	cleanup_control_related_data(control_info);
1440*33de042dSApple OSS Distributions 
1441*33de042dSApple OSS Distributions 	return kr;
1442*33de042dSApple OSS Distributions }
1443*33de042dSApple OSS Distributions 
1444*33de042dSApple OSS Distributions kern_return_t
vm_map_wrapped(vm_map_t target_task,mach_vm_address_t * address,mach_vm_size_t size,mach_vm_offset_t mask,int flags,mem_entry_name_port_t object,memory_object_offset_t offset,boolean_t copy,vm_prot_t cur_protection,vm_prot_t max_protection,vm_inherit_t inheritance)1445*33de042dSApple OSS Distributions vm_map_wrapped(vm_map_t target_task,
1446*33de042dSApple OSS Distributions     mach_vm_address_t *address,
1447*33de042dSApple OSS Distributions     mach_vm_size_t size,
1448*33de042dSApple OSS Distributions     mach_vm_offset_t mask,
1449*33de042dSApple OSS Distributions     int flags,
1450*33de042dSApple OSS Distributions     mem_entry_name_port_t object,
1451*33de042dSApple OSS Distributions     memory_object_offset_t offset,
1452*33de042dSApple OSS Distributions     boolean_t copy,
1453*33de042dSApple OSS Distributions     vm_prot_t cur_protection,
1454*33de042dSApple OSS Distributions     vm_prot_t max_protection,
1455*33de042dSApple OSS Distributions     vm_inherit_t inheritance)
1456*33de042dSApple OSS Distributions {
1457*33de042dSApple OSS Distributions 	if (dealloc_would_panic(*address, size)) {
1458*33de042dSApple OSS Distributions 		return PANIC;
1459*33de042dSApple OSS Distributions 	}
1460*33de042dSApple OSS Distributions 	vm_address_t addr = (vm_address_t)*address;
1461*33de042dSApple OSS Distributions 	kern_return_t kr = vm_map(target_task, &addr, size, mask, flags, object, offset, copy, cur_protection, max_protection, inheritance);
1462*33de042dSApple OSS Distributions 	check_mach_vm_map_outparam_changes(&kr, addr, (vm_address_t)*address, flags, target_task);
1463*33de042dSApple OSS Distributions 	*address = addr;
1464*33de042dSApple OSS Distributions 	return kr;
1465*33de042dSApple OSS Distributions }
1466*33de042dSApple OSS Distributions 
1467*33de042dSApple OSS Distributions kern_return_t
1468*33de042dSApple OSS Distributions vm_map_external(
1469*33de042dSApple OSS Distributions 	vm_map_t                target_map,
1470*33de042dSApple OSS Distributions 	vm_offset_t             *address,
1471*33de042dSApple OSS Distributions 	vm_size_t               size,
1472*33de042dSApple OSS Distributions 	vm_offset_t             mask,
1473*33de042dSApple OSS Distributions 	int                     flags,
1474*33de042dSApple OSS Distributions 	ipc_port_t              port,
1475*33de042dSApple OSS Distributions 	vm_offset_t             offset,
1476*33de042dSApple OSS Distributions 	boolean_t               copy,
1477*33de042dSApple OSS Distributions 	vm_prot_t               cur_protection,
1478*33de042dSApple OSS Distributions 	vm_prot_t               max_protection,
1479*33de042dSApple OSS Distributions 	vm_inherit_t            inheritance);
1480*33de042dSApple OSS Distributions kern_return_t
vm_map_external_wrapped(vm_map_t target_task,mach_vm_address_t * address,mach_vm_size_t size,mach_vm_offset_t mask,int flags,mem_entry_name_port_t object,memory_object_offset_t offset,boolean_t copy,vm_prot_t cur_protection,vm_prot_t max_protection,vm_inherit_t inheritance)1481*33de042dSApple OSS Distributions vm_map_external_wrapped(vm_map_t target_task,
1482*33de042dSApple OSS Distributions     mach_vm_address_t *address,
1483*33de042dSApple OSS Distributions     mach_vm_size_t size,
1484*33de042dSApple OSS Distributions     mach_vm_offset_t mask,
1485*33de042dSApple OSS Distributions     int flags,
1486*33de042dSApple OSS Distributions     mem_entry_name_port_t object,
1487*33de042dSApple OSS Distributions     memory_object_offset_t offset,
1488*33de042dSApple OSS Distributions     boolean_t copy,
1489*33de042dSApple OSS Distributions     vm_prot_t cur_protection,
1490*33de042dSApple OSS Distributions     vm_prot_t max_protection,
1491*33de042dSApple OSS Distributions     vm_inherit_t inheritance)
1492*33de042dSApple OSS Distributions {
1493*33de042dSApple OSS Distributions 	if (dealloc_would_panic(*address, size)) {
1494*33de042dSApple OSS Distributions 		return PANIC;
1495*33de042dSApple OSS Distributions 	}
1496*33de042dSApple OSS Distributions 	vm_address_t addr = (vm_address_t)*address;
1497*33de042dSApple OSS Distributions 	kern_return_t kr = vm_map_external(target_task, &addr, size, mask, flags, object, offset, copy, cur_protection, max_protection, inheritance);
1498*33de042dSApple OSS Distributions 	check_mach_vm_map_outparam_changes(&kr, addr, (vm_address_t)*address, flags, target_task);
1499*33de042dSApple OSS Distributions 	*address = addr;
1500*33de042dSApple OSS Distributions 	return kr;
1501*33de042dSApple OSS Distributions }
1502*33de042dSApple OSS Distributions 
1503*33de042dSApple OSS Distributions // implementations
1504*33de042dSApple OSS Distributions 
1505*33de042dSApple OSS Distributions #define IMPL_MAP_FN_START_SIZE(map_fn, instance)                                                \
1506*33de042dSApple OSS Distributions     static kern_return_t                                                                        \
1507*33de042dSApple OSS Distributions     call_ ## map_fn ## __ ## instance (MAP_T map, mach_vm_address_t start, mach_vm_size_t size) \
1508*33de042dSApple OSS Distributions     {                                                                                           \
1509*33de042dSApple OSS Distributions 	return call_map_fn__ ## instance(map_fn, map, start, size);                             \
1510*33de042dSApple OSS Distributions     }
1511*33de042dSApple OSS Distributions 
1512*33de042dSApple OSS Distributions #define IMPL_MAP_FN_HINT_SIZE(map_fn, instance)                                                      \
1513*33de042dSApple OSS Distributions     static kern_return_t                                                                             \
1514*33de042dSApple OSS Distributions     call_ ## map_fn ## __ ## instance (MAP_T map, mach_vm_address_t start_hint, mach_vm_size_t size) \
1515*33de042dSApple OSS Distributions     {                                                                                                \
1516*33de042dSApple OSS Distributions 	return call_map_fn__ ## instance(map_fn, map, start_hint, size);                             \
1517*33de042dSApple OSS Distributions     }
1518*33de042dSApple OSS Distributions 
1519*33de042dSApple OSS Distributions #define IMPL_MAP_FN_START_SIZE_OFFSET_OBJECT(map_fn, instance)                                                                                                                   \
1520*33de042dSApple OSS Distributions     static kern_return_t                                                                                                                                                         \
1521*33de042dSApple OSS Distributions     call_ ## map_fn ## __ ## instance ## __start_size_offset_object(MAP_T map, mach_vm_address_t start, mach_vm_size_t size, vm_object_offset_t offset, mach_vm_size_t obj_size) \
1522*33de042dSApple OSS Distributions     {                                                                                                                                                                            \
1523*33de042dSApple OSS Distributions 	return call_map_fn__ ## instance ## __start_size_offset_object(map_fn, map, start, size, offset, obj_size);                                                              \
1524*33de042dSApple OSS Distributions     }
1525*33de042dSApple OSS Distributions 
1526*33de042dSApple OSS Distributions #define IMPL_MAP_FN_START_SIZE_INHERIT(map_fn, instance)                                                                          \
1527*33de042dSApple OSS Distributions     static kern_return_t                                                                                                          \
1528*33de042dSApple OSS Distributions     call_ ## map_fn ## __ ## instance ## __inherit(MAP_T map, mach_vm_address_t start, mach_vm_size_t size, vm_inherit_t inherit) \
1529*33de042dSApple OSS Distributions     {                                                                                                                             \
1530*33de042dSApple OSS Distributions 	return call_map_fn__ ## instance ## __inherit(map_fn, map, start, size, inherit);                                         \
1531*33de042dSApple OSS Distributions     }
1532*33de042dSApple OSS Distributions 
1533*33de042dSApple OSS Distributions #define IMPL_MAP_FN_START_SIZE_FLAGS(map_fn, instance)                                                                 \
1534*33de042dSApple OSS Distributions     static kern_return_t                                                                                               \
1535*33de042dSApple OSS Distributions     call_ ## map_fn ## __ ## instance ## __flags(MAP_T map, mach_vm_address_t * start, mach_vm_size_t size, int flags) \
1536*33de042dSApple OSS Distributions     {                                                                                                                  \
1537*33de042dSApple OSS Distributions 	return call_map_fn__ ## instance ## __flags(map_fn, map, start, size, flags);                                  \
1538*33de042dSApple OSS Distributions     }
1539*33de042dSApple OSS Distributions 
1540*33de042dSApple OSS Distributions #define IMPL_MAP_FN_PROT_PAIRS(map_fn, instance)                                               \
1541*33de042dSApple OSS Distributions     static kern_return_t                                                                       \
1542*33de042dSApple OSS Distributions     call_ ## map_fn ## __ ## instance ## __prot_pairs(MAP_T map, vm_prot_t cur, vm_prot_t max) \
1543*33de042dSApple OSS Distributions     {                                                                                          \
1544*33de042dSApple OSS Distributions 	return call_map_fn__ ## instance ## __prot_pairs(map_fn, map, cur, max);               \
1545*33de042dSApple OSS Distributions     }
1546*33de042dSApple OSS Distributions 
1547*33de042dSApple OSS Distributions #define IMPL(map_fn)                                                       \
1548*33de042dSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE(map_fn, allocate_fixed)                     \
1549*33de042dSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE(map_fn, allocate_fixed_copy)                \
1550*33de042dSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE(map_fn, memobject_fixed)                    \
1551*33de042dSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE(map_fn, memobject_fixed_copy)               \
1552*33de042dSApple OSS Distributions 	IMPL_MAP_FN_HINT_SIZE(map_fn, allocate_anywhere)                   \
1553*33de042dSApple OSS Distributions 	IMPL_MAP_FN_HINT_SIZE(map_fn, memobject_anywhere)                  \
1554*33de042dSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE_OFFSET_OBJECT(map_fn, memobject_fixed)      \
1555*33de042dSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE_OFFSET_OBJECT(map_fn, memobject_fixed_copy) \
1556*33de042dSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE_OFFSET_OBJECT(map_fn, memobject_anywhere)   \
1557*33de042dSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE_INHERIT(map_fn, allocate_fixed)             \
1558*33de042dSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE_INHERIT(map_fn, allocate_fixed_copy)        \
1559*33de042dSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE_INHERIT(map_fn, allocate_anywhere)          \
1560*33de042dSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE_INHERIT(map_fn, memobject_fixed)            \
1561*33de042dSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE_INHERIT(map_fn, memobject_fixed_copy)       \
1562*33de042dSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE_INHERIT(map_fn, memobject_anywhere)         \
1563*33de042dSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE_FLAGS(map_fn, allocate)                     \
1564*33de042dSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE_FLAGS(map_fn, allocate_copy)                \
1565*33de042dSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE_FLAGS(map_fn, memobject)                    \
1566*33de042dSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE_FLAGS(map_fn, memobject_copy)               \
1567*33de042dSApple OSS Distributions 	IMPL_MAP_FN_PROT_PAIRS(map_fn, allocate_fixed)                     \
1568*33de042dSApple OSS Distributions 	IMPL_MAP_FN_PROT_PAIRS(map_fn, allocate_fixed_copy)                \
1569*33de042dSApple OSS Distributions 	IMPL_MAP_FN_PROT_PAIRS(map_fn, allocate_anywhere)                  \
1570*33de042dSApple OSS Distributions 	IMPL_MAP_FN_PROT_PAIRS(map_fn, memobject_fixed)                    \
1571*33de042dSApple OSS Distributions 	IMPL_MAP_FN_PROT_PAIRS(map_fn, memobject_fixed_copy)               \
1572*33de042dSApple OSS Distributions 	IMPL_MAP_FN_PROT_PAIRS(map_fn, memobject_anywhere)                 \
1573*33de042dSApple OSS Distributions 
1574*33de042dSApple OSS Distributions IMPL(mach_vm_map_wrapped)
IMPL(mach_vm_map_external_wrapped)1575*33de042dSApple OSS Distributions IMPL(mach_vm_map_external_wrapped)
1576*33de042dSApple OSS Distributions IMPL(mach_vm_map_kernel_wrapped)
1577*33de042dSApple OSS Distributions IMPL(vm_map_wrapped)
1578*33de042dSApple OSS Distributions IMPL(vm_map_external_wrapped)
1579*33de042dSApple OSS Distributions IMPL(vm_map_enter_mem_object_control_wrapped)
1580*33de042dSApple OSS Distributions 
1581*33de042dSApple OSS Distributions #undef IMPL
1582*33de042dSApple OSS Distributions 
1583*33de042dSApple OSS Distributions static int
1584*33de042dSApple OSS Distributions vm_parameter_validation_kern_test(int64_t in_value, int64_t *out_value)
1585*33de042dSApple OSS Distributions {
1586*33de042dSApple OSS Distributions 	// in_value has the userspace address of the fixed-size output buffer and a file descriptor.
1587*33de042dSApple OSS Distributions 	// The address is KB16 aligned, so the bottom bits are used for the fd.
1588*33de042dSApple OSS Distributions 	// fd bit 15 also indicates if we want to generate golden results.
1589*33de042dSApple OSS Distributions 	// in_value is KB16 aligned
1590*33de042dSApple OSS Distributions 	uint64_t fd_mask = KB16 - 1;
1591*33de042dSApple OSS Distributions 	file_descriptor = (int)(((uint64_t) in_value) & fd_mask);
1592*33de042dSApple OSS Distributions 	uint64_t buffer_address = in_value - file_descriptor;
1593*33de042dSApple OSS Distributions 	SYSCTL_OUTPUT_BUF = buffer_address;
1594*33de042dSApple OSS Distributions 	SYSCTL_OUTPUT_END = SYSCTL_OUTPUT_BUF + SYSCTL_OUTPUT_BUFFER_SIZE;
1595*33de042dSApple OSS Distributions 
1596*33de042dSApple OSS Distributions 	// check if running to generate golden result list via boot-arg
1597*33de042dSApple OSS Distributions 	kernel_generate_golden = (file_descriptor & (KB16 >> 1)) > 0;
1598*33de042dSApple OSS Distributions 	if (kernel_generate_golden) {
1599*33de042dSApple OSS Distributions 		file_descriptor &= ~(KB16 >> 1);
1600*33de042dSApple OSS Distributions 	} else {
1601*33de042dSApple OSS Distributions 		init_kernel_generate_golden();
1602*33de042dSApple OSS Distributions 	}
1603*33de042dSApple OSS Distributions 
1604*33de042dSApple OSS Distributions 	/*
1605*33de042dSApple OSS Distributions 	 * Group 1: memory entry
1606*33de042dSApple OSS Distributions 	 */
1607*33de042dSApple OSS Distributions 
1608*33de042dSApple OSS Distributions #define RUN_START_SIZE(fn, variant, name) dealloc_results(dump_results(test_mach_with_allocated_start_size(call_ ## fn ## __start_size__ ## variant, name " (start/size)")))
1609*33de042dSApple OSS Distributions #define RUN_PROT(fn, name) dealloc_results(dump_results(test_mach_with_allocated_vm_prot_t(call_ ## fn ## __vm_prot , name " (vm_prot_t)")))
1610*33de042dSApple OSS Distributions 
1611*33de042dSApple OSS Distributions #define RUN_ALL(fn, name) \
1612*33de042dSApple OSS Distributions 	RUN_START_SIZE(fn, copy, #name " (copy)"); \
1613*33de042dSApple OSS Distributions 	RUN_START_SIZE(fn, memonly, #name " (memonly)"); \
1614*33de042dSApple OSS Distributions 	RUN_START_SIZE(fn, namedcreate, #name " (namedcreate)"); \
1615*33de042dSApple OSS Distributions 	RUN_START_SIZE(fn, share, #name " (share)"); \
1616*33de042dSApple OSS Distributions 	RUN_START_SIZE(fn, namedreuse, #name " (namedreuse)"); \
1617*33de042dSApple OSS Distributions 	RUN_PROT(fn, #name " (vm_prot_t)"); \
1618*33de042dSApple OSS Distributions 
1619*33de042dSApple OSS Distributions 	RUN_ALL(mach_make_memory_entry_64, mach_make_memory_entry_64);
1620*33de042dSApple OSS Distributions 	RUN_ALL(mach_make_memory_entry, mach_make_memory_entry);
1621*33de042dSApple OSS Distributions 	RUN_ALL(mach_make_memory_entry_internal_retyped, mach_make_memory_entry_internal);
1622*33de042dSApple OSS Distributions #undef RUN_ALL
1623*33de042dSApple OSS Distributions #undef RUN_START_SIZE
1624*33de042dSApple OSS Distributions #undef RUN_PROT
1625*33de042dSApple OSS Distributions 
1626*33de042dSApple OSS Distributions #define RUN(fn, name) dealloc_results(dump_results(test_mach_with_ledger_tag(fn, name " (ledger tag)")))
1627*33de042dSApple OSS Distributions 	RUN(call_mach_memory_entry_ownership__ledger_tag, "mach_memory_entry_ownership");
1628*33de042dSApple OSS Distributions #undef RUN
1629*33de042dSApple OSS Distributions 
1630*33de042dSApple OSS Distributions #define RUN(fn, name) dealloc_results(dump_results(test_mach_with_ledger_flag(fn, name " (ledger flag)")))
1631*33de042dSApple OSS Distributions 	RUN(call_mach_memory_entry_ownership__ledger_flag, "mach_memory_entry_ownership");
1632*33de042dSApple OSS Distributions #undef RUN
1633*33de042dSApple OSS Distributions 
1634*33de042dSApple OSS Distributions #define RUN(fn, name) dealloc_results(dump_results(test_mach_with_allocated_start_size(fn, name " (start/size)")))
1635*33de042dSApple OSS Distributions 	RUN(call_mach_memory_entry_map_size__start_size, "mach_memory_entry_map_size");
1636*33de042dSApple OSS Distributions #undef RUN
1637*33de042dSApple OSS Distributions 
1638*33de042dSApple OSS Distributions 	/*
1639*33de042dSApple OSS Distributions 	 * Group 2: allocate/deallocate
1640*33de042dSApple OSS Distributions 	 */
1641*33de042dSApple OSS Distributions 
1642*33de042dSApple OSS Distributions #define RUN(fn, name) dealloc_results(dump_results(test_mach_allocation_func_with_start_size(fn, name)))
1643*33de042dSApple OSS Distributions 	RUN(call_mach_vm_allocate__start_size_fixed, "mach_vm_allocate_external (fixed) (realigned start/size)");
1644*33de042dSApple OSS Distributions 	RUN(call_mach_vm_allocate__start_size_anywhere, "mach_vm_allocate_external (anywhere) (hint/size)");
1645*33de042dSApple OSS Distributions 	RUN(call_mach_vm_allocate_kernel__start_size_fixed, "mach_vm_allocate (fixed) (realigned start/size)");
1646*33de042dSApple OSS Distributions 	RUN(call_mach_vm_allocate_kernel__start_size_anywhere, "mach_vm_allocate (anywhere) (hint/size)");
1647*33de042dSApple OSS Distributions #undef RUN
1648*33de042dSApple OSS Distributions 
1649*33de042dSApple OSS Distributions #define RUN(fn, name) dealloc_results(dump_results(test_mach_allocation_func_with_vm_map_kernel_flags_t(fn, name " (vm_map_kernel_flags_t)")))
1650*33de042dSApple OSS Distributions 	RUN(call_mach_vm_allocate__flags, "mach_vm_allocate_external");
1651*33de042dSApple OSS Distributions 	RUN(call_mach_vm_allocate_kernel__flags, "mach_vm_allocate_kernel");
1652*33de042dSApple OSS Distributions #undef RUN
1653*33de042dSApple OSS Distributions 
1654*33de042dSApple OSS Distributions #define RUN(fn, name) dealloc_results(dump_results(test_mach_allocation_func_with_start_size(fn, name)))
1655*33de042dSApple OSS Distributions 	RUN(call_vm_allocate__start_size_fixed, "vm_allocate (fixed) (realigned start/size)");
1656*33de042dSApple OSS Distributions 	RUN(call_vm_allocate__start_size_anywhere, "vm_allocate (anywhere) (hint/size)");
1657*33de042dSApple OSS Distributions #undef RUN
1658*33de042dSApple OSS Distributions 
1659*33de042dSApple OSS Distributions #define RUN(fn, name) dealloc_results(dump_results(test_mach_allocation_func_with_vm_map_kernel_flags_t(fn, name " (vm_map_kernel_flags_t)")))
1660*33de042dSApple OSS Distributions 	RUN(call_vm_allocate__flags, "vm_allocate");
1661*33de042dSApple OSS Distributions #undef RUN
1662*33de042dSApple OSS Distributions 	dealloc_results(dump_results(test_deallocator(call_mach_vm_deallocate, "mach_vm_deallocate (start/size)")));
1663*33de042dSApple OSS Distributions 	dealloc_results(dump_results(test_deallocator(call_vm_deallocate, "vm_deallocate (start/size)")));
1664*33de042dSApple OSS Distributions 
1665*33de042dSApple OSS Distributions 	/*
1666*33de042dSApple OSS Distributions 	 * Group 3: map/remap
1667*33de042dSApple OSS Distributions 	 */
1668*33de042dSApple OSS Distributions 
1669*33de042dSApple OSS Distributions 	// map tests
1670*33de042dSApple OSS Distributions 
1671*33de042dSApple OSS Distributions #define RUN_START_SIZE(fn, name) dealloc_results(dump_results(test_mach_with_allocated_start_size(fn, name " (realigned start/size)")))
1672*33de042dSApple OSS Distributions #define RUN_HINT_SIZE(fn, name) dealloc_results(dump_results(test_mach_with_allocated_start_size(fn, name " (hint/size)")))
1673*33de042dSApple OSS Distributions #define RUN_PROT_PAIR(fn, name) dealloc_results(dump_results(test_mach_vm_prot_pair(fn, name " (vm_prot_t pair)")))
1674*33de042dSApple OSS Distributions #define RUN_INHERIT(fn, name) dealloc_results(dump_results(test_mach_with_allocated_vm_inherit_t(fn, name " (vm_inherit_t)")))
1675*33de042dSApple OSS Distributions #define RUN_FLAGS(fn, name) dealloc_results(dump_results(test_mach_allocation_func_with_vm_map_kernel_flags_t(fn, name " (vm_map_kernel_flags_t)")))
1676*33de042dSApple OSS Distributions #define RUN_SSOO(fn, name) dealloc_results(dump_results(test_mach_with_start_size_offset_object(fn, name " (start/size/offset/object)")))
1677*33de042dSApple OSS Distributions 
1678*33de042dSApple OSS Distributions #define RUN_ALL(fn, name)     \
1679*33de042dSApple OSS Distributions 	RUN_START_SIZE(call_ ## fn ## __allocate_fixed, #name " (allocate fixed overwrite)");   \
1680*33de042dSApple OSS Distributions 	RUN_START_SIZE(call_ ## fn ## __allocate_fixed_copy, #name " (allocate fixed overwrite copy)");  \
1681*33de042dSApple OSS Distributions 	RUN_START_SIZE(call_ ## fn ## __memobject_fixed, #name " (memobject fixed overwrite)");  \
1682*33de042dSApple OSS Distributions 	RUN_START_SIZE(call_ ## fn ## __memobject_fixed_copy, #name " (memobject fixed overwrite copy)"); \
1683*33de042dSApple OSS Distributions 	RUN_HINT_SIZE(call_ ## fn ## __allocate_anywhere, #name " (allocate anywhere)");  \
1684*33de042dSApple OSS Distributions 	RUN_HINT_SIZE(call_ ## fn ## __memobject_anywhere, #name " (memobject anywhere)");  \
1685*33de042dSApple OSS Distributions 	RUN_PROT_PAIR(call_ ## fn ## __allocate_fixed__prot_pairs, #name " (allocate fixed overwrite)");  \
1686*33de042dSApple OSS Distributions 	RUN_PROT_PAIR(call_ ## fn ## __allocate_fixed_copy__prot_pairs, #name " (allocate fixed overwrite copy)");  \
1687*33de042dSApple OSS Distributions 	RUN_PROT_PAIR(call_ ## fn ## __allocate_anywhere__prot_pairs, #name " (allocate anywhere)");  \
1688*33de042dSApple OSS Distributions 	RUN_PROT_PAIR(call_ ## fn ## __memobject_fixed__prot_pairs, #name " (memobject fixed overwrite)");  \
1689*33de042dSApple OSS Distributions 	RUN_PROT_PAIR(call_ ## fn ## __memobject_fixed_copy__prot_pairs, #name " (memobject fixed overwrite copy)");  \
1690*33de042dSApple OSS Distributions 	RUN_PROT_PAIR(call_ ## fn ## __memobject_anywhere__prot_pairs, #name " (memobject anywhere)");  \
1691*33de042dSApple OSS Distributions 	RUN_INHERIT(call_ ## fn ## __allocate_fixed__inherit, #name " (allocate fixed overwrite)");  \
1692*33de042dSApple OSS Distributions 	RUN_INHERIT(call_ ## fn ## __allocate_fixed_copy__inherit, #name " (allocate fixed overwrite copy)");  \
1693*33de042dSApple OSS Distributions 	RUN_INHERIT(call_ ## fn ## __allocate_anywhere__inherit, #name " (allocate anywhere)");  \
1694*33de042dSApple OSS Distributions 	RUN_INHERIT(call_ ## fn ## __memobject_fixed__inherit, #name " (memobject fixed overwrite)");  \
1695*33de042dSApple OSS Distributions 	RUN_INHERIT(call_ ## fn ## __memobject_fixed_copy__inherit, #name " (memobject fixed overwrite copy)");  \
1696*33de042dSApple OSS Distributions 	RUN_INHERIT(call_ ## fn ## __memobject_anywhere__inherit, #name " (memobject anywhere)");  \
1697*33de042dSApple OSS Distributions 	RUN_FLAGS(call_ ## fn ## __allocate__flags, #name " (allocate)");  \
1698*33de042dSApple OSS Distributions 	RUN_FLAGS(call_ ## fn ## __allocate_copy__flags, #name " (allocate copy)");  \
1699*33de042dSApple OSS Distributions 	RUN_FLAGS(call_ ## fn ## __memobject__flags, #name " (memobject)");  \
1700*33de042dSApple OSS Distributions 	RUN_FLAGS(call_ ## fn ## __memobject_copy__flags, #name " (memobject copy)");  \
1701*33de042dSApple OSS Distributions 	RUN_SSOO(call_ ## fn ## __memobject_fixed__start_size_offset_object, #name " (memobject fixed overwrite)");  \
1702*33de042dSApple OSS Distributions 	RUN_SSOO(call_ ## fn ## __memobject_fixed_copy__start_size_offset_object, #name " (memobject fixed overwrite copy)");  \
1703*33de042dSApple OSS Distributions 	RUN_SSOO(call_ ## fn ## __memobject_anywhere__start_size_offset_object, #name " (memobject anywhere)");  \
1704*33de042dSApple OSS Distributions 
1705*33de042dSApple OSS Distributions 	RUN_ALL(mach_vm_map_wrapped, mach_vm_map);
1706*33de042dSApple OSS Distributions 	RUN_ALL(mach_vm_map_external_wrapped, mach_vm_map_external);
1707*33de042dSApple OSS Distributions 	RUN_ALL(mach_vm_map_kernel_wrapped, mach_vm_map_kernel);
1708*33de042dSApple OSS Distributions 	RUN_ALL(vm_map_wrapped, vm_map);
1709*33de042dSApple OSS Distributions 	RUN_ALL(vm_map_external_wrapped, vm_map_external);
1710*33de042dSApple OSS Distributions 
1711*33de042dSApple OSS Distributions #define RUN_SSO(fn, name) dealloc_results(dump_results(test_mach_with_start_size_offset(fn, name " (start/size/offset)")))
1712*33de042dSApple OSS Distributions 
1713*33de042dSApple OSS Distributions #define RUN_ALL_CTL(fn, name)     \
1714*33de042dSApple OSS Distributions 	RUN_START_SIZE(call_ ## fn ## __allocate_fixed, #name " (allocate fixed overwrite)");   \
1715*33de042dSApple OSS Distributions 	RUN_START_SIZE(call_ ## fn ## __allocate_fixed_copy, #name " (allocate fixed overwrite copy)");  \
1716*33de042dSApple OSS Distributions 	RUN_START_SIZE(call_ ## fn ## __memobject_fixed, #name " (memobject fixed overwrite)");  \
1717*33de042dSApple OSS Distributions 	RUN_START_SIZE(call_ ## fn ## __memobject_fixed_copy, #name " (memobject fixed overwrite copy)"); \
1718*33de042dSApple OSS Distributions 	RUN_HINT_SIZE(call_ ## fn ## __allocate_anywhere, #name " (allocate anywhere)");  \
1719*33de042dSApple OSS Distributions 	RUN_HINT_SIZE(call_ ## fn ## __memobject_anywhere, #name " (memobject anywhere)");  \
1720*33de042dSApple OSS Distributions 	RUN_PROT_PAIR(call_ ## fn ## __allocate_fixed__prot_pairs, #name " (allocate fixed overwrite)");  \
1721*33de042dSApple OSS Distributions 	RUN_PROT_PAIR(call_ ## fn ## __allocate_fixed_copy__prot_pairs, #name " (allocate fixed overwrite copy)");  \
1722*33de042dSApple OSS Distributions 	RUN_PROT_PAIR(call_ ## fn ## __allocate_anywhere__prot_pairs, #name " (allocate anywhere)");  \
1723*33de042dSApple OSS Distributions 	RUN_PROT_PAIR(call_ ## fn ## __memobject_fixed__prot_pairs, #name " (memobject fixed overwrite)");  \
1724*33de042dSApple OSS Distributions 	RUN_PROT_PAIR(call_ ## fn ## __memobject_fixed_copy__prot_pairs, #name " (memobject fixed overwrite copy)");  \
1725*33de042dSApple OSS Distributions 	RUN_PROT_PAIR(call_ ## fn ## __memobject_anywhere__prot_pairs, #name " (memobject anywhere)");  \
1726*33de042dSApple OSS Distributions 	RUN_INHERIT(call_ ## fn ## __allocate_fixed__inherit, #name " (allocate fixed overwrite)");  \
1727*33de042dSApple OSS Distributions 	RUN_INHERIT(call_ ## fn ## __allocate_fixed_copy__inherit, #name " (allocate fixed overwrite copy)");  \
1728*33de042dSApple OSS Distributions 	RUN_INHERIT(call_ ## fn ## __allocate_anywhere__inherit, #name " (allocate anywhere)");  \
1729*33de042dSApple OSS Distributions 	RUN_INHERIT(call_ ## fn ## __memobject_fixed__inherit, #name " (memobject fixed overwrite)");  \
1730*33de042dSApple OSS Distributions 	RUN_INHERIT(call_ ## fn ## __memobject_fixed_copy__inherit, #name " (memobject fixed overwrite copy)");  \
1731*33de042dSApple OSS Distributions 	RUN_INHERIT(call_ ## fn ## __memobject_anywhere__inherit, #name " (memobject anywhere)");  \
1732*33de042dSApple OSS Distributions 	RUN_FLAGS(call_ ## fn ## __allocate__flags, #name " (allocate)");  \
1733*33de042dSApple OSS Distributions 	RUN_FLAGS(call_ ## fn ## __allocate_copy__flags, #name " (allocate copy)");  \
1734*33de042dSApple OSS Distributions 	RUN_FLAGS(call_ ## fn ## __memobject__flags, #name " (memobject)");  \
1735*33de042dSApple OSS Distributions 	RUN_FLAGS(call_ ## fn ## __memobject_copy__flags, #name " (memobject copy)");  \
1736*33de042dSApple OSS Distributions 	RUN_SSO(call_ ## fn ## __memobject_fixed__start_size_offset_object, #name " (memobject fixed overwrite)");  \
1737*33de042dSApple OSS Distributions 	RUN_SSO(call_ ## fn ## __memobject_fixed_copy__start_size_offset_object, #name " (memobject fixed overwrite copy)");  \
1738*33de042dSApple OSS Distributions 	RUN_SSO(call_ ## fn ## __memobject_anywhere__start_size_offset_object, #name " (memobject anywhere)");  \
1739*33de042dSApple OSS Distributions 
1740*33de042dSApple OSS Distributions 	RUN_ALL_CTL(vm_map_enter_mem_object_control_wrapped, vm_map_enter_mem_object_control);
1741*33de042dSApple OSS Distributions 
1742*33de042dSApple OSS Distributions #undef RUN_ALL
1743*33de042dSApple OSS Distributions #undef RUN_START_SIZE
1744*33de042dSApple OSS Distributions #undef RUN_HINT_SIZE
1745*33de042dSApple OSS Distributions #undef RUN_PROT_PAIR
1746*33de042dSApple OSS Distributions #undef RUN_INHERIT
1747*33de042dSApple OSS Distributions #undef RUN_FLAGS
1748*33de042dSApple OSS Distributions #undef RUN_SSOO
1749*33de042dSApple OSS Distributions #undef RUN_ALL_CTL
1750*33de042dSApple OSS Distributions #undef RUN_SSO
1751*33de042dSApple OSS Distributions 
1752*33de042dSApple OSS Distributions 	// remap tests
1753*33de042dSApple OSS Distributions 
1754*33de042dSApple OSS Distributions #define FN_NAME(fn, variant, type) call_ ## fn ## __  ## variant ## __ ## type
1755*33de042dSApple OSS Distributions #define RUN_HELPER(harness, fn, variant, type, type_name, name) dealloc_results(dump_results(harness(FN_NAME(fn, variant, type), #name " (" #variant ") (" type_name ")")))
1756*33de042dSApple OSS Distributions #define RUN_SRC_SIZE(fn, variant, type_name, name) RUN_HELPER(test_mach_with_allocated_start_size, fn, variant, src_size, type_name, name)
1757*33de042dSApple OSS Distributions #define RUN_DST_SIZE(fn, variant, type_name, name) RUN_HELPER(test_mach_with_allocated_start_size, fn, variant, dst_size, type_name, name)
1758*33de042dSApple OSS Distributions #define RUN_PROT_PAIRS(fn, variant, name) RUN_HELPER(test_mach_with_allocated_vm_prot_pair, fn, variant, prot_pairs, "prot_pairs", name)
1759*33de042dSApple OSS Distributions #define RUN_INHERIT(fn, variant, name) RUN_HELPER(test_mach_with_allocated_vm_inherit_t, fn, variant, inherit, "inherit", name)
1760*33de042dSApple OSS Distributions #define RUN_FLAGS(fn, variant, name) RUN_HELPER(test_mach_with_allocated_vm_map_kernel_flags_t, fn, variant, flags, "flags", name)
1761*33de042dSApple OSS Distributions #define RUN_SRC_DST_SIZE(fn, variant, type_name, name) RUN_HELPER(test_allocated_src_unallocated_dst_size, fn, variant, src_dst_size, type_name, name)
1762*33de042dSApple OSS Distributions 
1763*33de042dSApple OSS Distributions #define RUN_ALL(fn, realigned, name)                                    \
1764*33de042dSApple OSS Distributions 	RUN_SRC_SIZE(fn, copy, realigned "src/size", name);             \
1765*33de042dSApple OSS Distributions 	RUN_SRC_SIZE(fn, nocopy, realigned "src/size", name);           \
1766*33de042dSApple OSS Distributions 	RUN_DST_SIZE(fn, fixed, "realigned dst/size", name);            \
1767*33de042dSApple OSS Distributions 	RUN_DST_SIZE(fn, fixed_copy, "realigned dst/size", name);       \
1768*33de042dSApple OSS Distributions 	RUN_DST_SIZE(fn, anywhere, "hint/size", name);                  \
1769*33de042dSApple OSS Distributions 	RUN_INHERIT(fn, fixed, name);                                   \
1770*33de042dSApple OSS Distributions 	RUN_INHERIT(fn, fixed_copy, name);                              \
1771*33de042dSApple OSS Distributions 	RUN_INHERIT(fn, anywhere, name);                                \
1772*33de042dSApple OSS Distributions 	RUN_FLAGS(fn, nocopy, name);                                    \
1773*33de042dSApple OSS Distributions 	RUN_FLAGS(fn, copy, name);                                      \
1774*33de042dSApple OSS Distributions 	RUN_PROT_PAIRS(fn, fixed, name);                                \
1775*33de042dSApple OSS Distributions 	RUN_PROT_PAIRS(fn, fixed_copy, name);                           \
1776*33de042dSApple OSS Distributions 	RUN_PROT_PAIRS(fn, anywhere, name);                             \
1777*33de042dSApple OSS Distributions 	RUN_SRC_DST_SIZE(fn, fixed, "src/dst/size", name);              \
1778*33de042dSApple OSS Distributions 	RUN_SRC_DST_SIZE(fn, fixed_copy, "src/dst/size", name);         \
1779*33de042dSApple OSS Distributions 	RUN_SRC_DST_SIZE(fn, anywhere, "src/dst/size", name);           \
1780*33de042dSApple OSS Distributions 
1781*33de042dSApple OSS Distributions 	RUN_ALL(mach_vm_remap_wrapped_kern, "realigned ", mach_vm_remap);
1782*33de042dSApple OSS Distributions 	RUN_ALL(mach_vm_remap_new_kernel_wrapped, , mach_vm_remap_new_kernel);
1783*33de042dSApple OSS Distributions 
1784*33de042dSApple OSS Distributions #undef RUN_ALL
1785*33de042dSApple OSS Distributions #undef RUN_HELPER
1786*33de042dSApple OSS Distributions #undef RUN_SRC_SIZE
1787*33de042dSApple OSS Distributions #undef RUN_DST_SIZE
1788*33de042dSApple OSS Distributions #undef RUN_PROT_PAIRS
1789*33de042dSApple OSS Distributions #undef RUN_INHERIT
1790*33de042dSApple OSS Distributions #undef RUN_FLAGS
1791*33de042dSApple OSS Distributions #undef RUN_SRC_DST_SIZE
1792*33de042dSApple OSS Distributions 
1793*33de042dSApple OSS Distributions 	/*
1794*33de042dSApple OSS Distributions 	 * Group 4: wire/unwire
1795*33de042dSApple OSS Distributions 	 */
1796*33de042dSApple OSS Distributions 
1797*33de042dSApple OSS Distributions #define RUN(fn, name) dealloc_results(dump_results(test_kext_unix_with_allocated_start_size(fn, name " (start/size)")))
1798*33de042dSApple OSS Distributions 	RUN(call_vslock, "vslock");
1799*33de042dSApple OSS Distributions 	RUN(call_vsunlock_undirtied, "vsunlock (undirtied)");
1800*33de042dSApple OSS Distributions 	RUN(call_vsunlock_dirtied, "vsunlock (dirtied)");
1801*33de042dSApple OSS Distributions #undef RUN
1802*33de042dSApple OSS Distributions 
1803*33de042dSApple OSS Distributions #if XNU_PLATFORM_MacOSX
1804*33de042dSApple OSS Distributions 	// vm_map_wire_and_extract is implemented on macOS only
1805*33de042dSApple OSS Distributions #define RUN(fn, name) dealloc_results(dump_results(test_kext_tagged_with_allocated_addr(fn, name " (addr)")))
1806*33de042dSApple OSS Distributions 	RUN(call_vm_map_wire_and_extract_user_wired, "vm_map_wire_and_extract (user wired)");
1807*33de042dSApple OSS Distributions 	RUN(call_vm_map_wire_and_extract_non_user_wired, "vm_map_wire_and_extract (user wired)");
1808*33de042dSApple OSS Distributions #undef RUN
1809*33de042dSApple OSS Distributions 
1810*33de042dSApple OSS Distributions #define RUN(fn, name) dealloc_results(dump_results(test_mach_with_allocated_vm_prot_t(fn, name " (vm_prot_t)")))
1811*33de042dSApple OSS Distributions 	RUN(call_vm_map_wire_and_extract_vm_prot_t_user_wired, "vm_map_wire_and_extract_external (user wired)");
1812*33de042dSApple OSS Distributions 	RUN(call_vm_map_wire_and_extract_vm_prot_t_non_user_wired, "vm_map_wire_and_extract_external (non user wired)");
1813*33de042dSApple OSS Distributions #undef RUN
1814*33de042dSApple OSS Distributions #endif // XNU_PLATFORM_MacOSX
1815*33de042dSApple OSS Distributions 
1816*33de042dSApple OSS Distributions #define RUN(fn, name) dealloc_results(dump_results(test_mach_with_allocated_vm_prot_t(fn, name " (vm_prot_t)")))
1817*33de042dSApple OSS Distributions 	RUN(call_vm_map_wire_external_vm_prot_t_user_wired, "vm_map_wire_external (user wired)");
1818*33de042dSApple OSS Distributions 	RUN(call_vm_map_wire_external_vm_prot_t_non_user_wired, "vm_map_wire_external (non user wired))");
1819*33de042dSApple OSS Distributions 	RUN(call_vm_map_wire_kernel_vm_prot_t_user_wired, "vm_map_wire_kernel (user wired)");
1820*33de042dSApple OSS Distributions 	RUN(call_vm_map_wire_kernel_vm_prot_t_non_user_wired, "vm_map_wire_kernel (non user wired))");
1821*33de042dSApple OSS Distributions #undef RUN
1822*33de042dSApple OSS Distributions 
1823*33de042dSApple OSS Distributions #define RUN(fn, name) dealloc_results(dump_results(test_with_start_end(fn, name " (start/end)")))
1824*33de042dSApple OSS Distributions 	RUN(call_vm_map_wire_external_user_wired, "vm_map_wire_external (user wired)");
1825*33de042dSApple OSS Distributions 	RUN(call_vm_map_wire_external_non_user_wired, "vm_map_wire_external (non user wired)");
1826*33de042dSApple OSS Distributions 	RUN(call_vm_map_wire_kernel_user_wired, "vm_map_wire_kernel (user wired)");
1827*33de042dSApple OSS Distributions 	RUN(call_vm_map_wire_kernel_non_user_wired, "vm_map_wire_kernel (non user wired)");
1828*33de042dSApple OSS Distributions 	RUN(call_vm_map_unwire_user_wired, "vm_map_unwire (user_wired)");
1829*33de042dSApple OSS Distributions 	RUN(call_vm_map_unwire_non_user_wired, "vm_map_unwire (non user_wired)");
1830*33de042dSApple OSS Distributions #undef RUN
1831*33de042dSApple OSS Distributions 
1832*33de042dSApple OSS Distributions #define RUN(fn, name) dealloc_results(dump_results(test_with_tag(fn, name " (tag)")))
1833*33de042dSApple OSS Distributions 	RUN(call_vm_map_kernel_tag_user_wired, "vm_map_wire_kernel (user wired)");
1834*33de042dSApple OSS Distributions 	RUN(call_vm_map_kernel_tag_non_user_wired, "vm_map_wire_kernel (non user wired)");
1835*33de042dSApple OSS Distributions #undef RUN
1836*33de042dSApple OSS Distributions 
1837*33de042dSApple OSS Distributions #define RUN(fn, name) dealloc_results(dump_results(test_with_int64(fn, name " (int64)")))
1838*33de042dSApple OSS Distributions 	RUN(call_mach_vm_wire_level_monitor, "mach_vm_wire_level_monitor");
1839*33de042dSApple OSS Distributions #undef RUN
1840*33de042dSApple OSS Distributions 
1841*33de042dSApple OSS Distributions 	/*
1842*33de042dSApple OSS Distributions 	 * Group 5: copyin/copyout
1843*33de042dSApple OSS Distributions 	 */
1844*33de042dSApple OSS Distributions 
1845*33de042dSApple OSS Distributions #define RUN(fn, name) dealloc_results(dump_results(test_mach_with_allocated_start_size(fn, name " (start/size)")))
1846*33de042dSApple OSS Distributions 	RUN(call_vm_map_copyin, "vm_map_copyin");
1847*33de042dSApple OSS Distributions 	// vm_map_copyin_common is covered well by the vm_map_copyin test
1848*33de042dSApple OSS Distributions 	// RUN(call_vm_map_copyin_common, "vm_map_copyin_common");
1849*33de042dSApple OSS Distributions #undef RUN
1850*33de042dSApple OSS Distributions 
1851*33de042dSApple OSS Distributions #define RUN(fn, name) dealloc_results(dump_results(test_mach_with_allocated_addr_of_size_n(fn, sizeof(uint32_t), name " (start)")))
1852*33de042dSApple OSS Distributions 	RUN(call_copyoutmap_atomic32, "copyoutmap_atomic32");
1853*33de042dSApple OSS Distributions #undef RUN
1854*33de042dSApple OSS Distributions 
1855*33de042dSApple OSS Distributions #define RUN(fn, name) dealloc_results(dump_results(test_src_kerneldst_size(fn, name " (src/dst/size)")))
1856*33de042dSApple OSS Distributions 	RUN(call_copyinmap, "copyinmap");
1857*33de042dSApple OSS Distributions 	RUN(call_vm_map_read_user, "vm_map_read_user");
1858*33de042dSApple OSS Distributions #undef RUN
1859*33de042dSApple OSS Distributions 
1860*33de042dSApple OSS Distributions #define RUN(fn, name) dealloc_results(dump_results(test_kernelsrc_dst_size(fn, name " (src/dst/size)")))
1861*33de042dSApple OSS Distributions 	RUN(call_vm_map_write_user, "vm_map_write_user");
1862*33de042dSApple OSS Distributions 	RUN(call_copyoutmap, "copyoutmap");
1863*33de042dSApple OSS Distributions #undef RUN
1864*33de042dSApple OSS Distributions 
1865*33de042dSApple OSS Distributions 	dealloc_results(dump_results(test_vm_map_copy_overwrite(call_vm_map_copy_overwrite_interruptible, "vm_map_copy_overwrite (start/size)")));
1866*33de042dSApple OSS Distributions 
1867*33de042dSApple OSS Distributions 	SYSCTL_OUTPUT_BUF = 0;
1868*33de042dSApple OSS Distributions 	SYSCTL_OUTPUT_END = 0;
1869*33de042dSApple OSS Distributions 	*out_value = 1;  // success
1870*33de042dSApple OSS Distributions 	return 0;
1871*33de042dSApple OSS Distributions }
1872*33de042dSApple OSS Distributions 
1873*33de042dSApple OSS Distributions SYSCTL_TEST_REGISTER(vm_parameter_validation_kern, vm_parameter_validation_kern_test);
1874