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