xref: /xnu-11215.81.4/osfmk/tests/vm_parameter_validation_kern.c (revision d4514f0bc1d3f944c22d92e68b646ac3fb40d452)
1*d4514f0bSApple OSS Distributions #include <kern/zalloc.h>
2*d4514f0bSApple OSS Distributions #include <kern/thread_test_context.h>
3*d4514f0bSApple OSS Distributions 
4*d4514f0bSApple OSS Distributions #include "vm_parameter_validation.h"
5*d4514f0bSApple OSS Distributions 
6*d4514f0bSApple OSS Distributions #pragma clang diagnostic ignored "-Wdeclaration-after-statement"
7*d4514f0bSApple OSS Distributions #pragma clang diagnostic ignored "-Wincompatible-function-pointer-types"
8*d4514f0bSApple OSS Distributions #pragma clang diagnostic ignored "-Wmissing-prototypes"
9*d4514f0bSApple OSS Distributions #pragma clang diagnostic ignored "-Wpedantic"
10*d4514f0bSApple OSS Distributions #pragma clang diagnostic ignored "-Wgcc-compat"
11*d4514f0bSApple OSS Distributions 
12*d4514f0bSApple OSS Distributions 
13*d4514f0bSApple OSS Distributions // Kernel sysctl test prints its output into a userspace buffer.
14*d4514f0bSApple OSS Distributions // fixme these global variables prevent test concurrency
15*d4514f0bSApple OSS Distributions 
16*d4514f0bSApple OSS Distributions static user_addr_t SYSCTL_OUTPUT_BUF;
17*d4514f0bSApple OSS Distributions static user_addr_t SYSCTL_OUTPUT_END;
18*d4514f0bSApple OSS Distributions 
19*d4514f0bSApple OSS Distributions // This is a read/write fd passed from userspace.
20*d4514f0bSApple OSS Distributions // It's passed to make it easier for kernel tests to interact with a file.
21*d4514f0bSApple OSS Distributions static int file_descriptor;
22*d4514f0bSApple OSS Distributions 
23*d4514f0bSApple OSS Distributions // Output to create a golden test result in kern test, controlled by
24*d4514f0bSApple OSS Distributions // MSB in file_descriptor and set by GENERATE_GOLDEN_IMAGE from userspace.
25*d4514f0bSApple OSS Distributions bool kernel_generate_golden = FALSE;
26*d4514f0bSApple OSS Distributions 
27*d4514f0bSApple OSS Distributions // vprintf() to a userspace buffer
28*d4514f0bSApple OSS Distributions // output is incremented to point at the new nul terminator
29*d4514f0bSApple OSS Distributions static void
user_vprintf(user_addr_t * output,user_addr_t output_end,const char * format,va_list args)30*d4514f0bSApple OSS Distributions user_vprintf(user_addr_t *output, user_addr_t output_end, const char *format, va_list args) __printflike(3, 0)
31*d4514f0bSApple OSS Distributions {
32*d4514f0bSApple OSS Distributions 	extern int vsnprintf(char *, size_t, const char *, va_list) __printflike(3, 0);
33*d4514f0bSApple OSS Distributions 	char linebuf[1024];
34*d4514f0bSApple OSS Distributions 	size_t printed;
35*d4514f0bSApple OSS Distributions 
36*d4514f0bSApple OSS Distributions 	printed = vsnprintf(linebuf, sizeof(linebuf), format, args);
37*d4514f0bSApple OSS Distributions 	assert(printed < sizeof(linebuf) - 1);
38*d4514f0bSApple OSS Distributions 	assert(*output + printed + 1 < output_end);
39*d4514f0bSApple OSS Distributions 	copyout(linebuf, *output, printed + 1);
40*d4514f0bSApple OSS Distributions 	*output += printed;
41*d4514f0bSApple OSS Distributions }
42*d4514f0bSApple OSS Distributions 
43*d4514f0bSApple OSS Distributions void
testprintf(const char * format,...)44*d4514f0bSApple OSS Distributions testprintf(const char *format, ...)
45*d4514f0bSApple OSS Distributions {
46*d4514f0bSApple OSS Distributions 	va_list args;
47*d4514f0bSApple OSS Distributions 	va_start(args, format);
48*d4514f0bSApple OSS Distributions 	user_vprintf(&SYSCTL_OUTPUT_BUF, SYSCTL_OUTPUT_END, format, args);
49*d4514f0bSApple OSS Distributions 	va_end(args);
50*d4514f0bSApple OSS Distributions }
51*d4514f0bSApple OSS Distributions 
52*d4514f0bSApple OSS Distributions // Utils
53*d4514f0bSApple OSS Distributions 
54*d4514f0bSApple OSS Distributions static mach_port_t
make_a_mem_object(vm_size_t size)55*d4514f0bSApple OSS Distributions make_a_mem_object(vm_size_t size)
56*d4514f0bSApple OSS Distributions {
57*d4514f0bSApple OSS Distributions 	ipc_port_t out_handle;
58*d4514f0bSApple 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);
59*d4514f0bSApple OSS Distributions 	assert(kr == 0);
60*d4514f0bSApple OSS Distributions 	return out_handle;
61*d4514f0bSApple OSS Distributions }
62*d4514f0bSApple OSS Distributions 
63*d4514f0bSApple OSS Distributions static mach_port_t
make_a_mem_entry(MAP_T map,vm_size_t size)64*d4514f0bSApple OSS Distributions make_a_mem_entry(MAP_T map, vm_size_t size)
65*d4514f0bSApple OSS Distributions {
66*d4514f0bSApple OSS Distributions 	mach_port_t port;
67*d4514f0bSApple OSS Distributions 	memory_object_size_t s = (memory_object_size_t)size;
68*d4514f0bSApple 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);
69*d4514f0bSApple OSS Distributions 	assert(kr == 0);
70*d4514f0bSApple OSS Distributions 	return port;
71*d4514f0bSApple OSS Distributions }
72*d4514f0bSApple OSS Distributions 
73*d4514f0bSApple OSS Distributions // Test functions
74*d4514f0bSApple OSS Distributions 
75*d4514f0bSApple 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)76*d4514f0bSApple 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)
77*d4514f0bSApple OSS Distributions {
78*d4514f0bSApple OSS Distributions 	// source map: has an allocation bigger than our
79*d4514f0bSApple OSS Distributions 	// "reasonable" trial sizes, to copy from
80*d4514f0bSApple OSS Distributions 	MAP_T src_map SMART_MAP;
81*d4514f0bSApple OSS Distributions 	allocation_t src_alloc SMART_ALLOCATE_VM(src_map, TEST_ALLOC_SIZE, VM_PROT_READ);
82*d4514f0bSApple OSS Distributions 
83*d4514f0bSApple OSS Distributions 	// dest map: has an allocation bigger than our
84*d4514f0bSApple OSS Distributions 	// "reasonable" trial sizes, to copy-overwrite on
85*d4514f0bSApple OSS Distributions 	MAP_T dst_map SMART_MAP;
86*d4514f0bSApple OSS Distributions 	allocation_t dst_alloc SMART_ALLOCATE_VM(dst_map, TEST_ALLOC_SIZE, VM_PROT_DEFAULT);
87*d4514f0bSApple OSS Distributions 
88*d4514f0bSApple OSS Distributions 	// We test dst/size parameters.
89*d4514f0bSApple OSS Distributions 	// We don't test the contents of the vm_map_copy_t.
90*d4514f0bSApple OSS Distributions 	start_size_trials_t *trials SMART_START_SIZE_TRIALS(dst_alloc.addr);
91*d4514f0bSApple OSS Distributions 	results_t *results = alloc_results(testname, eSMART_START_SIZE_TRIALS, dst_alloc.addr, trials->count);
92*d4514f0bSApple OSS Distributions 
93*d4514f0bSApple OSS Distributions 	for (unsigned i = 0; i < trials->count; i++) {
94*d4514f0bSApple OSS Distributions 		start_size_trial_t trial = trials->list[i];
95*d4514f0bSApple OSS Distributions 
96*d4514f0bSApple OSS Distributions 		// Copy from the source.
97*d4514f0bSApple OSS Distributions 		vm_map_copy_t copy;
98*d4514f0bSApple OSS Distributions 		kern_return_t kr = vm_map_copyin(src_map, src_alloc.addr, src_alloc.size, false, &copy);
99*d4514f0bSApple OSS Distributions 		assert(kr == 0);
100*d4514f0bSApple OSS Distributions 		assert(copy);  // null copy won't exercise the sanitization path
101*d4514f0bSApple OSS Distributions 
102*d4514f0bSApple OSS Distributions 		// Copy-overwrite to the destination.
103*d4514f0bSApple OSS Distributions 		kern_return_t ret = func(dst_map, copy, trial.start, trial.size);
104*d4514f0bSApple OSS Distributions 
105*d4514f0bSApple OSS Distributions 		if (ret != KERN_SUCCESS) {
106*d4514f0bSApple OSS Distributions 			vm_map_copy_discard(copy);
107*d4514f0bSApple OSS Distributions 		}
108*d4514f0bSApple OSS Distributions 		append_result(results, ret, trial.name);
109*d4514f0bSApple OSS Distributions 	}
110*d4514f0bSApple OSS Distributions 	return results;
111*d4514f0bSApple OSS Distributions }
112*d4514f0bSApple OSS Distributions 
113*d4514f0bSApple OSS Distributions /*
114*d4514f0bSApple OSS Distributions  * This function temporarily allocates a writeable allocation in kernel_map, and a read only allocation in a temporary map.
115*d4514f0bSApple 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.
116*d4514f0bSApple OSS Distributions  */
117*d4514f0bSApple 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)118*d4514f0bSApple 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)
119*d4514f0bSApple OSS Distributions {
120*d4514f0bSApple OSS Distributions 	MAP_T map SMART_MAP;
121*d4514f0bSApple OSS Distributions 	allocation_t src_base SMART_ALLOCATE_VM(map, TEST_ALLOC_SIZE, VM_PROT_READ);
122*d4514f0bSApple OSS Distributions 	allocation_t dst_base SMART_ALLOCATE_VM(kernel_map, TEST_ALLOC_SIZE, VM_PROT_DEFAULT);
123*d4514f0bSApple OSS Distributions 	src_dst_size_trials_t * trials SMART_SRC_DST_SIZE_TRIALS();
124*d4514f0bSApple OSS Distributions 	results_t *results = alloc_results(testname, eSMART_SRC_DST_SIZE_TRIALS, trials->count);
125*d4514f0bSApple OSS Distributions 
126*d4514f0bSApple OSS Distributions 	for (unsigned i = 0; i < trials->count; i++) {
127*d4514f0bSApple OSS Distributions 		src_dst_size_trial_t trial = trials->list[i];
128*d4514f0bSApple OSS Distributions 		trial = slide_trial_src(trial, src_base.addr);
129*d4514f0bSApple OSS Distributions 		trial = slide_trial_dst(trial, dst_base.addr);
130*d4514f0bSApple OSS Distributions 		int ret = func(map, trial.src, (void *)trial.dst, trial.size);
131*d4514f0bSApple OSS Distributions 		append_result(results, ret, trial.name);
132*d4514f0bSApple OSS Distributions 	}
133*d4514f0bSApple OSS Distributions 	return results;
134*d4514f0bSApple OSS Distributions }
135*d4514f0bSApple OSS Distributions 
136*d4514f0bSApple OSS Distributions /*
137*d4514f0bSApple OSS Distributions  * This function temporarily allocates a read only allocation in kernel_map, and a writeable allocation in a temporary map.
138*d4514f0bSApple 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.
139*d4514f0bSApple OSS Distributions  */
140*d4514f0bSApple 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)141*d4514f0bSApple 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)
142*d4514f0bSApple OSS Distributions {
143*d4514f0bSApple OSS Distributions 	MAP_T map SMART_MAP;
144*d4514f0bSApple OSS Distributions 	allocation_t src_base SMART_ALLOCATE_VM(kernel_map, TEST_ALLOC_SIZE, VM_PROT_READ);
145*d4514f0bSApple OSS Distributions 	allocation_t dst_base SMART_ALLOCATE_VM(map, TEST_ALLOC_SIZE, VM_PROT_DEFAULT);
146*d4514f0bSApple OSS Distributions 	src_dst_size_trials_t * trials SMART_SRC_DST_SIZE_TRIALS();
147*d4514f0bSApple OSS Distributions 	results_t *results = alloc_results(testname, eSMART_SRC_DST_SIZE_TRIALS, trials->count);
148*d4514f0bSApple OSS Distributions 
149*d4514f0bSApple OSS Distributions 	for (unsigned i = 0; i < trials->count; i++) {
150*d4514f0bSApple OSS Distributions 		src_dst_size_trial_t trial = trials->list[i];
151*d4514f0bSApple OSS Distributions 		trial = slide_trial_src(trial, src_base.addr);
152*d4514f0bSApple OSS Distributions 		trial = slide_trial_dst(trial, dst_base.addr);
153*d4514f0bSApple OSS Distributions 		int ret = func(map, (void *)trial.src, trial.dst, trial.size);
154*d4514f0bSApple OSS Distributions 		append_result(results, ret, trial.name);
155*d4514f0bSApple OSS Distributions 	}
156*d4514f0bSApple OSS Distributions 	return results;
157*d4514f0bSApple OSS Distributions }
158*d4514f0bSApple OSS Distributions 
159*d4514f0bSApple OSS Distributions 
160*d4514f0bSApple OSS Distributions /////////////////////////////////////////////////////
161*d4514f0bSApple OSS Distributions // Mach tests
162*d4514f0bSApple OSS Distributions 
163*d4514f0bSApple OSS Distributions 
164*d4514f0bSApple OSS Distributions static kern_return_t
call_mach_vm_read(MAP_T map,mach_vm_address_t start,mach_vm_size_t size)165*d4514f0bSApple OSS Distributions call_mach_vm_read(MAP_T map, mach_vm_address_t start, mach_vm_size_t size)
166*d4514f0bSApple OSS Distributions {
167*d4514f0bSApple OSS Distributions 	vm_offset_t out_addr;
168*d4514f0bSApple OSS Distributions 	mach_msg_type_number_t out_size;
169*d4514f0bSApple OSS Distributions 	kern_return_t kr = mach_vm_read(map, start, size, &out_addr, &out_size);
170*d4514f0bSApple OSS Distributions 	if (kr == 0) {
171*d4514f0bSApple OSS Distributions 		// we didn't call through MIG so out_addr is really a vm_map_copy_t
172*d4514f0bSApple OSS Distributions 		vm_map_copy_discard((vm_map_copy_t)out_addr);
173*d4514f0bSApple OSS Distributions 	}
174*d4514f0bSApple OSS Distributions 	return kr;
175*d4514f0bSApple OSS Distributions }
176*d4514f0bSApple OSS Distributions 
177*d4514f0bSApple 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)178*d4514f0bSApple OSS Distributions check_vm_map_copyin_outparam_changes(kern_return_t * kr, vm_map_copy_t copy, vm_map_copy_t saved_copy)
179*d4514f0bSApple OSS Distributions {
180*d4514f0bSApple OSS Distributions 	if (*kr == KERN_SUCCESS) {
181*d4514f0bSApple OSS Distributions 		if (copy == saved_copy) {
182*d4514f0bSApple OSS Distributions 			*kr = OUT_PARAM_BAD;
183*d4514f0bSApple OSS Distributions 		}
184*d4514f0bSApple OSS Distributions 	} else {
185*d4514f0bSApple OSS Distributions 		if (copy != saved_copy) {
186*d4514f0bSApple OSS Distributions 			*kr = OUT_PARAM_BAD;
187*d4514f0bSApple OSS Distributions 		}
188*d4514f0bSApple OSS Distributions 	}
189*d4514f0bSApple OSS Distributions }
190*d4514f0bSApple OSS Distributions 
191*d4514f0bSApple OSS Distributions static kern_return_t
call_vm_map_copyin(MAP_T map,mach_vm_address_t start,mach_vm_size_t size)192*d4514f0bSApple OSS Distributions call_vm_map_copyin(MAP_T map, mach_vm_address_t start, mach_vm_size_t size)
193*d4514f0bSApple OSS Distributions {
194*d4514f0bSApple OSS Distributions 	vm_map_copy_t invalid_initial_value = INVALID_VM_MAP_COPY;
195*d4514f0bSApple OSS Distributions 	vm_map_copy_t copy = invalid_initial_value;
196*d4514f0bSApple OSS Distributions 	kern_return_t kr = vm_map_copyin(map, start, size, false, &copy);
197*d4514f0bSApple OSS Distributions 	if (kr == 0) {
198*d4514f0bSApple OSS Distributions 		vm_map_copy_discard(copy);
199*d4514f0bSApple OSS Distributions 	}
200*d4514f0bSApple OSS Distributions 	check_vm_map_copyin_outparam_changes(&kr, copy, invalid_initial_value);
201*d4514f0bSApple OSS Distributions 	return kr;
202*d4514f0bSApple OSS Distributions }
203*d4514f0bSApple OSS Distributions 
204*d4514f0bSApple OSS Distributions static kern_return_t
call_copyoutmap_atomic32(MAP_T map,vm_map_offset_t addr)205*d4514f0bSApple OSS Distributions call_copyoutmap_atomic32(MAP_T map, vm_map_offset_t addr)
206*d4514f0bSApple OSS Distributions {
207*d4514f0bSApple OSS Distributions 	uint32_t data = 0;
208*d4514f0bSApple OSS Distributions 	kern_return_t kr = copyoutmap_atomic32(map, data, addr);
209*d4514f0bSApple OSS Distributions 	return kr;
210*d4514f0bSApple OSS Distributions }
211*d4514f0bSApple OSS Distributions 
212*d4514f0bSApple OSS Distributions 
213*d4514f0bSApple 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)214*d4514f0bSApple OSS Distributions call_mach_vm_allocate__flags(MAP_T map, mach_vm_address_t * start, mach_vm_size_t size, int flags)
215*d4514f0bSApple OSS Distributions {
216*d4514f0bSApple OSS Distributions 	mach_vm_address_t saved_start = *start;
217*d4514f0bSApple OSS Distributions 	kern_return_t kr = mach_vm_allocate_external(map, start, size, flags);
218*d4514f0bSApple OSS Distributions 	check_mach_vm_allocate_outparam_changes(&kr, *start, size, saved_start, flags, map);
219*d4514f0bSApple OSS Distributions 	return kr;
220*d4514f0bSApple OSS Distributions }
221*d4514f0bSApple OSS Distributions 
222*d4514f0bSApple 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)223*d4514f0bSApple OSS Distributions call_mach_vm_allocate__start_size_fixed(MAP_T map, mach_vm_address_t * start, mach_vm_size_t size)
224*d4514f0bSApple OSS Distributions {
225*d4514f0bSApple OSS Distributions 	mach_vm_address_t saved_start = *start;
226*d4514f0bSApple OSS Distributions 	kern_return_t kr = mach_vm_allocate_external(map, start, size, VM_FLAGS_FIXED);
227*d4514f0bSApple OSS Distributions 	check_mach_vm_allocate_outparam_changes(&kr, *start, size, saved_start, VM_FLAGS_FIXED, map);
228*d4514f0bSApple OSS Distributions 	return kr;
229*d4514f0bSApple OSS Distributions }
230*d4514f0bSApple OSS Distributions 
231*d4514f0bSApple 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)232*d4514f0bSApple OSS Distributions call_mach_vm_allocate__start_size_anywhere(MAP_T map, mach_vm_address_t * start, mach_vm_size_t size)
233*d4514f0bSApple OSS Distributions {
234*d4514f0bSApple OSS Distributions 	mach_vm_address_t saved_start = *start;
235*d4514f0bSApple OSS Distributions 	kern_return_t kr = mach_vm_allocate_external(map, start, size, VM_FLAGS_ANYWHERE);
236*d4514f0bSApple OSS Distributions 	check_mach_vm_allocate_outparam_changes(&kr, *start, size, saved_start, VM_FLAGS_ANYWHERE, map);
237*d4514f0bSApple OSS Distributions 	return kr;
238*d4514f0bSApple OSS Distributions }
239*d4514f0bSApple OSS Distributions 
240*d4514f0bSApple 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)241*d4514f0bSApple OSS Distributions call_mach_vm_allocate_kernel__flags(MAP_T map, mach_vm_address_t * start, mach_vm_size_t size, int flags)
242*d4514f0bSApple OSS Distributions {
243*d4514f0bSApple OSS Distributions 	mach_vm_address_t saved_start = *start;
244*d4514f0bSApple OSS Distributions 	kern_return_t kr = mach_vm_allocate_kernel(map, start, size,
245*d4514f0bSApple OSS Distributions 	    FLAGS_AND_TAG(flags, VM_KERN_MEMORY_OSFMK));
246*d4514f0bSApple OSS Distributions 	check_mach_vm_allocate_outparam_changes(&kr, *start, size, saved_start, flags, map);
247*d4514f0bSApple OSS Distributions 	return kr;
248*d4514f0bSApple OSS Distributions }
249*d4514f0bSApple OSS Distributions 
250*d4514f0bSApple 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)251*d4514f0bSApple OSS Distributions call_mach_vm_allocate_kernel__start_size_fixed(MAP_T map, mach_vm_address_t * start, mach_vm_size_t size)
252*d4514f0bSApple OSS Distributions {
253*d4514f0bSApple OSS Distributions 	if (dealloc_would_time_out(*start, size, map)) {
254*d4514f0bSApple OSS Distributions 		return ACCEPTABLE;
255*d4514f0bSApple OSS Distributions 	}
256*d4514f0bSApple OSS Distributions 
257*d4514f0bSApple OSS Distributions 	mach_vm_address_t saved_start = *start;
258*d4514f0bSApple OSS Distributions 	kern_return_t kr = mach_vm_allocate_kernel(map, start, size,
259*d4514f0bSApple OSS Distributions 	    FLAGS_AND_TAG(VM_FLAGS_FIXED, VM_KERN_MEMORY_OSFMK));
260*d4514f0bSApple OSS Distributions 	check_mach_vm_allocate_outparam_changes(&kr, *start, size, saved_start, VM_FLAGS_FIXED, map);
261*d4514f0bSApple OSS Distributions 	return kr;
262*d4514f0bSApple OSS Distributions }
263*d4514f0bSApple OSS Distributions 
264*d4514f0bSApple 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)265*d4514f0bSApple OSS Distributions call_mach_vm_allocate_kernel__start_size_anywhere(MAP_T map, mach_vm_address_t * start, mach_vm_size_t size)
266*d4514f0bSApple OSS Distributions {
267*d4514f0bSApple OSS Distributions 	if (dealloc_would_time_out(*start, size, map)) {
268*d4514f0bSApple OSS Distributions 		return ACCEPTABLE;
269*d4514f0bSApple OSS Distributions 	}
270*d4514f0bSApple OSS Distributions 
271*d4514f0bSApple OSS Distributions 	mach_vm_address_t saved_start = *start;
272*d4514f0bSApple OSS Distributions 	kern_return_t kr = mach_vm_allocate_kernel(map, start, size,
273*d4514f0bSApple OSS Distributions 	    FLAGS_AND_TAG(VM_FLAGS_ANYWHERE, VM_KERN_MEMORY_OSFMK));
274*d4514f0bSApple OSS Distributions 	check_mach_vm_allocate_outparam_changes(&kr, *start, size, saved_start, VM_FLAGS_ANYWHERE, map);
275*d4514f0bSApple OSS Distributions 	return kr;
276*d4514f0bSApple OSS Distributions }
277*d4514f0bSApple OSS Distributions 
278*d4514f0bSApple OSS Distributions 
279*d4514f0bSApple OSS Distributions 
280*d4514f0bSApple 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)281*d4514f0bSApple OSS Distributions call_vm_allocate__flags(MAP_T map, mach_vm_address_t * start, mach_vm_size_t size, int flags)
282*d4514f0bSApple OSS Distributions {
283*d4514f0bSApple OSS Distributions 	mach_vm_address_t saved_start = *start;
284*d4514f0bSApple OSS Distributions 	kern_return_t kr = vm_allocate(map, (vm_address_t *) start, (vm_size_t) size, flags);
285*d4514f0bSApple OSS Distributions 	check_mach_vm_allocate_outparam_changes(&kr, *start, size, saved_start, flags, map);
286*d4514f0bSApple OSS Distributions 	return kr;
287*d4514f0bSApple OSS Distributions }
288*d4514f0bSApple OSS Distributions 
289*d4514f0bSApple 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)290*d4514f0bSApple OSS Distributions call_vm_allocate__start_size_fixed(MAP_T map, mach_vm_address_t * start, mach_vm_size_t size)
291*d4514f0bSApple OSS Distributions {
292*d4514f0bSApple OSS Distributions 	mach_vm_address_t saved_start = *start;
293*d4514f0bSApple OSS Distributions 	kern_return_t kr = vm_allocate(map, (vm_address_t *) start, (vm_size_t) size, VM_FLAGS_FIXED);
294*d4514f0bSApple OSS Distributions 	check_mach_vm_allocate_outparam_changes(&kr, *start, size, saved_start, VM_FLAGS_FIXED, map);
295*d4514f0bSApple OSS Distributions 	return kr;
296*d4514f0bSApple OSS Distributions }
297*d4514f0bSApple OSS Distributions 
298*d4514f0bSApple 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)299*d4514f0bSApple OSS Distributions call_vm_allocate__start_size_anywhere(MAP_T map, mach_vm_address_t * start, mach_vm_size_t size)
300*d4514f0bSApple OSS Distributions {
301*d4514f0bSApple OSS Distributions 	mach_vm_address_t saved_start = *start;
302*d4514f0bSApple OSS Distributions 	kern_return_t kr = vm_allocate(map, (vm_address_t *) start, (vm_size_t) size, VM_FLAGS_ANYWHERE);
303*d4514f0bSApple OSS Distributions 	check_mach_vm_allocate_outparam_changes(&kr, *start, size, saved_start, VM_FLAGS_ANYWHERE, map);
304*d4514f0bSApple OSS Distributions 	return kr;
305*d4514f0bSApple OSS Distributions }
306*d4514f0bSApple OSS Distributions 
307*d4514f0bSApple OSS Distributions static kern_return_t
call_mach_vm_deallocate(MAP_T map,mach_vm_address_t start,mach_vm_size_t size)308*d4514f0bSApple OSS Distributions call_mach_vm_deallocate(MAP_T map, mach_vm_address_t start, mach_vm_size_t size)
309*d4514f0bSApple OSS Distributions {
310*d4514f0bSApple OSS Distributions 	kern_return_t kr = mach_vm_deallocate(map, start, size);
311*d4514f0bSApple OSS Distributions 	return kr;
312*d4514f0bSApple OSS Distributions }
313*d4514f0bSApple OSS Distributions 
314*d4514f0bSApple OSS Distributions static kern_return_t
call_vm_deallocate(MAP_T map,mach_vm_address_t start,mach_vm_size_t size)315*d4514f0bSApple OSS Distributions call_vm_deallocate(MAP_T map, mach_vm_address_t start, mach_vm_size_t size)
316*d4514f0bSApple OSS Distributions {
317*d4514f0bSApple OSS Distributions 	kern_return_t kr = vm_deallocate(map, (vm_address_t) start, (vm_size_t) size);
318*d4514f0bSApple OSS Distributions 	return kr;
319*d4514f0bSApple OSS Distributions }
320*d4514f0bSApple OSS Distributions 
321*d4514f0bSApple OSS Distributions // Including sys/systm.h caused things to blow up
322*d4514f0bSApple OSS Distributions int     vslock(user_addr_t addr, user_size_t len);
323*d4514f0bSApple OSS Distributions int     vsunlock(user_addr_t addr, user_size_t len, int dirtied);
324*d4514f0bSApple OSS Distributions static int
call_vslock(void * start,size_t size)325*d4514f0bSApple OSS Distributions call_vslock(void * start, size_t size)
326*d4514f0bSApple OSS Distributions {
327*d4514f0bSApple OSS Distributions 	int kr = vslock((user_addr_t) start, (user_size_t) size);
328*d4514f0bSApple OSS Distributions 	if (kr == KERN_SUCCESS) {
329*d4514f0bSApple OSS Distributions 		(void) vsunlock((user_addr_t) start, (user_size_t) size, 0);
330*d4514f0bSApple OSS Distributions 	}
331*d4514f0bSApple OSS Distributions 
332*d4514f0bSApple OSS Distributions 	return kr;
333*d4514f0bSApple OSS Distributions }
334*d4514f0bSApple OSS Distributions 
335*d4514f0bSApple OSS Distributions static int
call_vsunlock_undirtied(void * start,size_t size)336*d4514f0bSApple OSS Distributions call_vsunlock_undirtied(void * start, size_t size)
337*d4514f0bSApple OSS Distributions {
338*d4514f0bSApple OSS Distributions 	int kr = vslock((user_addr_t) start, (user_size_t) size);
339*d4514f0bSApple OSS Distributions 	if (kr == EINVAL) {
340*d4514f0bSApple OSS Distributions 		// Invalid vslock arguments should also be
341*d4514f0bSApple OSS Distributions 		// invalid vsunlock arguments. Test it.
342*d4514f0bSApple OSS Distributions 	} else if (kr != KERN_SUCCESS) {
343*d4514f0bSApple OSS Distributions 		// vslock failed, and vsunlock of non-locked memory panics
344*d4514f0bSApple OSS Distributions 		return PANIC;
345*d4514f0bSApple OSS Distributions 	}
346*d4514f0bSApple OSS Distributions 	kr = vsunlock((user_addr_t) start, (user_size_t) size, 0);
347*d4514f0bSApple OSS Distributions 	return kr;
348*d4514f0bSApple OSS Distributions }
349*d4514f0bSApple OSS Distributions 
350*d4514f0bSApple OSS Distributions static int
call_vsunlock_dirtied(void * start,size_t size)351*d4514f0bSApple OSS Distributions call_vsunlock_dirtied(void * start, size_t size)
352*d4514f0bSApple OSS Distributions {
353*d4514f0bSApple OSS Distributions 	int kr = vslock((user_addr_t) start, (user_size_t) size);
354*d4514f0bSApple OSS Distributions 	if (kr == EINVAL) {
355*d4514f0bSApple OSS Distributions 		// Invalid vslock arguments should also be
356*d4514f0bSApple OSS Distributions 		// invalid vsunlock arguments. Test it.
357*d4514f0bSApple OSS Distributions 	} else if (kr != KERN_SUCCESS) {
358*d4514f0bSApple OSS Distributions 		// vslock failed, and vsunlock of non-locked memory panics
359*d4514f0bSApple OSS Distributions 		return PANIC;
360*d4514f0bSApple OSS Distributions 	}
361*d4514f0bSApple OSS Distributions 	kr = vsunlock((user_addr_t) start, (user_size_t) size, 1);
362*d4514f0bSApple OSS Distributions 	return kr;
363*d4514f0bSApple OSS Distributions }
364*d4514f0bSApple OSS Distributions 
365*d4514f0bSApple OSS Distributions extern kern_return_t    vm_map_wire_external(
366*d4514f0bSApple OSS Distributions 	vm_map_t                map,
367*d4514f0bSApple OSS Distributions 	vm_map_offset_t         start,
368*d4514f0bSApple OSS Distributions 	vm_map_offset_t         end,
369*d4514f0bSApple OSS Distributions 	vm_prot_t               access_type,
370*d4514f0bSApple OSS Distributions 	boolean_t               user_wire);
371*d4514f0bSApple OSS Distributions 
372*d4514f0bSApple OSS Distributions 
373*d4514f0bSApple OSS Distributions typedef kern_return_t (*wire_fn_t)(
374*d4514f0bSApple OSS Distributions 	vm_map_t task,
375*d4514f0bSApple OSS Distributions 	mach_vm_address_t start,
376*d4514f0bSApple OSS Distributions 	mach_vm_address_t end,
377*d4514f0bSApple OSS Distributions 	vm_prot_t prot,
378*d4514f0bSApple OSS Distributions 	vm_tag_t tag,
379*d4514f0bSApple OSS Distributions 	boolean_t user_wire);
380*d4514f0bSApple OSS Distributions 
381*d4514f0bSApple OSS Distributions 
382*d4514f0bSApple OSS Distributions /*
383*d4514f0bSApple OSS Distributions  * Tell vm_tag_bt() to change its behavior so our calls to
384*d4514f0bSApple OSS Distributions  * vm_map_wire_external and vm_map_wire_and_extract do not panic.
385*d4514f0bSApple OSS Distributions  */
386*d4514f0bSApple OSS Distributions static void
prevent_wire_tag_panic(bool prevent)387*d4514f0bSApple OSS Distributions prevent_wire_tag_panic(bool prevent)
388*d4514f0bSApple OSS Distributions {
389*d4514f0bSApple OSS Distributions 	thread_set_test_option(test_option_vm_prevent_wire_tag_panic, prevent);
390*d4514f0bSApple OSS Distributions }
391*d4514f0bSApple OSS Distributions 
392*d4514f0bSApple OSS Distributions #if XNU_PLATFORM_MacOSX
393*d4514f0bSApple OSS Distributions // vm_map_wire_and_extract() implemented on macOS only
394*d4514f0bSApple OSS Distributions 
395*d4514f0bSApple OSS Distributions 
396*d4514f0bSApple OSS Distributions /*
397*d4514f0bSApple OSS Distributions  * wire_nested requires a range of exactly one page when passed a physpage pointer.
398*d4514f0bSApple OSS Distributions  * wire_and_extract is meant to provide that, but as a result of round introduced, unaligned values don't follow that.
399*d4514f0bSApple OSS Distributions  */
400*d4514f0bSApple OSS Distributions static bool
will_vm_map_wire_nested_panic_due_to_invalid_range_size(MAP_T map,mach_vm_address_t start)401*d4514f0bSApple OSS Distributions will_vm_map_wire_nested_panic_due_to_invalid_range_size(MAP_T map, mach_vm_address_t start)
402*d4514f0bSApple OSS Distributions {
403*d4514f0bSApple OSS Distributions 	mach_vm_address_t end = start + VM_MAP_PAGE_SIZE(map);
404*d4514f0bSApple OSS Distributions 	if (round_up_map(map, end) - trunc_down_map(map, start) != VM_MAP_PAGE_SIZE(map)) {
405*d4514f0bSApple OSS Distributions 		return true;
406*d4514f0bSApple OSS Distributions 	}
407*d4514f0bSApple OSS Distributions 	return false;
408*d4514f0bSApple OSS Distributions }
409*d4514f0bSApple OSS Distributions 
410*d4514f0bSApple OSS Distributions static inline void
check_vm_map_wire_and_extract_outparam_changes(kern_return_t * kr,ppnum_t physpage)411*d4514f0bSApple OSS Distributions check_vm_map_wire_and_extract_outparam_changes(kern_return_t * kr, ppnum_t physpage)
412*d4514f0bSApple OSS Distributions {
413*d4514f0bSApple OSS Distributions 	if (*kr != KERN_SUCCESS) {
414*d4514f0bSApple OSS Distributions 		if (physpage != 0) {
415*d4514f0bSApple OSS Distributions 			*kr = OUT_PARAM_BAD;
416*d4514f0bSApple OSS Distributions 		}
417*d4514f0bSApple OSS Distributions 	}
418*d4514f0bSApple OSS Distributions }
419*d4514f0bSApple OSS Distributions 
420*d4514f0bSApple OSS Distributions static kern_return_t
vm_map_wire_and_extract_retyped(vm_map_t map,mach_vm_address_t start,mach_vm_address_t end __unused,vm_prot_t prot,vm_tag_t tag __unused,boolean_t user_wire)421*d4514f0bSApple OSS Distributions vm_map_wire_and_extract_retyped(
422*d4514f0bSApple OSS Distributions 	vm_map_t                map,
423*d4514f0bSApple OSS Distributions 	mach_vm_address_t       start,
424*d4514f0bSApple OSS Distributions 	mach_vm_address_t       end __unused,
425*d4514f0bSApple OSS Distributions 	vm_prot_t               prot,
426*d4514f0bSApple OSS Distributions 	vm_tag_t                tag __unused,
427*d4514f0bSApple OSS Distributions 	boolean_t               user_wire)
428*d4514f0bSApple OSS Distributions {
429*d4514f0bSApple OSS Distributions 	if (will_vm_map_wire_nested_panic_due_to_invalid_range_size(map, start)) {
430*d4514f0bSApple OSS Distributions 		return PANIC;
431*d4514f0bSApple OSS Distributions 	}
432*d4514f0bSApple OSS Distributions 
433*d4514f0bSApple OSS Distributions 	ppnum_t physpage = UNLIKELY_INITIAL_PPNUM;
434*d4514f0bSApple OSS Distributions 	kern_return_t kr = vm_map_wire_and_extract(map, start, prot, user_wire, &physpage);
435*d4514f0bSApple OSS Distributions 	check_vm_map_wire_and_extract_outparam_changes(&kr, physpage);
436*d4514f0bSApple OSS Distributions 	return kr;
437*d4514f0bSApple OSS Distributions }
438*d4514f0bSApple OSS Distributions #endif // XNU_PLATFORM_MacOSX
439*d4514f0bSApple OSS Distributions 
440*d4514f0bSApple OSS Distributions 
441*d4514f0bSApple OSS Distributions static kern_return_t
vm_map_wire_external_retyped(vm_map_t map,mach_vm_address_t start,mach_vm_address_t end,vm_prot_t prot,vm_tag_t tag __unused,boolean_t user_wire)442*d4514f0bSApple OSS Distributions vm_map_wire_external_retyped(
443*d4514f0bSApple OSS Distributions 	vm_map_t                map,
444*d4514f0bSApple OSS Distributions 	mach_vm_address_t       start,
445*d4514f0bSApple OSS Distributions 	mach_vm_address_t       end,
446*d4514f0bSApple OSS Distributions 	vm_prot_t               prot,
447*d4514f0bSApple OSS Distributions 	vm_tag_t                tag __unused,
448*d4514f0bSApple OSS Distributions 	boolean_t               user_wire)
449*d4514f0bSApple OSS Distributions {
450*d4514f0bSApple OSS Distributions 	return vm_map_wire_external(map, start, end, prot, user_wire);
451*d4514f0bSApple OSS Distributions }
452*d4514f0bSApple OSS Distributions 
453*d4514f0bSApple OSS Distributions static kern_return_t
wire_call_impl(wire_fn_t fn,MAP_T map,mach_vm_address_t start,mach_vm_size_t end,vm_prot_t prot,vm_tag_t tag,bool user_wire)454*d4514f0bSApple OSS Distributions wire_call_impl(wire_fn_t fn, MAP_T map, mach_vm_address_t start, mach_vm_size_t end, vm_prot_t prot, vm_tag_t tag, bool user_wire)
455*d4514f0bSApple OSS Distributions {
456*d4514f0bSApple OSS Distributions 	if (tag == VM_KERN_MEMORY_NONE) {
457*d4514f0bSApple OSS Distributions 		return PANIC;
458*d4514f0bSApple OSS Distributions 	}
459*d4514f0bSApple OSS Distributions 	prevent_wire_tag_panic(true);
460*d4514f0bSApple OSS Distributions 	kern_return_t kr = fn(map, start, end, prot, tag, user_wire);
461*d4514f0bSApple OSS Distributions 	prevent_wire_tag_panic(false);
462*d4514f0bSApple OSS Distributions 	if (kr == KERN_SUCCESS) {
463*d4514f0bSApple OSS Distributions 		(void) vm_map_unwire(map, start, end, user_wire);
464*d4514f0bSApple OSS Distributions 	}
465*d4514f0bSApple OSS Distributions 	return kr;
466*d4514f0bSApple OSS Distributions }
467*d4514f0bSApple OSS Distributions 
468*d4514f0bSApple OSS Distributions #define WIRE_IMPL(FN, user_wire)                                                  \
469*d4514f0bSApple OSS Distributions 	static kern_return_t                                                      \
470*d4514f0bSApple OSS Distributions 	__attribute__((used))                                                     \
471*d4514f0bSApple OSS Distributions 	call_ ## FN ## __start_end__user_wired_ ## user_wire ## _(MAP_T map, mach_vm_address_t start, mach_vm_address_t end) \
472*d4514f0bSApple OSS Distributions 	{                                                                         \
473*d4514f0bSApple OSS Distributions 	        return wire_call_impl(FN, map, start, end, VM_PROT_DEFAULT, VM_KERN_MEMORY_OSFMK, user_wire); \
474*d4514f0bSApple OSS Distributions 	}                                                                         \
475*d4514f0bSApple OSS Distributions 	static kern_return_t                                                      \
476*d4514f0bSApple OSS Distributions 	__attribute__((used))                                                     \
477*d4514f0bSApple OSS Distributions 	call_ ## FN ## __prot__user_wired_ ## user_wire ## _(MAP_T map, mach_vm_address_t start, mach_vm_size_t size, vm_prot_t prot) \
478*d4514f0bSApple OSS Distributions 	{                                                                         \
479*d4514f0bSApple OSS Distributions 	        mach_vm_address_t end;                                            \
480*d4514f0bSApple OSS Distributions 	        if (__builtin_add_overflow(start, size, &end)) {                  \
481*d4514f0bSApple OSS Distributions 	                return BUSTED;                                            \
482*d4514f0bSApple OSS Distributions 	        }                                                                 \
483*d4514f0bSApple OSS Distributions 	        return wire_call_impl(FN, map, start, end, prot, VM_KERN_MEMORY_OSFMK, user_wire); \
484*d4514f0bSApple OSS Distributions 	}                                                                         \
485*d4514f0bSApple OSS Distributions 	static kern_return_t                                                      \
486*d4514f0bSApple OSS Distributions 	__attribute__((used))                                                     \
487*d4514f0bSApple OSS Distributions 	call_ ## FN ## __tag__user_wired_ ## user_wire ## _(MAP_T map, mach_vm_address_t start, mach_vm_address_t end, vm_tag_t tag) \
488*d4514f0bSApple OSS Distributions 	{                                                                         \
489*d4514f0bSApple OSS Distributions 	        kern_return_t kr = wire_call_impl(FN, map, start, end, VM_PROT_DEFAULT, tag, user_wire); \
490*d4514f0bSApple OSS Distributions 	        return kr;                                                        \
491*d4514f0bSApple OSS Distributions 	}                                                                         \
492*d4514f0bSApple OSS Distributions 	static kern_return_t                                                      \
493*d4514f0bSApple OSS Distributions 	__attribute__((used))                                                     \
494*d4514f0bSApple OSS Distributions 	call_ ## FN ## __start__user_wired_ ## user_wire ## _(MAP_T map, mach_vm_address_t start) \
495*d4514f0bSApple OSS Distributions 	{                                                                         \
496*d4514f0bSApple OSS Distributions 	        return wire_call_impl(FN, map, start, 0, VM_PROT_DEFAULT, VM_KERN_MEMORY_OSFMK, user_wire); \
497*d4514f0bSApple OSS Distributions 	}                                                                         \
498*d4514f0bSApple OSS Distributions 
WIRE_IMPL(vm_map_wire_external_retyped,true)499*d4514f0bSApple OSS Distributions WIRE_IMPL(vm_map_wire_external_retyped, true)
500*d4514f0bSApple OSS Distributions WIRE_IMPL(vm_map_wire_external_retyped, false)
501*d4514f0bSApple OSS Distributions WIRE_IMPL(vm_map_wire_kernel, true)
502*d4514f0bSApple OSS Distributions WIRE_IMPL(vm_map_wire_kernel, false)
503*d4514f0bSApple OSS Distributions 
504*d4514f0bSApple OSS Distributions #if XNU_PLATFORM_MacOSX
505*d4514f0bSApple OSS Distributions WIRE_IMPL(vm_map_wire_and_extract_retyped, true)
506*d4514f0bSApple OSS Distributions WIRE_IMPL(vm_map_wire_and_extract_retyped, false)
507*d4514f0bSApple OSS Distributions #endif
508*d4514f0bSApple OSS Distributions 
509*d4514f0bSApple OSS Distributions static kern_return_t
510*d4514f0bSApple OSS Distributions call_mach_vm_wire_level_monitor(int64_t requested_pages)
511*d4514f0bSApple OSS Distributions {
512*d4514f0bSApple OSS Distributions 	kern_return_t kr = mach_vm_wire_level_monitor(requested_pages);
513*d4514f0bSApple OSS Distributions 	return kr;
514*d4514f0bSApple OSS Distributions }
515*d4514f0bSApple OSS Distributions 
516*d4514f0bSApple 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)517*d4514f0bSApple OSS Distributions call_vm_map_unwire_user_wired(MAP_T map, mach_vm_address_t start, mach_vm_address_t end)
518*d4514f0bSApple OSS Distributions {
519*d4514f0bSApple OSS Distributions 	kern_return_t kr = vm_map_unwire(map, start, end, TRUE);
520*d4514f0bSApple OSS Distributions 	return kr;
521*d4514f0bSApple OSS Distributions }
522*d4514f0bSApple OSS Distributions 
523*d4514f0bSApple OSS Distributions 
524*d4514f0bSApple 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)525*d4514f0bSApple OSS Distributions call_vm_map_unwire_non_user_wired(MAP_T map, mach_vm_address_t start, mach_vm_address_t end)
526*d4514f0bSApple OSS Distributions {
527*d4514f0bSApple OSS Distributions 	kern_return_t kr = vm_map_wire_kernel(map, start, end, VM_PROT_DEFAULT, VM_KERN_MEMORY_OSFMK, FALSE);
528*d4514f0bSApple OSS Distributions 	if (kr) {
529*d4514f0bSApple OSS Distributions 		return PANIC;
530*d4514f0bSApple OSS Distributions 	}
531*d4514f0bSApple OSS Distributions 	kr = vm_map_unwire(map, start, end, FALSE);
532*d4514f0bSApple OSS Distributions 	return kr;
533*d4514f0bSApple OSS Distributions }
534*d4514f0bSApple OSS Distributions 
535*d4514f0bSApple OSS Distributions #ifndef __x86_64__
536*d4514f0bSApple OSS Distributions extern const vm_map_address_t physmap_base;
537*d4514f0bSApple OSS Distributions extern const vm_map_address_t physmap_end;
538*d4514f0bSApple OSS Distributions #endif
539*d4514f0bSApple OSS Distributions 
540*d4514f0bSApple OSS Distributions /*
541*d4514f0bSApple OSS Distributions  * This function duplicates the panicking checks done in copy_validate.
542*d4514f0bSApple OSS Distributions  * size==0 is returned as success earlier in copyin/out than copy_validate is called, so we ignore that case.
543*d4514f0bSApple OSS Distributions  */
544*d4514f0bSApple OSS Distributions static bool
will_copyio_panic_in_copy_validate(void * kernel_addr,vm_size_t size)545*d4514f0bSApple OSS Distributions will_copyio_panic_in_copy_validate(void *kernel_addr, vm_size_t size)
546*d4514f0bSApple OSS Distributions {
547*d4514f0bSApple OSS Distributions 	if (size == 0) {
548*d4514f0bSApple OSS Distributions 		return false;
549*d4514f0bSApple OSS Distributions 	}
550*d4514f0bSApple OSS Distributions 	extern const int copysize_limit_panic;
551*d4514f0bSApple OSS Distributions 	if (size > copysize_limit_panic) {
552*d4514f0bSApple OSS Distributions 		return true;
553*d4514f0bSApple OSS Distributions 	}
554*d4514f0bSApple OSS Distributions 
555*d4514f0bSApple OSS Distributions 	/*
556*d4514f0bSApple OSS Distributions 	 * copyio is architecture specific and has different checks per arch.
557*d4514f0bSApple OSS Distributions 	 */
558*d4514f0bSApple OSS Distributions #ifdef __x86_64__
559*d4514f0bSApple OSS Distributions 	if ((vm_offset_t) kernel_addr < VM_MIN_KERNEL_AND_KEXT_ADDRESS) {
560*d4514f0bSApple OSS Distributions 		return true;
561*d4514f0bSApple OSS Distributions 	}
562*d4514f0bSApple OSS Distributions #else /* not __x86_64__ */
563*d4514f0bSApple OSS Distributions 	uintptr_t kernel_addr_last;
564*d4514f0bSApple OSS Distributions 	if (os_add_overflow((uintptr_t) kernel_addr, size, &kernel_addr_last)) {
565*d4514f0bSApple OSS Distributions 		return true;
566*d4514f0bSApple OSS Distributions 	}
567*d4514f0bSApple OSS Distributions 
568*d4514f0bSApple OSS Distributions 	bool in_kva = (VM_KERNEL_STRIP_UPTR(kernel_addr) >= VM_MIN_KERNEL_ADDRESS) &&
569*d4514f0bSApple OSS Distributions 	    (VM_KERNEL_STRIP_UPTR(kernel_addr_last) <= VM_MAX_KERNEL_ADDRESS);
570*d4514f0bSApple OSS Distributions 	bool in_physmap = (VM_KERNEL_STRIP_UPTR(kernel_addr) >= physmap_base) &&
571*d4514f0bSApple OSS Distributions 	    (VM_KERNEL_STRIP_UPTR(kernel_addr_last) <= physmap_end);
572*d4514f0bSApple OSS Distributions 
573*d4514f0bSApple OSS Distributions 	if (!(in_kva || in_physmap)) {
574*d4514f0bSApple OSS Distributions 		return true;
575*d4514f0bSApple OSS Distributions 	}
576*d4514f0bSApple OSS Distributions #endif /* not __x86_64__ */
577*d4514f0bSApple OSS Distributions 
578*d4514f0bSApple OSS Distributions 	return false;
579*d4514f0bSApple OSS Distributions }
580*d4514f0bSApple OSS Distributions 
581*d4514f0bSApple OSS Distributions static kern_return_t
call_copyinmap(MAP_T map,vm_map_offset_t fromaddr,void * todata,vm_size_t length)582*d4514f0bSApple OSS Distributions call_copyinmap(MAP_T map, vm_map_offset_t fromaddr, void * todata, vm_size_t length)
583*d4514f0bSApple OSS Distributions {
584*d4514f0bSApple OSS Distributions 	if (will_copyio_panic_in_copy_validate(todata, length)) {
585*d4514f0bSApple OSS Distributions 		return PANIC;
586*d4514f0bSApple OSS Distributions 	}
587*d4514f0bSApple OSS Distributions 
588*d4514f0bSApple OSS Distributions 	kern_return_t kr = copyinmap(map, fromaddr, todata, length);
589*d4514f0bSApple OSS Distributions 	return kr;
590*d4514f0bSApple OSS Distributions }
591*d4514f0bSApple OSS Distributions 
592*d4514f0bSApple OSS Distributions static kern_return_t
call_copyoutmap(MAP_T map,void * fromdata,vm_map_offset_t toaddr,vm_size_t length)593*d4514f0bSApple OSS Distributions call_copyoutmap(MAP_T map, void * fromdata, vm_map_offset_t toaddr, vm_size_t length)
594*d4514f0bSApple OSS Distributions {
595*d4514f0bSApple OSS Distributions 	if (will_copyio_panic_in_copy_validate(fromdata, length)) {
596*d4514f0bSApple OSS Distributions 		return PANIC;
597*d4514f0bSApple OSS Distributions 	}
598*d4514f0bSApple OSS Distributions 
599*d4514f0bSApple OSS Distributions 	kern_return_t kr = copyoutmap(map, fromdata, toaddr, length);
600*d4514f0bSApple OSS Distributions 	return kr;
601*d4514f0bSApple OSS Distributions }
602*d4514f0bSApple OSS Distributions 
603*d4514f0bSApple 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)604*d4514f0bSApple OSS Distributions call_vm_map_read_user(MAP_T map, vm_map_address_t src_addr, void * ptr, vm_size_t size)
605*d4514f0bSApple OSS Distributions {
606*d4514f0bSApple OSS Distributions 	if (will_copyio_panic_in_copy_validate(ptr, size)) {
607*d4514f0bSApple OSS Distributions 		return PANIC;
608*d4514f0bSApple OSS Distributions 	}
609*d4514f0bSApple OSS Distributions 
610*d4514f0bSApple OSS Distributions 	kern_return_t kr = vm_map_read_user(map, src_addr, ptr, size);
611*d4514f0bSApple OSS Distributions 	return kr;
612*d4514f0bSApple OSS Distributions }
613*d4514f0bSApple OSS Distributions 
614*d4514f0bSApple 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)615*d4514f0bSApple OSS Distributions call_vm_map_write_user(MAP_T map, void * ptr, vm_map_address_t dst_addr, vm_size_t size)
616*d4514f0bSApple OSS Distributions {
617*d4514f0bSApple OSS Distributions 	if (will_copyio_panic_in_copy_validate(ptr, size)) {
618*d4514f0bSApple OSS Distributions 		return PANIC;
619*d4514f0bSApple OSS Distributions 	}
620*d4514f0bSApple OSS Distributions 
621*d4514f0bSApple OSS Distributions 	kern_return_t kr = vm_map_write_user(map, ptr, dst_addr, size);
622*d4514f0bSApple OSS Distributions 	return kr;
623*d4514f0bSApple OSS Distributions }
624*d4514f0bSApple OSS Distributions 
625*d4514f0bSApple 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)626*d4514f0bSApple 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)
627*d4514f0bSApple OSS Distributions {
628*d4514f0bSApple OSS Distributions 	kern_return_t kr = vm_map_copy_overwrite(dst_map, dst_addr, copy, copy_size, TRUE);
629*d4514f0bSApple OSS Distributions 	return kr;
630*d4514f0bSApple OSS Distributions }
631*d4514f0bSApple OSS Distributions 
632*d4514f0bSApple OSS Distributions static kern_return_t
call_mach_vm_protect__start_size(MAP_T map,mach_vm_address_t start,mach_vm_size_t size)633*d4514f0bSApple OSS Distributions call_mach_vm_protect__start_size(MAP_T map, mach_vm_address_t start, mach_vm_size_t size)
634*d4514f0bSApple OSS Distributions {
635*d4514f0bSApple OSS Distributions 	kern_return_t kr = mach_vm_protect(map, start, size, 0, VM_PROT_READ | VM_PROT_WRITE);
636*d4514f0bSApple OSS Distributions 	return kr;
637*d4514f0bSApple OSS Distributions }
638*d4514f0bSApple OSS Distributions static kern_return_t
call_mach_vm_protect__vm_prot(MAP_T map,mach_vm_address_t start,mach_vm_size_t size,vm_prot_t prot)639*d4514f0bSApple OSS Distributions call_mach_vm_protect__vm_prot(MAP_T map, mach_vm_address_t start, mach_vm_size_t size, vm_prot_t prot)
640*d4514f0bSApple OSS Distributions {
641*d4514f0bSApple OSS Distributions 	kern_return_t kr = mach_vm_protect(map, start, size, 0, prot);
642*d4514f0bSApple OSS Distributions 	return kr;
643*d4514f0bSApple OSS Distributions }
644*d4514f0bSApple OSS Distributions 
645*d4514f0bSApple OSS Distributions static kern_return_t
call_vm_protect__start_size(MAP_T map,vm_address_t start,vm_size_t size)646*d4514f0bSApple OSS Distributions call_vm_protect__start_size(MAP_T map, vm_address_t start, vm_size_t size)
647*d4514f0bSApple OSS Distributions {
648*d4514f0bSApple OSS Distributions 	kern_return_t kr = vm_protect(map, start, size, 0, VM_PROT_READ | VM_PROT_WRITE);
649*d4514f0bSApple OSS Distributions 	return kr;
650*d4514f0bSApple OSS Distributions }
651*d4514f0bSApple OSS Distributions 
652*d4514f0bSApple OSS Distributions static kern_return_t
call_vm_protect__vm_prot(MAP_T map,vm_address_t start,vm_size_t size,vm_prot_t prot)653*d4514f0bSApple OSS Distributions call_vm_protect__vm_prot(MAP_T map, vm_address_t start, vm_size_t size, vm_prot_t prot)
654*d4514f0bSApple OSS Distributions {
655*d4514f0bSApple OSS Distributions 	kern_return_t kr = vm_protect(map, start, size, 0, prot);
656*d4514f0bSApple OSS Distributions 	return kr;
657*d4514f0bSApple OSS Distributions }
658*d4514f0bSApple OSS Distributions 
659*d4514f0bSApple OSS Distributions /*
660*d4514f0bSApple OSS Distributions  * VME_OFFSET_SET will panic due to an assertion if passed an address that is not aligned to VME_ALIAS_BITS
661*d4514f0bSApple OSS Distributions  * VME_OFFSET_SET is called by _vm_map_clip_(start/end)
662*d4514f0bSApple OSS Distributions  * vm_map_protect -> vm_map_clip_end -> _vm_map_clip_end -> VME_OFFSET_SET
663*d4514f0bSApple OSS Distributions  */
664*d4514f0bSApple OSS Distributions static bool
will_vm_map_protect_panic(mach_vm_address_t start,mach_vm_address_t end)665*d4514f0bSApple OSS Distributions will_vm_map_protect_panic(mach_vm_address_t start, mach_vm_address_t end)
666*d4514f0bSApple OSS Distributions {
667*d4514f0bSApple OSS Distributions 	bool start_aligned = start == ((start >> VME_ALIAS_BITS) << VME_ALIAS_BITS);
668*d4514f0bSApple OSS Distributions 	bool end_aligned = end == ((end >> VME_ALIAS_BITS) << VME_ALIAS_BITS);
669*d4514f0bSApple OSS Distributions 	return !(start_aligned && end_aligned);
670*d4514f0bSApple OSS Distributions }
671*d4514f0bSApple OSS Distributions 
672*d4514f0bSApple OSS Distributions static kern_return_t
call_vm_map_protect__start_size__no_max(MAP_T map,mach_vm_address_t start,mach_vm_size_t size)673*d4514f0bSApple OSS Distributions call_vm_map_protect__start_size__no_max(MAP_T map, mach_vm_address_t start, mach_vm_size_t size)
674*d4514f0bSApple OSS Distributions {
675*d4514f0bSApple OSS Distributions 	mach_vm_address_t end = start + size;
676*d4514f0bSApple OSS Distributions 	if (will_vm_map_protect_panic(start, end)) {
677*d4514f0bSApple OSS Distributions 		return PANIC;
678*d4514f0bSApple OSS Distributions 	}
679*d4514f0bSApple OSS Distributions 
680*d4514f0bSApple OSS Distributions 	kern_return_t kr = vm_map_protect(map, start, end, 0, VM_PROT_READ | VM_PROT_WRITE);
681*d4514f0bSApple OSS Distributions 	return kr;
682*d4514f0bSApple OSS Distributions }
683*d4514f0bSApple OSS Distributions 
684*d4514f0bSApple OSS Distributions static kern_return_t
call_vm_map_protect__start_size__set_max(MAP_T map,mach_vm_address_t start,mach_vm_size_t size)685*d4514f0bSApple OSS Distributions call_vm_map_protect__start_size__set_max(MAP_T map, mach_vm_address_t start, mach_vm_size_t size)
686*d4514f0bSApple OSS Distributions {
687*d4514f0bSApple OSS Distributions 	mach_vm_address_t end = start + size;
688*d4514f0bSApple OSS Distributions 	if (will_vm_map_protect_panic(start, end)) {
689*d4514f0bSApple OSS Distributions 		return PANIC;
690*d4514f0bSApple OSS Distributions 	}
691*d4514f0bSApple OSS Distributions 
692*d4514f0bSApple OSS Distributions 	kern_return_t kr = vm_map_protect(map, start, end, 1, VM_PROT_READ | VM_PROT_WRITE);
693*d4514f0bSApple OSS Distributions 	return kr;
694*d4514f0bSApple OSS Distributions }
695*d4514f0bSApple OSS Distributions 
696*d4514f0bSApple OSS Distributions static kern_return_t
call_vm_map_protect__vm_prot__no_max(MAP_T map,mach_vm_address_t start,mach_vm_size_t size,vm_prot_t prot)697*d4514f0bSApple OSS Distributions call_vm_map_protect__vm_prot__no_max(MAP_T map, mach_vm_address_t start, mach_vm_size_t size, vm_prot_t prot)
698*d4514f0bSApple OSS Distributions {
699*d4514f0bSApple OSS Distributions 	mach_vm_address_t end = start + size;
700*d4514f0bSApple OSS Distributions 	if (will_vm_map_protect_panic(start, end)) {
701*d4514f0bSApple OSS Distributions 		return PANIC;
702*d4514f0bSApple OSS Distributions 	}
703*d4514f0bSApple OSS Distributions 
704*d4514f0bSApple OSS Distributions 	kern_return_t kr = vm_map_protect(map, start, end, 0, prot);
705*d4514f0bSApple OSS Distributions 	return kr;
706*d4514f0bSApple OSS Distributions }
707*d4514f0bSApple OSS Distributions 
708*d4514f0bSApple OSS Distributions static kern_return_t
call_vm_map_protect__vm_prot__set_max(MAP_T map,mach_vm_address_t start,mach_vm_size_t size,vm_prot_t prot)709*d4514f0bSApple OSS Distributions call_vm_map_protect__vm_prot__set_max(MAP_T map, mach_vm_address_t start, mach_vm_size_t size, vm_prot_t prot)
710*d4514f0bSApple OSS Distributions {
711*d4514f0bSApple OSS Distributions 	mach_vm_address_t end = start + size;
712*d4514f0bSApple OSS Distributions 	if (will_vm_map_protect_panic(start, end)) {
713*d4514f0bSApple OSS Distributions 		return PANIC;
714*d4514f0bSApple OSS Distributions 	}
715*d4514f0bSApple OSS Distributions 
716*d4514f0bSApple OSS Distributions 	kern_return_t kr = vm_map_protect(map, start, end, 0, prot);
717*d4514f0bSApple OSS Distributions 	return kr;
718*d4514f0bSApple OSS Distributions }
719*d4514f0bSApple OSS Distributions 
720*d4514f0bSApple OSS Distributions // Fwd decl to avoid including bsd headers
721*d4514f0bSApple OSS Distributions int     useracc(user_addr_t addr, user_size_t len, int prot);
722*d4514f0bSApple OSS Distributions 
723*d4514f0bSApple OSS Distributions static int
call_useracc__start_size(void * start,size_t size)724*d4514f0bSApple OSS Distributions call_useracc__start_size(void * start, size_t size)
725*d4514f0bSApple OSS Distributions {
726*d4514f0bSApple OSS Distributions 	int result = useracc((user_addr_t) start, (user_addr_t) size, VM_PROT_READ);
727*d4514f0bSApple OSS Distributions 	return result;
728*d4514f0bSApple OSS Distributions }
729*d4514f0bSApple OSS Distributions 
730*d4514f0bSApple OSS Distributions static int
call_useracc__vm_prot(void * start,size_t size,int prot)731*d4514f0bSApple OSS Distributions call_useracc__vm_prot(void * start, size_t size, int prot)
732*d4514f0bSApple OSS Distributions {
733*d4514f0bSApple OSS Distributions 	return useracc((user_addr_t) start, (user_addr_t) size, prot);
734*d4514f0bSApple OSS Distributions }
735*d4514f0bSApple OSS Distributions 
736*d4514f0bSApple OSS Distributions static int
call_vm_map_purgable_control__address__get(MAP_T map,mach_vm_address_t addr)737*d4514f0bSApple OSS Distributions call_vm_map_purgable_control__address__get(MAP_T map, mach_vm_address_t addr)
738*d4514f0bSApple OSS Distributions {
739*d4514f0bSApple OSS Distributions 	int state = INVALID_PURGABLE_STATE;
740*d4514f0bSApple OSS Distributions 	int initial_state = state;
741*d4514f0bSApple OSS Distributions 	kern_return_t kr = vm_map_purgable_control(map, addr, VM_PURGABLE_GET_STATE, &state);
742*d4514f0bSApple OSS Distributions 	check_mach_vm_purgable_control_outparam_changes(&kr, state, initial_state, VM_PURGABLE_GET_STATE);
743*d4514f0bSApple OSS Distributions 	return kr;
744*d4514f0bSApple OSS Distributions }
745*d4514f0bSApple OSS Distributions 
746*d4514f0bSApple OSS Distributions static int
call_vm_map_purgable_control__address__purge_all(MAP_T map,mach_vm_address_t addr)747*d4514f0bSApple OSS Distributions call_vm_map_purgable_control__address__purge_all(MAP_T map, mach_vm_address_t addr)
748*d4514f0bSApple OSS Distributions {
749*d4514f0bSApple OSS Distributions 	int state = INVALID_PURGABLE_STATE;
750*d4514f0bSApple OSS Distributions 	int initial_state = state;
751*d4514f0bSApple OSS Distributions 	kern_return_t kr = vm_map_purgable_control(map, addr, VM_PURGABLE_PURGE_ALL, &state);
752*d4514f0bSApple OSS Distributions 	check_mach_vm_purgable_control_outparam_changes(&kr, state, initial_state, VM_PURGABLE_PURGE_ALL);
753*d4514f0bSApple OSS Distributions 	return kr;
754*d4514f0bSApple OSS Distributions }
755*d4514f0bSApple OSS Distributions 
756*d4514f0bSApple OSS Distributions static int
call_vm_map_purgable_control__purgeable_state(MAP_T map,vm_address_t addr,vm_purgable_t control,int state)757*d4514f0bSApple OSS Distributions call_vm_map_purgable_control__purgeable_state(MAP_T map, vm_address_t addr, vm_purgable_t control, int state)
758*d4514f0bSApple OSS Distributions {
759*d4514f0bSApple OSS Distributions 	int state_copy = state;
760*d4514f0bSApple OSS Distributions 	kern_return_t kr = vm_map_purgable_control(map, addr, control, &state_copy);
761*d4514f0bSApple OSS Distributions 	check_mach_vm_purgable_control_outparam_changes(&kr, state_copy, state, control);
762*d4514f0bSApple OSS Distributions 
763*d4514f0bSApple OSS Distributions 	return kr;
764*d4514f0bSApple OSS Distributions }
765*d4514f0bSApple OSS Distributions 
766*d4514f0bSApple OSS Distributions #if XNU_PLATFORM_MacOSX
767*d4514f0bSApple OSS Distributions static void
check_vm_region_object_create_outparam_changes(kern_return_t * kr,ipc_port_t handle)768*d4514f0bSApple OSS Distributions check_vm_region_object_create_outparam_changes(kern_return_t * kr, ipc_port_t handle)
769*d4514f0bSApple OSS Distributions {
770*d4514f0bSApple OSS Distributions 	if (handle == NULL) {
771*d4514f0bSApple OSS Distributions 		*kr = OUT_PARAM_BAD;
772*d4514f0bSApple OSS Distributions 	}
773*d4514f0bSApple OSS Distributions }
774*d4514f0bSApple OSS Distributions 
775*d4514f0bSApple OSS Distributions static kern_return_t
call_vm_region_object_create(MAP_T map,vm_size_t size)776*d4514f0bSApple OSS Distributions call_vm_region_object_create(MAP_T map, vm_size_t size)
777*d4514f0bSApple OSS Distributions {
778*d4514f0bSApple OSS Distributions 	ipc_port_t handle = NULL;
779*d4514f0bSApple OSS Distributions 	kern_return_t kr = vm_region_object_create(map, size, &handle);
780*d4514f0bSApple OSS Distributions 	check_vm_region_object_create_outparam_changes(&kr, handle);
781*d4514f0bSApple OSS Distributions 
782*d4514f0bSApple OSS Distributions 	if (kr == KERN_SUCCESS) {
783*d4514f0bSApple OSS Distributions 		mach_memory_entry_port_release(handle);
784*d4514f0bSApple OSS Distributions 	}
785*d4514f0bSApple OSS Distributions 
786*d4514f0bSApple OSS Distributions 	return kr;
787*d4514f0bSApple OSS Distributions }
788*d4514f0bSApple OSS Distributions #endif /* #if XNU_PLATFORM_MacOSX */
789*d4514f0bSApple OSS Distributions 
790*d4514f0bSApple OSS Distributions static kern_return_t
call_vm_map_page_info(MAP_T map,mach_vm_address_t addr)791*d4514f0bSApple OSS Distributions call_vm_map_page_info(MAP_T map, mach_vm_address_t addr)
792*d4514f0bSApple OSS Distributions {
793*d4514f0bSApple OSS Distributions 	vm_page_info_flavor_t flavor = VM_PAGE_INFO_BASIC;
794*d4514f0bSApple OSS Distributions 	mach_msg_type_number_t count = VM_PAGE_INFO_BASIC_COUNT;
795*d4514f0bSApple OSS Distributions 	mach_msg_type_number_t saved_count = count;
796*d4514f0bSApple OSS Distributions 	vm_page_info_basic_data_t info = {0};
797*d4514f0bSApple OSS Distributions 	info.depth = -1;
798*d4514f0bSApple OSS Distributions 	vm_page_info_basic_data_t saved_info = info;
799*d4514f0bSApple OSS Distributions 
800*d4514f0bSApple OSS Distributions 	/*
801*d4514f0bSApple OSS Distributions 	 * If this test is invoked from a rosetta process,
802*d4514f0bSApple OSS Distributions 	 * vm_map_page_range_info_internal doesn't know what
803*d4514f0bSApple OSS Distributions 	 * effective_page_shift to use and returns KERN_INVALID_ARGUMENT.
804*d4514f0bSApple OSS Distributions 	 * To fix this, we can set the region_page_shift to the page_shift
805*d4514f0bSApple OSS Distributions 	 * used for map
806*d4514f0bSApple OSS Distributions 	 */
807*d4514f0bSApple OSS Distributions 	int saved_page_shift = thread_self_region_page_shift();
808*d4514f0bSApple OSS Distributions 	if (PAGE_SIZE == KB16) {
809*d4514f0bSApple OSS Distributions 		if (VM_MAP_PAGE_SHIFT(current_map()) != VM_MAP_PAGE_SHIFT(map)) {
810*d4514f0bSApple OSS Distributions 			thread_self_region_page_shift_set(VM_MAP_PAGE_SHIFT(map));
811*d4514f0bSApple OSS Distributions 		}
812*d4514f0bSApple OSS Distributions 	}
813*d4514f0bSApple OSS Distributions 
814*d4514f0bSApple OSS Distributions 	kern_return_t kr = vm_map_page_info(map, addr, flavor, (vm_page_info_t)&info, &count);
815*d4514f0bSApple OSS Distributions 
816*d4514f0bSApple OSS Distributions 	thread_self_region_page_shift_set(saved_page_shift);
817*d4514f0bSApple OSS Distributions 
818*d4514f0bSApple OSS Distributions 	check_mach_vm_page_info_outparam_changes(&kr, info, saved_info, count, saved_count);
819*d4514f0bSApple OSS Distributions 
820*d4514f0bSApple OSS Distributions 	return kr;
821*d4514f0bSApple OSS Distributions }
822*d4514f0bSApple OSS Distributions 
823*d4514f0bSApple OSS Distributions #if CONFIG_MAP_RANGES
824*d4514f0bSApple OSS Distributions static kern_return_t
call_mach_vm_range_create(MAP_T map,mach_vm_address_t start,mach_vm_size_t size,mach_vm_address_t second_start,mach_vm_size_t second_size)825*d4514f0bSApple OSS Distributions call_mach_vm_range_create(MAP_T map, mach_vm_address_t start, mach_vm_size_t size, mach_vm_address_t second_start, mach_vm_size_t second_size)
826*d4514f0bSApple OSS Distributions {
827*d4514f0bSApple OSS Distributions 	mach_vm_range_recipe_v1_t array[2];
828*d4514f0bSApple OSS Distributions 	array[0] = (mach_vm_range_recipe_v1_t){
829*d4514f0bSApple OSS Distributions 		.range = { start, start + size }, .range_tag = MACH_VM_RANGE_FIXED,
830*d4514f0bSApple OSS Distributions 	};
831*d4514f0bSApple OSS Distributions 	array[1] = (mach_vm_range_recipe_v1_t){
832*d4514f0bSApple OSS Distributions 		.range = { second_start, second_start + second_size }, .range_tag = MACH_VM_RANGE_FIXED,
833*d4514f0bSApple OSS Distributions 	};
834*d4514f0bSApple OSS Distributions 
835*d4514f0bSApple OSS Distributions 	// mach_vm_range_create requires map == current_map(). Patch it up, do the call, and then restore it.
836*d4514f0bSApple OSS Distributions 	vm_map_t saved_map = swap_task_map(current_task(), current_thread(), map);
837*d4514f0bSApple OSS Distributions 
838*d4514f0bSApple OSS Distributions 	kern_return_t kr = mach_vm_range_create(map, MACH_VM_RANGE_FLAVOR_V1, (mach_vm_range_recipes_raw_t)array, sizeof(array[0]) * 2);
839*d4514f0bSApple OSS Distributions 
840*d4514f0bSApple OSS Distributions 	swap_task_map(current_task(), current_thread(), saved_map);
841*d4514f0bSApple OSS Distributions 
842*d4514f0bSApple OSS Distributions 	return kr;
843*d4514f0bSApple OSS Distributions }
844*d4514f0bSApple OSS Distributions #endif /* CONFIG_MAP_RANGES */
845*d4514f0bSApple OSS Distributions 
846*d4514f0bSApple OSS Distributions // Mach memory entry ownership
847*d4514f0bSApple OSS Distributions 
848*d4514f0bSApple OSS Distributions extern kern_return_t
849*d4514f0bSApple OSS Distributions mach_memory_entry_ownership(
850*d4514f0bSApple OSS Distributions 	ipc_port_t      entry_port,
851*d4514f0bSApple OSS Distributions 	task_t          owner,
852*d4514f0bSApple OSS Distributions 	int             ledger_tag,
853*d4514f0bSApple OSS Distributions 	int             ledger_flags);
854*d4514f0bSApple OSS Distributions 
855*d4514f0bSApple OSS Distributions static kern_return_t
call_mach_memory_entry_ownership__ledger_tag(MAP_T map __unused,int ledger_tag)856*d4514f0bSApple OSS Distributions call_mach_memory_entry_ownership__ledger_tag(MAP_T map __unused, int ledger_tag)
857*d4514f0bSApple OSS Distributions {
858*d4514f0bSApple OSS Distributions 	mach_port_t mementry = make_a_mem_entry(map, TEST_ALLOC_SIZE + 1);
859*d4514f0bSApple OSS Distributions 	kern_return_t kr = mach_memory_entry_ownership(mementry, TASK_NULL, ledger_tag, 0);
860*d4514f0bSApple OSS Distributions 	mach_memory_entry_port_release(mementry);
861*d4514f0bSApple OSS Distributions 	return kr;
862*d4514f0bSApple OSS Distributions }
863*d4514f0bSApple OSS Distributions 
864*d4514f0bSApple OSS Distributions static kern_return_t
call_mach_memory_entry_ownership__ledger_flag(MAP_T map __unused,int ledger_flag)865*d4514f0bSApple OSS Distributions call_mach_memory_entry_ownership__ledger_flag(MAP_T map __unused, int ledger_flag)
866*d4514f0bSApple OSS Distributions {
867*d4514f0bSApple OSS Distributions 	mach_port_t mementry = make_a_mem_entry(map, TEST_ALLOC_SIZE + 1);
868*d4514f0bSApple OSS Distributions 	kern_return_t kr = mach_memory_entry_ownership(mementry, TASK_NULL, VM_LEDGER_TAG_DEFAULT, ledger_flag);
869*d4514f0bSApple OSS Distributions 	mach_memory_entry_port_release(mementry);
870*d4514f0bSApple OSS Distributions 	return kr;
871*d4514f0bSApple OSS Distributions }
872*d4514f0bSApple OSS Distributions 
873*d4514f0bSApple 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)874*d4514f0bSApple OSS Distributions check_mach_memory_entry_map_size_outparam_changes(kern_return_t * kr, mach_vm_size_t map_size,
875*d4514f0bSApple OSS Distributions     mach_vm_size_t invalid_initial_size)
876*d4514f0bSApple OSS Distributions {
877*d4514f0bSApple OSS Distributions 	if (*kr == KERN_SUCCESS) {
878*d4514f0bSApple OSS Distributions 		if (map_size == invalid_initial_size) {
879*d4514f0bSApple OSS Distributions 			*kr = OUT_PARAM_BAD;
880*d4514f0bSApple OSS Distributions 		}
881*d4514f0bSApple OSS Distributions 	} else {
882*d4514f0bSApple OSS Distributions 		if (map_size != 0) {
883*d4514f0bSApple OSS Distributions 			*kr = OUT_PARAM_BAD;
884*d4514f0bSApple OSS Distributions 		}
885*d4514f0bSApple OSS Distributions 	}
886*d4514f0bSApple OSS Distributions }
887*d4514f0bSApple OSS Distributions 
888*d4514f0bSApple 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)889*d4514f0bSApple OSS Distributions call_mach_memory_entry_map_size__start_size(MAP_T map, mach_vm_address_t start, mach_vm_size_t size)
890*d4514f0bSApple OSS Distributions {
891*d4514f0bSApple OSS Distributions 	mach_port_t mementry;
892*d4514f0bSApple OSS Distributions 	mach_vm_address_t addr;
893*d4514f0bSApple OSS Distributions 	memory_object_size_t s = (memory_object_size_t)TEST_ALLOC_SIZE + 1;
894*d4514f0bSApple OSS Distributions 	/*
895*d4514f0bSApple OSS Distributions 	 * UNLIKELY_INITIAL_SIZE is guaranteed to never be the correct map_size
896*d4514f0bSApple OSS Distributions 	 * from the mach_memory_entry_map_size calls we make. map_size should represent the size of the
897*d4514f0bSApple OSS Distributions 	 * copy that would result, and UNLIKELY_INITIAL_SIZE is completely unrelated to the sizes we pass
898*d4514f0bSApple OSS Distributions 	 * and not page aligned.
899*d4514f0bSApple OSS Distributions 	 */
900*d4514f0bSApple OSS Distributions 	mach_vm_size_t invalid_initial_size = UNLIKELY_INITIAL_SIZE;
901*d4514f0bSApple OSS Distributions 
902*d4514f0bSApple OSS Distributions 	mach_vm_size_t map_size = invalid_initial_size;
903*d4514f0bSApple OSS Distributions 
904*d4514f0bSApple OSS Distributions 	kern_return_t kr = mach_vm_allocate_kernel(map, &addr, s, FLAGS_AND_TAG(VM_FLAGS_ANYWHERE, VM_KERN_MEMORY_OSFMK));
905*d4514f0bSApple OSS Distributions 	assert(kr == 0);
906*d4514f0bSApple OSS Distributions 	kr = mach_make_memory_entry_64(map, &s, (memory_object_offset_t)addr, MAP_MEM_VM_SHARE, &mementry, MACH_PORT_NULL);
907*d4514f0bSApple OSS Distributions 	assert(kr == 0);
908*d4514f0bSApple OSS Distributions 	kr = mach_memory_entry_map_size(mementry, map, start, size, &map_size);
909*d4514f0bSApple OSS Distributions 	check_mach_memory_entry_map_size_outparam_changes(&kr, map_size, invalid_initial_size);
910*d4514f0bSApple OSS Distributions 	mach_memory_entry_port_release(mementry);
911*d4514f0bSApple OSS Distributions 	(void)mach_vm_deallocate(map, addr, s);
912*d4514f0bSApple OSS Distributions 	return kr;
913*d4514f0bSApple OSS Distributions }
914*d4514f0bSApple OSS Distributions 
915*d4514f0bSApple OSS Distributions struct file_control_return {
916*d4514f0bSApple OSS Distributions 	void * control;
917*d4514f0bSApple OSS Distributions 	void * fp;
918*d4514f0bSApple OSS Distributions 	void * vp;
919*d4514f0bSApple OSS Distributions 	int fd;
920*d4514f0bSApple OSS Distributions };
921*d4514f0bSApple OSS Distributions struct file_control_return get_control_from_fd(int fd);
922*d4514f0bSApple OSS Distributions void cleanup_control_related_data(struct file_control_return info);
923*d4514f0bSApple OSS Distributions uint32_t vnode_vid(void * vp);
924*d4514f0bSApple OSS Distributions 
925*d4514f0bSApple OSS Distributions static void
check_task_find_region_details_outparam_changes(int * result,uintptr_t vp,uintptr_t saved_vp,uint32_t vid,bool is_map_shared,uint64_t start,uint64_t saved_start,uint64_t len,uint64_t saved_len)926*d4514f0bSApple OSS Distributions check_task_find_region_details_outparam_changes(int * result,
927*d4514f0bSApple OSS Distributions     uintptr_t vp, uintptr_t saved_vp,
928*d4514f0bSApple OSS Distributions     uint32_t vid,
929*d4514f0bSApple OSS Distributions     bool is_map_shared,
930*d4514f0bSApple OSS Distributions     uint64_t start, uint64_t saved_start,
931*d4514f0bSApple OSS Distributions     uint64_t len, uint64_t saved_len)
932*d4514f0bSApple OSS Distributions {
933*d4514f0bSApple OSS Distributions 	// task_find_region_details returns a bool. 0 means failure, 1 success
934*d4514f0bSApple OSS Distributions 	if (*result == 0) {
935*d4514f0bSApple OSS Distributions 		if (vp != 0 || vid != 0 || is_map_shared != 0 || start != 0 || len != 0) {
936*d4514f0bSApple OSS Distributions 			*result = OUT_PARAM_BAD;
937*d4514f0bSApple OSS Distributions 		}
938*d4514f0bSApple OSS Distributions 	} else {
939*d4514f0bSApple OSS Distributions 		if (vp == saved_vp || start == saved_start || len == saved_len) {
940*d4514f0bSApple OSS Distributions 			*result = OUT_PARAM_BAD;
941*d4514f0bSApple OSS Distributions 		}
942*d4514f0bSApple OSS Distributions 		if (vid != (uint32_t)vnode_vid((void *)vp)) {
943*d4514f0bSApple OSS Distributions 			*result = OUT_PARAM_BAD;
944*d4514f0bSApple OSS Distributions 		}
945*d4514f0bSApple OSS Distributions 		// is_map_shared seems to check if the relevant entry is shadowed by another
946*d4514f0bSApple OSS Distributions 		// we don't set up any shadow entries for this test
947*d4514f0bSApple OSS Distributions 		if (is_map_shared) {
948*d4514f0bSApple OSS Distributions 			// *result = OUT_PARAM_BAD;
949*d4514f0bSApple OSS Distributions 		}
950*d4514f0bSApple OSS Distributions 	}
951*d4514f0bSApple OSS Distributions }
952*d4514f0bSApple OSS Distributions 
953*d4514f0bSApple OSS Distributions 
954*d4514f0bSApple OSS Distributions static int
call_task_find_region_details(MAP_T map,mach_vm_address_t addr)955*d4514f0bSApple OSS Distributions call_task_find_region_details(MAP_T map, mach_vm_address_t addr)
956*d4514f0bSApple OSS Distributions {
957*d4514f0bSApple OSS Distributions 	(void) map;
958*d4514f0bSApple OSS Distributions 	uint64_t len = UNLIKELY_INITIAL_SIZE, start = UNLIKELY_INITIAL_ADDRESS;
959*d4514f0bSApple OSS Distributions 	uint64_t saved_len = len, saved_start = start;
960*d4514f0bSApple OSS Distributions 	bool is_map_shared = true;
961*d4514f0bSApple OSS Distributions 	uintptr_t vp = (uintptr_t) INVALID_VNODE_PTR;
962*d4514f0bSApple OSS Distributions 	uintptr_t saved_vp = vp;
963*d4514f0bSApple OSS Distributions 	uint32_t vid = UNLIKELY_INITIAL_VID;
964*d4514f0bSApple OSS Distributions 
965*d4514f0bSApple OSS Distributions 	/*
966*d4514f0bSApple OSS Distributions 	 * task_find_region_details operates on task->map. Our setup code does allocations
967*d4514f0bSApple OSS Distributions 	 * that otherwise could theoretically overwrite existing ones, so we don't want to
968*d4514f0bSApple OSS Distributions 	 * operate on current_map
969*d4514f0bSApple OSS Distributions 	 */
970*d4514f0bSApple OSS Distributions 	vm_map_t saved_map = swap_task_map(current_task(), current_thread(), map);
971*d4514f0bSApple OSS Distributions 
972*d4514f0bSApple OSS Distributions 	int kr = task_find_region_details(current_task(), addr, FIND_REGION_DETAILS_AT_OFFSET, &vp, &vid, &is_map_shared, &start, &len);
973*d4514f0bSApple OSS Distributions 
974*d4514f0bSApple OSS Distributions 	swap_task_map(current_task(), current_thread(), saved_map);
975*d4514f0bSApple OSS Distributions 
976*d4514f0bSApple OSS Distributions 	check_task_find_region_details_outparam_changes(&kr, vp, saved_vp, vid, is_map_shared, start, saved_start, len, saved_len);
977*d4514f0bSApple OSS Distributions 	return kr;
978*d4514f0bSApple OSS Distributions }
979*d4514f0bSApple OSS Distributions 
980*d4514f0bSApple OSS Distributions static results_t * __attribute__((used))
test_kext_unix_with_allocated_vnode_addr(kern_return_t (* func)(MAP_T dst_map,mach_vm_address_t start),const char * testname)981*d4514f0bSApple OSS Distributions test_kext_unix_with_allocated_vnode_addr(kern_return_t (*func)(MAP_T dst_map, mach_vm_address_t start), const char *testname)
982*d4514f0bSApple OSS Distributions {
983*d4514f0bSApple OSS Distributions 	MAP_T map SMART_MAP;
984*d4514f0bSApple OSS Distributions 	allocation_t base SMART_ALLOCATE_VM(map, TEST_ALLOC_SIZE, VM_PROT_DEFAULT);
985*d4514f0bSApple OSS Distributions 	addr_trials_t *trials SMART_ADDR_TRIALS(base.addr);
986*d4514f0bSApple OSS Distributions 	results_t *results = alloc_results(testname, eSMART_ADDR_TRIALS, base.addr, trials->count);
987*d4514f0bSApple OSS Distributions 
988*d4514f0bSApple OSS Distributions 	for (unsigned i = 0; i < trials->count; i++) {
989*d4514f0bSApple OSS Distributions 		mach_vm_address_t addr = (mach_vm_address_t)trials->list[i].addr;
990*d4514f0bSApple OSS Distributions 
991*d4514f0bSApple OSS Distributions 		struct file_control_return control_info = get_control_from_fd(file_descriptor);
992*d4514f0bSApple OSS Distributions 		vm_map_kernel_flags_t vmk_flags = VM_MAP_KERNEL_FLAGS_FIXED(.vmf_overwrite = true);
993*d4514f0bSApple OSS Distributions 		kern_return_t kr = vm_map_enter_mem_object_control(map, &addr, TEST_ALLOC_SIZE, 0, vmk_flags, (memory_object_control_t) control_info.control, 0, false, VM_PROT_DEFAULT, VM_PROT_DEFAULT, VM_INHERIT_DEFAULT);
994*d4514f0bSApple OSS Distributions 		if (kr == KERN_INVALID_ARGUMENT) {
995*d4514f0bSApple OSS Distributions 			// can't map a file at that address, so we can't pass
996*d4514f0bSApple OSS Distributions 			// such a mapping to the function being tested
997*d4514f0bSApple OSS Distributions 			append_result(results, IGNORED, trials->list[i].name);
998*d4514f0bSApple OSS Distributions 			cleanup_control_related_data(control_info);
999*d4514f0bSApple OSS Distributions 			continue;
1000*d4514f0bSApple OSS Distributions 		}
1001*d4514f0bSApple OSS Distributions 		assert(kr == KERN_SUCCESS);
1002*d4514f0bSApple OSS Distributions 
1003*d4514f0bSApple OSS Distributions 		kern_return_t ret = func(map, addr);
1004*d4514f0bSApple OSS Distributions 		append_result(results, ret, trials->list[i].name);
1005*d4514f0bSApple OSS Distributions 		cleanup_control_related_data(control_info);
1006*d4514f0bSApple OSS Distributions 	}
1007*d4514f0bSApple OSS Distributions 	return results;
1008*d4514f0bSApple OSS Distributions }
1009*d4514f0bSApple OSS Distributions 
1010*d4514f0bSApple OSS Distributions extern uint64_t vm_reclaim_max_threshold;
1011*d4514f0bSApple OSS Distributions 
1012*d4514f0bSApple OSS Distributions static kern_return_t
test_mach_vm_deferred_reclamation_buffer_init(MAP_T map __unused,mach_vm_address_t address,mach_vm_size_t size)1013*d4514f0bSApple OSS Distributions test_mach_vm_deferred_reclamation_buffer_init(MAP_T map __unused, mach_vm_address_t address, mach_vm_size_t size)
1014*d4514f0bSApple OSS Distributions {
1015*d4514f0bSApple OSS Distributions 	uint64_t vm_reclaim_max_threshold_orig = vm_reclaim_max_threshold;
1016*d4514f0bSApple OSS Distributions 	kern_return_t kr = 0;
1017*d4514f0bSApple OSS Distributions 
1018*d4514f0bSApple OSS Distributions 	vm_reclaim_max_threshold = KB16;
1019*d4514f0bSApple OSS Distributions 	kr = call_mach_vm_deferred_reclamation_buffer_init(current_task(), address, size);
1020*d4514f0bSApple OSS Distributions 	vm_reclaim_max_threshold = vm_reclaim_max_threshold_orig;
1021*d4514f0bSApple OSS Distributions 
1022*d4514f0bSApple OSS Distributions 	return kr;
1023*d4514f0bSApple OSS Distributions }
1024*d4514f0bSApple OSS Distributions 
1025*d4514f0bSApple OSS Distributions 
1026*d4514f0bSApple OSS Distributions // mach_make_memory_entry and variants
1027*d4514f0bSApple OSS Distributions 
1028*d4514f0bSApple 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)1029*d4514f0bSApple OSS Distributions check_mach_memory_entry_outparam_changes(kern_return_t * kr, mach_vm_size_t size,
1030*d4514f0bSApple OSS Distributions     mach_port_t out_handle)
1031*d4514f0bSApple OSS Distributions {
1032*d4514f0bSApple OSS Distributions 	/*
1033*d4514f0bSApple OSS Distributions 	 * mach_make_memory_entry overwrites *size to be 0 on failure.
1034*d4514f0bSApple OSS Distributions 	 */
1035*d4514f0bSApple OSS Distributions 	if (*kr != KERN_SUCCESS) {
1036*d4514f0bSApple OSS Distributions 		if (size != 0) {
1037*d4514f0bSApple OSS Distributions 			*kr = OUT_PARAM_BAD;
1038*d4514f0bSApple OSS Distributions 		}
1039*d4514f0bSApple OSS Distributions 		if (out_handle != 0) {
1040*d4514f0bSApple OSS Distributions 			*kr = OUT_PARAM_BAD;
1041*d4514f0bSApple OSS Distributions 		}
1042*d4514f0bSApple OSS Distributions 	}
1043*d4514f0bSApple OSS Distributions }
1044*d4514f0bSApple OSS Distributions 
1045*d4514f0bSApple OSS Distributions #define IMPL(FN, T)                                                               \
1046*d4514f0bSApple OSS Distributions 	static kern_return_t                                                      \
1047*d4514f0bSApple OSS Distributions 	call_ ## FN ## __start_size__memonly(MAP_T map, T start, T size)                      \
1048*d4514f0bSApple OSS Distributions 	{                                                                         \
1049*d4514f0bSApple OSS Distributions 	        mach_port_t memobject = make_a_mem_object(TEST_ALLOC_SIZE + 1);          \
1050*d4514f0bSApple OSS Distributions 	        T io_size = size;                                                 \
1051*d4514f0bSApple OSS Distributions 	        mach_port_t invalid_handle_value = UNLIKELY_INITIAL_MACH_PORT;     \
1052*d4514f0bSApple OSS Distributions 	        mach_port_t out_handle = invalid_handle_value;                    \
1053*d4514f0bSApple OSS Distributions 	        kern_return_t kr = FN(map, &io_size, start,                       \
1054*d4514f0bSApple OSS Distributions 	                              VM_PROT_READ | MAP_MEM_ONLY, &out_handle, memobject); \
1055*d4514f0bSApple OSS Distributions 	        if (kr == 0) {                                                    \
1056*d4514f0bSApple OSS Distributions 	                if (out_handle) mach_memory_entry_port_release(out_handle); \
1057*d4514f0bSApple OSS Distributions 	        }                                                                 \
1058*d4514f0bSApple OSS Distributions 	        mach_memory_entry_port_release(memobject);                        \
1059*d4514f0bSApple OSS Distributions 	        check_mach_memory_entry_outparam_changes(&kr, io_size, out_handle); \
1060*d4514f0bSApple OSS Distributions 	        return kr;                                                        \
1061*d4514f0bSApple OSS Distributions 	}                                                                         \
1062*d4514f0bSApple OSS Distributions                                                                                   \
1063*d4514f0bSApple OSS Distributions 	static kern_return_t                                                      \
1064*d4514f0bSApple OSS Distributions 	call_ ## FN ## __start_size__namedcreate(MAP_T map, T start, T size)                  \
1065*d4514f0bSApple OSS Distributions 	{                                                                         \
1066*d4514f0bSApple OSS Distributions 	        mach_port_t memobject = make_a_mem_object(TEST_ALLOC_SIZE + 1);          \
1067*d4514f0bSApple OSS Distributions 	        T io_size = size;                                                 \
1068*d4514f0bSApple OSS Distributions 	        mach_port_t invalid_handle_value = UNLIKELY_INITIAL_MACH_PORT;     \
1069*d4514f0bSApple OSS Distributions 	        mach_port_t out_handle = invalid_handle_value;                    \
1070*d4514f0bSApple OSS Distributions 	        kern_return_t kr = FN(map, &io_size, start,                       \
1071*d4514f0bSApple OSS Distributions 	                              VM_PROT_READ | MAP_MEM_NAMED_CREATE, &out_handle, memobject); \
1072*d4514f0bSApple OSS Distributions 	        if (kr == 0) {                                                    \
1073*d4514f0bSApple OSS Distributions 	                if (out_handle) mach_memory_entry_port_release(out_handle); \
1074*d4514f0bSApple OSS Distributions 	        }                                                                 \
1075*d4514f0bSApple OSS Distributions 	        mach_memory_entry_port_release(memobject);                        \
1076*d4514f0bSApple OSS Distributions 	        check_mach_memory_entry_outparam_changes(&kr, io_size, out_handle); \
1077*d4514f0bSApple OSS Distributions 	        return kr;                                                        \
1078*d4514f0bSApple OSS Distributions 	}                                                                         \
1079*d4514f0bSApple OSS Distributions                                                                                   \
1080*d4514f0bSApple OSS Distributions 	static kern_return_t                                                      \
1081*d4514f0bSApple OSS Distributions 	call_ ## FN ## __start_size__copy(MAP_T map, T start, T size)                         \
1082*d4514f0bSApple OSS Distributions 	{                                                                         \
1083*d4514f0bSApple OSS Distributions 	        mach_port_t memobject = make_a_mem_object(TEST_ALLOC_SIZE + 1);          \
1084*d4514f0bSApple OSS Distributions 	        T io_size = size;                                                 \
1085*d4514f0bSApple OSS Distributions 	        mach_port_t invalid_handle_value = UNLIKELY_INITIAL_MACH_PORT;     \
1086*d4514f0bSApple OSS Distributions 	        mach_port_t out_handle = invalid_handle_value;                    \
1087*d4514f0bSApple OSS Distributions 	        kern_return_t kr = FN(map, &io_size, start,                       \
1088*d4514f0bSApple OSS Distributions 	                              VM_PROT_READ | MAP_MEM_VM_COPY, &out_handle, memobject); \
1089*d4514f0bSApple OSS Distributions 	        if (kr == 0) {                                                    \
1090*d4514f0bSApple OSS Distributions 	                if (out_handle) mach_memory_entry_port_release(out_handle); \
1091*d4514f0bSApple OSS Distributions 	        }                                                                 \
1092*d4514f0bSApple OSS Distributions 	        mach_memory_entry_port_release(memobject);                        \
1093*d4514f0bSApple OSS Distributions 	        check_mach_memory_entry_outparam_changes(&kr, io_size, out_handle); \
1094*d4514f0bSApple OSS Distributions 	        return kr;                                                        \
1095*d4514f0bSApple OSS Distributions 	}                                                                         \
1096*d4514f0bSApple OSS Distributions                                                                                   \
1097*d4514f0bSApple OSS Distributions 	static kern_return_t                                                      \
1098*d4514f0bSApple OSS Distributions 	call_ ## FN ## __start_size__share(MAP_T map, T start, T size)            \
1099*d4514f0bSApple OSS Distributions 	{                                                                         \
1100*d4514f0bSApple OSS Distributions 	        mach_port_t memobject = make_a_mem_object(TEST_ALLOC_SIZE + 1);          \
1101*d4514f0bSApple OSS Distributions 	        T io_size = size;                                                 \
1102*d4514f0bSApple OSS Distributions 	        mach_port_t invalid_handle_value = UNLIKELY_INITIAL_MACH_PORT;     \
1103*d4514f0bSApple OSS Distributions 	        mach_port_t out_handle = invalid_handle_value;                    \
1104*d4514f0bSApple OSS Distributions 	        kern_return_t kr = FN(map, &io_size, start,                       \
1105*d4514f0bSApple OSS Distributions 	                              VM_PROT_READ | MAP_MEM_VM_SHARE, &out_handle, memobject); \
1106*d4514f0bSApple OSS Distributions 	        if (kr == 0) {                                                    \
1107*d4514f0bSApple OSS Distributions 	                if (out_handle) mach_memory_entry_port_release(out_handle); \
1108*d4514f0bSApple OSS Distributions 	        }                                                                 \
1109*d4514f0bSApple OSS Distributions 	        mach_memory_entry_port_release(memobject);                        \
1110*d4514f0bSApple OSS Distributions 	        check_mach_memory_entry_outparam_changes(&kr, io_size, out_handle); \
1111*d4514f0bSApple OSS Distributions 	        return kr;                                                        \
1112*d4514f0bSApple OSS Distributions 	}                                                                         \
1113*d4514f0bSApple OSS Distributions                                                                                   \
1114*d4514f0bSApple OSS Distributions 	static kern_return_t                                                      \
1115*d4514f0bSApple OSS Distributions 	call_ ## FN ## __start_size__namedreuse(MAP_T map, T start, T size)       \
1116*d4514f0bSApple OSS Distributions 	{                                                                         \
1117*d4514f0bSApple OSS Distributions 	        mach_port_t memobject = make_a_mem_object(TEST_ALLOC_SIZE + 1);          \
1118*d4514f0bSApple OSS Distributions 	        T io_size = size;                                                 \
1119*d4514f0bSApple OSS Distributions 	        mach_port_t invalid_handle_value = UNLIKELY_INITIAL_MACH_PORT;     \
1120*d4514f0bSApple OSS Distributions 	        mach_port_t out_handle = invalid_handle_value;                    \
1121*d4514f0bSApple OSS Distributions 	        kern_return_t kr = FN(map, &io_size, start,                       \
1122*d4514f0bSApple OSS Distributions 	                              VM_PROT_READ | MAP_MEM_NAMED_REUSE, &out_handle, memobject); \
1123*d4514f0bSApple OSS Distributions 	        if (kr == 0) {                                                    \
1124*d4514f0bSApple OSS Distributions 	                if (out_handle) mach_memory_entry_port_release(out_handle); \
1125*d4514f0bSApple OSS Distributions 	        }                                                                 \
1126*d4514f0bSApple OSS Distributions 	        mach_memory_entry_port_release(memobject);                        \
1127*d4514f0bSApple OSS Distributions 	        check_mach_memory_entry_outparam_changes(&kr, io_size, out_handle); \
1128*d4514f0bSApple OSS Distributions 	        return kr;                                                        \
1129*d4514f0bSApple OSS Distributions 	}                                                                         \
1130*d4514f0bSApple OSS Distributions                                                                                   \
1131*d4514f0bSApple OSS Distributions 	static kern_return_t                                                      \
1132*d4514f0bSApple OSS Distributions 	call_ ## FN ## __vm_prot(MAP_T map, T start, T size, vm_prot_t prot)      \
1133*d4514f0bSApple OSS Distributions 	{                                                                         \
1134*d4514f0bSApple OSS Distributions 	        mach_port_t memobject = make_a_mem_object(TEST_ALLOC_SIZE + 1);          \
1135*d4514f0bSApple OSS Distributions 	        T io_size = size;                                                 \
1136*d4514f0bSApple OSS Distributions 	        mach_port_t invalid_handle_value = UNLIKELY_INITIAL_MACH_PORT;     \
1137*d4514f0bSApple OSS Distributions 	        mach_port_t out_handle = invalid_handle_value;                    \
1138*d4514f0bSApple OSS Distributions 	        kern_return_t kr = FN(map, &io_size, start,                       \
1139*d4514f0bSApple OSS Distributions 	                              prot, &out_handle, memobject); \
1140*d4514f0bSApple OSS Distributions 	        if (kr == 0) {                                                    \
1141*d4514f0bSApple OSS Distributions 	                if (out_handle) mach_memory_entry_port_release(out_handle); \
1142*d4514f0bSApple OSS Distributions 	        }                                                                 \
1143*d4514f0bSApple OSS Distributions 	        mach_memory_entry_port_release(memobject);                        \
1144*d4514f0bSApple OSS Distributions 	        check_mach_memory_entry_outparam_changes(&kr, io_size, out_handle); \
1145*d4514f0bSApple OSS Distributions 	        return kr;                                                        \
1146*d4514f0bSApple OSS Distributions 	}
1147*d4514f0bSApple OSS Distributions 
IMPL(mach_make_memory_entry_64,mach_vm_address_t)1148*d4514f0bSApple OSS Distributions IMPL(mach_make_memory_entry_64, mach_vm_address_t)
1149*d4514f0bSApple OSS Distributions IMPL(mach_make_memory_entry, vm_size_t)
1150*d4514f0bSApple OSS Distributions static kern_return_t
1151*d4514f0bSApple OSS Distributions mach_make_memory_entry_internal_retyped(
1152*d4514f0bSApple OSS Distributions 	vm_map_t                target_map,
1153*d4514f0bSApple OSS Distributions 	memory_object_size_t    *size,
1154*d4514f0bSApple OSS Distributions 	memory_object_offset_t  offset,
1155*d4514f0bSApple OSS Distributions 	vm_prot_t               permission,
1156*d4514f0bSApple OSS Distributions 	ipc_port_t              *object_handle,
1157*d4514f0bSApple OSS Distributions 	ipc_port_t              parent_handle)
1158*d4514f0bSApple OSS Distributions {
1159*d4514f0bSApple OSS Distributions 	vm_named_entry_kernel_flags_t   vmne_kflags = VM_NAMED_ENTRY_KERNEL_FLAGS_NONE;
1160*d4514f0bSApple OSS Distributions 	if (permission & MAP_MEM_LEDGER_TAGGED) {
1161*d4514f0bSApple OSS Distributions 		vmne_kflags.vmnekf_ledger_tag = VM_LEDGER_TAG_DEFAULT;
1162*d4514f0bSApple OSS Distributions 	}
1163*d4514f0bSApple OSS Distributions 	return mach_make_memory_entry_internal(target_map, size, offset, permission, vmne_kflags, object_handle, parent_handle);
1164*d4514f0bSApple OSS Distributions }
1165*d4514f0bSApple OSS Distributions IMPL(mach_make_memory_entry_internal_retyped, mach_vm_address_t)
1166*d4514f0bSApple OSS Distributions 
1167*d4514f0bSApple OSS Distributions #undef IMPL
1168*d4514f0bSApple OSS Distributions 
1169*d4514f0bSApple OSS Distributions // mach_vm_map/mach_vm_map_external/mach_vm_map_kernel/vm_map/vm_map_external infra
1170*d4514f0bSApple OSS Distributions 
1171*d4514f0bSApple OSS Distributions typedef kern_return_t (*map_fn_t)(vm_map_t target_task,
1172*d4514f0bSApple OSS Distributions     mach_vm_address_t *address,
1173*d4514f0bSApple OSS Distributions     mach_vm_size_t size,
1174*d4514f0bSApple OSS Distributions     mach_vm_offset_t mask,
1175*d4514f0bSApple OSS Distributions     int flags,
1176*d4514f0bSApple OSS Distributions     mem_entry_name_port_t object,
1177*d4514f0bSApple OSS Distributions     memory_object_offset_t offset,
1178*d4514f0bSApple OSS Distributions     boolean_t copy,
1179*d4514f0bSApple OSS Distributions     vm_prot_t cur_protection,
1180*d4514f0bSApple OSS Distributions     vm_prot_t max_protection,
1181*d4514f0bSApple OSS Distributions     vm_inherit_t inheritance);
1182*d4514f0bSApple OSS Distributions 
1183*d4514f0bSApple 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)1184*d4514f0bSApple OSS Distributions call_map_fn__allocate_fixed(map_fn_t fn, MAP_T map, mach_vm_address_t start, mach_vm_size_t size)
1185*d4514f0bSApple OSS Distributions {
1186*d4514f0bSApple OSS Distributions 	mach_vm_address_t out_addr = start;
1187*d4514f0bSApple OSS Distributions 	kern_return_t kr = fn(map, &out_addr, size, 0, VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE,
1188*d4514f0bSApple OSS Distributions 	    0, 0, 0, 0, 0, VM_INHERIT_NONE);
1189*d4514f0bSApple OSS Distributions 	// fixed-overwrite with pre-existing allocation, don't deallocate
1190*d4514f0bSApple OSS Distributions 	return kr;
1191*d4514f0bSApple OSS Distributions }
1192*d4514f0bSApple OSS Distributions 
1193*d4514f0bSApple 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)1194*d4514f0bSApple 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)
1195*d4514f0bSApple OSS Distributions {
1196*d4514f0bSApple OSS Distributions 	mach_vm_address_t out_addr = start;
1197*d4514f0bSApple OSS Distributions 	kern_return_t kr = fn(map, &out_addr, size, 0, VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE,
1198*d4514f0bSApple OSS Distributions 	    0, 0, true, 0, 0, VM_INHERIT_NONE);
1199*d4514f0bSApple OSS Distributions 	// fixed-overwrite with pre-existing allocation, don't deallocate
1200*d4514f0bSApple OSS Distributions 	return kr;
1201*d4514f0bSApple OSS Distributions }
1202*d4514f0bSApple OSS Distributions 
1203*d4514f0bSApple 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)1204*d4514f0bSApple 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)
1205*d4514f0bSApple OSS Distributions {
1206*d4514f0bSApple OSS Distributions 	mach_vm_address_t out_addr = start_hint;
1207*d4514f0bSApple OSS Distributions 	kern_return_t kr = fn(map, &out_addr, size, 0, VM_FLAGS_ANYWHERE, 0, 0, 0, 0, 0, VM_INHERIT_NONE);
1208*d4514f0bSApple OSS Distributions 	if (kr == 0) {
1209*d4514f0bSApple OSS Distributions 		(void)mach_vm_deallocate(map, out_addr, size);
1210*d4514f0bSApple OSS Distributions 	}
1211*d4514f0bSApple OSS Distributions 	return kr;
1212*d4514f0bSApple OSS Distributions }
1213*d4514f0bSApple OSS Distributions 
1214*d4514f0bSApple 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)1215*d4514f0bSApple OSS Distributions call_map_fn__memobject_fixed(map_fn_t fn, MAP_T map, mach_vm_address_t start, mach_vm_size_t size)
1216*d4514f0bSApple OSS Distributions {
1217*d4514f0bSApple OSS Distributions 	mach_port_t memobject = make_a_mem_object(TEST_ALLOC_SIZE + 1);
1218*d4514f0bSApple OSS Distributions 	mach_vm_address_t out_addr = start;
1219*d4514f0bSApple OSS Distributions 	kern_return_t kr = fn(map, &out_addr, size, 0, VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE,
1220*d4514f0bSApple OSS Distributions 	    memobject, KB16, false, VM_PROT_DEFAULT, VM_PROT_DEFAULT, VM_INHERIT_DEFAULT);
1221*d4514f0bSApple OSS Distributions 	// fixed-overwrite with pre-existing allocation, don't deallocate
1222*d4514f0bSApple OSS Distributions 	mach_memory_entry_port_release(memobject);
1223*d4514f0bSApple OSS Distributions 	return kr;
1224*d4514f0bSApple OSS Distributions }
1225*d4514f0bSApple OSS Distributions 
1226*d4514f0bSApple 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)1227*d4514f0bSApple 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)
1228*d4514f0bSApple OSS Distributions {
1229*d4514f0bSApple OSS Distributions 	mach_port_t memobject = make_a_mem_object(TEST_ALLOC_SIZE + 1);
1230*d4514f0bSApple OSS Distributions 	mach_vm_address_t out_addr = start;
1231*d4514f0bSApple OSS Distributions 	kern_return_t kr = fn(map, &out_addr, size, 0, VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE,
1232*d4514f0bSApple OSS Distributions 	    memobject, KB16, true, VM_PROT_DEFAULT, VM_PROT_DEFAULT, VM_INHERIT_DEFAULT);
1233*d4514f0bSApple OSS Distributions 	// fixed-overwrite with pre-existing allocation, don't deallocate
1234*d4514f0bSApple OSS Distributions 	mach_memory_entry_port_release(memobject);
1235*d4514f0bSApple OSS Distributions 	return kr;
1236*d4514f0bSApple OSS Distributions }
1237*d4514f0bSApple OSS Distributions 
1238*d4514f0bSApple 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)1239*d4514f0bSApple 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)
1240*d4514f0bSApple OSS Distributions {
1241*d4514f0bSApple OSS Distributions 	mach_port_t memobject = make_a_mem_object(TEST_ALLOC_SIZE + 1);
1242*d4514f0bSApple OSS Distributions 	mach_vm_address_t out_addr = start_hint;
1243*d4514f0bSApple OSS Distributions 	kern_return_t kr = fn(map, &out_addr, size, 0, VM_FLAGS_ANYWHERE, memobject,
1244*d4514f0bSApple OSS Distributions 	    KB16, false, VM_PROT_DEFAULT, VM_PROT_DEFAULT, VM_INHERIT_DEFAULT);
1245*d4514f0bSApple OSS Distributions 	if (kr == 0) {
1246*d4514f0bSApple OSS Distributions 		(void)mach_vm_deallocate(map, out_addr, size);
1247*d4514f0bSApple OSS Distributions 	}
1248*d4514f0bSApple OSS Distributions 	mach_memory_entry_port_release(memobject);
1249*d4514f0bSApple OSS Distributions 	return kr;
1250*d4514f0bSApple OSS Distributions }
1251*d4514f0bSApple OSS Distributions 
1252*d4514f0bSApple 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)1253*d4514f0bSApple 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)
1254*d4514f0bSApple OSS Distributions {
1255*d4514f0bSApple OSS Distributions 	mach_port_t memobject = make_a_mem_object(obj_size);
1256*d4514f0bSApple OSS Distributions 	mach_vm_address_t out_addr = start;
1257*d4514f0bSApple OSS Distributions 	kern_return_t kr = fn(map, &out_addr, size, 0, flags, memobject,
1258*d4514f0bSApple OSS Distributions 	    offset, copy, VM_PROT_DEFAULT, VM_PROT_DEFAULT, VM_INHERIT_DEFAULT);
1259*d4514f0bSApple OSS Distributions 	deallocate_if_not_fixed_overwrite(kr, map, out_addr, size, flags);
1260*d4514f0bSApple OSS Distributions 	mach_memory_entry_port_release(memobject);
1261*d4514f0bSApple OSS Distributions 	return kr;
1262*d4514f0bSApple OSS Distributions }
1263*d4514f0bSApple OSS Distributions 
1264*d4514f0bSApple 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)1265*d4514f0bSApple 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)
1266*d4514f0bSApple OSS Distributions {
1267*d4514f0bSApple OSS Distributions 	return helper_call_map_fn__memobject__ssoo(fn, map, VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE, false, start, size, offset, obj_size);
1268*d4514f0bSApple OSS Distributions }
1269*d4514f0bSApple OSS Distributions 
1270*d4514f0bSApple 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)1271*d4514f0bSApple 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)
1272*d4514f0bSApple OSS Distributions {
1273*d4514f0bSApple OSS Distributions 	return helper_call_map_fn__memobject__ssoo(fn, map, VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE, true, start, size, offset, obj_size);
1274*d4514f0bSApple OSS Distributions }
1275*d4514f0bSApple OSS Distributions 
1276*d4514f0bSApple 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)1277*d4514f0bSApple 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)
1278*d4514f0bSApple OSS Distributions {
1279*d4514f0bSApple OSS Distributions 	return helper_call_map_fn__memobject__ssoo(fn, map, VM_FLAGS_ANYWHERE, false, start, size, offset, obj_size);
1280*d4514f0bSApple OSS Distributions }
1281*d4514f0bSApple OSS Distributions 
1282*d4514f0bSApple 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)1283*d4514f0bSApple 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)
1284*d4514f0bSApple OSS Distributions {
1285*d4514f0bSApple OSS Distributions 	mach_vm_address_t out_addr = start;
1286*d4514f0bSApple OSS Distributions 	kern_return_t kr = fn(map, &out_addr, size, 0, flags,
1287*d4514f0bSApple OSS Distributions 	    0, KB16, copy, VM_PROT_DEFAULT, VM_PROT_DEFAULT, inherit);
1288*d4514f0bSApple OSS Distributions 	deallocate_if_not_fixed_overwrite(kr, map, out_addr, size, flags);
1289*d4514f0bSApple OSS Distributions 	return kr;
1290*d4514f0bSApple OSS Distributions }
1291*d4514f0bSApple OSS Distributions 
1292*d4514f0bSApple 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)1293*d4514f0bSApple 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)
1294*d4514f0bSApple OSS Distributions {
1295*d4514f0bSApple OSS Distributions 	return help_call_map_fn__allocate__inherit(fn, map, VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE, false, start, size, inherit);
1296*d4514f0bSApple OSS Distributions }
1297*d4514f0bSApple OSS Distributions 
1298*d4514f0bSApple 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)1299*d4514f0bSApple 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)
1300*d4514f0bSApple OSS Distributions {
1301*d4514f0bSApple OSS Distributions 	return help_call_map_fn__allocate__inherit(fn, map, VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE, true, start, size, inherit);
1302*d4514f0bSApple OSS Distributions }
1303*d4514f0bSApple OSS Distributions 
1304*d4514f0bSApple 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)1305*d4514f0bSApple 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)
1306*d4514f0bSApple OSS Distributions {
1307*d4514f0bSApple OSS Distributions 	return help_call_map_fn__allocate__inherit(fn, map, VM_FLAGS_ANYWHERE, false, start, size, inherit);
1308*d4514f0bSApple OSS Distributions }
1309*d4514f0bSApple OSS Distributions 
1310*d4514f0bSApple 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)1311*d4514f0bSApple 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)
1312*d4514f0bSApple OSS Distributions {
1313*d4514f0bSApple OSS Distributions 	mach_port_t memobject = make_a_mem_object(TEST_ALLOC_SIZE + 1);
1314*d4514f0bSApple OSS Distributions 	mach_vm_address_t out_addr = start;
1315*d4514f0bSApple OSS Distributions 	kern_return_t kr = fn(map, &out_addr, size, 0, flags,
1316*d4514f0bSApple OSS Distributions 	    memobject, KB16, copy, VM_PROT_DEFAULT, VM_PROT_DEFAULT, inherit);
1317*d4514f0bSApple OSS Distributions 	deallocate_if_not_fixed_overwrite(kr, map, out_addr, size, flags);
1318*d4514f0bSApple OSS Distributions 	mach_memory_entry_port_release(memobject);
1319*d4514f0bSApple OSS Distributions 	return kr;
1320*d4514f0bSApple OSS Distributions }
1321*d4514f0bSApple OSS Distributions 
1322*d4514f0bSApple 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)1323*d4514f0bSApple 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)
1324*d4514f0bSApple OSS Distributions {
1325*d4514f0bSApple OSS Distributions 	return help_call_map_fn__memobject__inherit(fn, map, VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE, false, start, size, inherit);
1326*d4514f0bSApple OSS Distributions }
1327*d4514f0bSApple OSS Distributions 
1328*d4514f0bSApple 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)1329*d4514f0bSApple 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)
1330*d4514f0bSApple OSS Distributions {
1331*d4514f0bSApple OSS Distributions 	return help_call_map_fn__memobject__inherit(fn, map, VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE, true, start, size, inherit);
1332*d4514f0bSApple OSS Distributions }
1333*d4514f0bSApple OSS Distributions 
1334*d4514f0bSApple 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)1335*d4514f0bSApple 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)
1336*d4514f0bSApple OSS Distributions {
1337*d4514f0bSApple OSS Distributions 	return help_call_map_fn__memobject__inherit(fn, map, VM_FLAGS_ANYWHERE, false, start, size, inherit);
1338*d4514f0bSApple OSS Distributions }
1339*d4514f0bSApple OSS Distributions 
1340*d4514f0bSApple 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)1341*d4514f0bSApple 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)
1342*d4514f0bSApple OSS Distributions {
1343*d4514f0bSApple OSS Distributions 	kern_return_t kr = fn(map, start, size, 0, flags,
1344*d4514f0bSApple OSS Distributions 	    0, KB16, false, VM_PROT_DEFAULT, VM_PROT_DEFAULT, VM_INHERIT_DEFAULT);
1345*d4514f0bSApple OSS Distributions 	deallocate_if_not_fixed_overwrite(kr, map, *start, size, flags);
1346*d4514f0bSApple OSS Distributions 	return kr;
1347*d4514f0bSApple OSS Distributions }
1348*d4514f0bSApple OSS Distributions 
1349*d4514f0bSApple 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)1350*d4514f0bSApple 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)
1351*d4514f0bSApple OSS Distributions {
1352*d4514f0bSApple OSS Distributions 	kern_return_t kr = fn(map, start, size, 0, flags,
1353*d4514f0bSApple OSS Distributions 	    0, KB16, false, VM_PROT_DEFAULT, VM_PROT_DEFAULT, VM_INHERIT_DEFAULT);
1354*d4514f0bSApple OSS Distributions 	deallocate_if_not_fixed_overwrite(kr, map, *start, size, flags);
1355*d4514f0bSApple OSS Distributions 	return kr;
1356*d4514f0bSApple OSS Distributions }
1357*d4514f0bSApple OSS Distributions 
1358*d4514f0bSApple 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)1359*d4514f0bSApple 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)
1360*d4514f0bSApple OSS Distributions {
1361*d4514f0bSApple OSS Distributions 	mach_port_t memobject = make_a_mem_object(TEST_ALLOC_SIZE + 1);
1362*d4514f0bSApple OSS Distributions 	kern_return_t kr = fn(map, start, size, 0, flags,
1363*d4514f0bSApple OSS Distributions 	    memobject, KB16, false, VM_PROT_DEFAULT, VM_PROT_DEFAULT, VM_INHERIT_DEFAULT);
1364*d4514f0bSApple OSS Distributions 	deallocate_if_not_fixed_overwrite(kr, map, *start, size, flags);
1365*d4514f0bSApple OSS Distributions 	mach_memory_entry_port_release(memobject);
1366*d4514f0bSApple OSS Distributions 	return kr;
1367*d4514f0bSApple OSS Distributions }
1368*d4514f0bSApple OSS Distributions 
1369*d4514f0bSApple 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)1370*d4514f0bSApple 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)
1371*d4514f0bSApple OSS Distributions {
1372*d4514f0bSApple OSS Distributions 	mach_port_t memobject = make_a_mem_object(TEST_ALLOC_SIZE + 1);
1373*d4514f0bSApple OSS Distributions 	kern_return_t kr = fn(map, start, size, 0, flags,
1374*d4514f0bSApple OSS Distributions 	    memobject, KB16, true, VM_PROT_DEFAULT, VM_PROT_DEFAULT, VM_INHERIT_DEFAULT);
1375*d4514f0bSApple OSS Distributions 	deallocate_if_not_fixed_overwrite(kr, map, *start, size, flags);
1376*d4514f0bSApple OSS Distributions 	mach_memory_entry_port_release(memobject);
1377*d4514f0bSApple OSS Distributions 	return kr;
1378*d4514f0bSApple OSS Distributions }
1379*d4514f0bSApple OSS Distributions 
1380*d4514f0bSApple 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)1381*d4514f0bSApple 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)
1382*d4514f0bSApple OSS Distributions {
1383*d4514f0bSApple OSS Distributions 	mach_vm_address_t out_addr = 0;
1384*d4514f0bSApple OSS Distributions 	kern_return_t kr = fn(map, &out_addr, KB16, 0, flags,
1385*d4514f0bSApple OSS Distributions 	    0, KB16, copy, cur, max, VM_INHERIT_DEFAULT);
1386*d4514f0bSApple OSS Distributions 	deallocate_if_not_fixed_overwrite(kr, map, out_addr, KB16, flags);
1387*d4514f0bSApple OSS Distributions 	return kr;
1388*d4514f0bSApple OSS Distributions }
1389*d4514f0bSApple OSS Distributions 
1390*d4514f0bSApple 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)1391*d4514f0bSApple OSS Distributions call_map_fn__allocate_fixed__prot_pairs(map_fn_t fn, MAP_T map, vm_prot_t cur, vm_prot_t max)
1392*d4514f0bSApple OSS Distributions {
1393*d4514f0bSApple OSS Distributions 	return help_call_map_fn__allocate__prot_pairs(fn, map, VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE, false, cur, max);
1394*d4514f0bSApple OSS Distributions }
1395*d4514f0bSApple OSS Distributions 
1396*d4514f0bSApple 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)1397*d4514f0bSApple 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)
1398*d4514f0bSApple OSS Distributions {
1399*d4514f0bSApple OSS Distributions 	return help_call_map_fn__allocate__prot_pairs(fn, map, VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE, true, cur, max);
1400*d4514f0bSApple OSS Distributions }
1401*d4514f0bSApple OSS Distributions 
1402*d4514f0bSApple 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)1403*d4514f0bSApple OSS Distributions call_map_fn__allocate_anywhere__prot_pairs(map_fn_t fn, MAP_T map, vm_prot_t cur, vm_prot_t max)
1404*d4514f0bSApple OSS Distributions {
1405*d4514f0bSApple OSS Distributions 	return help_call_map_fn__allocate__prot_pairs(fn, map, VM_FLAGS_ANYWHERE, false, cur, max);
1406*d4514f0bSApple OSS Distributions }
1407*d4514f0bSApple OSS Distributions 
1408*d4514f0bSApple 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)1409*d4514f0bSApple 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)
1410*d4514f0bSApple OSS Distributions {
1411*d4514f0bSApple OSS Distributions 	mach_port_t memobject = make_a_mem_object(TEST_ALLOC_SIZE + 1);
1412*d4514f0bSApple OSS Distributions 	mach_vm_address_t out_addr = 0;
1413*d4514f0bSApple OSS Distributions 	kern_return_t kr = fn(map, &out_addr, KB16, 0, flags,
1414*d4514f0bSApple OSS Distributions 	    memobject, KB16, copy, cur, max, VM_INHERIT_DEFAULT);
1415*d4514f0bSApple OSS Distributions 	deallocate_if_not_fixed_overwrite(kr, map, out_addr, KB16, flags);
1416*d4514f0bSApple OSS Distributions 	mach_memory_entry_port_release(memobject);
1417*d4514f0bSApple OSS Distributions 	return kr;
1418*d4514f0bSApple OSS Distributions }
1419*d4514f0bSApple OSS Distributions 
1420*d4514f0bSApple 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)1421*d4514f0bSApple OSS Distributions call_map_fn__memobject_fixed__prot_pairs(map_fn_t fn, MAP_T map, vm_prot_t cur, vm_prot_t max)
1422*d4514f0bSApple OSS Distributions {
1423*d4514f0bSApple OSS Distributions 	return help_call_map_fn__memobject__prot_pairs(fn, map, VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE, false, cur, max);
1424*d4514f0bSApple OSS Distributions }
1425*d4514f0bSApple OSS Distributions 
1426*d4514f0bSApple 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)1427*d4514f0bSApple 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)
1428*d4514f0bSApple OSS Distributions {
1429*d4514f0bSApple OSS Distributions 	return help_call_map_fn__memobject__prot_pairs(fn, map, VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE, true, cur, max);
1430*d4514f0bSApple OSS Distributions }
1431*d4514f0bSApple OSS Distributions 
1432*d4514f0bSApple 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)1433*d4514f0bSApple OSS Distributions call_map_fn__memobject_anywhere__prot_pairs(map_fn_t fn, MAP_T map, vm_prot_t cur, vm_prot_t max)
1434*d4514f0bSApple OSS Distributions {
1435*d4514f0bSApple OSS Distributions 	return help_call_map_fn__memobject__prot_pairs(fn, map, VM_FLAGS_ANYWHERE, false, cur, max);
1436*d4514f0bSApple OSS Distributions }
1437*d4514f0bSApple OSS Distributions 
1438*d4514f0bSApple OSS Distributions // wrappers
1439*d4514f0bSApple OSS Distributions 
1440*d4514f0bSApple 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)1441*d4514f0bSApple OSS Distributions mach_vm_map_wrapped(vm_map_t target_task,
1442*d4514f0bSApple OSS Distributions     mach_vm_address_t *address,
1443*d4514f0bSApple OSS Distributions     mach_vm_size_t size,
1444*d4514f0bSApple OSS Distributions     mach_vm_offset_t mask,
1445*d4514f0bSApple OSS Distributions     int flags,
1446*d4514f0bSApple OSS Distributions     mem_entry_name_port_t object,
1447*d4514f0bSApple OSS Distributions     memory_object_offset_t offset,
1448*d4514f0bSApple OSS Distributions     boolean_t copy,
1449*d4514f0bSApple OSS Distributions     vm_prot_t cur_protection,
1450*d4514f0bSApple OSS Distributions     vm_prot_t max_protection,
1451*d4514f0bSApple OSS Distributions     vm_inherit_t inheritance)
1452*d4514f0bSApple OSS Distributions {
1453*d4514f0bSApple OSS Distributions 	if (dealloc_would_time_out(*address, size, target_task)) {
1454*d4514f0bSApple OSS Distributions 		return ACCEPTABLE;
1455*d4514f0bSApple OSS Distributions 	}
1456*d4514f0bSApple OSS Distributions 
1457*d4514f0bSApple OSS Distributions 	mach_vm_address_t saved_addr = *address;
1458*d4514f0bSApple OSS Distributions 	kern_return_t kr = mach_vm_map(target_task, address, size, mask, flags, object, offset, copy, cur_protection, max_protection, inheritance);
1459*d4514f0bSApple OSS Distributions 	check_mach_vm_map_outparam_changes(&kr, *address, saved_addr, flags, target_task);
1460*d4514f0bSApple OSS Distributions 	return kr;
1461*d4514f0bSApple OSS Distributions }
1462*d4514f0bSApple OSS Distributions 
1463*d4514f0bSApple OSS Distributions // missing forward declaration
1464*d4514f0bSApple OSS Distributions kern_return_t
1465*d4514f0bSApple OSS Distributions mach_vm_map_external(
1466*d4514f0bSApple OSS Distributions 	vm_map_t                target_map,
1467*d4514f0bSApple OSS Distributions 	mach_vm_offset_t        *address,
1468*d4514f0bSApple OSS Distributions 	mach_vm_size_t          initial_size,
1469*d4514f0bSApple OSS Distributions 	mach_vm_offset_t        mask,
1470*d4514f0bSApple OSS Distributions 	int                     flags,
1471*d4514f0bSApple OSS Distributions 	ipc_port_t              port,
1472*d4514f0bSApple OSS Distributions 	vm_object_offset_t      offset,
1473*d4514f0bSApple OSS Distributions 	boolean_t               copy,
1474*d4514f0bSApple OSS Distributions 	vm_prot_t               cur_protection,
1475*d4514f0bSApple OSS Distributions 	vm_prot_t               max_protection,
1476*d4514f0bSApple OSS Distributions 	vm_inherit_t            inheritance);
1477*d4514f0bSApple 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)1478*d4514f0bSApple OSS Distributions mach_vm_map_external_wrapped(vm_map_t target_task,
1479*d4514f0bSApple OSS Distributions     mach_vm_address_t *address,
1480*d4514f0bSApple OSS Distributions     mach_vm_size_t size,
1481*d4514f0bSApple OSS Distributions     mach_vm_offset_t mask,
1482*d4514f0bSApple OSS Distributions     int flags,
1483*d4514f0bSApple OSS Distributions     mem_entry_name_port_t object,
1484*d4514f0bSApple OSS Distributions     memory_object_offset_t offset,
1485*d4514f0bSApple OSS Distributions     boolean_t copy,
1486*d4514f0bSApple OSS Distributions     vm_prot_t cur_protection,
1487*d4514f0bSApple OSS Distributions     vm_prot_t max_protection,
1488*d4514f0bSApple OSS Distributions     vm_inherit_t inheritance)
1489*d4514f0bSApple OSS Distributions {
1490*d4514f0bSApple OSS Distributions 	if (dealloc_would_time_out(*address, size, target_task)) {
1491*d4514f0bSApple OSS Distributions 		return ACCEPTABLE;
1492*d4514f0bSApple OSS Distributions 	}
1493*d4514f0bSApple OSS Distributions 
1494*d4514f0bSApple OSS Distributions 	mach_vm_address_t saved_addr = *address;
1495*d4514f0bSApple OSS Distributions 	kern_return_t kr = mach_vm_map_external(target_task, address, size, mask, flags, object, offset, copy, cur_protection, max_protection, inheritance);
1496*d4514f0bSApple OSS Distributions 	check_mach_vm_map_outparam_changes(&kr, *address, saved_addr, flags, target_task);
1497*d4514f0bSApple OSS Distributions 	return kr;
1498*d4514f0bSApple OSS Distributions }
1499*d4514f0bSApple OSS Distributions 
1500*d4514f0bSApple 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)1501*d4514f0bSApple OSS Distributions mach_vm_map_kernel_wrapped(vm_map_t target_task,
1502*d4514f0bSApple OSS Distributions     mach_vm_address_t *address,
1503*d4514f0bSApple OSS Distributions     mach_vm_size_t size,
1504*d4514f0bSApple OSS Distributions     mach_vm_offset_t mask,
1505*d4514f0bSApple OSS Distributions     int flags,
1506*d4514f0bSApple OSS Distributions     mem_entry_name_port_t object,
1507*d4514f0bSApple OSS Distributions     memory_object_offset_t offset,
1508*d4514f0bSApple OSS Distributions     boolean_t copy,
1509*d4514f0bSApple OSS Distributions     vm_prot_t cur_protection,
1510*d4514f0bSApple OSS Distributions     vm_prot_t max_protection,
1511*d4514f0bSApple OSS Distributions     vm_inherit_t inheritance)
1512*d4514f0bSApple OSS Distributions {
1513*d4514f0bSApple OSS Distributions 	if (dealloc_would_time_out(*address, size, target_task)) {
1514*d4514f0bSApple OSS Distributions 		return ACCEPTABLE;
1515*d4514f0bSApple OSS Distributions 	}
1516*d4514f0bSApple OSS Distributions 
1517*d4514f0bSApple OSS Distributions 	vm_map_kernel_flags_t vmk_flags = VM_MAP_KERNEL_FLAGS_NONE;
1518*d4514f0bSApple OSS Distributions 
1519*d4514f0bSApple OSS Distributions 	vm_map_kernel_flags_set_vmflags(&vmk_flags, flags);
1520*d4514f0bSApple OSS Distributions 	mach_vm_address_t saved_addr = *address;
1521*d4514f0bSApple 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);
1522*d4514f0bSApple OSS Distributions 	check_mach_vm_map_outparam_changes(&kr, *address, saved_addr, flags, target_task);
1523*d4514f0bSApple OSS Distributions 	return kr;
1524*d4514f0bSApple OSS Distributions }
1525*d4514f0bSApple OSS Distributions 
1526*d4514f0bSApple 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)1527*d4514f0bSApple OSS Distributions check_vm_map_enter_mem_object_control_outparam_changes(kern_return_t * kr, mach_vm_address_t addr,
1528*d4514f0bSApple OSS Distributions     mach_vm_address_t saved_start, int flags, MAP_T map)
1529*d4514f0bSApple OSS Distributions {
1530*d4514f0bSApple OSS Distributions 	if (*kr == KERN_SUCCESS) {
1531*d4514f0bSApple OSS Distributions 		if (is_fixed(flags)) {
1532*d4514f0bSApple OSS Distributions 			if (addr != truncate_vm_map_addr_with_flags(map, saved_start, flags)) {
1533*d4514f0bSApple OSS Distributions 				*kr = OUT_PARAM_BAD;
1534*d4514f0bSApple OSS Distributions 			}
1535*d4514f0bSApple OSS Distributions 		}
1536*d4514f0bSApple OSS Distributions 	} else {
1537*d4514f0bSApple OSS Distributions 		if (saved_start != addr) {
1538*d4514f0bSApple OSS Distributions 			*kr = OUT_PARAM_BAD;
1539*d4514f0bSApple OSS Distributions 		}
1540*d4514f0bSApple OSS Distributions 	}
1541*d4514f0bSApple OSS Distributions }
1542*d4514f0bSApple OSS Distributions 
1543*d4514f0bSApple 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)1544*d4514f0bSApple OSS Distributions vm_map_enter_mem_object_control_wrapped(
1545*d4514f0bSApple OSS Distributions 	vm_map_t                target_map,
1546*d4514f0bSApple OSS Distributions 	mach_vm_address_t      *address,
1547*d4514f0bSApple OSS Distributions 	mach_vm_size_t          size,
1548*d4514f0bSApple OSS Distributions 	vm_map_offset_t         mask,
1549*d4514f0bSApple OSS Distributions 	int                     flags,
1550*d4514f0bSApple OSS Distributions 	mem_entry_name_port_t   object __unused,
1551*d4514f0bSApple OSS Distributions 	memory_object_offset_t  offset,
1552*d4514f0bSApple OSS Distributions 	boolean_t               copy,
1553*d4514f0bSApple OSS Distributions 	vm_prot_t               cur_protection,
1554*d4514f0bSApple OSS Distributions 	vm_prot_t               max_protection,
1555*d4514f0bSApple OSS Distributions 	vm_inherit_t            inheritance)
1556*d4514f0bSApple OSS Distributions {
1557*d4514f0bSApple OSS Distributions 	if (dealloc_would_time_out(*address, size, target_map)) {
1558*d4514f0bSApple OSS Distributions 		return ACCEPTABLE;
1559*d4514f0bSApple OSS Distributions 	}
1560*d4514f0bSApple OSS Distributions 
1561*d4514f0bSApple OSS Distributions 	vm_map_offset_t vmmaddr = (vm_map_offset_t) *address;
1562*d4514f0bSApple OSS Distributions 	vm_map_kernel_flags_t vmk_flags = VM_MAP_KERNEL_FLAGS_NONE;
1563*d4514f0bSApple OSS Distributions 
1564*d4514f0bSApple OSS Distributions 	vm_map_kernel_flags_set_vmflags(&vmk_flags, flags);
1565*d4514f0bSApple OSS Distributions 	struct file_control_return control_info = get_control_from_fd(file_descriptor);
1566*d4514f0bSApple 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);
1567*d4514f0bSApple OSS Distributions 	check_vm_map_enter_mem_object_control_outparam_changes(&kr, vmmaddr, *address, flags, target_map);
1568*d4514f0bSApple OSS Distributions 
1569*d4514f0bSApple OSS Distributions 	*address = vmmaddr;
1570*d4514f0bSApple OSS Distributions 
1571*d4514f0bSApple OSS Distributions 	cleanup_control_related_data(control_info);
1572*d4514f0bSApple OSS Distributions 
1573*d4514f0bSApple OSS Distributions 	return kr;
1574*d4514f0bSApple OSS Distributions }
1575*d4514f0bSApple OSS Distributions 
1576*d4514f0bSApple 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)1577*d4514f0bSApple OSS Distributions vm_map_wrapped(vm_map_t target_task,
1578*d4514f0bSApple OSS Distributions     mach_vm_address_t *address,
1579*d4514f0bSApple OSS Distributions     mach_vm_size_t size,
1580*d4514f0bSApple OSS Distributions     mach_vm_offset_t mask,
1581*d4514f0bSApple OSS Distributions     int flags,
1582*d4514f0bSApple OSS Distributions     mem_entry_name_port_t object,
1583*d4514f0bSApple OSS Distributions     memory_object_offset_t offset,
1584*d4514f0bSApple OSS Distributions     boolean_t copy,
1585*d4514f0bSApple OSS Distributions     vm_prot_t cur_protection,
1586*d4514f0bSApple OSS Distributions     vm_prot_t max_protection,
1587*d4514f0bSApple OSS Distributions     vm_inherit_t inheritance)
1588*d4514f0bSApple OSS Distributions {
1589*d4514f0bSApple OSS Distributions 	if (dealloc_would_time_out(*address, size, target_task)) {
1590*d4514f0bSApple OSS Distributions 		return ACCEPTABLE;
1591*d4514f0bSApple OSS Distributions 	}
1592*d4514f0bSApple OSS Distributions 
1593*d4514f0bSApple OSS Distributions 	vm_address_t addr = (vm_address_t)*address;
1594*d4514f0bSApple OSS Distributions 	kern_return_t kr = vm_map(target_task, &addr, size, mask, flags, object, offset, copy, cur_protection, max_protection, inheritance);
1595*d4514f0bSApple OSS Distributions 	check_mach_vm_map_outparam_changes(&kr, addr, (vm_address_t)*address, flags, target_task);
1596*d4514f0bSApple OSS Distributions 	*address = addr;
1597*d4514f0bSApple OSS Distributions 	return kr;
1598*d4514f0bSApple OSS Distributions }
1599*d4514f0bSApple OSS Distributions 
1600*d4514f0bSApple OSS Distributions kern_return_t
1601*d4514f0bSApple OSS Distributions vm_map_external(
1602*d4514f0bSApple OSS Distributions 	vm_map_t                target_map,
1603*d4514f0bSApple OSS Distributions 	vm_offset_t             *address,
1604*d4514f0bSApple OSS Distributions 	vm_size_t               size,
1605*d4514f0bSApple OSS Distributions 	vm_offset_t             mask,
1606*d4514f0bSApple OSS Distributions 	int                     flags,
1607*d4514f0bSApple OSS Distributions 	ipc_port_t              port,
1608*d4514f0bSApple OSS Distributions 	vm_offset_t             offset,
1609*d4514f0bSApple OSS Distributions 	boolean_t               copy,
1610*d4514f0bSApple OSS Distributions 	vm_prot_t               cur_protection,
1611*d4514f0bSApple OSS Distributions 	vm_prot_t               max_protection,
1612*d4514f0bSApple OSS Distributions 	vm_inherit_t            inheritance);
1613*d4514f0bSApple 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)1614*d4514f0bSApple OSS Distributions vm_map_external_wrapped(vm_map_t target_task,
1615*d4514f0bSApple OSS Distributions     mach_vm_address_t *address,
1616*d4514f0bSApple OSS Distributions     mach_vm_size_t size,
1617*d4514f0bSApple OSS Distributions     mach_vm_offset_t mask,
1618*d4514f0bSApple OSS Distributions     int flags,
1619*d4514f0bSApple OSS Distributions     mem_entry_name_port_t object,
1620*d4514f0bSApple OSS Distributions     memory_object_offset_t offset,
1621*d4514f0bSApple OSS Distributions     boolean_t copy,
1622*d4514f0bSApple OSS Distributions     vm_prot_t cur_protection,
1623*d4514f0bSApple OSS Distributions     vm_prot_t max_protection,
1624*d4514f0bSApple OSS Distributions     vm_inherit_t inheritance)
1625*d4514f0bSApple OSS Distributions {
1626*d4514f0bSApple OSS Distributions 	if (dealloc_would_time_out(*address, size, target_task)) {
1627*d4514f0bSApple OSS Distributions 		return ACCEPTABLE;
1628*d4514f0bSApple OSS Distributions 	}
1629*d4514f0bSApple OSS Distributions 
1630*d4514f0bSApple OSS Distributions 	vm_address_t addr = (vm_address_t)*address;
1631*d4514f0bSApple OSS Distributions 	kern_return_t kr = vm_map_external(target_task, &addr, size, mask, flags, object, offset, copy, cur_protection, max_protection, inheritance);
1632*d4514f0bSApple OSS Distributions 	check_mach_vm_map_outparam_changes(&kr, addr, (vm_address_t)*address, flags, target_task);
1633*d4514f0bSApple OSS Distributions 	*address = addr;
1634*d4514f0bSApple OSS Distributions 	return kr;
1635*d4514f0bSApple OSS Distributions }
1636*d4514f0bSApple OSS Distributions 
1637*d4514f0bSApple OSS Distributions // implementations
1638*d4514f0bSApple OSS Distributions 
1639*d4514f0bSApple OSS Distributions #define IMPL_MAP_FN_START_SIZE(map_fn, instance)                                                \
1640*d4514f0bSApple OSS Distributions     static kern_return_t                                                                        \
1641*d4514f0bSApple OSS Distributions     call_ ## map_fn ## __ ## instance (MAP_T map, mach_vm_address_t start, mach_vm_size_t size) \
1642*d4514f0bSApple OSS Distributions     {                                                                                           \
1643*d4514f0bSApple OSS Distributions 	return call_map_fn__ ## instance(map_fn, map, start, size);                             \
1644*d4514f0bSApple OSS Distributions     }
1645*d4514f0bSApple OSS Distributions 
1646*d4514f0bSApple OSS Distributions #define IMPL_MAP_FN_HINT_SIZE(map_fn, instance)                                                      \
1647*d4514f0bSApple OSS Distributions     static kern_return_t                                                                             \
1648*d4514f0bSApple OSS Distributions     call_ ## map_fn ## __ ## instance (MAP_T map, mach_vm_address_t start_hint, mach_vm_size_t size) \
1649*d4514f0bSApple OSS Distributions     {                                                                                                \
1650*d4514f0bSApple OSS Distributions 	return call_map_fn__ ## instance(map_fn, map, start_hint, size);                             \
1651*d4514f0bSApple OSS Distributions     }
1652*d4514f0bSApple OSS Distributions 
1653*d4514f0bSApple OSS Distributions #define IMPL_MAP_FN_START_SIZE_OFFSET_OBJECT(map_fn, instance)                                                                                                                   \
1654*d4514f0bSApple OSS Distributions     static kern_return_t                                                                                                                                                         \
1655*d4514f0bSApple 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) \
1656*d4514f0bSApple OSS Distributions     {                                                                                                                                                                            \
1657*d4514f0bSApple OSS Distributions 	return call_map_fn__ ## instance ## __start_size_offset_object(map_fn, map, start, size, offset, obj_size);                                                              \
1658*d4514f0bSApple OSS Distributions     }
1659*d4514f0bSApple OSS Distributions 
1660*d4514f0bSApple OSS Distributions #define IMPL_MAP_FN_START_SIZE_INHERIT(map_fn, instance)                                                                          \
1661*d4514f0bSApple OSS Distributions     static kern_return_t                                                                                                          \
1662*d4514f0bSApple OSS Distributions     call_ ## map_fn ## __ ## instance ## __inherit(MAP_T map, mach_vm_address_t start, mach_vm_size_t size, vm_inherit_t inherit) \
1663*d4514f0bSApple OSS Distributions     {                                                                                                                             \
1664*d4514f0bSApple OSS Distributions 	return call_map_fn__ ## instance ## __inherit(map_fn, map, start, size, inherit);                                         \
1665*d4514f0bSApple OSS Distributions     }
1666*d4514f0bSApple OSS Distributions 
1667*d4514f0bSApple OSS Distributions #define IMPL_MAP_FN_START_SIZE_FLAGS(map_fn, instance)                                                                 \
1668*d4514f0bSApple OSS Distributions     static kern_return_t                                                                                               \
1669*d4514f0bSApple OSS Distributions     call_ ## map_fn ## __ ## instance ## __flags(MAP_T map, mach_vm_address_t * start, mach_vm_size_t size, int flags) \
1670*d4514f0bSApple OSS Distributions     {                                                                                                                  \
1671*d4514f0bSApple OSS Distributions 	return call_map_fn__ ## instance ## __flags(map_fn, map, start, size, flags);                                  \
1672*d4514f0bSApple OSS Distributions     }
1673*d4514f0bSApple OSS Distributions 
1674*d4514f0bSApple OSS Distributions #define IMPL_MAP_FN_PROT_PAIRS(map_fn, instance)                                               \
1675*d4514f0bSApple OSS Distributions     static kern_return_t                                                                       \
1676*d4514f0bSApple OSS Distributions     call_ ## map_fn ## __ ## instance ## __prot_pairs(MAP_T map, vm_prot_t cur, vm_prot_t max) \
1677*d4514f0bSApple OSS Distributions     {                                                                                          \
1678*d4514f0bSApple OSS Distributions 	return call_map_fn__ ## instance ## __prot_pairs(map_fn, map, cur, max);               \
1679*d4514f0bSApple OSS Distributions     }
1680*d4514f0bSApple OSS Distributions 
1681*d4514f0bSApple OSS Distributions #define IMPL(map_fn)                                                       \
1682*d4514f0bSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE(map_fn, allocate_fixed)                     \
1683*d4514f0bSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE(map_fn, allocate_fixed_copy)                \
1684*d4514f0bSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE(map_fn, memobject_fixed)                    \
1685*d4514f0bSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE(map_fn, memobject_fixed_copy)               \
1686*d4514f0bSApple OSS Distributions 	IMPL_MAP_FN_HINT_SIZE(map_fn, allocate_anywhere)                   \
1687*d4514f0bSApple OSS Distributions 	IMPL_MAP_FN_HINT_SIZE(map_fn, memobject_anywhere)                  \
1688*d4514f0bSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE_OFFSET_OBJECT(map_fn, memobject_fixed)      \
1689*d4514f0bSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE_OFFSET_OBJECT(map_fn, memobject_fixed_copy) \
1690*d4514f0bSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE_OFFSET_OBJECT(map_fn, memobject_anywhere)   \
1691*d4514f0bSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE_INHERIT(map_fn, allocate_fixed)             \
1692*d4514f0bSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE_INHERIT(map_fn, allocate_fixed_copy)        \
1693*d4514f0bSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE_INHERIT(map_fn, allocate_anywhere)          \
1694*d4514f0bSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE_INHERIT(map_fn, memobject_fixed)            \
1695*d4514f0bSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE_INHERIT(map_fn, memobject_fixed_copy)       \
1696*d4514f0bSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE_INHERIT(map_fn, memobject_anywhere)         \
1697*d4514f0bSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE_FLAGS(map_fn, allocate)                     \
1698*d4514f0bSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE_FLAGS(map_fn, allocate_copy)                \
1699*d4514f0bSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE_FLAGS(map_fn, memobject)                    \
1700*d4514f0bSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE_FLAGS(map_fn, memobject_copy)               \
1701*d4514f0bSApple OSS Distributions 	IMPL_MAP_FN_PROT_PAIRS(map_fn, allocate_fixed)                     \
1702*d4514f0bSApple OSS Distributions 	IMPL_MAP_FN_PROT_PAIRS(map_fn, allocate_fixed_copy)                \
1703*d4514f0bSApple OSS Distributions 	IMPL_MAP_FN_PROT_PAIRS(map_fn, allocate_anywhere)                  \
1704*d4514f0bSApple OSS Distributions 	IMPL_MAP_FN_PROT_PAIRS(map_fn, memobject_fixed)                    \
1705*d4514f0bSApple OSS Distributions 	IMPL_MAP_FN_PROT_PAIRS(map_fn, memobject_fixed_copy)               \
1706*d4514f0bSApple OSS Distributions 	IMPL_MAP_FN_PROT_PAIRS(map_fn, memobject_anywhere)                 \
1707*d4514f0bSApple OSS Distributions 
1708*d4514f0bSApple OSS Distributions IMPL(mach_vm_map_wrapped)
IMPL(mach_vm_map_external_wrapped)1709*d4514f0bSApple OSS Distributions IMPL(mach_vm_map_external_wrapped)
1710*d4514f0bSApple OSS Distributions IMPL(mach_vm_map_kernel_wrapped)
1711*d4514f0bSApple OSS Distributions IMPL(vm_map_wrapped)
1712*d4514f0bSApple OSS Distributions IMPL(vm_map_external_wrapped)
1713*d4514f0bSApple OSS Distributions IMPL(vm_map_enter_mem_object_control_wrapped)
1714*d4514f0bSApple OSS Distributions 
1715*d4514f0bSApple OSS Distributions #undef IMPL
1716*d4514f0bSApple OSS Distributions 
1717*d4514f0bSApple OSS Distributions static int
1718*d4514f0bSApple OSS Distributions vm_parameter_validation_kern_test(int64_t in_value, int64_t *out_value)
1719*d4514f0bSApple OSS Distributions {
1720*d4514f0bSApple OSS Distributions 	// in_value has the userspace address of the fixed-size output buffer and a file descriptor.
1721*d4514f0bSApple OSS Distributions 	// The address is KB16 aligned, so the bottom bits are used for the fd.
1722*d4514f0bSApple OSS Distributions 	// fd bit 15 also indicates if we want to generate golden results.
1723*d4514f0bSApple OSS Distributions 	// in_value is KB16 aligned
1724*d4514f0bSApple OSS Distributions 	uint64_t fd_mask = KB16 - 1;
1725*d4514f0bSApple OSS Distributions 	file_descriptor = (int)(((uint64_t) in_value) & fd_mask);
1726*d4514f0bSApple OSS Distributions 	uint64_t buffer_address = in_value - file_descriptor;
1727*d4514f0bSApple OSS Distributions 	SYSCTL_OUTPUT_BUF = buffer_address;
1728*d4514f0bSApple OSS Distributions 	SYSCTL_OUTPUT_END = SYSCTL_OUTPUT_BUF + SYSCTL_OUTPUT_BUFFER_SIZE;
1729*d4514f0bSApple OSS Distributions 
1730*d4514f0bSApple OSS Distributions 	// check if running to generate golden result list via boot-arg
1731*d4514f0bSApple OSS Distributions 	kernel_generate_golden = (file_descriptor & (KB16 >> 1)) > 0;
1732*d4514f0bSApple OSS Distributions 	if (kernel_generate_golden) {
1733*d4514f0bSApple OSS Distributions 		file_descriptor &= ~(KB16 >> 1);
1734*d4514f0bSApple OSS Distributions 	}
1735*d4514f0bSApple OSS Distributions 
1736*d4514f0bSApple OSS Distributions 	// Test options:
1737*d4514f0bSApple OSS Distributions 	// - avoid panics for untagged wired memory (set to true during some tests)
1738*d4514f0bSApple OSS Distributions 	// - clamp vm addresses before passing to pmap to avoid pmap panics
1739*d4514f0bSApple OSS Distributions 	thread_test_context_t ctx CLEANUP_THREAD_TEST_CONTEXT = {
1740*d4514f0bSApple OSS Distributions 		.test_option_vm_prevent_wire_tag_panic = false,
1741*d4514f0bSApple OSS Distributions 		.test_option_vm_map_clamp_pmap_remove = true,
1742*d4514f0bSApple OSS Distributions 	};
1743*d4514f0bSApple OSS Distributions 	thread_set_test_context(&ctx);
1744*d4514f0bSApple OSS Distributions 
1745*d4514f0bSApple OSS Distributions #if !CONFIG_SPTM && (__ARM_42BIT_PA_SPACE__ || ARM_LARGE_MEMORY)
1746*d4514f0bSApple OSS Distributions 	if (kernel_generate_golden) {
1747*d4514f0bSApple OSS Distributions 		// Some devices skip some trials to avoid timeouts.
1748*d4514f0bSApple OSS Distributions 		// Golden files cannot be generated on these devices.
1749*d4514f0bSApple OSS Distributions 		testprintf("Can't generate golden files on this device "
1750*d4514f0bSApple OSS Distributions 		    "(PPL && (__ARM_42BIT_PA_SPACE__ || ARM_LARGE_MEMORY)). "
1751*d4514f0bSApple OSS Distributions 		    "Try again on a different device.\n");
1752*d4514f0bSApple OSS Distributions 		*out_value = 0;  // failure
1753*d4514f0bSApple OSS Distributions 		goto done;
1754*d4514f0bSApple OSS Distributions 	}
1755*d4514f0bSApple OSS Distributions #else
1756*d4514f0bSApple OSS Distributions #pragma clang diagnostic ignored "-Wunused-label"
1757*d4514f0bSApple OSS Distributions #endif
1758*d4514f0bSApple OSS Distributions 
1759*d4514f0bSApple OSS Distributions 	/*
1760*d4514f0bSApple OSS Distributions 	 * -- memory entry functions --
1761*d4514f0bSApple OSS Distributions 	 * The memory entry test functions use macros to generate each flavor of memory entry function.
1762*d4514f0bSApple OSS Distributions 	 * For more context on why, see the matching comment in vm_parameter_validation.c
1763*d4514f0bSApple OSS Distributions 	 */
1764*d4514f0bSApple OSS Distributions 
1765*d4514f0bSApple OSS Distributions #define RUN_START_SIZE(fn, variant, name) dealloc_results(process_results(test_mach_with_allocated_start_size(call_ ## fn ## __start_size__ ## variant, name " (start/size)")))
1766*d4514f0bSApple OSS Distributions #define RUN_PROT(fn, name) dealloc_results(process_results(test_mach_with_allocated_vm_prot_t(call_ ## fn ## __vm_prot , name " (vm_prot_t)")))
1767*d4514f0bSApple OSS Distributions 
1768*d4514f0bSApple OSS Distributions #define RUN_ALL(fn, name) \
1769*d4514f0bSApple OSS Distributions 	RUN_START_SIZE(fn, copy, #name " (copy)"); \
1770*d4514f0bSApple OSS Distributions 	RUN_START_SIZE(fn, memonly, #name " (memonly)"); \
1771*d4514f0bSApple OSS Distributions 	RUN_START_SIZE(fn, namedcreate, #name " (namedcreate)"); \
1772*d4514f0bSApple OSS Distributions 	RUN_START_SIZE(fn, share, #name " (share)"); \
1773*d4514f0bSApple OSS Distributions 	RUN_START_SIZE(fn, namedreuse, #name " (namedreuse)"); \
1774*d4514f0bSApple OSS Distributions 	RUN_PROT(fn, #name " (vm_prot_t)"); \
1775*d4514f0bSApple OSS Distributions 
1776*d4514f0bSApple OSS Distributions 	RUN_ALL(mach_make_memory_entry_64, mach_make_memory_entry_64);
1777*d4514f0bSApple OSS Distributions 	RUN_ALL(mach_make_memory_entry, mach_make_memory_entry);
1778*d4514f0bSApple OSS Distributions 	RUN_ALL(mach_make_memory_entry_internal_retyped, mach_make_memory_entry_internal);
1779*d4514f0bSApple OSS Distributions #undef RUN_ALL
1780*d4514f0bSApple OSS Distributions #undef RUN_START_SIZE
1781*d4514f0bSApple OSS Distributions #undef RUN_PROT
1782*d4514f0bSApple OSS Distributions 
1783*d4514f0bSApple OSS Distributions #define RUN(fn, name) dealloc_results(process_results(test_mach_with_ledger_tag(fn, name " (ledger tag)")))
1784*d4514f0bSApple OSS Distributions 	RUN(call_mach_memory_entry_ownership__ledger_tag, "mach_memory_entry_ownership");
1785*d4514f0bSApple OSS Distributions #undef RUN
1786*d4514f0bSApple OSS Distributions 
1787*d4514f0bSApple OSS Distributions #define RUN(fn, name) dealloc_results(process_results(test_mach_with_ledger_flag(fn, name " (ledger flag)")))
1788*d4514f0bSApple OSS Distributions 	RUN(call_mach_memory_entry_ownership__ledger_flag, "mach_memory_entry_ownership");
1789*d4514f0bSApple OSS Distributions #undef RUN
1790*d4514f0bSApple OSS Distributions 
1791*d4514f0bSApple OSS Distributions #define RUN(fn, name) dealloc_results(process_results(test_mach_with_allocated_start_size(fn, name " (start/size)")))
1792*d4514f0bSApple OSS Distributions 	RUN(call_mach_memory_entry_map_size__start_size, "mach_memory_entry_map_size");
1793*d4514f0bSApple OSS Distributions #undef RUN
1794*d4514f0bSApple OSS Distributions 
1795*d4514f0bSApple OSS Distributions 	/*
1796*d4514f0bSApple OSS Distributions 	 * -- allocate/deallocate functions --
1797*d4514f0bSApple OSS Distributions 	 */
1798*d4514f0bSApple OSS Distributions 
1799*d4514f0bSApple OSS Distributions #define RUN(fn, name) dealloc_results(process_results(test_mach_allocation_func_with_start_size(fn, name)))
1800*d4514f0bSApple OSS Distributions 	RUN(call_mach_vm_allocate__start_size_fixed, "mach_vm_allocate_external (fixed) (realigned start/size)");
1801*d4514f0bSApple OSS Distributions 	RUN(call_mach_vm_allocate__start_size_anywhere, "mach_vm_allocate_external (anywhere) (hint/size)");
1802*d4514f0bSApple OSS Distributions 	RUN(call_mach_vm_allocate_kernel__start_size_fixed, "mach_vm_allocate (fixed) (realigned start/size)");
1803*d4514f0bSApple OSS Distributions 	RUN(call_mach_vm_allocate_kernel__start_size_anywhere, "mach_vm_allocate (anywhere) (hint/size)");
1804*d4514f0bSApple OSS Distributions #undef RUN
1805*d4514f0bSApple OSS Distributions 
1806*d4514f0bSApple OSS Distributions #define RUN(fn, name) dealloc_results(process_results(test_mach_allocation_func_with_vm_map_kernel_flags_t(fn, name " (vm_map_kernel_flags_t)")))
1807*d4514f0bSApple OSS Distributions 	RUN(call_mach_vm_allocate__flags, "mach_vm_allocate_external");
1808*d4514f0bSApple OSS Distributions 	RUN(call_mach_vm_allocate_kernel__flags, "mach_vm_allocate_kernel");
1809*d4514f0bSApple OSS Distributions #undef RUN
1810*d4514f0bSApple OSS Distributions 
1811*d4514f0bSApple OSS Distributions #define RUN(fn, name) dealloc_results(process_results(test_mach_allocation_func_with_start_size(fn, name)))
1812*d4514f0bSApple OSS Distributions 	RUN(call_vm_allocate__start_size_fixed, "vm_allocate (fixed) (realigned start/size)");
1813*d4514f0bSApple OSS Distributions 	RUN(call_vm_allocate__start_size_anywhere, "vm_allocate (anywhere) (hint/size)");
1814*d4514f0bSApple OSS Distributions #undef RUN
1815*d4514f0bSApple OSS Distributions 
1816*d4514f0bSApple OSS Distributions #define RUN(fn, name) dealloc_results(process_results(test_mach_allocation_func_with_vm_map_kernel_flags_t(fn, name " (vm_map_kernel_flags_t)")))
1817*d4514f0bSApple OSS Distributions 	RUN(call_vm_allocate__flags, "vm_allocate");
1818*d4514f0bSApple OSS Distributions #undef RUN
1819*d4514f0bSApple OSS Distributions 	dealloc_results(process_results(test_deallocator(call_mach_vm_deallocate, "mach_vm_deallocate (start/size)")));
1820*d4514f0bSApple OSS Distributions 	dealloc_results(process_results(test_deallocator(call_vm_deallocate, "vm_deallocate (start/size)")));
1821*d4514f0bSApple OSS Distributions 
1822*d4514f0bSApple OSS Distributions 	/*
1823*d4514f0bSApple OSS Distributions 	 * -- map/remap functions --
1824*d4514f0bSApple OSS Distributions 	 * These functions rely heavily on macros.
1825*d4514f0bSApple OSS Distributions 	 * For more context on why, see the matching comment in vm_parameter_validation.c
1826*d4514f0bSApple OSS Distributions 	 */
1827*d4514f0bSApple OSS Distributions 
1828*d4514f0bSApple OSS Distributions 	// map tests
1829*d4514f0bSApple OSS Distributions 
1830*d4514f0bSApple OSS Distributions #define RUN_START_SIZE(fn, name) dealloc_results(process_results(test_mach_with_allocated_start_size(fn, name " (realigned start/size)")))
1831*d4514f0bSApple OSS Distributions #define RUN_HINT_SIZE(fn, name) dealloc_results(process_results(test_mach_with_allocated_start_size(fn, name " (hint/size)")))
1832*d4514f0bSApple OSS Distributions #define RUN_PROT_PAIR(fn, name) dealloc_results(process_results(test_mach_vm_prot_pair(fn, name " (vm_prot_t pair)")))
1833*d4514f0bSApple OSS Distributions #define RUN_INHERIT(fn, name) dealloc_results(process_results(test_mach_with_allocated_vm_inherit_t(fn, name " (vm_inherit_t)")))
1834*d4514f0bSApple OSS Distributions #define RUN_FLAGS(fn, name) dealloc_results(process_results(test_mach_allocation_func_with_vm_map_kernel_flags_t(fn, name " (vm_map_kernel_flags_t)")))
1835*d4514f0bSApple OSS Distributions #define RUN_SSOO(fn, name) dealloc_results(process_results(test_mach_with_allocated_start_size_offset_object(fn, name " (start/size/offset/object)")))
1836*d4514f0bSApple OSS Distributions 
1837*d4514f0bSApple OSS Distributions #define RUN_ALL(fn, name)     \
1838*d4514f0bSApple OSS Distributions 	RUN_START_SIZE(call_ ## fn ## __allocate_fixed, #name " (allocate fixed overwrite)");   \
1839*d4514f0bSApple OSS Distributions 	RUN_START_SIZE(call_ ## fn ## __allocate_fixed_copy, #name " (allocate fixed overwrite copy)");  \
1840*d4514f0bSApple OSS Distributions 	RUN_START_SIZE(call_ ## fn ## __memobject_fixed, #name " (memobject fixed overwrite)");  \
1841*d4514f0bSApple OSS Distributions 	RUN_START_SIZE(call_ ## fn ## __memobject_fixed_copy, #name " (memobject fixed overwrite copy)"); \
1842*d4514f0bSApple OSS Distributions 	RUN_HINT_SIZE(call_ ## fn ## __allocate_anywhere, #name " (allocate anywhere)");  \
1843*d4514f0bSApple OSS Distributions 	RUN_HINT_SIZE(call_ ## fn ## __memobject_anywhere, #name " (memobject anywhere)");  \
1844*d4514f0bSApple OSS Distributions 	RUN_PROT_PAIR(call_ ## fn ## __allocate_fixed__prot_pairs, #name " (allocate fixed overwrite)");  \
1845*d4514f0bSApple OSS Distributions 	RUN_PROT_PAIR(call_ ## fn ## __allocate_fixed_copy__prot_pairs, #name " (allocate fixed overwrite copy)");  \
1846*d4514f0bSApple OSS Distributions 	RUN_PROT_PAIR(call_ ## fn ## __allocate_anywhere__prot_pairs, #name " (allocate anywhere)");  \
1847*d4514f0bSApple OSS Distributions 	RUN_PROT_PAIR(call_ ## fn ## __memobject_fixed__prot_pairs, #name " (memobject fixed overwrite)");  \
1848*d4514f0bSApple OSS Distributions 	RUN_PROT_PAIR(call_ ## fn ## __memobject_fixed_copy__prot_pairs, #name " (memobject fixed overwrite copy)");  \
1849*d4514f0bSApple OSS Distributions 	RUN_PROT_PAIR(call_ ## fn ## __memobject_anywhere__prot_pairs, #name " (memobject anywhere)");  \
1850*d4514f0bSApple OSS Distributions 	RUN_INHERIT(call_ ## fn ## __allocate_fixed__inherit, #name " (allocate fixed overwrite)");  \
1851*d4514f0bSApple OSS Distributions 	RUN_INHERIT(call_ ## fn ## __allocate_fixed_copy__inherit, #name " (allocate fixed overwrite copy)");  \
1852*d4514f0bSApple OSS Distributions 	RUN_INHERIT(call_ ## fn ## __allocate_anywhere__inherit, #name " (allocate anywhere)");  \
1853*d4514f0bSApple OSS Distributions 	RUN_INHERIT(call_ ## fn ## __memobject_fixed__inherit, #name " (memobject fixed overwrite)");  \
1854*d4514f0bSApple OSS Distributions 	RUN_INHERIT(call_ ## fn ## __memobject_fixed_copy__inherit, #name " (memobject fixed overwrite copy)");  \
1855*d4514f0bSApple OSS Distributions 	RUN_INHERIT(call_ ## fn ## __memobject_anywhere__inherit, #name " (memobject anywhere)");  \
1856*d4514f0bSApple OSS Distributions 	RUN_FLAGS(call_ ## fn ## __allocate__flags, #name " (allocate)");  \
1857*d4514f0bSApple OSS Distributions 	RUN_FLAGS(call_ ## fn ## __allocate_copy__flags, #name " (allocate copy)");  \
1858*d4514f0bSApple OSS Distributions 	RUN_FLAGS(call_ ## fn ## __memobject__flags, #name " (memobject)");  \
1859*d4514f0bSApple OSS Distributions 	RUN_FLAGS(call_ ## fn ## __memobject_copy__flags, #name " (memobject copy)");  \
1860*d4514f0bSApple OSS Distributions 	RUN_SSOO(call_ ## fn ## __memobject_fixed__start_size_offset_object, #name " (memobject fixed overwrite)");  \
1861*d4514f0bSApple OSS Distributions 	RUN_SSOO(call_ ## fn ## __memobject_fixed_copy__start_size_offset_object, #name " (memobject fixed overwrite copy)");  \
1862*d4514f0bSApple OSS Distributions 	RUN_SSOO(call_ ## fn ## __memobject_anywhere__start_size_offset_object, #name " (memobject anywhere)");  \
1863*d4514f0bSApple OSS Distributions 
1864*d4514f0bSApple OSS Distributions 	RUN_ALL(mach_vm_map_wrapped, mach_vm_map);
1865*d4514f0bSApple OSS Distributions 	RUN_ALL(mach_vm_map_external_wrapped, mach_vm_map_external);
1866*d4514f0bSApple OSS Distributions 	RUN_ALL(mach_vm_map_kernel_wrapped, mach_vm_map_kernel);
1867*d4514f0bSApple OSS Distributions 	RUN_ALL(vm_map_wrapped, vm_map);
1868*d4514f0bSApple OSS Distributions 	RUN_ALL(vm_map_external_wrapped, vm_map_external);
1869*d4514f0bSApple OSS Distributions 
1870*d4514f0bSApple OSS Distributions #define RUN_SSO(fn, name) dealloc_results(process_results(test_mach_with_allocated_start_size_offset(fn, name " (start/size/offset)")))
1871*d4514f0bSApple OSS Distributions 
1872*d4514f0bSApple OSS Distributions #define RUN_ALL_CTL(fn, name)     \
1873*d4514f0bSApple OSS Distributions 	RUN_START_SIZE(call_ ## fn ## __allocate_fixed, #name " (allocate fixed overwrite)");   \
1874*d4514f0bSApple OSS Distributions 	RUN_START_SIZE(call_ ## fn ## __allocate_fixed_copy, #name " (allocate fixed overwrite copy)");  \
1875*d4514f0bSApple OSS Distributions 	RUN_START_SIZE(call_ ## fn ## __memobject_fixed, #name " (memobject fixed overwrite)");  \
1876*d4514f0bSApple OSS Distributions 	RUN_START_SIZE(call_ ## fn ## __memobject_fixed_copy, #name " (memobject fixed overwrite copy)"); \
1877*d4514f0bSApple OSS Distributions 	RUN_HINT_SIZE(call_ ## fn ## __allocate_anywhere, #name " (allocate anywhere)");  \
1878*d4514f0bSApple OSS Distributions 	RUN_HINT_SIZE(call_ ## fn ## __memobject_anywhere, #name " (memobject anywhere)");  \
1879*d4514f0bSApple OSS Distributions 	RUN_PROT_PAIR(call_ ## fn ## __allocate_fixed__prot_pairs, #name " (allocate fixed overwrite)");  \
1880*d4514f0bSApple OSS Distributions 	RUN_PROT_PAIR(call_ ## fn ## __allocate_fixed_copy__prot_pairs, #name " (allocate fixed overwrite copy)");  \
1881*d4514f0bSApple OSS Distributions 	RUN_PROT_PAIR(call_ ## fn ## __allocate_anywhere__prot_pairs, #name " (allocate anywhere)");  \
1882*d4514f0bSApple OSS Distributions 	RUN_PROT_PAIR(call_ ## fn ## __memobject_fixed__prot_pairs, #name " (memobject fixed overwrite)");  \
1883*d4514f0bSApple OSS Distributions 	RUN_PROT_PAIR(call_ ## fn ## __memobject_fixed_copy__prot_pairs, #name " (memobject fixed overwrite copy)");  \
1884*d4514f0bSApple OSS Distributions 	RUN_PROT_PAIR(call_ ## fn ## __memobject_anywhere__prot_pairs, #name " (memobject anywhere)");  \
1885*d4514f0bSApple OSS Distributions 	RUN_INHERIT(call_ ## fn ## __allocate_fixed__inherit, #name " (allocate fixed overwrite)");  \
1886*d4514f0bSApple OSS Distributions 	RUN_INHERIT(call_ ## fn ## __allocate_fixed_copy__inherit, #name " (allocate fixed overwrite copy)");  \
1887*d4514f0bSApple OSS Distributions 	RUN_INHERIT(call_ ## fn ## __allocate_anywhere__inherit, #name " (allocate anywhere)");  \
1888*d4514f0bSApple OSS Distributions 	RUN_INHERIT(call_ ## fn ## __memobject_fixed__inherit, #name " (memobject fixed overwrite)");  \
1889*d4514f0bSApple OSS Distributions 	RUN_INHERIT(call_ ## fn ## __memobject_fixed_copy__inherit, #name " (memobject fixed overwrite copy)");  \
1890*d4514f0bSApple OSS Distributions 	RUN_INHERIT(call_ ## fn ## __memobject_anywhere__inherit, #name " (memobject anywhere)");  \
1891*d4514f0bSApple OSS Distributions 	RUN_FLAGS(call_ ## fn ## __allocate__flags, #name " (allocate)");  \
1892*d4514f0bSApple OSS Distributions 	RUN_FLAGS(call_ ## fn ## __allocate_copy__flags, #name " (allocate copy)");  \
1893*d4514f0bSApple OSS Distributions 	RUN_FLAGS(call_ ## fn ## __memobject__flags, #name " (memobject)");  \
1894*d4514f0bSApple OSS Distributions 	RUN_FLAGS(call_ ## fn ## __memobject_copy__flags, #name " (memobject copy)");  \
1895*d4514f0bSApple OSS Distributions 	RUN_SSO(call_ ## fn ## __memobject_fixed__start_size_offset_object, #name " (memobject fixed overwrite)");  \
1896*d4514f0bSApple OSS Distributions 	RUN_SSO(call_ ## fn ## __memobject_fixed_copy__start_size_offset_object, #name " (memobject fixed overwrite copy)");  \
1897*d4514f0bSApple OSS Distributions 	RUN_SSO(call_ ## fn ## __memobject_anywhere__start_size_offset_object, #name " (memobject anywhere)");  \
1898*d4514f0bSApple OSS Distributions 
1899*d4514f0bSApple OSS Distributions 	RUN_ALL_CTL(vm_map_enter_mem_object_control_wrapped, vm_map_enter_mem_object_control);
1900*d4514f0bSApple OSS Distributions 
1901*d4514f0bSApple OSS Distributions #undef RUN_ALL
1902*d4514f0bSApple OSS Distributions #undef RUN_START_SIZE
1903*d4514f0bSApple OSS Distributions #undef RUN_HINT_SIZE
1904*d4514f0bSApple OSS Distributions #undef RUN_PROT_PAIR
1905*d4514f0bSApple OSS Distributions #undef RUN_INHERIT
1906*d4514f0bSApple OSS Distributions #undef RUN_FLAGS
1907*d4514f0bSApple OSS Distributions #undef RUN_SSOO
1908*d4514f0bSApple OSS Distributions #undef RUN_ALL_CTL
1909*d4514f0bSApple OSS Distributions #undef RUN_SSO
1910*d4514f0bSApple OSS Distributions 
1911*d4514f0bSApple OSS Distributions 	// remap tests
1912*d4514f0bSApple OSS Distributions 
1913*d4514f0bSApple OSS Distributions #define FN_NAME(fn, variant, type) call_ ## fn ## __  ## variant ## __ ## type
1914*d4514f0bSApple OSS Distributions #define RUN_HELPER(harness, fn, variant, type, type_name, name) dealloc_results(process_results(harness(FN_NAME(fn, variant, type), #name " (" #variant ") (" type_name ")")))
1915*d4514f0bSApple 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)
1916*d4514f0bSApple 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)
1917*d4514f0bSApple 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)
1918*d4514f0bSApple OSS Distributions #define RUN_INHERIT(fn, variant, name) RUN_HELPER(test_mach_with_allocated_vm_inherit_t, fn, variant, inherit, "inherit", name)
1919*d4514f0bSApple OSS Distributions #define RUN_FLAGS(fn, variant, name) RUN_HELPER(test_mach_with_allocated_vm_map_kernel_flags_t, fn, variant, flags, "flags", name)
1920*d4514f0bSApple 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)
1921*d4514f0bSApple OSS Distributions 
1922*d4514f0bSApple OSS Distributions #define RUN_ALL(fn, realigned, name)                                    \
1923*d4514f0bSApple OSS Distributions 	RUN_SRC_SIZE(fn, copy, realigned "src/size", name);             \
1924*d4514f0bSApple OSS Distributions 	RUN_SRC_SIZE(fn, nocopy, realigned "src/size", name);           \
1925*d4514f0bSApple OSS Distributions 	RUN_DST_SIZE(fn, fixed, "realigned dst/size", name);            \
1926*d4514f0bSApple OSS Distributions 	RUN_DST_SIZE(fn, fixed_copy, "realigned dst/size", name);       \
1927*d4514f0bSApple OSS Distributions 	RUN_DST_SIZE(fn, anywhere, "hint/size", name);                  \
1928*d4514f0bSApple OSS Distributions 	RUN_INHERIT(fn, fixed, name);                                   \
1929*d4514f0bSApple OSS Distributions 	RUN_INHERIT(fn, fixed_copy, name);                              \
1930*d4514f0bSApple OSS Distributions 	RUN_INHERIT(fn, anywhere, name);                                \
1931*d4514f0bSApple OSS Distributions 	RUN_FLAGS(fn, nocopy, name);                                    \
1932*d4514f0bSApple OSS Distributions 	RUN_FLAGS(fn, copy, name);                                      \
1933*d4514f0bSApple OSS Distributions 	RUN_PROT_PAIRS(fn, fixed, name);                                \
1934*d4514f0bSApple OSS Distributions 	RUN_PROT_PAIRS(fn, fixed_copy, name);                           \
1935*d4514f0bSApple OSS Distributions 	RUN_PROT_PAIRS(fn, anywhere, name);                             \
1936*d4514f0bSApple OSS Distributions 	RUN_SRC_DST_SIZE(fn, fixed, "src/dst/size", name);              \
1937*d4514f0bSApple OSS Distributions 	RUN_SRC_DST_SIZE(fn, fixed_copy, "src/dst/size", name);         \
1938*d4514f0bSApple OSS Distributions 	RUN_SRC_DST_SIZE(fn, anywhere, "src/dst/size", name);           \
1939*d4514f0bSApple OSS Distributions 
1940*d4514f0bSApple OSS Distributions 	RUN_ALL(mach_vm_remap_wrapped_kern, "realigned ", mach_vm_remap);
1941*d4514f0bSApple OSS Distributions 	RUN_ALL(mach_vm_remap_new_kernel_wrapped, , mach_vm_remap_new_kernel);
1942*d4514f0bSApple OSS Distributions 
1943*d4514f0bSApple OSS Distributions #undef RUN_ALL
1944*d4514f0bSApple OSS Distributions #undef RUN_HELPER
1945*d4514f0bSApple OSS Distributions #undef RUN_SRC_SIZE
1946*d4514f0bSApple OSS Distributions #undef RUN_DST_SIZE
1947*d4514f0bSApple OSS Distributions #undef RUN_PROT_PAIRS
1948*d4514f0bSApple OSS Distributions #undef RUN_INHERIT
1949*d4514f0bSApple OSS Distributions #undef RUN_FLAGS
1950*d4514f0bSApple OSS Distributions #undef RUN_SRC_DST_SIZE
1951*d4514f0bSApple OSS Distributions 
1952*d4514f0bSApple OSS Distributions 	/*
1953*d4514f0bSApple OSS Distributions 	 * -- wire/unwire functions --
1954*d4514f0bSApple OSS Distributions 	 * Some wire functions (vm_map_wire_and_extract, vm_map_wire_external, vm_map_wire_kernel)
1955*d4514f0bSApple OSS Distributions 	 * are implemented with macros to avoid code duplication that would happen otherwise from the multiple
1956*d4514f0bSApple OSS Distributions 	 * entrypoints, multiple params under test, and user/non user wired paths
1957*d4514f0bSApple OSS Distributions 	 */
1958*d4514f0bSApple OSS Distributions 
1959*d4514f0bSApple OSS Distributions #define RUN(fn, name) dealloc_results(process_results(test_kext_unix_with_allocated_start_size(fn, name " (start/size)")))
1960*d4514f0bSApple OSS Distributions 	RUN(call_vslock, "vslock");
1961*d4514f0bSApple OSS Distributions 	RUN(call_vsunlock_undirtied, "vsunlock (undirtied)");
1962*d4514f0bSApple OSS Distributions 	RUN(call_vsunlock_dirtied, "vsunlock (dirtied)");
1963*d4514f0bSApple OSS Distributions #undef RUN
1964*d4514f0bSApple OSS Distributions 
1965*d4514f0bSApple OSS Distributions #define RUN_PROT(fn, wired, name) dealloc_results(process_results(test_mach_with_allocated_vm_prot_t(call_ ## fn ## __prot__user_wired_ ## wired ## _, name " (vm_prot_t)")))
1966*d4514f0bSApple OSS Distributions #define RUN_START(fn, wired, name) dealloc_results(process_results(test_kext_tagged_with_allocated_addr(call_ ## fn ## __start__user_wired_ ## wired ## _, name " (addr)")))
1967*d4514f0bSApple OSS Distributions #define RUN_START_END(fn, wired, name) dealloc_results(process_results(test_mach_with_allocated_start_end(call_ ## fn ## __start_end__user_wired_ ## wired ## _, name " (start/end)")))
1968*d4514f0bSApple OSS Distributions #define RUN_TAG(fn, wired, name) dealloc_results(process_results(test_mach_with_allocated_tag(call_ ## fn ## __tag__user_wired_ ## wired ## _, name " (tag)")))
1969*d4514f0bSApple OSS Distributions 
1970*d4514f0bSApple OSS Distributions #if XNU_PLATFORM_MacOSX
1971*d4514f0bSApple OSS Distributions // vm_map_wire_and_extract is implemented on macOS only
1972*d4514f0bSApple OSS Distributions 
1973*d4514f0bSApple OSS Distributions #define RUN_ALL_WIRE_AND_EXTRACT(fn, name) \
1974*d4514f0bSApple OSS Distributions 	RUN_PROT(fn, true, #name " (user wired)"); \
1975*d4514f0bSApple OSS Distributions 	RUN_PROT(fn, false, #name " (non user wired)"); \
1976*d4514f0bSApple OSS Distributions 	RUN_START(fn, true, #name " (user wired)"); \
1977*d4514f0bSApple OSS Distributions 	RUN_START(fn, false, #name " (non user wired)");
1978*d4514f0bSApple OSS Distributions 
1979*d4514f0bSApple OSS Distributions 	RUN_ALL_WIRE_AND_EXTRACT(vm_map_wire_and_extract_retyped, vm_map_wire_and_extract);
1980*d4514f0bSApple OSS Distributions #undef RUN_ALL_WIRE_AND_EXTRACT
1981*d4514f0bSApple OSS Distributions #endif // XNU_PLATFORM_MacOSX
1982*d4514f0bSApple OSS Distributions 
1983*d4514f0bSApple OSS Distributions #define RUN_ALL_WIRE_EXTERNAL(fn, name) \
1984*d4514f0bSApple OSS Distributions 	RUN_PROT(fn, true, #name " (user wired)"); \
1985*d4514f0bSApple OSS Distributions 	RUN_PROT(fn, false, #name " (non user wired))"); \
1986*d4514f0bSApple OSS Distributions 	RUN_START_END(fn, true, #name " (user wired)"); \
1987*d4514f0bSApple OSS Distributions 	RUN_START_END(fn, false, #name " (non user wired)");
1988*d4514f0bSApple OSS Distributions 
1989*d4514f0bSApple OSS Distributions 	RUN_ALL_WIRE_EXTERNAL(vm_map_wire_external_retyped, vm_map_wire_external);
1990*d4514f0bSApple OSS Distributions #undef RUN_ALL_WIRE_EXTERNAL
1991*d4514f0bSApple OSS Distributions 
1992*d4514f0bSApple OSS Distributions #define RUN_ALL_WIRE_KERNEL(fn, name) \
1993*d4514f0bSApple OSS Distributions 	RUN_PROT(fn, false, #name " (non user wired))"); \
1994*d4514f0bSApple OSS Distributions 	RUN_PROT(fn, true, #name " (user wired)"); \
1995*d4514f0bSApple OSS Distributions 	RUN_START_END(fn, true, #name " (user wired)"); \
1996*d4514f0bSApple OSS Distributions 	RUN_START_END(fn, false, #name " (non user wired)"); \
1997*d4514f0bSApple OSS Distributions 	RUN_TAG(fn, true, #name " (user wired)"); \
1998*d4514f0bSApple OSS Distributions 	RUN_TAG(fn, false, #name " (non user wired)");
1999*d4514f0bSApple OSS Distributions 
2000*d4514f0bSApple OSS Distributions 	RUN_ALL_WIRE_KERNEL(vm_map_wire_kernel, vm_map_wire_kernel);
2001*d4514f0bSApple OSS Distributions #undef RUN_ALL_WIRE_KERNEL
2002*d4514f0bSApple OSS Distributions 
2003*d4514f0bSApple OSS Distributions #undef RUN_PROT
2004*d4514f0bSApple OSS Distributions #undef RUN_START
2005*d4514f0bSApple OSS Distributions #undef RUN_START_END
2006*d4514f0bSApple OSS Distributions #undef RUN_TAG
2007*d4514f0bSApple OSS Distributions 
2008*d4514f0bSApple OSS Distributions #define RUN(fn, name) dealloc_results(process_results(test_mach_with_allocated_start_end(fn, name " (start/end)")))
2009*d4514f0bSApple OSS Distributions 	RUN(call_vm_map_unwire_user_wired, "vm_map_unwire (user_wired)");
2010*d4514f0bSApple OSS Distributions 	RUN(call_vm_map_unwire_non_user_wired, "vm_map_unwire (non user_wired)");
2011*d4514f0bSApple OSS Distributions #undef RUN
2012*d4514f0bSApple OSS Distributions 
2013*d4514f0bSApple OSS Distributions #define RUN(fn, name) dealloc_results(process_results(test_with_int64(fn, name " (int64)")))
2014*d4514f0bSApple OSS Distributions 	RUN(call_mach_vm_wire_level_monitor, "mach_vm_wire_level_monitor");
2015*d4514f0bSApple OSS Distributions #undef RUN
2016*d4514f0bSApple OSS Distributions 
2017*d4514f0bSApple OSS Distributions 	/*
2018*d4514f0bSApple OSS Distributions 	 * -- copyin/copyout functions --
2019*d4514f0bSApple OSS Distributions 	 */
2020*d4514f0bSApple OSS Distributions 
2021*d4514f0bSApple OSS Distributions #define RUN(fn, name) dealloc_results(process_results(test_mach_with_allocated_start_size(fn, name " (start/size)")))
2022*d4514f0bSApple OSS Distributions 	RUN(call_vm_map_copyin, "vm_map_copyin");
2023*d4514f0bSApple OSS Distributions 	RUN(call_mach_vm_read, "mach_vm_read");
2024*d4514f0bSApple OSS Distributions 	// vm_map_copyin_common is covered well by the vm_map_copyin test
2025*d4514f0bSApple OSS Distributions 	// RUN(call_vm_map_copyin_common, "vm_map_copyin_common");
2026*d4514f0bSApple OSS Distributions #undef RUN
2027*d4514f0bSApple OSS Distributions 
2028*d4514f0bSApple OSS Distributions #define RUN(fn, name) dealloc_results(process_results(test_mach_with_allocated_addr_of_size_n(fn, sizeof(uint32_t), name " (start)")))
2029*d4514f0bSApple OSS Distributions 	RUN(call_copyoutmap_atomic32, "copyoutmap_atomic32");
2030*d4514f0bSApple OSS Distributions #undef RUN
2031*d4514f0bSApple OSS Distributions 
2032*d4514f0bSApple OSS Distributions #define RUN(fn, name) dealloc_results(process_results(test_src_kerneldst_size(fn, name " (src/dst/size)")))
2033*d4514f0bSApple OSS Distributions 	RUN(call_copyinmap, "copyinmap");
2034*d4514f0bSApple OSS Distributions 	RUN(call_vm_map_read_user, "vm_map_read_user");
2035*d4514f0bSApple OSS Distributions #undef RUN
2036*d4514f0bSApple OSS Distributions 
2037*d4514f0bSApple OSS Distributions #define RUN(fn, name) dealloc_results(process_results(test_kernelsrc_dst_size(fn, name " (src/dst/size)")))
2038*d4514f0bSApple OSS Distributions 	RUN(call_vm_map_write_user, "vm_map_write_user");
2039*d4514f0bSApple OSS Distributions 	RUN(call_copyoutmap, "copyoutmap");
2040*d4514f0bSApple OSS Distributions #undef RUN
2041*d4514f0bSApple OSS Distributions 
2042*d4514f0bSApple OSS Distributions 	dealloc_results(process_results(test_vm_map_copy_overwrite(call_vm_map_copy_overwrite_interruptible, "vm_map_copy_overwrite (start/size)")));
2043*d4514f0bSApple OSS Distributions 
2044*d4514f0bSApple OSS Distributions 	/*
2045*d4514f0bSApple OSS Distributions 	 * -- protection functions --
2046*d4514f0bSApple OSS Distributions 	 */
2047*d4514f0bSApple OSS Distributions 
2048*d4514f0bSApple OSS Distributions #define RUN(fn, name) dealloc_results(process_results(test_mach_with_allocated_start_size(fn, name " (start/size)")))
2049*d4514f0bSApple OSS Distributions 	RUN(call_mach_vm_protect__start_size, "mach_vm_protect");
2050*d4514f0bSApple OSS Distributions 	RUN(call_vm_protect__start_size, "vm_protect");
2051*d4514f0bSApple OSS Distributions 	RUN(call_vm_map_protect__start_size__no_max, "vm_map_protect (no max)");
2052*d4514f0bSApple OSS Distributions 	RUN(call_vm_map_protect__start_size__set_max, "vm_map_protect (set max)");
2053*d4514f0bSApple OSS Distributions #undef RUN
2054*d4514f0bSApple OSS Distributions 
2055*d4514f0bSApple OSS Distributions #define RUN(fn, name) dealloc_results(process_results(test_mach_with_allocated_vm_prot_t(fn, name " (vm_prot_t)")))
2056*d4514f0bSApple OSS Distributions 	RUN(call_mach_vm_protect__vm_prot, "mach_vm_protect");
2057*d4514f0bSApple OSS Distributions 	RUN(call_vm_protect__vm_prot, "vm_protect");
2058*d4514f0bSApple OSS Distributions 	RUN(call_vm_map_protect__vm_prot__no_max, "vm_map_protect (no max)");
2059*d4514f0bSApple OSS Distributions 	RUN(call_vm_map_protect__vm_prot__set_max, "vm_map_protect (set max)");
2060*d4514f0bSApple OSS Distributions #undef RUN
2061*d4514f0bSApple OSS Distributions 
2062*d4514f0bSApple OSS Distributions #define RUN(fn, name) dealloc_results(process_results(test_unix_with_allocated_start_size(fn, name " (start/size)")))
2063*d4514f0bSApple OSS Distributions 	RUN(call_useracc__start_size, "useracc");
2064*d4514f0bSApple OSS Distributions #undef RUN
2065*d4514f0bSApple OSS Distributions #define RUN(fn, name) dealloc_results(process_results(test_unix_with_allocated_vm_prot_t(fn, name " (vm_prot_t)")))
2066*d4514f0bSApple OSS Distributions 	RUN(call_useracc__vm_prot, "useracc");
2067*d4514f0bSApple OSS Distributions #undef RUN
2068*d4514f0bSApple OSS Distributions 
2069*d4514f0bSApple OSS Distributions 	/*
2070*d4514f0bSApple OSS Distributions 	 * -- madvise/behavior functions --
2071*d4514f0bSApple OSS Distributions 	 */
2072*d4514f0bSApple OSS Distributions 
2073*d4514f0bSApple OSS Distributions #define RUN(fn, name) dealloc_results(process_results(test_mach_with_allocated_start_size(fn, name " (start/size)")))
2074*d4514f0bSApple OSS Distributions 	RUN(call_mach_vm_behavior_set__start_size__default, "mach_vm_behavior_set (VM_BEHAVIOR_DEFAULT)");
2075*d4514f0bSApple OSS Distributions 	RUN(call_mach_vm_behavior_set__start_size__can_reuse, "mach_vm_behavior_set (VM_BEHAVIOR_CAN_REUSE)");
2076*d4514f0bSApple OSS Distributions #undef RUN
2077*d4514f0bSApple OSS Distributions #define RUN(fn, name) dealloc_results(process_results(test_mach_with_allocated_vm_behavior_t(fn, name " (vm_behavior_t)")))
2078*d4514f0bSApple OSS Distributions 	RUN(call_mach_vm_behavior_set__vm_behavior, "mach_vm_behavior_set");
2079*d4514f0bSApple OSS Distributions #undef RUN
2080*d4514f0bSApple OSS Distributions 
2081*d4514f0bSApple OSS Distributions 	/*
2082*d4514f0bSApple OSS Distributions 	 * -- purgability/purgeability functions --
2083*d4514f0bSApple OSS Distributions 	 */
2084*d4514f0bSApple OSS Distributions 
2085*d4514f0bSApple OSS Distributions #define RUN(fn, name) dealloc_results(process_results(test_mach_with_allocated_purgeable_addr(fn, name " (addr)")))
2086*d4514f0bSApple OSS Distributions 	RUN(call_vm_map_purgable_control__address__get, "vm_map_purgable_control (get)");
2087*d4514f0bSApple OSS Distributions 	RUN(call_vm_map_purgable_control__address__purge_all, "vm_map_purgable_control (purge all)");
2088*d4514f0bSApple OSS Distributions #undef RUN
2089*d4514f0bSApple OSS Distributions 
2090*d4514f0bSApple OSS Distributions #define RUN(fn, name) dealloc_results(process_results(test_mach_with_allocated_purgeable_and_state(fn, name " (purgeable and state)")))
2091*d4514f0bSApple OSS Distributions 	RUN(call_vm_map_purgable_control__purgeable_state, "vm_map_purgable_control");
2092*d4514f0bSApple OSS Distributions #undef RUN
2093*d4514f0bSApple OSS Distributions 
2094*d4514f0bSApple OSS Distributions 	/*
2095*d4514f0bSApple OSS Distributions 	 * -- region info functions --
2096*d4514f0bSApple OSS Distributions 	 */
2097*d4514f0bSApple OSS Distributions 
2098*d4514f0bSApple OSS Distributions #define RUN(fn, name) dealloc_results(process_results(test_mach_with_allocated_addr(fn, name " (addr)")))
2099*d4514f0bSApple OSS Distributions 	RUN(call_mach_vm_region, "mach_vm_region");
2100*d4514f0bSApple OSS Distributions 	RUN(call_vm_region, "vm_region");
2101*d4514f0bSApple OSS Distributions #undef RUN
2102*d4514f0bSApple OSS Distributions #if XNU_PLATFORM_MacOSX
2103*d4514f0bSApple OSS Distributions #define RUN(fn, name) dealloc_results(process_results(test_mach_with_size(fn, name " (size)")))
2104*d4514f0bSApple OSS Distributions 	RUN(call_vm_region_object_create, "vm_region_object_create");
2105*d4514f0bSApple OSS Distributions #undef RUN
2106*d4514f0bSApple OSS Distributions #endif
2107*d4514f0bSApple OSS Distributions 
2108*d4514f0bSApple OSS Distributions 	/*
2109*d4514f0bSApple OSS Distributions 	 * -- page info functions --
2110*d4514f0bSApple OSS Distributions 	 */
2111*d4514f0bSApple OSS Distributions 
2112*d4514f0bSApple OSS Distributions #define RUN(fn, name) dealloc_results(process_results(test_mach_with_allocated_addr(fn, name " (addr)")))
2113*d4514f0bSApple OSS Distributions 	RUN(call_vm_map_page_info, "vm_map_page_info");
2114*d4514f0bSApple OSS Distributions #undef RUN
2115*d4514f0bSApple OSS Distributions 
2116*d4514f0bSApple OSS Distributions 	/*
2117*d4514f0bSApple OSS Distributions 	 * -- miscellaneous functions --
2118*d4514f0bSApple OSS Distributions 	 */
2119*d4514f0bSApple OSS Distributions 
2120*d4514f0bSApple OSS Distributions #if CONFIG_MAP_RANGES
2121*d4514f0bSApple OSS Distributions 	dealloc_results(process_results(test_mach_vm_range_create(call_mach_vm_range_create, "mach_vm_range_create (start/size/start2/size2)")));
2122*d4514f0bSApple OSS Distributions #endif
2123*d4514f0bSApple OSS Distributions 
2124*d4514f0bSApple OSS Distributions 	dealloc_results(process_results(test_kext_unix_with_allocated_vnode_addr(call_task_find_region_details, "task_find_region_details (addr)")));
2125*d4514f0bSApple OSS Distributions 
2126*d4514f0bSApple OSS Distributions 	dealloc_results(process_results(test_mach_with_allocated_start_size(test_mach_vm_deferred_reclamation_buffer_init, "mach_vm_deferred_reclamation_buffer_init (start/size)")));
2127*d4514f0bSApple OSS Distributions 
2128*d4514f0bSApple OSS Distributions 	*out_value = 1;  // success
2129*d4514f0bSApple OSS Distributions done:
2130*d4514f0bSApple OSS Distributions 	SYSCTL_OUTPUT_BUF = 0;
2131*d4514f0bSApple OSS Distributions 	SYSCTL_OUTPUT_END = 0;
2132*d4514f0bSApple OSS Distributions 	return 0;
2133*d4514f0bSApple OSS Distributions }
2134*d4514f0bSApple OSS Distributions 
2135*d4514f0bSApple OSS Distributions SYSCTL_TEST_REGISTER(vm_parameter_validation_kern, vm_parameter_validation_kern_test);
2136