xref: /xnu-11215.41.3/tests/vm/vm_parameter_validation.c (revision 33de042d024d46de5ff4e89f2471de6608e37fa4)
1*33de042dSApple OSS Distributions #include <darwintest.h>
2*33de042dSApple OSS Distributions #include <darwintest_utils.h>
3*33de042dSApple OSS Distributions #include <test_utils.h>
4*33de042dSApple OSS Distributions 
5*33de042dSApple OSS Distributions #include <sys/types.h>
6*33de042dSApple OSS Distributions #include <sys/sysctl.h>
7*33de042dSApple OSS Distributions #include <mach/mach.h>
8*33de042dSApple OSS Distributions #include <mach/mach_vm.h>
9*33de042dSApple OSS Distributions #include <mach/memory_entry.h>
10*33de042dSApple OSS Distributions #include <mach/vm_types.h>
11*33de042dSApple OSS Distributions #include <sys/mman.h>
12*33de042dSApple OSS Distributions #include <unistd.h>
13*33de042dSApple OSS Distributions #include <TargetConditionals.h>
14*33de042dSApple OSS Distributions #include <mach-o/dyld.h>
15*33de042dSApple OSS Distributions #include <libgen.h>
16*33de042dSApple OSS Distributions 
17*33de042dSApple OSS Distributions #include <os/bsd.h> // For os_parse_boot_arg_int
18*33de042dSApple OSS Distributions 
19*33de042dSApple OSS Distributions // workarounds for buggy MIG declarations
20*33de042dSApple OSS Distributions // see tests/vm/vm_parameter_validation_replacement_*.defs
21*33de042dSApple OSS Distributions // and tests/Makefile for details
22*33de042dSApple OSS Distributions #include "vm_parameter_validation_replacement_mach_host.h"
23*33de042dSApple OSS Distributions #include "vm_parameter_validation_replacement_host_priv.h"
24*33de042dSApple OSS Distributions 
25*33de042dSApple OSS Distributions // code shared with kernel/kext tests
26*33de042dSApple OSS Distributions #include "../../osfmk/tests/vm_parameter_validation.h"
27*33de042dSApple OSS Distributions 
28*33de042dSApple OSS Distributions T_GLOBAL_META(
29*33de042dSApple OSS Distributions 	T_META_NAMESPACE("xnu.vm"),
30*33de042dSApple OSS Distributions 	T_META_RADAR_COMPONENT_NAME("xnu"),
31*33de042dSApple OSS Distributions 	T_META_RADAR_COMPONENT_VERSION("VM"),
32*33de042dSApple OSS Distributions 	T_META_ASROOT(true),  /* required for vm_wire tests on macOS */
33*33de042dSApple OSS Distributions 	T_META_RUN_CONCURRENTLY(false), /* vm_parameter_validation_kern uses kernel globals */
34*33de042dSApple OSS Distributions 	T_META_ALL_VALID_ARCHS(true),
35*33de042dSApple OSS Distributions 	XNU_T_META_REQUIRES_DEVELOPMENT_KERNEL
36*33de042dSApple OSS Distributions 	);
37*33de042dSApple OSS Distributions 
38*33de042dSApple OSS Distributions /*
39*33de042dSApple OSS Distributions  * vm_parameter_validation.c
40*33de042dSApple OSS Distributions  * Test parameter validation of vm's userspace API
41*33de042dSApple OSS Distributions  *
42*33de042dSApple OSS Distributions  * The test compares the return values against a 'golden' list, which is a text
43*33de042dSApple OSS Distributions  * file previously generated and compressed in .xz files, per platform.
44*33de042dSApple OSS Distributions  * When vm_parameter_validation runs, it calls assets/vm_parameter_validation/decompress.sh,
45*33de042dSApple OSS Distributions  * which detects the platform and decompresses the corresponding user and kern
46*33de042dSApple OSS Distributions  * golden files.
47*33de042dSApple OSS Distributions  *
48*33de042dSApple OSS Distributions  * Any return code mismatch is reported as a failure, printing test name and iteration.
49*33de042dSApple OSS Distributions  * New tests not present in the 'golden' list will run but they are also reported as a failure.
50*33de042dSApple OSS Distributions  *
51*33de042dSApple OSS Distributions  * There are two environment variable flags that makes development work easier and
52*33de042dSApple OSS Distributions  * can temporarily disable golden list testing.
53*33de042dSApple OSS Distributions  *
54*33de042dSApple OSS Distributions  * SKIP_TESTS
55*33de042dSApple OSS Distributions  * When running with SKIP_TESTS set, the test will not compare the results
56*33de042dSApple OSS Distributions  * against the golden files.
57*33de042dSApple OSS Distributions  *
58*33de042dSApple OSS Distributions  * DUMP_RESULTS
59*33de042dSApple OSS Distributions  * When running with DUMP_RESULTS set, the test will print all the returned values
60*33de042dSApple OSS Distributions  * (as opposed to only the failing ones). To pretty-print this output use the python script:
61*33de042dSApple OSS Distributions  * DUMP_RESULTS=1 vm_parameter_validation | tools/format_vm_parameter_validation.py
62*33de042dSApple OSS Distributions  */
63*33de042dSApple OSS Distributions 
64*33de042dSApple OSS Distributions 
65*33de042dSApple OSS Distributions 
66*33de042dSApple OSS Distributions /*
67*33de042dSApple OSS Distributions  * xnu/libsyscall/mach/mach_vm.c intercepts some VM calls from userspace,
68*33de042dSApple OSS Distributions  * sometimes doing something other than the expected MIG call.
69*33de042dSApple OSS Distributions  * This test generates its own MIG userspace call sites to call the kernel
70*33de042dSApple OSS Distributions  * entrypoints directly, bypassing libsyscall's interference.
71*33de042dSApple OSS Distributions  *
72*33de042dSApple OSS Distributions  * The custom MIG call sites are generated into:
73*33de042dSApple OSS Distributions  * vm_parameter_validation_vm_map_user.c
74*33de042dSApple OSS Distributions  * vm_parameter_validation_mach_vm_user.c
75*33de042dSApple OSS Distributions  */
76*33de042dSApple OSS Distributions 
77*33de042dSApple OSS Distributions #pragma clang diagnostic ignored "-Wdeclaration-after-statement"
78*33de042dSApple OSS Distributions #pragma clang diagnostic ignored "-Wmissing-prototypes"
79*33de042dSApple OSS Distributions #pragma clang diagnostic ignored "-Wpedantic"
80*33de042dSApple OSS Distributions 
81*33de042dSApple OSS Distributions /*
82*33de042dSApple OSS Distributions  * Our wire tests often try to wire the whole address space.
83*33de042dSApple OSS Distributions  * In that case the error code is determined by the first range of addresses
84*33de042dSApple OSS Distributions  * that cannot be wired.
85*33de042dSApple OSS Distributions  * In most cases that is a protection failure on a malloc guard page. But
86*33de042dSApple OSS Distributions  * sometimes, circumstances outside of our control change the address map of
87*33de042dSApple OSS Distributions  * our test process and add holes, which means we get a bad address error
88*33de042dSApple OSS Distributions  * instead, and the test fails because the return code doesn't match what's
89*33de042dSApple OSS Distributions  * recorded in the golden files.
90*33de042dSApple OSS Distributions  * To avoid this, we want to keep a guard page inside our data section.
91*33de042dSApple OSS Distributions  * Because that data section is one of the first things in our address space,
92*33de042dSApple OSS Distributions  * the behavior of wire is (more) predictable.
93*33de042dSApple OSS Distributions  */
94*33de042dSApple OSS Distributions _Alignas(KB16) char guard_page[KB16];
95*33de042dSApple OSS Distributions 
96*33de042dSApple OSS Distributions static void
set_up_guard_page(void)97*33de042dSApple OSS Distributions set_up_guard_page(void)
98*33de042dSApple OSS Distributions {
99*33de042dSApple OSS Distributions 	/*
100*33de042dSApple OSS Distributions 	 * Ensure that _Alignas worked as expected.
101*33de042dSApple OSS Distributions 	 */
102*33de042dSApple OSS Distributions 	assert(0 == (((mach_vm_address_t)guard_page) & PAGE_MASK));
103*33de042dSApple OSS Distributions 	/*
104*33de042dSApple OSS Distributions 	 * Remove all permissions on guard_page such that it is a guard page.
105*33de042dSApple OSS Distributions 	 */
106*33de042dSApple OSS Distributions 	assert(0 == mprotect(guard_page, sizeof(guard_page), 0));
107*33de042dSApple OSS Distributions }
108*33de042dSApple OSS Distributions 
109*33de042dSApple OSS Distributions // Return a file descriptor that tests can read and write.
110*33de042dSApple OSS Distributions // A single temporary file is shared among all tests.
111*33de042dSApple OSS Distributions static int
get_fd()112*33de042dSApple OSS Distributions get_fd()
113*33de042dSApple OSS Distributions {
114*33de042dSApple OSS Distributions 	static int fd = -1;
115*33de042dSApple OSS Distributions 	if (fd > 0) {
116*33de042dSApple OSS Distributions 		return fd;
117*33de042dSApple OSS Distributions 	}
118*33de042dSApple OSS Distributions 
119*33de042dSApple OSS Distributions 	char filename[] = "/tmp/vm_parameter_validation_XXXXXX";
120*33de042dSApple OSS Distributions 	fd = mkstemp(filename);
121*33de042dSApple OSS Distributions 	assert(fd > 2);  // not stdin/stdout/stderr
122*33de042dSApple OSS Distributions 	return fd;
123*33de042dSApple OSS Distributions }
124*33de042dSApple OSS Distributions 
125*33de042dSApple OSS Distributions static int
munmap_helper(void * ptr,size_t size)126*33de042dSApple OSS Distributions munmap_helper(void *ptr, size_t size)
127*33de042dSApple OSS Distributions {
128*33de042dSApple OSS Distributions 	mach_vm_address_t start, end;
129*33de042dSApple OSS Distributions 	if (0 != size) { // munmap rejects size == 0 even though mmap accepts it
130*33de042dSApple OSS Distributions 		/*
131*33de042dSApple OSS Distributions 		 * munmap expects aligned inputs, even though mmap sometimes
132*33de042dSApple OSS Distributions 		 * returns unaligned values
133*33de042dSApple OSS Distributions 		 */
134*33de042dSApple OSS Distributions 		start = ((mach_vm_address_t)ptr) & ~PAGE_MASK;
135*33de042dSApple OSS Distributions 		end = (((mach_vm_address_t)ptr) + size + PAGE_MASK) & ~PAGE_MASK;
136*33de042dSApple OSS Distributions 		return munmap((void*)start, end - start);
137*33de042dSApple OSS Distributions 	}
138*33de042dSApple OSS Distributions 	return 0;
139*33de042dSApple OSS Distributions }
140*33de042dSApple OSS Distributions 
141*33de042dSApple OSS Distributions // Some tests provoke EXC_GUARD exceptions.
142*33de042dSApple OSS Distributions // We disable EXC_GUARD if possible. If we can't, we disable those tests instead.
143*33de042dSApple OSS Distributions static bool EXC_GUARD_ENABLED = true;
144*33de042dSApple OSS Distributions 
145*33de042dSApple OSS Distributions static int
call_munlock(void * start,size_t size)146*33de042dSApple OSS Distributions call_munlock(void *start, size_t size)
147*33de042dSApple OSS Distributions {
148*33de042dSApple OSS Distributions 	int err = munlock(start, size);
149*33de042dSApple OSS Distributions 	return err ? errno : 0;
150*33de042dSApple OSS Distributions }
151*33de042dSApple OSS Distributions 
152*33de042dSApple OSS Distributions static int
call_mlock(void * start,size_t size)153*33de042dSApple OSS Distributions call_mlock(void *start, size_t size)
154*33de042dSApple OSS Distributions {
155*33de042dSApple OSS Distributions 	int err = mlock(start, size);
156*33de042dSApple OSS Distributions 	return err ? errno : 0;
157*33de042dSApple OSS Distributions }
158*33de042dSApple OSS Distributions 
159*33de042dSApple OSS Distributions static kern_return_t
call_munmap(MAP_T map __unused,mach_vm_address_t start,mach_vm_size_t size)160*33de042dSApple OSS Distributions call_munmap(MAP_T map __unused, mach_vm_address_t start, mach_vm_size_t size)
161*33de042dSApple OSS Distributions {
162*33de042dSApple OSS Distributions 	int err = munmap((void*)start, (size_t)size);
163*33de042dSApple OSS Distributions 	return err ? errno : 0;
164*33de042dSApple OSS Distributions }
165*33de042dSApple OSS Distributions 
166*33de042dSApple OSS Distributions static int
call_mremap_encrypted(void * start,size_t size)167*33de042dSApple OSS Distributions call_mremap_encrypted(void *start, size_t size)
168*33de042dSApple OSS Distributions {
169*33de042dSApple OSS Distributions 	int err = mremap_encrypted(start, size, CRYPTID_NO_ENCRYPTION, /*cputype=*/ 0, /*cpusubtype=*/ 0);
170*33de042dSApple OSS Distributions 	return err ? errno : 0;
171*33de042dSApple OSS Distributions }
172*33de042dSApple OSS Distributions 
173*33de042dSApple OSS Distributions /////////////////////////////////////////////////////
174*33de042dSApple OSS Distributions // Mach tests
175*33de042dSApple OSS Distributions 
176*33de042dSApple OSS Distributions static mach_port_t
make_a_mem_object(vm_size_t size)177*33de042dSApple OSS Distributions make_a_mem_object(vm_size_t size)
178*33de042dSApple OSS Distributions {
179*33de042dSApple OSS Distributions 	mach_port_t out_handle;
180*33de042dSApple OSS Distributions 	kern_return_t kr = mach_memory_object_memory_entry_64(mach_host_self(), 1, size, VM_PROT_READ | VM_PROT_WRITE, 0, &out_handle);
181*33de042dSApple OSS Distributions 	assert(kr == 0);
182*33de042dSApple OSS Distributions 	return out_handle;
183*33de042dSApple OSS Distributions }
184*33de042dSApple OSS Distributions 
185*33de042dSApple OSS Distributions static mach_port_t
make_a_mem_entry(vm_size_t size)186*33de042dSApple OSS Distributions make_a_mem_entry(vm_size_t size)
187*33de042dSApple OSS Distributions {
188*33de042dSApple OSS Distributions 	mach_port_t port;
189*33de042dSApple OSS Distributions 	memory_object_size_t s = (memory_object_size_t)size;
190*33de042dSApple OSS Distributions 	kern_return_t kr = mach_make_memory_entry_64(mach_host_self(), &s, (memory_object_offset_t)0, MAP_MEM_NAMED_CREATE | MAP_MEM_LEDGER_TAGGED, &port, MACH_PORT_NULL);
191*33de042dSApple OSS Distributions 	T_QUIET; T_ASSERT_MACH_SUCCESS(kr, "allocate memory entry");
192*33de042dSApple OSS Distributions 	return port;
193*33de042dSApple OSS Distributions }
194*33de042dSApple OSS Distributions 
195*33de042dSApple OSS Distributions static inline void
check_mach_memory_entry_outparam_changes(kern_return_t * kr,mach_port_t out_handle,mach_port_t saved_handle)196*33de042dSApple OSS Distributions check_mach_memory_entry_outparam_changes(kern_return_t * kr, mach_port_t out_handle, mach_port_t saved_handle)
197*33de042dSApple OSS Distributions {
198*33de042dSApple OSS Distributions 	if (*kr != KERN_SUCCESS) {
199*33de042dSApple OSS Distributions 		if (out_handle != (mach_port_t) saved_handle) {
200*33de042dSApple OSS Distributions 			*kr = OUT_PARAM_BAD;
201*33de042dSApple OSS Distributions 		}
202*33de042dSApple OSS Distributions 	}
203*33de042dSApple OSS Distributions }
204*33de042dSApple OSS Distributions // mach_make_memory_entry is really several functions wearing a trenchcoat.
205*33de042dSApple OSS Distributions // Run a separate test for each variation.
206*33de042dSApple OSS Distributions 
207*33de042dSApple OSS Distributions // mach_make_memory_entry also has a confusing number of entrypoints:
208*33de042dSApple OSS Distributions // U64: mach_make_memory_entry_64(64) (mach_make_memory_entry is the same MIG message)
209*33de042dSApple OSS Distributions // U32: mach_make_memory_entry(32), mach_make_memory_entry_64(64), _mach_make_memory_entry(64) (each is a unique MIG message)
210*33de042dSApple OSS Distributions #define IMPL(FN, T)                                                               \
211*33de042dSApple OSS Distributions 	static kern_return_t                                                      \
212*33de042dSApple OSS Distributions 	call_ ## FN ## __start_size__memonly(MAP_T map, T start, T size)                      \
213*33de042dSApple OSS Distributions 	{                                                                         \
214*33de042dSApple OSS Distributions 	        mach_port_t memobject = make_a_mem_object(TEST_ALLOC_SIZE + 1);          \
215*33de042dSApple OSS Distributions 	        T io_size = size;                                                 \
216*33de042dSApple OSS Distributions 	        mach_port_t invalid_value = INVALID_INITIAL_MACH_PORT;            \
217*33de042dSApple OSS Distributions 	        mach_port_t out_handle = invalid_value;                           \
218*33de042dSApple OSS Distributions 	        kern_return_t kr = FN(map, &io_size, start,                       \
219*33de042dSApple OSS Distributions 	                              VM_PROT_READ | MAP_MEM_ONLY, &out_handle, memobject); \
220*33de042dSApple OSS Distributions 	        if (kr == 0) {                                                    \
221*33de042dSApple OSS Distributions 	                (void)mach_port_deallocate(mach_task_self(), out_handle); \
222*33de042dSApple OSS Distributions 	/* MAP_MEM_ONLY doesn't use the size. It should not change it. */         \
223*33de042dSApple OSS Distributions 	                assert(io_size == size);                                  \
224*33de042dSApple OSS Distributions 	        }                                                                 \
225*33de042dSApple OSS Distributions 	        (void)mach_port_deallocate(mach_task_self(), memobject);          \
226*33de042dSApple OSS Distributions 	        check_mach_memory_entry_outparam_changes(&kr, out_handle, invalid_value); \
227*33de042dSApple OSS Distributions 	        return kr;                                                        \
228*33de042dSApple OSS Distributions 	}                                                                         \
229*33de042dSApple OSS Distributions                                                                                   \
230*33de042dSApple OSS Distributions 	static kern_return_t                                                      \
231*33de042dSApple OSS Distributions 	call_ ## FN ## __start_size__namedcreate(MAP_T map, T start, T size)                  \
232*33de042dSApple OSS Distributions 	{                                                                         \
233*33de042dSApple OSS Distributions 	        mach_port_t memobject = make_a_mem_object(TEST_ALLOC_SIZE + 1);          \
234*33de042dSApple OSS Distributions 	        T io_size = size;                                                 \
235*33de042dSApple OSS Distributions 	        mach_port_t invalid_value = INVALID_INITIAL_MACH_PORT;            \
236*33de042dSApple OSS Distributions 	        mach_port_t out_handle = invalid_value;                           \
237*33de042dSApple OSS Distributions 	        kern_return_t kr = FN(map, &io_size, start,                       \
238*33de042dSApple OSS Distributions 	                              VM_PROT_READ | MAP_MEM_NAMED_CREATE, &out_handle, memobject); \
239*33de042dSApple OSS Distributions 	        if (kr == 0) {                                                    \
240*33de042dSApple OSS Distributions 	                (void)mach_port_deallocate(mach_task_self(), out_handle); \
241*33de042dSApple OSS Distributions 	        }                                                                 \
242*33de042dSApple OSS Distributions 	        (void)mach_port_deallocate(mach_task_self(), memobject);          \
243*33de042dSApple OSS Distributions 	        check_mach_memory_entry_outparam_changes(&kr, out_handle, invalid_value); \
244*33de042dSApple OSS Distributions 	        return kr;                                                        \
245*33de042dSApple OSS Distributions 	}                                                                         \
246*33de042dSApple OSS Distributions                                                                                   \
247*33de042dSApple OSS Distributions 	static kern_return_t                                                      \
248*33de042dSApple OSS Distributions 	call_ ## FN ## __start_size__copy(MAP_T map, T start, T size)                         \
249*33de042dSApple OSS Distributions 	{                                                                         \
250*33de042dSApple OSS Distributions 	        mach_port_t memobject = make_a_mem_object(TEST_ALLOC_SIZE + 1);          \
251*33de042dSApple OSS Distributions 	        T io_size = size;                                                 \
252*33de042dSApple OSS Distributions 	        mach_port_t invalid_value = INVALID_INITIAL_MACH_PORT;            \
253*33de042dSApple OSS Distributions 	        mach_port_t out_handle = invalid_value;                           \
254*33de042dSApple OSS Distributions 	        kern_return_t kr = FN(map, &io_size, start,                       \
255*33de042dSApple OSS Distributions 	                              VM_PROT_READ | MAP_MEM_VM_COPY, &out_handle, memobject); \
256*33de042dSApple OSS Distributions 	        if (kr == 0) {                                                    \
257*33de042dSApple OSS Distributions 	                (void)mach_port_deallocate(mach_task_self(), out_handle); \
258*33de042dSApple OSS Distributions 	        }                                                                 \
259*33de042dSApple OSS Distributions 	        (void)mach_port_deallocate(mach_task_self(), memobject);          \
260*33de042dSApple OSS Distributions 	        check_mach_memory_entry_outparam_changes(&kr, out_handle, invalid_value); \
261*33de042dSApple OSS Distributions 	        return kr;                                                        \
262*33de042dSApple OSS Distributions 	}                                                                         \
263*33de042dSApple OSS Distributions                                                                                   \
264*33de042dSApple OSS Distributions 	static kern_return_t                                                      \
265*33de042dSApple OSS Distributions 	call_ ## FN ## __start_size__share(MAP_T map, T start, T size)                         \
266*33de042dSApple OSS Distributions 	{                                                                         \
267*33de042dSApple OSS Distributions 	        mach_port_t memobject = make_a_mem_object(TEST_ALLOC_SIZE + 1);          \
268*33de042dSApple OSS Distributions 	        T io_size = size;                                                 \
269*33de042dSApple OSS Distributions 	        mach_port_t invalid_value = INVALID_INITIAL_MACH_PORT;            \
270*33de042dSApple OSS Distributions 	        mach_port_t out_handle = invalid_value;                           \
271*33de042dSApple OSS Distributions 	        kern_return_t kr = FN(map, &io_size, start,                       \
272*33de042dSApple OSS Distributions 	                              VM_PROT_READ | MAP_MEM_VM_SHARE, &out_handle, memobject); \
273*33de042dSApple OSS Distributions 	        if (kr == 0) {                                                    \
274*33de042dSApple OSS Distributions 	                (void)mach_port_deallocate(mach_task_self(), out_handle); \
275*33de042dSApple OSS Distributions 	        }                                                                 \
276*33de042dSApple OSS Distributions 	        (void)mach_port_deallocate(mach_task_self(), memobject);          \
277*33de042dSApple OSS Distributions 	        check_mach_memory_entry_outparam_changes(&kr, out_handle, invalid_value); \
278*33de042dSApple OSS Distributions 	        return kr;                                                        \
279*33de042dSApple OSS Distributions 	}                                                                         \
280*33de042dSApple OSS Distributions                                                                                   \
281*33de042dSApple OSS Distributions 	static kern_return_t                                                      \
282*33de042dSApple OSS Distributions 	call_ ## FN ## __start_size__namedreuse(MAP_T map, T start, T size)                   \
283*33de042dSApple OSS Distributions 	{                                                                         \
284*33de042dSApple OSS Distributions 	        mach_port_t memobject = make_a_mem_object(TEST_ALLOC_SIZE + 1);          \
285*33de042dSApple OSS Distributions 	        T io_size = size;                                                 \
286*33de042dSApple OSS Distributions 	        mach_port_t invalid_value = INVALID_INITIAL_MACH_PORT;            \
287*33de042dSApple OSS Distributions 	        mach_port_t out_handle = invalid_value;                           \
288*33de042dSApple OSS Distributions 	        kern_return_t kr = FN(map, &io_size, start,                       \
289*33de042dSApple OSS Distributions 	                              VM_PROT_READ | MAP_MEM_NAMED_REUSE, &out_handle, memobject); \
290*33de042dSApple OSS Distributions 	        if (kr == 0) {                                                    \
291*33de042dSApple OSS Distributions 	                (void)mach_port_deallocate(mach_task_self(), out_handle); \
292*33de042dSApple OSS Distributions 	        }                                                                 \
293*33de042dSApple OSS Distributions 	        (void)mach_port_deallocate(mach_task_self(), memobject);          \
294*33de042dSApple OSS Distributions 	        check_mach_memory_entry_outparam_changes(&kr, out_handle, invalid_value); \
295*33de042dSApple OSS Distributions 	        return kr;                                                        \
296*33de042dSApple OSS Distributions 	}                                                                         \
297*33de042dSApple OSS Distributions                                                                                   \
298*33de042dSApple OSS Distributions 	static kern_return_t                                                      \
299*33de042dSApple OSS Distributions 	call_ ## FN ## __vm_prot(MAP_T map, T start, T size, vm_prot_t prot)      \
300*33de042dSApple OSS Distributions 	{                                                                         \
301*33de042dSApple OSS Distributions 	        mach_port_t memobject = make_a_mem_object(TEST_ALLOC_SIZE + 1);          \
302*33de042dSApple OSS Distributions 	        T io_size = size;                                                 \
303*33de042dSApple OSS Distributions 	        mach_port_t invalid_value = INVALID_INITIAL_MACH_PORT;            \
304*33de042dSApple OSS Distributions 	        mach_port_t out_handle = invalid_value;                           \
305*33de042dSApple OSS Distributions 	        kern_return_t kr = FN(map, &io_size, start,                       \
306*33de042dSApple OSS Distributions 	                              prot, &out_handle, memobject); \
307*33de042dSApple OSS Distributions 	        if (kr == 0) {                                                    \
308*33de042dSApple OSS Distributions 	                (void)mach_port_deallocate(mach_task_self(), out_handle); \
309*33de042dSApple OSS Distributions 	        }                                                                 \
310*33de042dSApple OSS Distributions 	        (void)mach_port_deallocate(mach_task_self(), memobject);          \
311*33de042dSApple OSS Distributions 	        check_mach_memory_entry_outparam_changes(&kr, out_handle, invalid_value); \
312*33de042dSApple OSS Distributions 	        return kr;                                                        \
313*33de042dSApple OSS Distributions 	}
314*33de042dSApple OSS Distributions 
IMPL(mach_make_memory_entry_64,mach_vm_address_t)315*33de042dSApple OSS Distributions IMPL(mach_make_memory_entry_64, mach_vm_address_t)
316*33de042dSApple OSS Distributions #if TEST_OLD_STYLE_MACH
317*33de042dSApple OSS Distributions IMPL(mach_make_memory_entry, vm_address_t)
318*33de042dSApple OSS Distributions IMPL(_mach_make_memory_entry, mach_vm_address_t)
319*33de042dSApple OSS Distributions #endif
320*33de042dSApple OSS Distributions #undef IMPL
321*33de042dSApple OSS Distributions 
322*33de042dSApple OSS Distributions static inline void
323*33de042dSApple OSS Distributions check_mach_memory_object_memory_entry_outparam_changes(kern_return_t * kr, mach_port_t out_handle,
324*33de042dSApple OSS Distributions     mach_port_t saved_out_handle)
325*33de042dSApple OSS Distributions {
326*33de042dSApple OSS Distributions 	if (*kr != KERN_SUCCESS) {
327*33de042dSApple OSS Distributions 		if (out_handle != saved_out_handle) {
328*33de042dSApple OSS Distributions 			*kr = OUT_PARAM_BAD;
329*33de042dSApple OSS Distributions 		}
330*33de042dSApple OSS Distributions 	}
331*33de042dSApple OSS Distributions }
332*33de042dSApple OSS Distributions 
333*33de042dSApple OSS Distributions #define IMPL(FN) \
334*33de042dSApple OSS Distributions 	static kern_return_t                                            \
335*33de042dSApple OSS Distributions 	call_ ## FN ## __size(MAP_T map __unused, mach_vm_size_t size)  \
336*33de042dSApple OSS Distributions 	{                                                               \
337*33de042dSApple OSS Distributions 	        kern_return_t kr;                                       \
338*33de042dSApple OSS Distributions 	        mach_port_t invalid_value = INVALID_INITIAL_MACH_PORT;  \
339*33de042dSApple OSS Distributions 	        mach_port_t out_entry = invalid_value;                  \
340*33de042dSApple OSS Distributions 	        kr = FN(mach_host_self(), 1, size, VM_PROT_READ | VM_PROT_WRITE, 0, &out_entry); \
341*33de042dSApple OSS Distributions 	        if (kr == 0) {                                          \
342*33de042dSApple OSS Distributions 	                (void)mach_port_deallocate(mach_task_self(), out_entry); \
343*33de042dSApple OSS Distributions 	        }                                                       \
344*33de042dSApple OSS Distributions 	        check_mach_memory_object_memory_entry_outparam_changes(&kr, out_entry, invalid_value); \
345*33de042dSApple OSS Distributions 	        return kr;                                              \
346*33de042dSApple OSS Distributions 	}                                                               \
347*33de042dSApple OSS Distributions 	static kern_return_t                                            \
348*33de042dSApple OSS Distributions 	call_ ## FN ## __vm_prot(MAP_T map __unused, mach_vm_size_t size, vm_prot_t prot) \
349*33de042dSApple OSS Distributions 	{                                                               \
350*33de042dSApple OSS Distributions 	        kern_return_t kr;                                       \
351*33de042dSApple OSS Distributions 	        mach_port_t invalid_value = INVALID_INITIAL_MACH_PORT;  \
352*33de042dSApple OSS Distributions 	        mach_port_t out_entry = invalid_value;                  \
353*33de042dSApple OSS Distributions 	        kr = FN(mach_host_self(), 1, size, prot, 0, &out_entry); \
354*33de042dSApple OSS Distributions 	        if (kr == 0) {                                          \
355*33de042dSApple OSS Distributions 	                (void)mach_port_deallocate(mach_task_self(), out_entry); \
356*33de042dSApple OSS Distributions 	        }                                                       \
357*33de042dSApple OSS Distributions 	        check_mach_memory_object_memory_entry_outparam_changes(&kr, out_entry, invalid_value); \
358*33de042dSApple OSS Distributions 	        return kr;                                              \
359*33de042dSApple OSS Distributions 	}
360*33de042dSApple OSS Distributions 
361*33de042dSApple OSS Distributions // The declaration of mach_memory_object_memory_entry is buggy on U32.
362*33de042dSApple OSS Distributions // We compile in our own MIG user stub for it with a "replacement_" prefix.
363*33de042dSApple OSS Distributions // rdar://117927965
364*33de042dSApple OSS Distributions IMPL(replacement_mach_memory_object_memory_entry)
IMPL(mach_memory_object_memory_entry_64)365*33de042dSApple OSS Distributions IMPL(mach_memory_object_memory_entry_64)
366*33de042dSApple OSS Distributions #undef IMPL
367*33de042dSApple OSS Distributions 
368*33de042dSApple OSS Distributions static inline void
369*33de042dSApple OSS Distributions check_vm_read_outparam_changes(kern_return_t * kr, mach_vm_size_t size, mach_vm_size_t requested_size,
370*33de042dSApple OSS Distributions     mach_vm_address_t addr)
371*33de042dSApple OSS Distributions {
372*33de042dSApple OSS Distributions 	if (*kr == KERN_SUCCESS) {
373*33de042dSApple OSS Distributions 		if (size != requested_size) {
374*33de042dSApple OSS Distributions 			*kr = OUT_PARAM_BAD;
375*33de042dSApple OSS Distributions 		}
376*33de042dSApple OSS Distributions 		if (size == 0) {
377*33de042dSApple OSS Distributions 			if (addr != 0) {
378*33de042dSApple OSS Distributions 				*kr = OUT_PARAM_BAD;
379*33de042dSApple OSS Distributions 			}
380*33de042dSApple OSS Distributions 		}
381*33de042dSApple OSS Distributions 	}
382*33de042dSApple OSS Distributions }
383*33de042dSApple OSS Distributions 
384*33de042dSApple OSS Distributions 
385*33de042dSApple OSS Distributions static kern_return_t
call_mach_vm_read(MAP_T map,mach_vm_address_t start,mach_vm_size_t size)386*33de042dSApple OSS Distributions call_mach_vm_read(MAP_T map, mach_vm_address_t start, mach_vm_size_t size)
387*33de042dSApple OSS Distributions {
388*33de042dSApple OSS Distributions 	vm_offset_t out_addr = INVALID_INITIAL_ADDRESS;
389*33de042dSApple OSS Distributions 	mach_msg_type_number_t out_size = INVALID_INITIAL_SIZE;
390*33de042dSApple OSS Distributions 	kern_return_t kr = mach_vm_read(map, start, size, &out_addr, &out_size);
391*33de042dSApple OSS Distributions 	if (kr == 0) {
392*33de042dSApple OSS Distributions 		(void)mach_vm_deallocate(mach_task_self(), out_addr, out_size);
393*33de042dSApple OSS Distributions 	}
394*33de042dSApple OSS Distributions 	check_vm_read_outparam_changes(&kr, out_size, size, out_addr);
395*33de042dSApple OSS Distributions 	return kr;
396*33de042dSApple OSS Distributions }
397*33de042dSApple OSS Distributions #if TEST_OLD_STYLE_MACH
398*33de042dSApple OSS Distributions static kern_return_t
call_vm_read(MAP_T map,vm_address_t start,vm_size_t size)399*33de042dSApple OSS Distributions call_vm_read(MAP_T map, vm_address_t start, vm_size_t size)
400*33de042dSApple OSS Distributions {
401*33de042dSApple OSS Distributions 	vm_offset_t out_addr = INVALID_INITIAL_ADDRESS;
402*33de042dSApple OSS Distributions 	mach_msg_type_number_t out_size = INVALID_INITIAL_SIZE;
403*33de042dSApple OSS Distributions 	kern_return_t kr = vm_read(map, start, size, &out_addr, &out_size);
404*33de042dSApple OSS Distributions 	if (kr == 0) {
405*33de042dSApple OSS Distributions 		(void)mach_vm_deallocate(mach_task_self(), out_addr, out_size);
406*33de042dSApple OSS Distributions 	}
407*33de042dSApple OSS Distributions 	check_vm_read_outparam_changes(&kr, out_size, size, out_addr);
408*33de042dSApple OSS Distributions 	return kr;
409*33de042dSApple OSS Distributions }
410*33de042dSApple OSS Distributions #endif
411*33de042dSApple OSS Distributions 
412*33de042dSApple OSS Distributions static kern_return_t
call_mach_vm_read_list(MAP_T map,mach_vm_address_t start,mach_vm_size_t size)413*33de042dSApple OSS Distributions call_mach_vm_read_list(MAP_T map, mach_vm_address_t start, mach_vm_size_t size)
414*33de042dSApple OSS Distributions {
415*33de042dSApple OSS Distributions 	mach_vm_read_entry_t re = {{.address = start, .size = size}};
416*33de042dSApple OSS Distributions 	kern_return_t kr = mach_vm_read_list(map, re, 1);
417*33de042dSApple OSS Distributions 	if (kr == 0) {
418*33de042dSApple OSS Distributions 		(void)mach_vm_deallocate(mach_task_self(), re[0].address, re[0].size);
419*33de042dSApple OSS Distributions 	}
420*33de042dSApple OSS Distributions 	return kr;
421*33de042dSApple OSS Distributions }
422*33de042dSApple OSS Distributions #if TEST_OLD_STYLE_MACH
423*33de042dSApple OSS Distributions static kern_return_t
call_vm_read_list(MAP_T map,vm_address_t start,vm_size_t size)424*33de042dSApple OSS Distributions call_vm_read_list(MAP_T map, vm_address_t start, vm_size_t size)
425*33de042dSApple OSS Distributions {
426*33de042dSApple OSS Distributions 	vm_read_entry_t re = {{.address = start, .size = size}};
427*33de042dSApple OSS Distributions 	kern_return_t kr = vm_read_list(map, re, 1);
428*33de042dSApple OSS Distributions 	if (kr == 0) {
429*33de042dSApple OSS Distributions 		(void)mach_vm_deallocate(mach_task_self(), re[0].address, re[0].size);
430*33de042dSApple OSS Distributions 	}
431*33de042dSApple OSS Distributions 	return kr;
432*33de042dSApple OSS Distributions }
433*33de042dSApple OSS Distributions #endif
434*33de042dSApple OSS Distributions 
435*33de042dSApple OSS Distributions static inline void
check_vm_read_overwrite_outparam_changes(kern_return_t * kr,mach_vm_size_t size,mach_vm_size_t requested_size)436*33de042dSApple OSS Distributions check_vm_read_overwrite_outparam_changes(kern_return_t * kr, mach_vm_size_t size, mach_vm_size_t requested_size)
437*33de042dSApple OSS Distributions {
438*33de042dSApple OSS Distributions 	if (*kr == KERN_SUCCESS) {
439*33de042dSApple OSS Distributions 		if (size != requested_size) {
440*33de042dSApple OSS Distributions 			*kr = OUT_PARAM_BAD;
441*33de042dSApple OSS Distributions 		}
442*33de042dSApple OSS Distributions 	}
443*33de042dSApple OSS Distributions }
444*33de042dSApple OSS Distributions 
445*33de042dSApple OSS Distributions static kern_return_t __unused
call_mach_vm_read_overwrite__ssz(MAP_T map,mach_vm_address_t start,mach_vm_address_t start_2,mach_vm_size_t size)446*33de042dSApple OSS Distributions call_mach_vm_read_overwrite__ssz(MAP_T map, mach_vm_address_t start, mach_vm_address_t start_2, mach_vm_size_t size)
447*33de042dSApple OSS Distributions {
448*33de042dSApple OSS Distributions 	mach_vm_size_t out_size;
449*33de042dSApple OSS Distributions 	kern_return_t kr = mach_vm_read_overwrite(map, start, size, start_2, &out_size);
450*33de042dSApple OSS Distributions 	check_vm_read_overwrite_outparam_changes(&kr, out_size, size);
451*33de042dSApple OSS Distributions 	return kr;
452*33de042dSApple OSS Distributions }
453*33de042dSApple OSS Distributions 
454*33de042dSApple OSS Distributions static kern_return_t
call_mach_vm_read_overwrite__src(MAP_T map,mach_vm_address_t src,mach_vm_size_t size)455*33de042dSApple OSS Distributions call_mach_vm_read_overwrite__src(MAP_T map, mach_vm_address_t src, mach_vm_size_t size)
456*33de042dSApple OSS Distributions {
457*33de042dSApple OSS Distributions 	mach_vm_size_t out_size;
458*33de042dSApple OSS Distributions 	allocation_t dst SMART_ALLOCATE_VM(map, TEST_ALLOC_SIZE, VM_PROT_DEFAULT);
459*33de042dSApple OSS Distributions 	kern_return_t kr = mach_vm_read_overwrite(map, src, size, dst.addr, &out_size);
460*33de042dSApple OSS Distributions 	check_vm_read_overwrite_outparam_changes(&kr, out_size, size);
461*33de042dSApple OSS Distributions 	return kr;
462*33de042dSApple OSS Distributions }
463*33de042dSApple OSS Distributions 
464*33de042dSApple OSS Distributions static kern_return_t
call_mach_vm_read_overwrite__dst(MAP_T map,mach_vm_address_t dst,mach_vm_size_t size)465*33de042dSApple OSS Distributions call_mach_vm_read_overwrite__dst(MAP_T map, mach_vm_address_t dst, mach_vm_size_t size)
466*33de042dSApple OSS Distributions {
467*33de042dSApple OSS Distributions 	mach_vm_size_t out_size;
468*33de042dSApple OSS Distributions 	allocation_t src SMART_ALLOCATE_VM(map, TEST_ALLOC_SIZE, VM_PROT_DEFAULT);
469*33de042dSApple OSS Distributions 	kern_return_t kr = mach_vm_read_overwrite(map, src.addr, size, dst, &out_size);
470*33de042dSApple OSS Distributions 	check_vm_read_overwrite_outparam_changes(&kr, out_size, size);
471*33de042dSApple OSS Distributions 	return kr;
472*33de042dSApple OSS Distributions }
473*33de042dSApple OSS Distributions 
474*33de042dSApple OSS Distributions #if TEST_OLD_STYLE_MACH
475*33de042dSApple OSS Distributions static kern_return_t __unused
call_vm_read_overwrite__ssz(MAP_T map,mach_vm_address_t start,mach_vm_address_t start_2,mach_vm_size_t size)476*33de042dSApple OSS Distributions call_vm_read_overwrite__ssz(MAP_T map, mach_vm_address_t start, mach_vm_address_t start_2, mach_vm_size_t size)
477*33de042dSApple OSS Distributions {
478*33de042dSApple OSS Distributions 	vm_size_t out_size;
479*33de042dSApple OSS Distributions 	kern_return_t kr = vm_read_overwrite(map, (vm_address_t) start, (vm_size_t) size, (vm_address_t) start_2, &out_size);
480*33de042dSApple OSS Distributions 	check_vm_read_overwrite_outparam_changes(&kr, out_size, size);
481*33de042dSApple OSS Distributions 	return kr;
482*33de042dSApple OSS Distributions }
483*33de042dSApple OSS Distributions 
484*33de042dSApple OSS Distributions static kern_return_t
call_vm_read_overwrite__src(MAP_T map,mach_vm_address_t src,mach_vm_size_t size)485*33de042dSApple OSS Distributions call_vm_read_overwrite__src(MAP_T map, mach_vm_address_t src, mach_vm_size_t size)
486*33de042dSApple OSS Distributions {
487*33de042dSApple OSS Distributions 	vm_size_t out_size;
488*33de042dSApple OSS Distributions 	allocation_t dst SMART_ALLOCATE_VM(map, TEST_ALLOC_SIZE, VM_PROT_DEFAULT);
489*33de042dSApple OSS Distributions 	kern_return_t kr = vm_read_overwrite(map, (vm_address_t) src, (vm_size_t) size, (vm_address_t) dst.addr, &out_size);
490*33de042dSApple OSS Distributions 	check_vm_read_overwrite_outparam_changes(&kr, out_size, size);
491*33de042dSApple OSS Distributions 	return kr;
492*33de042dSApple OSS Distributions }
493*33de042dSApple OSS Distributions 
494*33de042dSApple OSS Distributions static kern_return_t
call_vm_read_overwrite__dst(MAP_T map,mach_vm_address_t dst,mach_vm_size_t size)495*33de042dSApple OSS Distributions call_vm_read_overwrite__dst(MAP_T map, mach_vm_address_t dst, mach_vm_size_t size)
496*33de042dSApple OSS Distributions {
497*33de042dSApple OSS Distributions 	vm_size_t out_size;
498*33de042dSApple OSS Distributions 	allocation_t src SMART_ALLOCATE_VM(map, TEST_ALLOC_SIZE, VM_PROT_DEFAULT);
499*33de042dSApple OSS Distributions 	kern_return_t kr = vm_read_overwrite(map, (vm_address_t) src.addr, (vm_size_t) size, (vm_address_t) dst, &out_size);
500*33de042dSApple OSS Distributions 	check_vm_read_overwrite_outparam_changes(&kr, out_size, size);
501*33de042dSApple OSS Distributions 	return kr;
502*33de042dSApple OSS Distributions }
503*33de042dSApple OSS Distributions #endif
504*33de042dSApple OSS Distributions 
505*33de042dSApple OSS Distributions 
506*33de042dSApple OSS Distributions 
507*33de042dSApple OSS Distributions static kern_return_t __unused
call_mach_vm_copy__ssz(MAP_T map,mach_vm_address_t start,mach_vm_address_t start_2,mach_vm_size_t size)508*33de042dSApple OSS Distributions call_mach_vm_copy__ssz(MAP_T map, mach_vm_address_t start, mach_vm_address_t start_2, mach_vm_size_t size)
509*33de042dSApple OSS Distributions {
510*33de042dSApple OSS Distributions 	kern_return_t kr = mach_vm_copy(map, start, size, start_2);
511*33de042dSApple OSS Distributions 	return kr;
512*33de042dSApple OSS Distributions }
513*33de042dSApple OSS Distributions 
514*33de042dSApple OSS Distributions static kern_return_t
call_mach_vm_copy__src(MAP_T map,mach_vm_address_t src,mach_vm_size_t size)515*33de042dSApple OSS Distributions call_mach_vm_copy__src(MAP_T map, mach_vm_address_t src, mach_vm_size_t size)
516*33de042dSApple OSS Distributions {
517*33de042dSApple OSS Distributions 	allocation_t dst SMART_ALLOCATE_VM(map, TEST_ALLOC_SIZE, VM_PROT_DEFAULT);
518*33de042dSApple OSS Distributions 	kern_return_t kr = mach_vm_copy(map, src, size, dst.addr);
519*33de042dSApple OSS Distributions 	return kr;
520*33de042dSApple OSS Distributions }
521*33de042dSApple OSS Distributions 
522*33de042dSApple OSS Distributions static kern_return_t
call_mach_vm_copy__dst(MAP_T map,mach_vm_address_t dst,mach_vm_size_t size)523*33de042dSApple OSS Distributions call_mach_vm_copy__dst(MAP_T map, mach_vm_address_t dst, mach_vm_size_t size)
524*33de042dSApple OSS Distributions {
525*33de042dSApple OSS Distributions 	allocation_t src SMART_ALLOCATE_VM(map, TEST_ALLOC_SIZE, VM_PROT_DEFAULT);
526*33de042dSApple OSS Distributions 	kern_return_t kr = mach_vm_copy(map, src.addr, size, dst);
527*33de042dSApple OSS Distributions 	return kr;
528*33de042dSApple OSS Distributions }
529*33de042dSApple OSS Distributions 
530*33de042dSApple OSS Distributions #if TEST_OLD_STYLE_MACH
531*33de042dSApple OSS Distributions static kern_return_t __unused
call_vm_copy__ssz(MAP_T map,mach_vm_address_t start,mach_vm_address_t start_2,mach_vm_size_t size)532*33de042dSApple OSS Distributions call_vm_copy__ssz(MAP_T map, mach_vm_address_t start, mach_vm_address_t start_2, mach_vm_size_t size)
533*33de042dSApple OSS Distributions {
534*33de042dSApple OSS Distributions 	kern_return_t kr = vm_copy(map, (vm_address_t) start, (vm_size_t) size, (vm_address_t) start_2);
535*33de042dSApple OSS Distributions 	return kr;
536*33de042dSApple OSS Distributions }
537*33de042dSApple OSS Distributions 
538*33de042dSApple OSS Distributions static kern_return_t
call_vm_copy__src(MAP_T map,mach_vm_address_t src,mach_vm_size_t size)539*33de042dSApple OSS Distributions call_vm_copy__src(MAP_T map, mach_vm_address_t src, mach_vm_size_t size)
540*33de042dSApple OSS Distributions {
541*33de042dSApple OSS Distributions 	allocation_t dst SMART_ALLOCATE_VM(map, TEST_ALLOC_SIZE, VM_PROT_DEFAULT);
542*33de042dSApple OSS Distributions 	kern_return_t kr = vm_copy(map, (vm_address_t) src, (vm_size_t) size, (vm_address_t) dst.addr);
543*33de042dSApple OSS Distributions 	return kr;
544*33de042dSApple OSS Distributions }
545*33de042dSApple OSS Distributions 
546*33de042dSApple OSS Distributions static kern_return_t
call_vm_copy__dst(MAP_T map,mach_vm_address_t dst,mach_vm_size_t size)547*33de042dSApple OSS Distributions call_vm_copy__dst(MAP_T map, mach_vm_address_t dst, mach_vm_size_t size)
548*33de042dSApple OSS Distributions {
549*33de042dSApple OSS Distributions 	allocation_t src SMART_ALLOCATE_VM(map, TEST_ALLOC_SIZE, VM_PROT_DEFAULT);
550*33de042dSApple OSS Distributions 	kern_return_t kr = vm_copy(map, (vm_address_t) src.addr, (vm_size_t) size, (vm_address_t) dst);
551*33de042dSApple OSS Distributions 	return kr;
552*33de042dSApple OSS Distributions }
553*33de042dSApple OSS Distributions #endif
554*33de042dSApple OSS Distributions 
555*33de042dSApple OSS Distributions static kern_return_t __unused
call_mach_vm_write__ssz(MAP_T map,mach_vm_address_t start,mach_vm_address_t start_2,mach_vm_size_t size)556*33de042dSApple OSS Distributions call_mach_vm_write__ssz(MAP_T map, mach_vm_address_t start, mach_vm_address_t start_2, mach_vm_size_t size)
557*33de042dSApple OSS Distributions {
558*33de042dSApple OSS Distributions 	kern_return_t kr = mach_vm_write(map, start, (vm_offset_t) start_2, (mach_msg_type_number_t) size);
559*33de042dSApple OSS Distributions 	return kr;
560*33de042dSApple OSS Distributions }
561*33de042dSApple OSS Distributions 
562*33de042dSApple OSS Distributions static kern_return_t
call_mach_vm_write__src(MAP_T map,mach_vm_address_t start,mach_vm_size_t size)563*33de042dSApple OSS Distributions call_mach_vm_write__src(MAP_T map, mach_vm_address_t start, mach_vm_size_t size)
564*33de042dSApple OSS Distributions {
565*33de042dSApple OSS Distributions 	allocation_t dst SMART_ALLOCATE_VM(map, TEST_ALLOC_SIZE, VM_PROT_DEFAULT);
566*33de042dSApple OSS Distributions 	kern_return_t kr = mach_vm_write(map, dst.addr, (vm_offset_t) start, (mach_msg_type_number_t) size);
567*33de042dSApple OSS Distributions 	return kr;
568*33de042dSApple OSS Distributions }
569*33de042dSApple OSS Distributions 
570*33de042dSApple OSS Distributions static kern_return_t
call_mach_vm_write__dst(MAP_T map,mach_vm_address_t start,mach_vm_size_t size)571*33de042dSApple OSS Distributions call_mach_vm_write__dst(MAP_T map, mach_vm_address_t start, mach_vm_size_t size)
572*33de042dSApple OSS Distributions {
573*33de042dSApple OSS Distributions 	allocation_t src SMART_ALLOCATE_VM(map, TEST_ALLOC_SIZE, VM_PROT_DEFAULT);
574*33de042dSApple OSS Distributions 	kern_return_t kr = mach_vm_write(map, start, (vm_offset_t) src.addr, (mach_msg_type_number_t) size);
575*33de042dSApple OSS Distributions 	return kr;
576*33de042dSApple OSS Distributions }
577*33de042dSApple OSS Distributions 
578*33de042dSApple OSS Distributions #if TEST_OLD_STYLE_MACH
579*33de042dSApple OSS Distributions static kern_return_t __unused
call_vm_write__ssz(MAP_T map,mach_vm_address_t start,mach_vm_address_t start_2,mach_vm_size_t size)580*33de042dSApple OSS Distributions call_vm_write__ssz(MAP_T map, mach_vm_address_t start, mach_vm_address_t start_2, mach_vm_size_t size)
581*33de042dSApple OSS Distributions {
582*33de042dSApple OSS Distributions 	kern_return_t kr = vm_write(map, (vm_address_t) start, (vm_offset_t) start_2, (mach_msg_type_number_t) size);
583*33de042dSApple OSS Distributions 	return kr;
584*33de042dSApple OSS Distributions }
585*33de042dSApple OSS Distributions 
586*33de042dSApple OSS Distributions static kern_return_t
call_vm_write__src(MAP_T map,vm_address_t start,vm_size_t size)587*33de042dSApple OSS Distributions call_vm_write__src(MAP_T map, vm_address_t start, vm_size_t size)
588*33de042dSApple OSS Distributions {
589*33de042dSApple OSS Distributions 	allocation_t dst SMART_ALLOCATE_VM(map, TEST_ALLOC_SIZE, VM_PROT_DEFAULT);
590*33de042dSApple OSS Distributions 	kern_return_t kr = vm_write(map, (vm_address_t) dst.addr, start, (mach_msg_type_number_t) size);
591*33de042dSApple OSS Distributions 	return kr;
592*33de042dSApple OSS Distributions }
593*33de042dSApple OSS Distributions 
594*33de042dSApple OSS Distributions static kern_return_t
call_vm_write__dst(MAP_T map,vm_address_t start,vm_size_t size)595*33de042dSApple OSS Distributions call_vm_write__dst(MAP_T map, vm_address_t start, vm_size_t size)
596*33de042dSApple OSS Distributions {
597*33de042dSApple OSS Distributions 	allocation_t src SMART_ALLOCATE_VM(map, TEST_ALLOC_SIZE, VM_PROT_DEFAULT);
598*33de042dSApple OSS Distributions 	kern_return_t kr = vm_write(map, start, (vm_offset_t) src.addr, (mach_msg_type_number_t) size);
599*33de042dSApple OSS Distributions 	return kr;
600*33de042dSApple OSS Distributions }
601*33de042dSApple OSS Distributions #endif
602*33de042dSApple OSS Distributions 
603*33de042dSApple OSS Distributions // mach_vm_wire, vm_wire (start/size)
604*33de042dSApple OSS Distributions // "wire" and "unwire" paths diverge internally; test both
605*33de042dSApple OSS Distributions #define IMPL(FN, T, FLAVOR, PROT)                                       \
606*33de042dSApple OSS Distributions 	static kern_return_t                                            \
607*33de042dSApple OSS Distributions 	call_ ## FN ## __ ## FLAVOR(MAP_T map, T start, T size)         \
608*33de042dSApple OSS Distributions 	{                                                               \
609*33de042dSApple OSS Distributions 	        mach_port_t host_priv = HOST_PRIV_NULL;                 \
610*33de042dSApple OSS Distributions 	        kern_return_t kr = host_get_host_priv_port(mach_host_self(), &host_priv); \
611*33de042dSApple OSS Distributions 	        assert(kr == 0);  /* host priv port on macOS requires entitlements or root */ \
612*33de042dSApple OSS Distributions 	        kr = FN(host_priv, map, start, size, PROT);             \
613*33de042dSApple OSS Distributions 	        return kr;                                              \
614*33de042dSApple OSS Distributions 	}
615*33de042dSApple OSS Distributions IMPL(mach_vm_wire, mach_vm_address_t, wire, VM_PROT_READ)
616*33de042dSApple OSS Distributions IMPL(mach_vm_wire, mach_vm_address_t, unwire, VM_PROT_NONE)
617*33de042dSApple OSS Distributions // The declaration of vm_wire is buggy on U32.
618*33de042dSApple OSS Distributions // We compile in our own MIG user stub for it with a "replacement_" prefix.
619*33de042dSApple OSS Distributions // rdar://118258929
620*33de042dSApple OSS Distributions IMPL(replacement_vm_wire, mach_vm_address_t, wire, VM_PROT_READ)
621*33de042dSApple OSS Distributions IMPL(replacement_vm_wire, mach_vm_address_t, unwire, VM_PROT_NONE)
622*33de042dSApple OSS Distributions #undef IMPL
623*33de042dSApple OSS Distributions 
624*33de042dSApple OSS Distributions // mach_vm_wire, vm_wire (vm_prot_t)
625*33de042dSApple OSS Distributions #define IMPL(FN, T)                                                     \
626*33de042dSApple OSS Distributions 	static kern_return_t                                            \
627*33de042dSApple OSS Distributions 	call_ ## FN ## __vm_prot(MAP_T map, T start, T size, vm_prot_t prot) \
628*33de042dSApple OSS Distributions 	{                                                               \
629*33de042dSApple OSS Distributions 	        mach_port_t host_priv = HOST_PRIV_NULL;                 \
630*33de042dSApple OSS Distributions 	        kern_return_t kr = host_get_host_priv_port(mach_host_self(), &host_priv); \
631*33de042dSApple OSS Distributions 	        assert(kr == 0);  /* host priv port on macOS requires entitlements or root */ \
632*33de042dSApple OSS Distributions 	        kr = FN(host_priv, map, start, size, prot);             \
633*33de042dSApple OSS Distributions 	        return kr;                                              \
634*33de042dSApple OSS Distributions 	}
635*33de042dSApple OSS Distributions IMPL(mach_vm_wire, mach_vm_address_t)
636*33de042dSApple OSS Distributions // The declaration of vm_wire is buggy on U32.
637*33de042dSApple OSS Distributions // We compile in our own MIG user stub for it with a "replacement_" prefix.
638*33de042dSApple OSS Distributions // rdar://118258929
639*33de042dSApple OSS Distributions IMPL(replacement_vm_wire, mach_vm_address_t)
640*33de042dSApple OSS Distributions #undef IMPL
641*33de042dSApple OSS Distributions 
642*33de042dSApple OSS Distributions 
643*33de042dSApple OSS Distributions // mach_vm_map/vm32_map/vm32_map_64 infra
644*33de042dSApple OSS Distributions 
645*33de042dSApple OSS Distributions typedef kern_return_t (*map_fn_t)(vm_map_t target_task,
646*33de042dSApple OSS Distributions     mach_vm_address_t *address,
647*33de042dSApple OSS Distributions     mach_vm_size_t size,
648*33de042dSApple OSS Distributions     mach_vm_offset_t mask,
649*33de042dSApple OSS Distributions     int flags,
650*33de042dSApple OSS Distributions     mem_entry_name_port_t object,
651*33de042dSApple OSS Distributions     memory_object_offset_t offset,
652*33de042dSApple OSS Distributions     boolean_t copy,
653*33de042dSApple OSS Distributions     vm_prot_t cur_protection,
654*33de042dSApple OSS Distributions     vm_prot_t max_protection,
655*33de042dSApple OSS Distributions     vm_inherit_t inheritance);
656*33de042dSApple OSS Distributions 
657*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)658*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)
659*33de042dSApple OSS Distributions {
660*33de042dSApple OSS Distributions 	mach_vm_address_t out_addr = start;
661*33de042dSApple OSS Distributions 	kern_return_t kr = fn(map, &out_addr, size, 0, VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE,
662*33de042dSApple OSS Distributions 	    0, 0, 0, 0, 0, VM_INHERIT_NONE);
663*33de042dSApple OSS Distributions 	// fixed-overwrite with pre-existing allocation, don't deallocate
664*33de042dSApple OSS Distributions 	return kr;
665*33de042dSApple OSS Distributions }
666*33de042dSApple OSS Distributions 
667*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)668*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)
669*33de042dSApple OSS Distributions {
670*33de042dSApple OSS Distributions 	mach_vm_address_t out_addr = start;
671*33de042dSApple OSS Distributions 	kern_return_t kr = fn(map, &out_addr, size, 0, VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE,
672*33de042dSApple OSS Distributions 	    0, 0, true, 0, 0, VM_INHERIT_NONE);
673*33de042dSApple OSS Distributions 	// fixed-overwrite with pre-existing allocation, don't deallocate
674*33de042dSApple OSS Distributions 	return kr;
675*33de042dSApple OSS Distributions }
676*33de042dSApple OSS Distributions 
677*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)678*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)
679*33de042dSApple OSS Distributions {
680*33de042dSApple OSS Distributions 	mach_vm_address_t out_addr = start_hint;
681*33de042dSApple OSS Distributions 	kern_return_t kr = fn(map, &out_addr, size, 0, VM_FLAGS_ANYWHERE, 0, 0, 0, 0, 0, VM_INHERIT_NONE);
682*33de042dSApple OSS Distributions 	if (kr == 0) {
683*33de042dSApple OSS Distributions 		(void)mach_vm_deallocate(map, out_addr, size);
684*33de042dSApple OSS Distributions 	}
685*33de042dSApple OSS Distributions 	return kr;
686*33de042dSApple OSS Distributions }
687*33de042dSApple OSS Distributions 
688*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)689*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)
690*33de042dSApple OSS Distributions {
691*33de042dSApple OSS Distributions 	mach_port_t memobject = make_a_mem_object(TEST_ALLOC_SIZE + 1);
692*33de042dSApple OSS Distributions 	mach_vm_address_t out_addr = start;
693*33de042dSApple OSS Distributions 	kern_return_t kr = fn(map, &out_addr, size, 0, VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE,
694*33de042dSApple OSS Distributions 	    memobject, KB16, false, VM_PROT_DEFAULT, VM_PROT_DEFAULT, VM_INHERIT_DEFAULT);
695*33de042dSApple OSS Distributions 	(void)mach_port_deallocate(mach_task_self(), memobject);
696*33de042dSApple OSS Distributions 	// fixed-overwrite with pre-existing allocation, don't deallocate
697*33de042dSApple OSS Distributions 	return kr;
698*33de042dSApple OSS Distributions }
699*33de042dSApple OSS Distributions 
700*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)701*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)
702*33de042dSApple OSS Distributions {
703*33de042dSApple OSS Distributions 	mach_port_t memobject = make_a_mem_object(TEST_ALLOC_SIZE + 1);
704*33de042dSApple OSS Distributions 	mach_vm_address_t out_addr = start;
705*33de042dSApple OSS Distributions 	kern_return_t kr = fn(map, &out_addr, size, 0, VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE,
706*33de042dSApple OSS Distributions 	    memobject, KB16, true, VM_PROT_DEFAULT, VM_PROT_DEFAULT, VM_INHERIT_DEFAULT);
707*33de042dSApple OSS Distributions 	(void)mach_port_deallocate(mach_task_self(), memobject);
708*33de042dSApple OSS Distributions 	// fixed-overwrite with pre-existing allocation, don't deallocate
709*33de042dSApple OSS Distributions 	return kr;
710*33de042dSApple OSS Distributions }
711*33de042dSApple OSS Distributions 
712*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)713*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)
714*33de042dSApple OSS Distributions {
715*33de042dSApple OSS Distributions 	mach_port_t memobject = make_a_mem_object(TEST_ALLOC_SIZE + 1);
716*33de042dSApple OSS Distributions 	mach_vm_address_t out_addr = start_hint;
717*33de042dSApple OSS Distributions 	kern_return_t kr = fn(map, &out_addr, size, 0, VM_FLAGS_ANYWHERE, memobject,
718*33de042dSApple OSS Distributions 	    KB16, false, VM_PROT_DEFAULT, VM_PROT_DEFAULT, VM_INHERIT_DEFAULT);
719*33de042dSApple OSS Distributions 	if (kr == 0) {
720*33de042dSApple OSS Distributions 		(void)mach_vm_deallocate(map, out_addr, size);
721*33de042dSApple OSS Distributions 	}
722*33de042dSApple OSS Distributions 	(void)mach_port_deallocate(mach_task_self(), memobject);
723*33de042dSApple OSS Distributions 	return kr;
724*33de042dSApple OSS Distributions }
725*33de042dSApple OSS Distributions 
726*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)727*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)
728*33de042dSApple OSS Distributions {
729*33de042dSApple OSS Distributions 	mach_port_t memobject = make_a_mem_object(obj_size);
730*33de042dSApple OSS Distributions 	mach_vm_address_t out_addr = start;
731*33de042dSApple OSS Distributions 	kern_return_t kr = fn(map, &out_addr, size, 0, flags, memobject,
732*33de042dSApple OSS Distributions 	    offset, copy, VM_PROT_DEFAULT, VM_PROT_DEFAULT, VM_INHERIT_DEFAULT);
733*33de042dSApple OSS Distributions 	deallocate_if_not_fixed_overwrite(kr, map, out_addr, size, flags);
734*33de042dSApple OSS Distributions 	(void)mach_port_deallocate(mach_task_self(), memobject);
735*33de042dSApple OSS Distributions 	return kr;
736*33de042dSApple OSS Distributions }
737*33de042dSApple OSS Distributions 
738*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)739*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)
740*33de042dSApple OSS Distributions {
741*33de042dSApple OSS Distributions 	return helper_call_map_fn__memobject__ssoo(fn, map, VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE, false, start, size, offset, obj_size);
742*33de042dSApple OSS Distributions }
743*33de042dSApple OSS Distributions 
744*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)745*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)
746*33de042dSApple OSS Distributions {
747*33de042dSApple OSS Distributions 	return helper_call_map_fn__memobject__ssoo(fn, map, VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE, true, start, size, offset, obj_size);
748*33de042dSApple OSS Distributions }
749*33de042dSApple OSS Distributions 
750*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)751*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)
752*33de042dSApple OSS Distributions {
753*33de042dSApple OSS Distributions 	return helper_call_map_fn__memobject__ssoo(fn, map, VM_FLAGS_ANYWHERE, false, start, size, offset, obj_size);
754*33de042dSApple OSS Distributions }
755*33de042dSApple OSS Distributions 
756*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)757*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)
758*33de042dSApple OSS Distributions {
759*33de042dSApple OSS Distributions 	mach_vm_address_t out_addr = start;
760*33de042dSApple OSS Distributions 	kern_return_t kr = fn(map, &out_addr, size, 0, flags,
761*33de042dSApple OSS Distributions 	    0, KB16, copy, VM_PROT_DEFAULT, VM_PROT_DEFAULT, inherit);
762*33de042dSApple OSS Distributions 	deallocate_if_not_fixed_overwrite(kr, map, out_addr, size, flags);
763*33de042dSApple OSS Distributions 	return kr;
764*33de042dSApple OSS Distributions }
765*33de042dSApple OSS Distributions 
766*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)767*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)
768*33de042dSApple OSS Distributions {
769*33de042dSApple OSS Distributions 	return help_call_map_fn__allocate__inherit(fn, map, VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE, false, start, size, inherit);
770*33de042dSApple OSS Distributions }
771*33de042dSApple OSS Distributions 
772*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)773*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)
774*33de042dSApple OSS Distributions {
775*33de042dSApple OSS Distributions 	return help_call_map_fn__allocate__inherit(fn, map, VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE, true, start, size, inherit);
776*33de042dSApple OSS Distributions }
777*33de042dSApple OSS Distributions 
778*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)779*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)
780*33de042dSApple OSS Distributions {
781*33de042dSApple OSS Distributions 	return help_call_map_fn__allocate__inherit(fn, map, VM_FLAGS_ANYWHERE, false, start, size, inherit);
782*33de042dSApple OSS Distributions }
783*33de042dSApple OSS Distributions 
784*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)785*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)
786*33de042dSApple OSS Distributions {
787*33de042dSApple OSS Distributions 	mach_port_t memobject = make_a_mem_object(TEST_ALLOC_SIZE + 1);
788*33de042dSApple OSS Distributions 	mach_vm_address_t out_addr = start;
789*33de042dSApple OSS Distributions 	kern_return_t kr = fn(map, &out_addr, size, 0, flags,
790*33de042dSApple OSS Distributions 	    memobject, KB16, copy, VM_PROT_DEFAULT, VM_PROT_DEFAULT, inherit);
791*33de042dSApple OSS Distributions 	deallocate_if_not_fixed_overwrite(kr, map, out_addr, size, flags);
792*33de042dSApple OSS Distributions 	(void)mach_port_deallocate(mach_task_self(), memobject);
793*33de042dSApple OSS Distributions 	return kr;
794*33de042dSApple OSS Distributions }
795*33de042dSApple OSS Distributions 
796*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)797*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)
798*33de042dSApple OSS Distributions {
799*33de042dSApple OSS Distributions 	return help_call_map_fn__memobject__inherit(fn, map, VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE, false, start, size, inherit);
800*33de042dSApple OSS Distributions }
801*33de042dSApple OSS Distributions 
802*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)803*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)
804*33de042dSApple OSS Distributions {
805*33de042dSApple OSS Distributions 	return help_call_map_fn__memobject__inherit(fn, map, VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE, true, start, size, inherit);
806*33de042dSApple OSS Distributions }
807*33de042dSApple OSS Distributions 
808*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)809*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)
810*33de042dSApple OSS Distributions {
811*33de042dSApple OSS Distributions 	return help_call_map_fn__memobject__inherit(fn, map, VM_FLAGS_ANYWHERE, false, start, size, inherit);
812*33de042dSApple OSS Distributions }
813*33de042dSApple OSS Distributions 
814*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)815*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)
816*33de042dSApple OSS Distributions {
817*33de042dSApple OSS Distributions 	kern_return_t kr = fn(map, start, size, 0, flags,
818*33de042dSApple OSS Distributions 	    0, KB16, false, VM_PROT_DEFAULT, VM_PROT_DEFAULT, VM_INHERIT_DEFAULT);
819*33de042dSApple OSS Distributions 	deallocate_if_not_fixed_overwrite(kr, map, *start, size, flags);
820*33de042dSApple OSS Distributions 	return kr;
821*33de042dSApple OSS Distributions }
822*33de042dSApple OSS Distributions 
823*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)824*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)
825*33de042dSApple OSS Distributions {
826*33de042dSApple OSS Distributions 	kern_return_t kr = fn(map, start, size, 0, flags,
827*33de042dSApple OSS Distributions 	    0, KB16, false, VM_PROT_DEFAULT, VM_PROT_DEFAULT, VM_INHERIT_DEFAULT);
828*33de042dSApple OSS Distributions 	deallocate_if_not_fixed_overwrite(kr, map, *start, size, flags);
829*33de042dSApple OSS Distributions 	return kr;
830*33de042dSApple OSS Distributions }
831*33de042dSApple OSS Distributions 
832*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)833*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)
834*33de042dSApple OSS Distributions {
835*33de042dSApple OSS Distributions 	mach_port_t memobject = make_a_mem_object(TEST_ALLOC_SIZE + 1);
836*33de042dSApple OSS Distributions 	kern_return_t kr = fn(map, start, size, 0, flags,
837*33de042dSApple OSS Distributions 	    memobject, KB16, false, VM_PROT_DEFAULT, VM_PROT_DEFAULT, VM_INHERIT_DEFAULT);
838*33de042dSApple OSS Distributions 	deallocate_if_not_fixed_overwrite(kr, map, *start, size, flags);
839*33de042dSApple OSS Distributions 	(void)mach_port_deallocate(mach_task_self(), memobject);
840*33de042dSApple OSS Distributions 	return kr;
841*33de042dSApple OSS Distributions }
842*33de042dSApple OSS Distributions 
843*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)844*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)
845*33de042dSApple OSS Distributions {
846*33de042dSApple OSS Distributions 	mach_port_t memobject = make_a_mem_object(TEST_ALLOC_SIZE + 1);
847*33de042dSApple OSS Distributions 	kern_return_t kr = fn(map, start, size, 0, flags,
848*33de042dSApple OSS Distributions 	    memobject, KB16, true, VM_PROT_DEFAULT, VM_PROT_DEFAULT, VM_INHERIT_DEFAULT);
849*33de042dSApple OSS Distributions 	deallocate_if_not_fixed_overwrite(kr, map, *start, size, flags);
850*33de042dSApple OSS Distributions 	(void)mach_port_deallocate(mach_task_self(), memobject);
851*33de042dSApple OSS Distributions 	return kr;
852*33de042dSApple OSS Distributions }
853*33de042dSApple OSS Distributions 
854*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)855*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)
856*33de042dSApple OSS Distributions {
857*33de042dSApple OSS Distributions 	mach_vm_address_t out_addr = 0;
858*33de042dSApple OSS Distributions 	kern_return_t kr = fn(map, &out_addr, KB16, 0, flags,
859*33de042dSApple OSS Distributions 	    0, KB16, copy, cur, max, VM_INHERIT_DEFAULT);
860*33de042dSApple OSS Distributions 	deallocate_if_not_fixed_overwrite(kr, map, out_addr, KB16, flags);
861*33de042dSApple OSS Distributions 	return kr;
862*33de042dSApple OSS Distributions }
863*33de042dSApple OSS Distributions 
864*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)865*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)
866*33de042dSApple OSS Distributions {
867*33de042dSApple OSS Distributions 	return help_call_map_fn__allocate__prot_pairs(fn, map, VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE, false, cur, max);
868*33de042dSApple OSS Distributions }
869*33de042dSApple OSS Distributions 
870*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)871*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)
872*33de042dSApple OSS Distributions {
873*33de042dSApple OSS Distributions 	return help_call_map_fn__allocate__prot_pairs(fn, map, VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE, true, cur, max);
874*33de042dSApple OSS Distributions }
875*33de042dSApple OSS Distributions 
876*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)877*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)
878*33de042dSApple OSS Distributions {
879*33de042dSApple OSS Distributions 	return help_call_map_fn__allocate__prot_pairs(fn, map, VM_FLAGS_ANYWHERE, false, cur, max);
880*33de042dSApple OSS Distributions }
881*33de042dSApple OSS Distributions 
882*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)883*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)
884*33de042dSApple OSS Distributions {
885*33de042dSApple OSS Distributions 	mach_port_t memobject = make_a_mem_object(TEST_ALLOC_SIZE + 1);
886*33de042dSApple OSS Distributions 	mach_vm_address_t out_addr = 0;
887*33de042dSApple OSS Distributions 	kern_return_t kr = fn(map, &out_addr, KB16, 0, flags,
888*33de042dSApple OSS Distributions 	    memobject, KB16, copy, cur, max, VM_INHERIT_DEFAULT);
889*33de042dSApple OSS Distributions 	deallocate_if_not_fixed_overwrite(kr, map, out_addr, KB16, flags);
890*33de042dSApple OSS Distributions 	return kr;
891*33de042dSApple OSS Distributions }
892*33de042dSApple OSS Distributions 
893*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)894*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)
895*33de042dSApple OSS Distributions {
896*33de042dSApple OSS Distributions 	return help_call_map_fn__memobject__prot_pairs(fn, map, VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE, false, cur, max);
897*33de042dSApple OSS Distributions }
898*33de042dSApple OSS Distributions 
899*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)900*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)
901*33de042dSApple OSS Distributions {
902*33de042dSApple OSS Distributions 	return help_call_map_fn__memobject__prot_pairs(fn, map, VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE, true, cur, max);
903*33de042dSApple OSS Distributions }
904*33de042dSApple OSS Distributions 
905*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)906*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)
907*33de042dSApple OSS Distributions {
908*33de042dSApple OSS Distributions 	return help_call_map_fn__memobject__prot_pairs(fn, map, VM_FLAGS_ANYWHERE, false, cur, max);
909*33de042dSApple OSS Distributions }
910*33de042dSApple OSS Distributions 
911*33de042dSApple OSS Distributions // implementations
912*33de042dSApple OSS Distributions 
913*33de042dSApple OSS Distributions #define IMPL_MAP_FN_START_SIZE(map_fn, instance)                                                \
914*33de042dSApple OSS Distributions     static kern_return_t                                                                        \
915*33de042dSApple OSS Distributions     call_ ## map_fn ## __ ## instance (MAP_T map, mach_vm_address_t start, mach_vm_size_t size) \
916*33de042dSApple OSS Distributions     {                                                                                           \
917*33de042dSApple OSS Distributions 	return call_map_fn__ ## instance(map_fn, map, start, size);                             \
918*33de042dSApple OSS Distributions     }
919*33de042dSApple OSS Distributions 
920*33de042dSApple OSS Distributions #define IMPL_MAP_FN_HINT_SIZE(map_fn, instance)                                                      \
921*33de042dSApple OSS Distributions     static kern_return_t                                                                             \
922*33de042dSApple OSS Distributions     call_ ## map_fn ## __ ## instance (MAP_T map, mach_vm_address_t start_hint, mach_vm_size_t size) \
923*33de042dSApple OSS Distributions     {                                                                                                \
924*33de042dSApple OSS Distributions 	return call_map_fn__ ## instance(map_fn, map, start_hint, size);                             \
925*33de042dSApple OSS Distributions     }
926*33de042dSApple OSS Distributions 
927*33de042dSApple OSS Distributions #define IMPL_MAP_FN_START_SIZE_OFFSET_OBJECT(map_fn, instance)                                                                                                                   \
928*33de042dSApple OSS Distributions     static kern_return_t                                                                                                                                                         \
929*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) \
930*33de042dSApple OSS Distributions     {                                                                                                                                                                            \
931*33de042dSApple OSS Distributions 	return call_map_fn__ ## instance ## __start_size_offset_object(map_fn, map, start, size, offset, obj_size);                                                              \
932*33de042dSApple OSS Distributions     }
933*33de042dSApple OSS Distributions 
934*33de042dSApple OSS Distributions #define IMPL_MAP_FN_START_SIZE_INHERIT(map_fn, instance)                                                                          \
935*33de042dSApple OSS Distributions     static kern_return_t                                                                                                          \
936*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) \
937*33de042dSApple OSS Distributions     {                                                                                                                             \
938*33de042dSApple OSS Distributions 	return call_map_fn__ ## instance ## __inherit(map_fn, map, start, size, inherit);                                         \
939*33de042dSApple OSS Distributions     }
940*33de042dSApple OSS Distributions 
941*33de042dSApple OSS Distributions #define IMPL_MAP_FN_START_SIZE_FLAGS(map_fn, instance)                                                                 \
942*33de042dSApple OSS Distributions     static kern_return_t                                                                                               \
943*33de042dSApple OSS Distributions     call_ ## map_fn ## __ ## instance ## __flags(MAP_T map, mach_vm_address_t * start, mach_vm_size_t size, int flags) \
944*33de042dSApple OSS Distributions     {                                                                                                                  \
945*33de042dSApple OSS Distributions 	return call_map_fn__ ## instance ## __flags(map_fn, map, start, size, flags);                                  \
946*33de042dSApple OSS Distributions     }
947*33de042dSApple OSS Distributions 
948*33de042dSApple OSS Distributions #define IMPL_MAP_FN_PROT_PAIRS(map_fn, instance)                                               \
949*33de042dSApple OSS Distributions     static kern_return_t                                                                       \
950*33de042dSApple OSS Distributions     call_ ## map_fn ## __ ## instance ## __prot_pairs(MAP_T map, vm_prot_t cur, vm_prot_t max) \
951*33de042dSApple OSS Distributions     {                                                                                          \
952*33de042dSApple OSS Distributions 	return call_map_fn__ ## instance ## __prot_pairs(map_fn, map, cur, max);               \
953*33de042dSApple OSS Distributions     }
954*33de042dSApple OSS Distributions 
955*33de042dSApple OSS Distributions #define IMPL(map_fn)                                                       \
956*33de042dSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE(map_fn, allocate_fixed)                     \
957*33de042dSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE(map_fn, allocate_fixed_copy)                \
958*33de042dSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE(map_fn, memobject_fixed)                    \
959*33de042dSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE(map_fn, memobject_fixed_copy)               \
960*33de042dSApple OSS Distributions 	IMPL_MAP_FN_HINT_SIZE(map_fn, allocate_anywhere)                   \
961*33de042dSApple OSS Distributions 	IMPL_MAP_FN_HINT_SIZE(map_fn, memobject_anywhere)                  \
962*33de042dSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE_OFFSET_OBJECT(map_fn, memobject_fixed)      \
963*33de042dSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE_OFFSET_OBJECT(map_fn, memobject_fixed_copy) \
964*33de042dSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE_OFFSET_OBJECT(map_fn, memobject_anywhere)   \
965*33de042dSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE_INHERIT(map_fn, allocate_fixed)             \
966*33de042dSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE_INHERIT(map_fn, allocate_fixed_copy)        \
967*33de042dSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE_INHERIT(map_fn, allocate_anywhere)          \
968*33de042dSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE_INHERIT(map_fn, memobject_fixed)            \
969*33de042dSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE_INHERIT(map_fn, memobject_fixed_copy)       \
970*33de042dSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE_INHERIT(map_fn, memobject_anywhere)         \
971*33de042dSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE_FLAGS(map_fn, allocate)                     \
972*33de042dSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE_FLAGS(map_fn, allocate_copy)                \
973*33de042dSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE_FLAGS(map_fn, memobject)                    \
974*33de042dSApple OSS Distributions 	IMPL_MAP_FN_START_SIZE_FLAGS(map_fn, memobject_copy)               \
975*33de042dSApple OSS Distributions 	IMPL_MAP_FN_PROT_PAIRS(map_fn, allocate_fixed)                     \
976*33de042dSApple OSS Distributions 	IMPL_MAP_FN_PROT_PAIRS(map_fn, allocate_fixed_copy)                \
977*33de042dSApple OSS Distributions 	IMPL_MAP_FN_PROT_PAIRS(map_fn, allocate_anywhere)                  \
978*33de042dSApple OSS Distributions 	IMPL_MAP_FN_PROT_PAIRS(map_fn, memobject_fixed)                    \
979*33de042dSApple OSS Distributions 	IMPL_MAP_FN_PROT_PAIRS(map_fn, memobject_fixed_copy)               \
980*33de042dSApple OSS Distributions 	IMPL_MAP_FN_PROT_PAIRS(map_fn, memobject_anywhere)                 \
981*33de042dSApple OSS Distributions 
982*33de042dSApple OSS Distributions static 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)983*33de042dSApple OSS Distributions mach_vm_map_wrapped(vm_map_t target_task,
984*33de042dSApple OSS Distributions     mach_vm_address_t *address,
985*33de042dSApple OSS Distributions     mach_vm_size_t size,
986*33de042dSApple OSS Distributions     mach_vm_offset_t mask,
987*33de042dSApple OSS Distributions     int flags,
988*33de042dSApple OSS Distributions     mem_entry_name_port_t object,
989*33de042dSApple OSS Distributions     memory_object_offset_t offset,
990*33de042dSApple OSS Distributions     boolean_t copy,
991*33de042dSApple OSS Distributions     vm_prot_t cur_protection,
992*33de042dSApple OSS Distributions     vm_prot_t max_protection,
993*33de042dSApple OSS Distributions     vm_inherit_t inheritance)
994*33de042dSApple OSS Distributions {
995*33de042dSApple OSS Distributions 	mach_vm_address_t addr = *address;
996*33de042dSApple OSS Distributions 	kern_return_t kr = mach_vm_map(target_task, &addr, size, mask, flags, object, offset, copy, cur_protection, max_protection, inheritance);
997*33de042dSApple OSS Distributions 	check_mach_vm_map_outparam_changes(&kr, addr, *address, flags, target_task);
998*33de042dSApple OSS Distributions 	*address = addr;
999*33de042dSApple OSS Distributions 	return kr;
1000*33de042dSApple OSS Distributions }
IMPL(mach_vm_map_wrapped)1001*33de042dSApple OSS Distributions IMPL(mach_vm_map_wrapped)
1002*33de042dSApple OSS Distributions 
1003*33de042dSApple OSS Distributions #if TEST_OLD_STYLE_MACH
1004*33de042dSApple OSS Distributions static kern_return_t
1005*33de042dSApple OSS Distributions vm_map_64_retyped(vm_map_t target_task,
1006*33de042dSApple OSS Distributions     mach_vm_address_t *address,
1007*33de042dSApple OSS Distributions     mach_vm_size_t size,
1008*33de042dSApple OSS Distributions     mach_vm_offset_t mask,
1009*33de042dSApple OSS Distributions     int flags,
1010*33de042dSApple OSS Distributions     mem_entry_name_port_t object,
1011*33de042dSApple OSS Distributions     memory_object_offset_t offset,
1012*33de042dSApple OSS Distributions     boolean_t copy,
1013*33de042dSApple OSS Distributions     vm_prot_t cur_protection,
1014*33de042dSApple OSS Distributions     vm_prot_t max_protection,
1015*33de042dSApple OSS Distributions     vm_inherit_t inheritance)
1016*33de042dSApple OSS Distributions {
1017*33de042dSApple OSS Distributions 	vm_address_t addr = (vm_address_t)*address;
1018*33de042dSApple OSS Distributions 	kern_return_t kr = vm_map_64(target_task, &addr, (vm_size_t)size, (vm_address_t)mask, flags, object, (vm_offset_t)offset, copy, cur_protection, max_protection, inheritance);
1019*33de042dSApple OSS Distributions 	check_mach_vm_map_outparam_changes(&kr, addr, (vm_address_t)*address, flags, target_task);
1020*33de042dSApple OSS Distributions 	*address = addr;
1021*33de042dSApple OSS Distributions 	return kr;
1022*33de042dSApple OSS Distributions }
IMPL(vm_map_64_retyped)1023*33de042dSApple OSS Distributions IMPL(vm_map_64_retyped)
1024*33de042dSApple OSS Distributions 
1025*33de042dSApple OSS Distributions static kern_return_t
1026*33de042dSApple OSS Distributions vm_map_retyped(vm_map_t target_task,
1027*33de042dSApple OSS Distributions     mach_vm_address_t *address,
1028*33de042dSApple OSS Distributions     mach_vm_size_t size,
1029*33de042dSApple OSS Distributions     mach_vm_offset_t mask,
1030*33de042dSApple OSS Distributions     int flags,
1031*33de042dSApple OSS Distributions     mem_entry_name_port_t object,
1032*33de042dSApple OSS Distributions     memory_object_offset_t offset,
1033*33de042dSApple OSS Distributions     boolean_t copy,
1034*33de042dSApple OSS Distributions     vm_prot_t cur_protection,
1035*33de042dSApple OSS Distributions     vm_prot_t max_protection,
1036*33de042dSApple OSS Distributions     vm_inherit_t inheritance)
1037*33de042dSApple OSS Distributions {
1038*33de042dSApple OSS Distributions 	vm_address_t addr = (vm_address_t)*address;
1039*33de042dSApple OSS Distributions 	kern_return_t kr = vm_map(target_task, &addr, (vm_size_t)size, (vm_address_t)mask, flags, object, (vm_offset_t)offset, copy, cur_protection, max_protection, inheritance);
1040*33de042dSApple OSS Distributions 	check_mach_vm_map_outparam_changes(&kr, addr, (vm_address_t)*address, flags, target_task);
1041*33de042dSApple OSS Distributions 	*address = addr;
1042*33de042dSApple OSS Distributions 	return kr;
1043*33de042dSApple OSS Distributions }
1044*33de042dSApple OSS Distributions IMPL(vm_map_retyped)
1045*33de042dSApple OSS Distributions #endif
1046*33de042dSApple OSS Distributions 
1047*33de042dSApple OSS Distributions #undef IMPL_MAP_FN_START_SIZE
1048*33de042dSApple OSS Distributions #undef IMPL_MAP_FN_SIZE
1049*33de042dSApple OSS Distributions #undef IMPL_MAP_FN_START_SIZE_OFFSET_OBJECT
1050*33de042dSApple OSS Distributions #undef IMPL_MAP_FN_START_SIZE_INHERIT
1051*33de042dSApple OSS Distributions #undef IMPL_MAP_FN_START_SIZE_FLAGS
1052*33de042dSApple OSS Distributions #undef IMPL_MAP_FN_PROT_PAIRS
1053*33de042dSApple OSS Distributions #undef IMPL
1054*33de042dSApple OSS Distributions 
1055*33de042dSApple OSS Distributions 
1056*33de042dSApple OSS Distributions // mmap
1057*33de042dSApple OSS Distributions // Directly calling this symbol lets us hit the syscall directly instead of the libsyscall wrapper.
1058*33de042dSApple OSS Distributions void *__mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t off);
1059*33de042dSApple OSS Distributions 
1060*33de042dSApple OSS Distributions // We invert MAP_UNIX03 in the flags. This is because by default libsyscall intercepts calls to mmap and adds MAP_UNIX03.
1061*33de042dSApple OSS Distributions // That means MAP_UNIX03 should be the default for most of our tests, and we should only test without MAP_UNIX03 when we explicitly want to.
1062*33de042dSApple OSS Distributions void *
mmap_wrapper(void * addr,size_t len,int prot,int flags,int fildes,off_t off)1063*33de042dSApple OSS Distributions mmap_wrapper(void *addr, size_t len, int prot, int flags, int fildes, off_t off)
1064*33de042dSApple OSS Distributions {
1065*33de042dSApple OSS Distributions 	flags ^= MAP_UNIX03;
1066*33de042dSApple OSS Distributions 	return __mmap(addr, len, prot, flags, fildes, off);
1067*33de042dSApple OSS Distributions }
1068*33de042dSApple OSS Distributions 
1069*33de042dSApple OSS Distributions // Rename the UNIX03 flag for the code below since we're inverting its meaning.
1070*33de042dSApple OSS Distributions #define MAP_NOT_UNIX03 0x40000
1071*33de042dSApple OSS Distributions static_assert(MAP_NOT_UNIX03 == MAP_UNIX03, "MAP_UNIX03 value changed");
1072*33de042dSApple OSS Distributions #undef MAP_UNIX03
1073*33de042dSApple OSS Distributions #define MAP_UNIX03 dont_use_MAP_UNIX03
1074*33de042dSApple OSS Distributions 
1075*33de042dSApple OSS Distributions // helpers
1076*33de042dSApple OSS Distributions 
1077*33de042dSApple OSS Distributions // Return true if security policy disallows unsigned code.
1078*33de042dSApple OSS Distributions // Some test results are expected to change with this set.
1079*33de042dSApple OSS Distributions static bool
unsigned_code_is_disallowed(void)1080*33de042dSApple OSS Distributions unsigned_code_is_disallowed(void)
1081*33de042dSApple OSS Distributions {
1082*33de042dSApple OSS Distributions 	if (isRosetta()) {
1083*33de042dSApple OSS Distributions 		return false;
1084*33de042dSApple OSS Distributions 	}
1085*33de042dSApple OSS Distributions 
1086*33de042dSApple OSS Distributions 	int out_value = 0;
1087*33de042dSApple OSS Distributions 	size_t io_size = sizeof(out_value);
1088*33de042dSApple OSS Distributions 	if (0 == sysctlbyname("security.mac.amfi.unsigned_code_policy",
1089*33de042dSApple OSS Distributions 	    &out_value, &io_size, NULL, 0)) {
1090*33de042dSApple OSS Distributions 		return out_value;
1091*33de042dSApple OSS Distributions 	}
1092*33de042dSApple OSS Distributions 
1093*33de042dSApple OSS Distributions 	// sysctl not present, assume unsigned code is okay
1094*33de042dSApple OSS Distributions 	return false;
1095*33de042dSApple OSS Distributions }
1096*33de042dSApple OSS Distributions 
1097*33de042dSApple OSS Distributions static int
maybe_hide_mmap_failure(int ret,int prot,int fd)1098*33de042dSApple OSS Distributions maybe_hide_mmap_failure(int ret, int prot, int fd)
1099*33de042dSApple OSS Distributions {
1100*33de042dSApple OSS Distributions 	// Special case for mmap(PROT_EXEC, fd).
1101*33de042dSApple OSS Distributions 	// When SIP is enabled these get EPERM from mac_file_check_mmap().
1102*33de042dSApple OSS Distributions 	// The golden files record the SIP-disabled values.
1103*33de042dSApple OSS Distributions 	// This special case also allows the test to succeed when SIP
1104*33de042dSApple OSS Distributions 	// is enabled even though the return value isn't the golden one.
1105*33de042dSApple OSS Distributions 	if (ret == EPERM && fd != -1 && (prot & PROT_EXEC) &&
1106*33de042dSApple OSS Distributions 	    unsigned_code_is_disallowed()) {
1107*33de042dSApple OSS Distributions 		return ACCEPTABLE;
1108*33de042dSApple OSS Distributions 	}
1109*33de042dSApple OSS Distributions 	return ret;
1110*33de042dSApple OSS Distributions }
1111*33de042dSApple OSS Distributions 
1112*33de042dSApple OSS Distributions static kern_return_t
help_call_mmap__vm_prot(MAP_T map __unused,int flags,mach_vm_address_t start,mach_vm_size_t size,vm_prot_t prot)1113*33de042dSApple OSS Distributions help_call_mmap__vm_prot(MAP_T map __unused, int flags, mach_vm_address_t start, mach_vm_size_t size, vm_prot_t prot)
1114*33de042dSApple OSS Distributions {
1115*33de042dSApple OSS Distributions 	int fd = -1;
1116*33de042dSApple OSS Distributions 	if (!(flags & MAP_ANON)) {
1117*33de042dSApple OSS Distributions 		fd = get_fd();
1118*33de042dSApple OSS Distributions 	}
1119*33de042dSApple OSS Distributions 	void *rv = mmap_wrapper((void *)start, size, prot, flags, fd, 0);
1120*33de042dSApple OSS Distributions 	if (rv == MAP_FAILED) {
1121*33de042dSApple OSS Distributions 		return maybe_hide_mmap_failure(errno, prot, fd);
1122*33de042dSApple OSS Distributions 	} else {
1123*33de042dSApple OSS Distributions 		assert(0 == munmap_helper(rv, size));
1124*33de042dSApple OSS Distributions 		return 0;
1125*33de042dSApple OSS Distributions 	}
1126*33de042dSApple OSS Distributions }
1127*33de042dSApple OSS Distributions 
1128*33de042dSApple OSS Distributions static kern_return_t
help_call_mmap__kernel_flags(MAP_T map __unused,int mmap_flags,mach_vm_address_t start,mach_vm_size_t size,int kernel_flags)1129*33de042dSApple OSS Distributions help_call_mmap__kernel_flags(MAP_T map __unused, int mmap_flags, mach_vm_address_t start, mach_vm_size_t size, int kernel_flags)
1130*33de042dSApple OSS Distributions {
1131*33de042dSApple OSS Distributions 	void *rv = mmap_wrapper((void *)start, size, VM_PROT_DEFAULT, mmap_flags, kernel_flags, 0);
1132*33de042dSApple OSS Distributions 	if (rv == MAP_FAILED) {
1133*33de042dSApple OSS Distributions 		return errno;
1134*33de042dSApple OSS Distributions 	} else {
1135*33de042dSApple OSS Distributions 		assert(0 == munmap_helper(rv, size));
1136*33de042dSApple OSS Distributions 		return 0;
1137*33de042dSApple OSS Distributions 	}
1138*33de042dSApple OSS Distributions }
1139*33de042dSApple OSS Distributions 
1140*33de042dSApple OSS Distributions static kern_return_t
help_call_mmap__dst_size_fileoff(MAP_T map __unused,int flags,mach_vm_address_t dst,mach_vm_size_t size,mach_vm_address_t fileoff)1141*33de042dSApple OSS Distributions help_call_mmap__dst_size_fileoff(MAP_T map __unused, int flags, mach_vm_address_t dst, mach_vm_size_t size, mach_vm_address_t fileoff)
1142*33de042dSApple OSS Distributions {
1143*33de042dSApple OSS Distributions 	int fd = -1;
1144*33de042dSApple OSS Distributions 	if (!(flags & MAP_ANON)) {
1145*33de042dSApple OSS Distributions 		fd = get_fd();
1146*33de042dSApple OSS Distributions 	}
1147*33de042dSApple OSS Distributions 	void *rv = mmap_wrapper((void *)dst, size, VM_PROT_DEFAULT, flags, fd, (off_t)fileoff);
1148*33de042dSApple OSS Distributions 	if (rv == MAP_FAILED) {
1149*33de042dSApple OSS Distributions 		return errno;
1150*33de042dSApple OSS Distributions 	} else {
1151*33de042dSApple OSS Distributions 		assert(0 == munmap_helper(rv, size));
1152*33de042dSApple OSS Distributions 		return 0;
1153*33de042dSApple OSS Distributions 	}
1154*33de042dSApple OSS Distributions }
1155*33de042dSApple OSS Distributions 
1156*33de042dSApple OSS Distributions static kern_return_t
help_call_mmap__start_size(MAP_T map __unused,int flags,mach_vm_address_t start,mach_vm_size_t size)1157*33de042dSApple OSS Distributions help_call_mmap__start_size(MAP_T map __unused, int flags, mach_vm_address_t start, mach_vm_size_t size)
1158*33de042dSApple OSS Distributions {
1159*33de042dSApple OSS Distributions 	int fd = -1;
1160*33de042dSApple OSS Distributions 	if (!(flags & MAP_ANON)) {
1161*33de042dSApple OSS Distributions 		fd = get_fd();
1162*33de042dSApple OSS Distributions 	}
1163*33de042dSApple OSS Distributions 	void *rv = mmap_wrapper((void *)start, size, VM_PROT_DEFAULT, flags, fd, 0);
1164*33de042dSApple OSS Distributions 	if (rv == MAP_FAILED) {
1165*33de042dSApple OSS Distributions 		return errno;
1166*33de042dSApple OSS Distributions 	} else {
1167*33de042dSApple OSS Distributions 		assert(0 == munmap_helper(rv, size));
1168*33de042dSApple OSS Distributions 		return 0;
1169*33de042dSApple OSS Distributions 	}
1170*33de042dSApple OSS Distributions }
1171*33de042dSApple OSS Distributions 
1172*33de042dSApple OSS Distributions static kern_return_t
help_call_mmap__offset_size(MAP_T map __unused,int flags,mach_vm_address_t offset,mach_vm_size_t size)1173*33de042dSApple OSS Distributions help_call_mmap__offset_size(MAP_T map __unused, int flags, mach_vm_address_t offset, mach_vm_size_t size)
1174*33de042dSApple OSS Distributions {
1175*33de042dSApple OSS Distributions 	int fd = -1;
1176*33de042dSApple OSS Distributions 	if (!(flags & MAP_ANON)) {
1177*33de042dSApple OSS Distributions 		fd = get_fd();
1178*33de042dSApple OSS Distributions 	}
1179*33de042dSApple OSS Distributions 	void *rv = mmap_wrapper((void *)0, size, VM_PROT_DEFAULT, flags, fd, (off_t)offset);
1180*33de042dSApple OSS Distributions 	if (rv == MAP_FAILED) {
1181*33de042dSApple OSS Distributions 		return errno;
1182*33de042dSApple OSS Distributions 	} else {
1183*33de042dSApple OSS Distributions 		assert(0 == munmap_helper(rv, size));
1184*33de042dSApple OSS Distributions 		return 0;
1185*33de042dSApple OSS Distributions 	}
1186*33de042dSApple OSS Distributions }
1187*33de042dSApple OSS Distributions 
1188*33de042dSApple OSS Distributions #define IMPL_ONE_FROM_HELPER(type, variant, flags, ...)                                                                                 \
1189*33de042dSApple OSS Distributions 	static kern_return_t                                                                                                            \
1190*33de042dSApple OSS Distributions 	call_mmap ## __ ## variant ## __ ## type(MAP_T map, mach_vm_address_t start, mach_vm_size_t size DROP_COMMAS(__VA_ARGS__)) {    \
1191*33de042dSApple OSS Distributions 	        return help_call_mmap__ ## type(map, flags, start, size DROP_TYPES(__VA_ARGS__));                                       \
1192*33de042dSApple OSS Distributions 	}
1193*33de042dSApple OSS Distributions 
1194*33de042dSApple OSS Distributions // call functions
1195*33de042dSApple OSS Distributions 
1196*33de042dSApple OSS Distributions #define IMPL_FROM_HELPER(type, ...) \
1197*33de042dSApple OSS Distributions 	IMPL_ONE_FROM_HELPER(type, file_private,          MAP_FILE | MAP_PRIVATE,                          ##__VA_ARGS__)  \
1198*33de042dSApple OSS Distributions 	IMPL_ONE_FROM_HELPER(type, anon_private,          MAP_ANON | MAP_PRIVATE,                          ##__VA_ARGS__)  \
1199*33de042dSApple OSS Distributions 	IMPL_ONE_FROM_HELPER(type, file_shared,           MAP_FILE | MAP_SHARED,                           ##__VA_ARGS__)  \
1200*33de042dSApple OSS Distributions 	IMPL_ONE_FROM_HELPER(type, anon_shared,           MAP_ANON | MAP_SHARED,                           ##__VA_ARGS__)  \
1201*33de042dSApple OSS Distributions 	IMPL_ONE_FROM_HELPER(type, file_private_codesign, MAP_FILE | MAP_PRIVATE | MAP_RESILIENT_CODESIGN, ##__VA_ARGS__)  \
1202*33de042dSApple OSS Distributions 	IMPL_ONE_FROM_HELPER(type, file_private_media,    MAP_FILE | MAP_PRIVATE | MAP_RESILIENT_MEDIA,    ##__VA_ARGS__)  \
1203*33de042dSApple OSS Distributions 	IMPL_ONE_FROM_HELPER(type, nounix03_private,      MAP_FILE | MAP_PRIVATE | MAP_NOT_UNIX03,         ##__VA_ARGS__)  \
1204*33de042dSApple OSS Distributions 	IMPL_ONE_FROM_HELPER(type, fixed_private,         MAP_FILE | MAP_PRIVATE | MAP_FIXED,              ##__VA_ARGS__)  \
1205*33de042dSApple OSS Distributions 
IMPL_FROM_HELPER(vm_prot,vm_prot_t,prot)1206*33de042dSApple OSS Distributions IMPL_FROM_HELPER(vm_prot, vm_prot_t, prot)
1207*33de042dSApple OSS Distributions IMPL_FROM_HELPER(dst_size_fileoff, mach_vm_address_t, fileoff)
1208*33de042dSApple OSS Distributions IMPL_FROM_HELPER(start_size)
1209*33de042dSApple OSS Distributions IMPL_FROM_HELPER(offset_size)
1210*33de042dSApple OSS Distributions 
1211*33de042dSApple OSS Distributions IMPL_ONE_FROM_HELPER(kernel_flags, anon_private, MAP_ANON | MAP_PRIVATE, int, kernel_flags)
1212*33de042dSApple OSS Distributions IMPL_ONE_FROM_HELPER(kernel_flags, anon_shared, MAP_ANON | MAP_SHARED, int, kernel_flags)
1213*33de042dSApple OSS Distributions 
1214*33de042dSApple OSS Distributions static kern_return_t
1215*33de042dSApple OSS Distributions call_mmap__mmap_flags(MAP_T map __unused, mach_vm_address_t start, mach_vm_size_t size, int mmap_flags)
1216*33de042dSApple OSS Distributions {
1217*33de042dSApple OSS Distributions 	int fd = -1;
1218*33de042dSApple OSS Distributions 	if (!(mmap_flags & MAP_ANON)) {
1219*33de042dSApple OSS Distributions 		fd = get_fd();
1220*33de042dSApple OSS Distributions 	}
1221*33de042dSApple OSS Distributions 	void *rv = mmap_wrapper((void *)start, size, VM_PROT_DEFAULT, mmap_flags, fd, 0);
1222*33de042dSApple OSS Distributions 	if (rv == MAP_FAILED) {
1223*33de042dSApple OSS Distributions 		return errno;
1224*33de042dSApple OSS Distributions 	} else {
1225*33de042dSApple OSS Distributions 		assert(0 == munmap(rv, size));
1226*33de042dSApple OSS Distributions 		return 0;
1227*33de042dSApple OSS Distributions 	}
1228*33de042dSApple OSS Distributions }
1229*33de042dSApple OSS Distributions 
1230*33de042dSApple OSS Distributions // Mach memory entry ownership
1231*33de042dSApple OSS Distributions 
1232*33de042dSApple OSS Distributions static kern_return_t
call_mach_memory_entry_ownership__ledger_tag(MAP_T map __unused,int ledger_tag)1233*33de042dSApple OSS Distributions call_mach_memory_entry_ownership__ledger_tag(MAP_T map __unused, int ledger_tag)
1234*33de042dSApple OSS Distributions {
1235*33de042dSApple OSS Distributions 	mach_port_t mementry = make_a_mem_entry(TEST_ALLOC_SIZE + 1);
1236*33de042dSApple OSS Distributions 	kern_return_t kr = mach_memory_entry_ownership(mementry, mach_task_self(), ledger_tag, 0);
1237*33de042dSApple OSS Distributions 	(void)mach_port_deallocate(mach_task_self(), mementry);
1238*33de042dSApple OSS Distributions 	return kr;
1239*33de042dSApple OSS Distributions }
1240*33de042dSApple OSS Distributions 
1241*33de042dSApple OSS Distributions static kern_return_t
call_mach_memory_entry_ownership__ledger_flag(MAP_T map __unused,int ledger_flag)1242*33de042dSApple OSS Distributions call_mach_memory_entry_ownership__ledger_flag(MAP_T map __unused, int ledger_flag)
1243*33de042dSApple OSS Distributions {
1244*33de042dSApple OSS Distributions 	mach_port_t mementry = make_a_mem_entry(TEST_ALLOC_SIZE + 1);
1245*33de042dSApple OSS Distributions 	kern_return_t kr = mach_memory_entry_ownership(mementry, mach_task_self(), VM_LEDGER_TAG_DEFAULT, ledger_flag);
1246*33de042dSApple OSS Distributions 	(void)mach_port_deallocate(mach_task_self(), mementry);
1247*33de042dSApple OSS Distributions 	return kr;
1248*33de042dSApple OSS Distributions }
1249*33de042dSApple OSS Distributions 
1250*33de042dSApple OSS Distributions 
1251*33de042dSApple OSS Distributions // For deallocators like munmap and vm_deallocate.
1252*33de042dSApple OSS Distributions // Return a non-zero error code if we should avoid performing this trial.
1253*33de042dSApple OSS Distributions kern_return_t
short_circuit_deallocator(MAP_T map,start_size_trial_t trial)1254*33de042dSApple OSS Distributions short_circuit_deallocator(MAP_T map, start_size_trial_t trial)
1255*33de042dSApple OSS Distributions {
1256*33de042dSApple OSS Distributions 	// mach_vm_deallocate(size == 0) is safe
1257*33de042dSApple OSS Distributions 	if (trial.size == 0) {
1258*33de042dSApple OSS Distributions 		return 0;
1259*33de042dSApple OSS Distributions 	}
1260*33de042dSApple OSS Distributions 
1261*33de042dSApple OSS Distributions 	// Allow deallocation attempts based on a valid allocation
1262*33de042dSApple OSS Distributions 	// (assumes the test loop will slide this trial to a valid allocation)
1263*33de042dSApple OSS Distributions 	if (!trial.start_is_absolute && trial.size_is_absolute) {
1264*33de042dSApple OSS Distributions 		return 0;
1265*33de042dSApple OSS Distributions 	}
1266*33de042dSApple OSS Distributions 
1267*33de042dSApple OSS Distributions 	// Avoid overwriting random live memory.
1268*33de042dSApple OSS Distributions 	if (!range_overflows_strict_zero(trial.start, trial.size, VM_MAP_PAGE_MASK(map))) {
1269*33de042dSApple OSS Distributions 		return IGNORED;
1270*33de042dSApple OSS Distributions 	}
1271*33de042dSApple OSS Distributions 
1272*33de042dSApple OSS Distributions 	// Avoid EXC_GUARD if it is still enabled.
1273*33de042dSApple OSS Distributions 	mach_vm_address_t sum;
1274*33de042dSApple OSS Distributions 	if (!__builtin_add_overflow(trial.start, trial.size, &sum) &&
1275*33de042dSApple OSS Distributions 	    trial.start + trial.size != 0 &&
1276*33de042dSApple OSS Distributions 	    round_up_page(trial.start + trial.size, PAGE_SIZE) == 0) {
1277*33de042dSApple OSS Distributions 		// this case provokes EXC_GUARD
1278*33de042dSApple OSS Distributions 		if (EXC_GUARD_ENABLED) {
1279*33de042dSApple OSS Distributions 			return GUARD;
1280*33de042dSApple OSS Distributions 		}
1281*33de042dSApple OSS Distributions 	}
1282*33de042dSApple OSS Distributions 
1283*33de042dSApple OSS Distributions 	// Allow.
1284*33de042dSApple OSS Distributions 	return 0;
1285*33de042dSApple OSS Distributions }
1286*33de042dSApple OSS Distributions 
1287*33de042dSApple OSS Distributions static kern_return_t
call_mach_vm_deallocate(MAP_T map,mach_vm_address_t start,mach_vm_size_t size)1288*33de042dSApple OSS Distributions call_mach_vm_deallocate(MAP_T map, mach_vm_address_t start, mach_vm_size_t size)
1289*33de042dSApple OSS Distributions {
1290*33de042dSApple OSS Distributions 	kern_return_t kr = mach_vm_deallocate(map, start, size);
1291*33de042dSApple OSS Distributions 	return kr;
1292*33de042dSApple OSS Distributions }
1293*33de042dSApple OSS Distributions 
1294*33de042dSApple OSS Distributions static kern_return_t
call_vm_deallocate(MAP_T map,mach_vm_address_t start,mach_vm_size_t size)1295*33de042dSApple OSS Distributions call_vm_deallocate(MAP_T map, mach_vm_address_t start, mach_vm_size_t size)
1296*33de042dSApple OSS Distributions {
1297*33de042dSApple OSS Distributions 	kern_return_t kr = vm_deallocate(map, (vm_address_t) start, (vm_size_t) size);
1298*33de042dSApple OSS Distributions 	return kr;
1299*33de042dSApple OSS Distributions }
1300*33de042dSApple OSS Distributions 
1301*33de042dSApple OSS Distributions 
1302*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)1303*33de042dSApple OSS Distributions call_mach_vm_allocate__flags(MAP_T map, mach_vm_address_t * start, mach_vm_size_t size, int flags)
1304*33de042dSApple OSS Distributions {
1305*33de042dSApple OSS Distributions 	mach_vm_address_t saved_start = *start;
1306*33de042dSApple OSS Distributions 	kern_return_t kr = mach_vm_allocate(map, start, size, flags);
1307*33de042dSApple OSS Distributions 	check_mach_vm_allocate_outparam_changes(&kr, *start, size, saved_start, flags, map);
1308*33de042dSApple OSS Distributions 	return kr;
1309*33de042dSApple OSS Distributions }
1310*33de042dSApple OSS Distributions 
1311*33de042dSApple OSS Distributions 
1312*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)1313*33de042dSApple OSS Distributions call_mach_vm_allocate__start_size_fixed(MAP_T map, mach_vm_address_t * start, mach_vm_size_t size)
1314*33de042dSApple OSS Distributions {
1315*33de042dSApple OSS Distributions 	mach_vm_address_t saved_start = *start;
1316*33de042dSApple OSS Distributions 	kern_return_t kr = mach_vm_allocate(map, start, size, VM_FLAGS_FIXED);
1317*33de042dSApple OSS Distributions 	check_mach_vm_allocate_outparam_changes(&kr, *start, size, saved_start, VM_FLAGS_FIXED, map);
1318*33de042dSApple OSS Distributions 	return kr;
1319*33de042dSApple OSS Distributions }
1320*33de042dSApple OSS Distributions 
1321*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)1322*33de042dSApple OSS Distributions call_mach_vm_allocate__start_size_anywhere(MAP_T map, mach_vm_address_t * start, mach_vm_size_t size)
1323*33de042dSApple OSS Distributions {
1324*33de042dSApple OSS Distributions 	mach_vm_address_t saved_start = *start;
1325*33de042dSApple OSS Distributions 	kern_return_t kr = mach_vm_allocate(map, start, size, VM_FLAGS_ANYWHERE);
1326*33de042dSApple OSS Distributions 	check_mach_vm_allocate_outparam_changes(&kr, *start, size, saved_start, VM_FLAGS_ANYWHERE, map);
1327*33de042dSApple OSS Distributions 	return kr;
1328*33de042dSApple OSS Distributions }
1329*33de042dSApple OSS Distributions 
1330*33de042dSApple OSS Distributions static results_t *
test_mach_allocated_with_vm_inherit_t(kern_return_t (* func)(MAP_T map,mach_vm_address_t start,mach_vm_size_t size,vm_inherit_t flags),const char * testname)1331*33de042dSApple OSS Distributions test_mach_allocated_with_vm_inherit_t(kern_return_t (*func)(MAP_T map, mach_vm_address_t start, mach_vm_size_t size, vm_inherit_t flags), const char * testname)
1332*33de042dSApple OSS Distributions {
1333*33de042dSApple OSS Distributions 	MAP_T map SMART_MAP;
1334*33de042dSApple OSS Distributions 	allocation_t base SMART_ALLOCATE_VM(map, TEST_ALLOC_SIZE, VM_PROT_DEFAULT);
1335*33de042dSApple OSS Distributions 	vm_inherit_trials_t * trials SMART_VM_INHERIT_TRIALS();
1336*33de042dSApple OSS Distributions 	results_t *results = alloc_results(testname, trials->count);
1337*33de042dSApple OSS Distributions 
1338*33de042dSApple OSS Distributions 	for (unsigned i = 0; i < trials->count; i++) {
1339*33de042dSApple OSS Distributions 		int ret = func(map, base.addr, base.size, trials->list[i].value);
1340*33de042dSApple OSS Distributions 		append_result(results, ret, trials->list[i].name);
1341*33de042dSApple OSS Distributions 	}
1342*33de042dSApple OSS Distributions 	return results;
1343*33de042dSApple OSS Distributions }
1344*33de042dSApple OSS Distributions 
1345*33de042dSApple OSS Distributions 
1346*33de042dSApple OSS Distributions static results_t *
test_unix_allocated_with_vm_inherit_t(kern_return_t (* func)(mach_vm_address_t start,mach_vm_size_t size,vm_inherit_t flags),const char * testname)1347*33de042dSApple OSS Distributions test_unix_allocated_with_vm_inherit_t(kern_return_t (*func)(mach_vm_address_t start, mach_vm_size_t size, vm_inherit_t flags), const char * testname)
1348*33de042dSApple OSS Distributions {
1349*33de042dSApple OSS Distributions 	MAP_T map SMART_MAP;
1350*33de042dSApple OSS Distributions 	allocation_t base SMART_ALLOCATE_VM(map, TEST_ALLOC_SIZE, VM_PROT_DEFAULT);
1351*33de042dSApple OSS Distributions 	vm_inherit_trials_t * trials SMART_VM_INHERIT_TRIALS();
1352*33de042dSApple OSS Distributions 	results_t *results = alloc_results(testname, trials->count);
1353*33de042dSApple OSS Distributions 
1354*33de042dSApple OSS Distributions 	for (unsigned i = 0; i < trials->count; i++) {
1355*33de042dSApple OSS Distributions 		int ret = func(base.addr, base.size, trials->list[i].value);
1356*33de042dSApple OSS Distributions 		append_result(results, ret, trials->list[i].name);
1357*33de042dSApple OSS Distributions 	}
1358*33de042dSApple OSS Distributions 	return results;
1359*33de042dSApple OSS Distributions }
1360*33de042dSApple OSS Distributions 
1361*33de042dSApple OSS Distributions static task_exc_guard_behavior_t saved_exc_guard_behavior;
1362*33de042dSApple OSS Distributions 
1363*33de042dSApple OSS Distributions static void
disable_exc_guard()1364*33de042dSApple OSS Distributions disable_exc_guard()
1365*33de042dSApple OSS Distributions {
1366*33de042dSApple OSS Distributions 	T_SETUPBEGIN;
1367*33de042dSApple OSS Distributions 
1368*33de042dSApple OSS Distributions 	// Disable EXC_GUARD for the duration of the test.
1369*33de042dSApple OSS Distributions 	// We restore it at the end.
1370*33de042dSApple OSS Distributions 	kern_return_t kr = task_get_exc_guard_behavior(mach_task_self(), &saved_exc_guard_behavior);
1371*33de042dSApple OSS Distributions 	assert(kr == 0);
1372*33de042dSApple OSS Distributions 
1373*33de042dSApple OSS Distributions 	kr = task_set_exc_guard_behavior(mach_task_self(), TASK_EXC_GUARD_NONE);
1374*33de042dSApple OSS Distributions 	if (kr) {
1375*33de042dSApple OSS Distributions 		T_LOG("warning, couldn't disable EXC_GUARD; some tests are disabled");
1376*33de042dSApple OSS Distributions 		EXC_GUARD_ENABLED = true;
1377*33de042dSApple OSS Distributions 	} else {
1378*33de042dSApple OSS Distributions 		EXC_GUARD_ENABLED = false;
1379*33de042dSApple OSS Distributions 	}
1380*33de042dSApple OSS Distributions 
1381*33de042dSApple OSS Distributions 	T_SETUPEND;
1382*33de042dSApple OSS Distributions }
1383*33de042dSApple OSS Distributions 
1384*33de042dSApple OSS Distributions static void
restore_exc_guard()1385*33de042dSApple OSS Distributions restore_exc_guard()
1386*33de042dSApple OSS Distributions {
1387*33de042dSApple OSS Distributions 	// restore process's EXC_GUARD handling
1388*33de042dSApple OSS Distributions 	(void)task_set_exc_guard_behavior(mach_task_self(), saved_exc_guard_behavior);
1389*33de042dSApple OSS Distributions }
1390*33de042dSApple OSS Distributions 
1391*33de042dSApple OSS Distributions static int
set_disable_vm_sanitize_telemetry_via_sysctl(uint32_t val)1392*33de042dSApple OSS Distributions set_disable_vm_sanitize_telemetry_via_sysctl(uint32_t val)
1393*33de042dSApple OSS Distributions {
1394*33de042dSApple OSS Distributions 	int ret = sysctlbyname("debug.disable_vm_sanitize_telemetry", NULL, NULL, &val, sizeof(uint32_t));
1395*33de042dSApple OSS Distributions 	if (ret != 0) {
1396*33de042dSApple OSS Distributions 		printf("sysctl failed with errno %d.\n", errno);
1397*33de042dSApple OSS Distributions 	}
1398*33de042dSApple OSS Distributions 	return ret;
1399*33de042dSApple OSS Distributions }
1400*33de042dSApple OSS Distributions 
1401*33de042dSApple OSS Distributions static int
disable_vm_sanitize_telemetry(void)1402*33de042dSApple OSS Distributions disable_vm_sanitize_telemetry(void)
1403*33de042dSApple OSS Distributions {
1404*33de042dSApple OSS Distributions 	return set_disable_vm_sanitize_telemetry_via_sysctl(1);
1405*33de042dSApple OSS Distributions }
1406*33de042dSApple OSS Distributions 
1407*33de042dSApple OSS Distributions static int
reenable_vm_sanitize_telemetry(void)1408*33de042dSApple OSS Distributions reenable_vm_sanitize_telemetry(void)
1409*33de042dSApple OSS Distributions {
1410*33de042dSApple OSS Distributions 	return set_disable_vm_sanitize_telemetry_via_sysctl(0);
1411*33de042dSApple OSS Distributions }
1412*33de042dSApple OSS Distributions 
1413*33de042dSApple OSS Distributions #define MAX_LINE_LENGTH 100
1414*33de042dSApple OSS Distributions #define MAX_NUM_TESTS 350
1415*33de042dSApple OSS Distributions #define GOLDEN_FILES_VERSION "vm_parameter_validation_golden_images_168d625.tar.xz"
1416*33de042dSApple OSS Distributions #define TMP_DIR "/tmp/"
1417*33de042dSApple OSS Distributions #define ASSETS_DIR "../assets/vm_parameter_validation/"
1418*33de042dSApple OSS Distributions #define DECOMPRESS ASSETS_DIR "decompress.sh"
1419*33de042dSApple OSS Distributions #define GOLDEN_FILE TMP_DIR "user_golden_image.log"
1420*33de042dSApple OSS Distributions 
1421*33de042dSApple OSS Distributions #define KERN_GOLDEN_FILE TMP_DIR "kern_golden_image.log"
1422*33de042dSApple OSS Distributions #define KERN_MAX_UNKNOWN_TEST_RESULTS    64
1423*33de042dSApple OSS Distributions 
1424*33de042dSApple OSS Distributions results_t *golden_list[MAX_NUM_TESTS];
1425*33de042dSApple OSS Distributions results_t *kern_list[MAX_NUM_TESTS];
1426*33de042dSApple OSS Distributions 
1427*33de042dSApple OSS Distributions // Read results written by dump_golden_results().
1428*33de042dSApple OSS Distributions static int
populate_golden_results(const char * filename)1429*33de042dSApple OSS Distributions populate_golden_results(const char *filename)
1430*33de042dSApple OSS Distributions {
1431*33de042dSApple OSS Distributions 	FILE *file;
1432*33de042dSApple OSS Distributions 	char line[MAX_LINE_LENGTH];
1433*33de042dSApple OSS Distributions 	results_t *results = NULL;
1434*33de042dSApple OSS Distributions 	uint32_t num_results = 0;
1435*33de042dSApple OSS Distributions 	uint32_t result_number = 0;
1436*33de042dSApple OSS Distributions 	int result_ret = 0;
1437*33de042dSApple OSS Distributions 	char *test_name = NULL;
1438*33de042dSApple OSS Distributions 	char *sub_line = NULL;
1439*33de042dSApple OSS Distributions 	char *s_num_results = NULL;
1440*33de042dSApple OSS Distributions 	bool in_test = FALSE;
1441*33de042dSApple OSS Distributions 
1442*33de042dSApple OSS Distributions 	// cd to the directory containing this executable
1443*33de042dSApple OSS Distributions 	// Test files are located relative to there.
1444*33de042dSApple OSS Distributions 	uint32_t exesize = 0;
1445*33de042dSApple OSS Distributions 	_NSGetExecutablePath(NULL, &exesize);
1446*33de042dSApple OSS Distributions 	char *exe = malloc(exesize);
1447*33de042dSApple OSS Distributions 	_NSGetExecutablePath(exe, &exesize);
1448*33de042dSApple OSS Distributions 	char *dir = dirname(exe);
1449*33de042dSApple OSS Distributions 	chdir(dir);
1450*33de042dSApple OSS Distributions 	free(exe);
1451*33de042dSApple OSS Distributions 
1452*33de042dSApple OSS Distributions 	file = fopen(filename, "r");
1453*33de042dSApple OSS Distributions 	if (file == NULL) {
1454*33de042dSApple OSS Distributions 		T_LOG("Could not open file %s\n", filename);
1455*33de042dSApple OSS Distributions 		return 1;
1456*33de042dSApple OSS Distributions 	}
1457*33de042dSApple OSS Distributions 
1458*33de042dSApple OSS Distributions 	// Read file line by line
1459*33de042dSApple OSS Distributions 	while (fgets(line, MAX_LINE_LENGTH, file) != NULL) {
1460*33de042dSApple OSS Distributions 		// Check if the line starts with "TESTNAME" or "RESULT COUNT"
1461*33de042dSApple OSS Distributions 		if (strncmp(line, TESTNAME_DELIMITER, strlen(TESTNAME_DELIMITER)) == 0) {
1462*33de042dSApple OSS Distributions 			// remove the newline char
1463*33de042dSApple OSS Distributions 			line[strcspn(line, "\r")] = 0;
1464*33de042dSApple OSS Distributions 			sub_line = line + strlen(TESTNAME_DELIMITER);
1465*33de042dSApple OSS Distributions 			test_name = strdup(sub_line);
1466*33de042dSApple OSS Distributions 			// T_LOG("TESTNAME %u : %s", num_tests, test_name);
1467*33de042dSApple OSS Distributions 			in_test = TRUE;
1468*33de042dSApple OSS Distributions 		} else if (in_test && strncmp(line, RESULTCOUNT_DELIMITER, strlen(RESULTCOUNT_DELIMITER)) == 0) {
1469*33de042dSApple OSS Distributions 			assert(num_tests < MAX_NUM_TESTS);
1470*33de042dSApple OSS Distributions 			s_num_results = line + strlen(RESULTCOUNT_DELIMITER);
1471*33de042dSApple OSS Distributions 			num_results = (uint32_t)strtoul(s_num_results, NULL, 10);
1472*33de042dSApple OSS Distributions 			results = alloc_results(test_name, num_results);
1473*33de042dSApple OSS Distributions 			results->count = num_results;
1474*33de042dSApple OSS Distributions 			golden_list[num_tests++] = results;
1475*33de042dSApple OSS Distributions 			// T_LOG("num_tests %u, testname %s, count: %u", num_tests, results->testname, results->count);
1476*33de042dSApple OSS Distributions 		} else if (in_test && strncmp(line, TESTRESULT_DELIMITER, strlen(TESTRESULT_DELIMITER)) == 0) {
1477*33de042dSApple OSS Distributions 			// T_LOG("checking: %s\n", line);
1478*33de042dSApple OSS Distributions 			sscanf(line, "%d: %d", &result_number, &result_ret);
1479*33de042dSApple OSS Distributions 			assert(result_number < num_results);
1480*33de042dSApple OSS Distributions 			// T_LOG("\tresult #%u: %d\n", result_number, result_ret);
1481*33de042dSApple OSS Distributions 			results->list[result_number] = (result_t){.ret = result_ret};
1482*33de042dSApple OSS Distributions 		} else {
1483*33de042dSApple OSS Distributions 			// T_LOG("Unknown line: %s\n", line);
1484*33de042dSApple OSS Distributions 			in_test = FALSE;
1485*33de042dSApple OSS Distributions 		}
1486*33de042dSApple OSS Distributions 	}
1487*33de042dSApple OSS Distributions 
1488*33de042dSApple OSS Distributions 	fclose(file);
1489*33de042dSApple OSS Distributions 
1490*33de042dSApple OSS Distributions 	dump_golden_list();
1491*33de042dSApple OSS Distributions 
1492*33de042dSApple OSS Distributions 	return 0;
1493*33de042dSApple OSS Distributions }
1494*33de042dSApple OSS Distributions 
1495*33de042dSApple OSS Distributions static void
clean_golden_results()1496*33de042dSApple OSS Distributions clean_golden_results()
1497*33de042dSApple OSS Distributions {
1498*33de042dSApple OSS Distributions 	for (uint32_t x = 0; x < num_tests; ++x) {
1499*33de042dSApple OSS Distributions 		dealloc_results(golden_list[x]);
1500*33de042dSApple OSS Distributions 		golden_list[x] = NULL;
1501*33de042dSApple OSS Distributions 	}
1502*33de042dSApple OSS Distributions }
1503*33de042dSApple OSS Distributions 
1504*33de042dSApple OSS Distributions static void
clean_kernel_results()1505*33de042dSApple OSS Distributions clean_kernel_results()
1506*33de042dSApple OSS Distributions {
1507*33de042dSApple OSS Distributions 	for (uint32_t x = 0; x < num_kern_tests; ++x) {
1508*33de042dSApple OSS Distributions 		dealloc_results(kern_list[x]);
1509*33de042dSApple OSS Distributions 		kern_list[x] = NULL;
1510*33de042dSApple OSS Distributions 	}
1511*33de042dSApple OSS Distributions }
1512*33de042dSApple OSS Distributions 
1513*33de042dSApple OSS Distributions // Verbose output in dump_results, controlled by DUMP_RESULTS env.
1514*33de042dSApple OSS Distributions bool dump = FALSE;
1515*33de042dSApple OSS Distributions // Output to create a golden test result, controlled by GENERATE_GOLDEN_IMAGE.
1516*33de042dSApple OSS Distributions bool generate_golden = FALSE;
1517*33de042dSApple OSS Distributions // Run tests as tests (i.e. emit TS_{PASS/FAIL}), enabled unless golden image generation is true.
1518*33de042dSApple OSS Distributions bool test_results =  TRUE;
1519*33de042dSApple OSS Distributions 
1520*33de042dSApple OSS Distributions T_DECL(vm_parameter_validation_user,
1521*33de042dSApple OSS Distributions     "parameter validation for userspace calls",
1522*33de042dSApple OSS Distributions     T_META_SPAWN_TOOL(DECOMPRESS),
1523*33de042dSApple OSS Distributions     T_META_SPAWN_TOOL_ARG("user"),
1524*33de042dSApple OSS Distributions     T_META_SPAWN_TOOL_ARG(TMP_DIR),
1525*33de042dSApple OSS Distributions     T_META_SPAWN_TOOL_ARG(GOLDEN_FILES_VERSION)
1526*33de042dSApple OSS Distributions     )
1527*33de042dSApple OSS Distributions {
1528*33de042dSApple OSS Distributions 	if (disable_vm_sanitize_telemetry() != 0) {
1529*33de042dSApple OSS Distributions 		T_FAIL("Could not disable VM API telemetry. Bailing out early.");
1530*33de042dSApple OSS Distributions 		return;
1531*33de042dSApple OSS Distributions 	}
1532*33de042dSApple OSS Distributions 
1533*33de042dSApple OSS Distributions 	read_env();
1534*33de042dSApple OSS Distributions 
1535*33de042dSApple OSS Distributions 	T_LOG("dump %d, golden %d, test %d\n", dump, generate_golden, test_results);
1536*33de042dSApple OSS Distributions 
1537*33de042dSApple OSS Distributions 	if (generate_golden && unsigned_code_is_disallowed()) {
1538*33de042dSApple OSS Distributions 		// Some test results change when SIP is enabled.
1539*33de042dSApple OSS Distributions 		// Golden files must record the SIP-disabled values.
1540*33de042dSApple OSS Distributions 		T_FAIL("Can't generate golden files with SIP enabled. Disable SIP and try again.\n");
1541*33de042dSApple OSS Distributions 		return;
1542*33de042dSApple OSS Distributions 	}
1543*33de042dSApple OSS Distributions 
1544*33de042dSApple OSS Distributions 	if (test_results && populate_golden_results(GOLDEN_FILE)) {
1545*33de042dSApple OSS Distributions 		// bail out early, couldn't load golden test results
1546*33de042dSApple OSS Distributions 		T_FAIL("Could not open golden file '%s'\n", GOLDEN_FILE);
1547*33de042dSApple OSS Distributions 		return;
1548*33de042dSApple OSS Distributions 	}
1549*33de042dSApple OSS Distributions 
1550*33de042dSApple OSS Distributions 	set_up_guard_page();
1551*33de042dSApple OSS Distributions 
1552*33de042dSApple OSS Distributions 	disable_exc_guard();
1553*33de042dSApple OSS Distributions 
1554*33de042dSApple OSS Distributions 	/*
1555*33de042dSApple OSS Distributions 	 * Group 1: memory entry
1556*33de042dSApple OSS Distributions 	 */
1557*33de042dSApple OSS Distributions 
1558*33de042dSApple OSS Distributions 	// Mach start/size with both old-style and new-style types
1559*33de042dSApple OSS Distributions 	// (co-located so old and new can be compared more easily)
1560*33de042dSApple OSS Distributions #define RUN_NEW(fn, name) dealloc_results(dump_results(test_mach_with_allocated_start_size(fn, name " (start/size)")))
1561*33de042dSApple OSS Distributions #if TEST_OLD_STYLE_MACH
1562*33de042dSApple OSS Distributions #define RUN_OLD(fn, name) dealloc_results(dump_results(test_oldmach_with_allocated_start_size(fn, name " (start/size)")))
1563*33de042dSApple OSS Distributions #define RUN_OLD64(fn, name) RUN_NEW(fn, name)
1564*33de042dSApple OSS Distributions #else
1565*33de042dSApple OSS Distributions #define RUN_OLD(fn, name) do {} while (0)
1566*33de042dSApple OSS Distributions #define RUN_OLD64(fn, name) do {} while (0)
1567*33de042dSApple OSS Distributions #endif
1568*33de042dSApple OSS Distributions 	// mach_make_memory_entry has up to three entry points on U32, unlike other functions that have two
1569*33de042dSApple OSS Distributions 	RUN_NEW(call_mach_make_memory_entry_64__start_size__copy, "mach_make_memory_entry_64 (copy)");
1570*33de042dSApple OSS Distributions 	RUN_OLD(call_mach_make_memory_entry__start_size__copy, "mach_make_memory_entry (copy)");
1571*33de042dSApple OSS Distributions 	RUN_OLD64(call__mach_make_memory_entry__start_size__copy, "_mach_make_memory_entry (copy)");
1572*33de042dSApple OSS Distributions 	RUN_NEW(call_mach_make_memory_entry_64__start_size__memonly, "mach_make_memory_entry_64 (mem_only)");
1573*33de042dSApple OSS Distributions 	RUN_OLD(call_mach_make_memory_entry__start_size__memonly, "mach_make_memory_entry (mem_only)");
1574*33de042dSApple OSS Distributions 	RUN_OLD64(call__mach_make_memory_entry__start_size__memonly, "_mach_make_memory_entry (mem_only)");
1575*33de042dSApple OSS Distributions 	RUN_NEW(call_mach_make_memory_entry_64__start_size__namedcreate, "mach_make_memory_entry_64 (named_create)");
1576*33de042dSApple OSS Distributions 	RUN_OLD(call_mach_make_memory_entry__start_size__namedcreate, "mach_make_memory_entry (named_create)");
1577*33de042dSApple OSS Distributions 	RUN_OLD64(call__mach_make_memory_entry__start_size__namedcreate, "_mach_make_memory_entry (named_create)");
1578*33de042dSApple OSS Distributions 	RUN_NEW(call_mach_make_memory_entry_64__start_size__share, "mach_make_memory_entry_64 (share)");
1579*33de042dSApple OSS Distributions 	RUN_OLD(call_mach_make_memory_entry__start_size__share, "mach_make_memory_entry (share)");
1580*33de042dSApple OSS Distributions 	RUN_OLD64(call__mach_make_memory_entry__start_size__share, "_mach_make_memory_entry (share)");
1581*33de042dSApple OSS Distributions 	RUN_NEW(call_mach_make_memory_entry_64__start_size__namedreuse, "mach_make_memory_entry_64 (named_reuse)");
1582*33de042dSApple OSS Distributions 	RUN_OLD(call_mach_make_memory_entry__start_size__namedreuse, "mach_make_memory_entry (named_reuse)");
1583*33de042dSApple OSS Distributions 	RUN_OLD64(call__mach_make_memory_entry__start_size__namedreuse, "_mach_make_memory_entry (named_reuse)");
1584*33de042dSApple OSS Distributions #undef RUN_NEW
1585*33de042dSApple OSS Distributions #undef RUN_OLD
1586*33de042dSApple OSS Distributions #undef RUN_OLD64
1587*33de042dSApple OSS Distributions 
1588*33de042dSApple OSS Distributions #define RUN(fn, name) dealloc_results(dump_results(test_mach_with_size(fn, name " (size)")))
1589*33de042dSApple OSS Distributions 	RUN(call_mach_memory_object_memory_entry_64__size, "mach_memory_object_memory_entry_64");
1590*33de042dSApple OSS Distributions 	RUN(call_replacement_mach_memory_object_memory_entry__size, "mach_memory_object_memory_entry");
1591*33de042dSApple OSS Distributions #undef RUN
1592*33de042dSApple OSS Distributions 
1593*33de042dSApple OSS Distributions #define RUN_NEW(fn, name) dealloc_results(dump_results(test_mach_with_allocated_vm_prot_t(fn, name " (vm_prot_t)")))
1594*33de042dSApple OSS Distributions #define RUN_OLD(fn, name) dealloc_results(dump_results(test_oldmach_with_allocated_vm_prot_t(fn, name " (vm_prot_t)")))
1595*33de042dSApple OSS Distributions #define RUN_OLD64(fn, name) RUN_NEW(fn, name)
1596*33de042dSApple OSS Distributions 
1597*33de042dSApple OSS Distributions 	RUN_NEW(call_mach_make_memory_entry_64__vm_prot, "mach_make_memory_entry_64");
1598*33de042dSApple OSS Distributions #if TEST_OLD_STYLE_MACH
1599*33de042dSApple OSS Distributions 	RUN_OLD(call_mach_make_memory_entry__vm_prot, "mach_make_memory_entry");
1600*33de042dSApple OSS Distributions 	RUN_OLD64(call__mach_make_memory_entry__vm_prot, "_mach_make_memory_entry");
1601*33de042dSApple OSS Distributions #endif
1602*33de042dSApple OSS Distributions 
1603*33de042dSApple OSS Distributions #undef RUN_NEW
1604*33de042dSApple OSS Distributions #undef RUN_OLD
1605*33de042dSApple OSS Distributions #undef RUN_OLD64
1606*33de042dSApple OSS Distributions 
1607*33de042dSApple OSS Distributions #define RUN(fn, name) dealloc_results(dump_results(test_mach_vm_prot(fn, name " (vm_prot_t)")))
1608*33de042dSApple OSS Distributions 	RUN(call_mach_memory_object_memory_entry_64__vm_prot, "mach_memory_object_memory_entry_64");
1609*33de042dSApple OSS Distributions 	RUN(call_replacement_mach_memory_object_memory_entry__vm_prot, "mach_memory_object_memory_entry");
1610*33de042dSApple OSS Distributions #undef RUN
1611*33de042dSApple OSS Distributions 
1612*33de042dSApple OSS Distributions #define RUN(fn, name) dealloc_results(dump_results(test_mach_with_ledger_tag(fn, name " (ledger tag)")))
1613*33de042dSApple OSS Distributions 	RUN(call_mach_memory_entry_ownership__ledger_tag, "mach_memory_entry_ownership");
1614*33de042dSApple OSS Distributions #undef RUN
1615*33de042dSApple OSS Distributions 
1616*33de042dSApple OSS Distributions #define RUN(fn, name) dealloc_results(dump_results(test_mach_with_ledger_flag(fn, name " (ledger flag)")))
1617*33de042dSApple OSS Distributions 	RUN(call_mach_memory_entry_ownership__ledger_flag, "mach_memory_entry_ownership");
1618*33de042dSApple OSS Distributions #undef RUN
1619*33de042dSApple OSS Distributions 
1620*33de042dSApple OSS Distributions 	/*
1621*33de042dSApple OSS Distributions 	 * Group 2: allocate/deallocate
1622*33de042dSApple OSS Distributions 	 */
1623*33de042dSApple OSS Distributions 
1624*33de042dSApple OSS Distributions #define RUN(fn, name) dealloc_results(dump_results(test_mach_allocation_func_with_start_size(fn, name)))
1625*33de042dSApple OSS Distributions 	RUN(call_mach_vm_allocate__start_size_fixed, "mach_vm_allocate (fixed) (realigned start/size)");
1626*33de042dSApple OSS Distributions 	RUN(call_mach_vm_allocate__start_size_anywhere, "mach_vm_allocate (anywhere) (hint/size)");
1627*33de042dSApple OSS Distributions #undef RUN
1628*33de042dSApple OSS Distributions 
1629*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)")))
1630*33de042dSApple OSS Distributions 	RUN(call_mach_vm_allocate__flags, "mach_vm_allocate");
1631*33de042dSApple OSS Distributions #undef RUN
1632*33de042dSApple OSS Distributions 
1633*33de042dSApple OSS Distributions 	dealloc_results(dump_results(test_deallocator(call_mach_vm_deallocate, "mach_vm_deallocate (start/size)")));
1634*33de042dSApple OSS Distributions #if TEST_OLD_STYLE_MACH
1635*33de042dSApple OSS Distributions 	dealloc_results(dump_results(test_deallocator(call_vm_deallocate, "vm_deallocate (start/size)")));
1636*33de042dSApple OSS Distributions #endif
1637*33de042dSApple OSS Distributions 
1638*33de042dSApple OSS Distributions #define RUN(fn, name) dealloc_results(dump_results(test_deallocator(fn, name " (start/size)")))
1639*33de042dSApple OSS Distributions 	RUN(call_munmap, "munmap");
1640*33de042dSApple OSS Distributions #undef RUN
1641*33de042dSApple OSS Distributions 
1642*33de042dSApple OSS Distributions 	/*
1643*33de042dSApple OSS Distributions 	 * Group 3: map/unmap
1644*33de042dSApple OSS Distributions 	 */
1645*33de042dSApple OSS Distributions 
1646*33de042dSApple OSS Distributions 	// map tests
1647*33de042dSApple OSS Distributions 
1648*33de042dSApple OSS Distributions #define RUN_START_SIZE(fn, name) dealloc_results(dump_results(test_mach_with_allocated_start_size(fn, name " (realigned start/size)")))
1649*33de042dSApple OSS Distributions #define RUN_HINT_SIZE(fn, name) dealloc_results(dump_results(test_mach_with_allocated_start_size(fn, name " (hint/size)")))
1650*33de042dSApple OSS Distributions #define RUN_PROT_PAIR(fn, name) dealloc_results(dump_results(test_mach_vm_prot_pair(fn, name " (prot_pairs)")))
1651*33de042dSApple OSS Distributions #define RUN_INHERIT(fn, name) dealloc_results(dump_results(test_mach_with_allocated_vm_inherit_t(fn, name " (vm_inherit_t)")))
1652*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)")))
1653*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)")))
1654*33de042dSApple OSS Distributions 
1655*33de042dSApple OSS Distributions #define RUN_ALL(fn, name)     \
1656*33de042dSApple OSS Distributions 	RUN_START_SIZE(call_ ## fn ## __allocate_fixed, #name " (allocate fixed overwrite)");   \
1657*33de042dSApple OSS Distributions 	RUN_START_SIZE(call_ ## fn ## __allocate_fixed_copy, #name " (allocate fixed overwrite copy)");  \
1658*33de042dSApple OSS Distributions 	RUN_START_SIZE(call_ ## fn ## __memobject_fixed, #name " (memobject fixed overwrite)");  \
1659*33de042dSApple OSS Distributions 	RUN_START_SIZE(call_ ## fn ## __memobject_fixed_copy, #name " (memobject fixed overwrite copy)"); \
1660*33de042dSApple OSS Distributions 	RUN_HINT_SIZE(call_ ## fn ## __allocate_anywhere, #name " (allocate anywhere)");  \
1661*33de042dSApple OSS Distributions 	RUN_HINT_SIZE(call_ ## fn ## __memobject_anywhere, #name " (memobject anywhere)");  \
1662*33de042dSApple OSS Distributions 	RUN_PROT_PAIR(call_ ## fn ## __allocate_fixed__prot_pairs, #name " (allocate fixed overwrite)");  \
1663*33de042dSApple OSS Distributions 	RUN_PROT_PAIR(call_ ## fn ## __allocate_fixed_copy__prot_pairs, #name " (allocate fixed overwrite copy)");  \
1664*33de042dSApple OSS Distributions 	RUN_PROT_PAIR(call_ ## fn ## __allocate_anywhere__prot_pairs, #name " (allocate anywhere)");  \
1665*33de042dSApple OSS Distributions 	RUN_PROT_PAIR(call_ ## fn ## __memobject_fixed__prot_pairs, #name " (memobject fixed overwrite)");  \
1666*33de042dSApple OSS Distributions 	RUN_PROT_PAIR(call_ ## fn ## __memobject_fixed_copy__prot_pairs, #name " (memobject fixed overwrite copy)");  \
1667*33de042dSApple OSS Distributions 	RUN_PROT_PAIR(call_ ## fn ## __memobject_anywhere__prot_pairs, #name " (memobject anywhere)");  \
1668*33de042dSApple OSS Distributions 	RUN_INHERIT(call_ ## fn ## __allocate_fixed__inherit, #name " (allocate fixed overwrite)");  \
1669*33de042dSApple OSS Distributions 	RUN_INHERIT(call_ ## fn ## __allocate_fixed_copy__inherit, #name " (allocate fixed overwrite copy)");  \
1670*33de042dSApple OSS Distributions 	RUN_INHERIT(call_ ## fn ## __allocate_anywhere__inherit, #name " (allocate anywhere)");  \
1671*33de042dSApple OSS Distributions 	RUN_INHERIT(call_ ## fn ## __memobject_fixed__inherit, #name " (memobject fixed overwrite)");  \
1672*33de042dSApple OSS Distributions 	RUN_INHERIT(call_ ## fn ## __memobject_fixed_copy__inherit, #name " (memobject fixed overwrite copy)");  \
1673*33de042dSApple OSS Distributions 	RUN_INHERIT(call_ ## fn ## __memobject_anywhere__inherit, #name " (memobject anywhere)");  \
1674*33de042dSApple OSS Distributions 	RUN_FLAGS(call_ ## fn ## __allocate__flags, #name " (allocate)");  \
1675*33de042dSApple OSS Distributions 	RUN_FLAGS(call_ ## fn ## __allocate_copy__flags, #name " (allocate copy)");  \
1676*33de042dSApple OSS Distributions 	RUN_FLAGS(call_ ## fn ## __memobject__flags, #name " (memobject)");  \
1677*33de042dSApple OSS Distributions 	RUN_FLAGS(call_ ## fn ## __memobject_copy__flags, #name " (memobject copy)");  \
1678*33de042dSApple OSS Distributions 	RUN_SSOO(call_ ## fn ## __memobject_fixed__start_size_offset_object, #name " (memobject fixed overwrite)");  \
1679*33de042dSApple OSS Distributions 	RUN_SSOO(call_ ## fn ## __memobject_fixed_copy__start_size_offset_object, #name " (memobject fixed overwrite copy)");  \
1680*33de042dSApple OSS Distributions 	RUN_SSOO(call_ ## fn ## __memobject_anywhere__start_size_offset_object, #name " (memobject anywhere)");  \
1681*33de042dSApple OSS Distributions 
1682*33de042dSApple OSS Distributions 	RUN_ALL(mach_vm_map_wrapped, mach_vm_map);
1683*33de042dSApple OSS Distributions #if TEST_OLD_STYLE_MACH
1684*33de042dSApple OSS Distributions 	RUN_ALL(vm_map_64_retyped, vm_map_64);
1685*33de042dSApple OSS Distributions 	RUN_ALL(vm_map_retyped, vm_map);
1686*33de042dSApple OSS Distributions #endif
1687*33de042dSApple OSS Distributions 
1688*33de042dSApple OSS Distributions #undef RUN_ALL
1689*33de042dSApple OSS Distributions #undef RUN_START_SIZE
1690*33de042dSApple OSS Distributions #undef RUN_HINT_SIZE
1691*33de042dSApple OSS Distributions #undef RUN_PROT_PAIR
1692*33de042dSApple OSS Distributions #undef RUN_INHERIT
1693*33de042dSApple OSS Distributions #undef RUN_FLAGS
1694*33de042dSApple OSS Distributions #undef RUN_SSOO
1695*33de042dSApple OSS Distributions 
1696*33de042dSApple OSS Distributions 	// remap tests
1697*33de042dSApple OSS Distributions 
1698*33de042dSApple OSS Distributions #define FN_NAME(fn, variant, type) call_ ## fn ## __  ## variant ## __ ## type
1699*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 ")")))
1700*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)
1701*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)
1702*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)
1703*33de042dSApple OSS Distributions #define RUN_INHERIT(fn, variant, name) RUN_HELPER(test_mach_with_allocated_vm_inherit_t, fn, variant, inherit, "inherit", name)
1704*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)
1705*33de042dSApple OSS Distributions #define RUN_SRC_DST_SIZE(fn, dst, variant, type_name, name) RUN_HELPER(test_allocated_src_##dst##_dst_size, fn, variant, src_dst_size, type_name, name)
1706*33de042dSApple OSS Distributions 
1707*33de042dSApple OSS Distributions #define RUN_ALL(fn, realigned, name)                                    \
1708*33de042dSApple OSS Distributions 	RUN_SRC_SIZE(fn, copy, realigned "src/size", name);             \
1709*33de042dSApple OSS Distributions 	RUN_SRC_SIZE(fn, nocopy, realigned "src/size", name);           \
1710*33de042dSApple OSS Distributions 	RUN_DST_SIZE(fn, fixed, "realigned dst/size", name);            \
1711*33de042dSApple OSS Distributions 	RUN_DST_SIZE(fn, fixed_copy, "realigned dst/size", name);       \
1712*33de042dSApple OSS Distributions 	RUN_DST_SIZE(fn, anywhere, "hint/size", name);                  \
1713*33de042dSApple OSS Distributions 	RUN_INHERIT(fn, fixed, name);                                   \
1714*33de042dSApple OSS Distributions 	RUN_INHERIT(fn, fixed_copy, name);                              \
1715*33de042dSApple OSS Distributions 	RUN_INHERIT(fn, anywhere, name);                                \
1716*33de042dSApple OSS Distributions 	RUN_FLAGS(fn, nocopy, name);                                    \
1717*33de042dSApple OSS Distributions 	RUN_FLAGS(fn, copy, name);                                      \
1718*33de042dSApple OSS Distributions 	RUN_PROT_PAIRS(fn, fixed, name);                                \
1719*33de042dSApple OSS Distributions 	RUN_PROT_PAIRS(fn, fixed_copy, name);                           \
1720*33de042dSApple OSS Distributions 	RUN_PROT_PAIRS(fn, anywhere, name);                             \
1721*33de042dSApple OSS Distributions 	RUN_SRC_DST_SIZE(fn, allocated, fixed, "src/dst/size", name);   \
1722*33de042dSApple OSS Distributions 	RUN_SRC_DST_SIZE(fn, allocated, fixed_copy, "src/dst/size", name); \
1723*33de042dSApple OSS Distributions 	RUN_SRC_DST_SIZE(fn, unallocated, anywhere, "src/dst/size", name); \
1724*33de042dSApple OSS Distributions 
1725*33de042dSApple OSS Distributions 	RUN_ALL(mach_vm_remap_user, "realigned ", mach_vm_remap);
1726*33de042dSApple OSS Distributions 	RUN_ALL(mach_vm_remap_new_user, , mach_vm_remap_new);
1727*33de042dSApple OSS Distributions 
1728*33de042dSApple OSS Distributions #if TEST_OLD_STYLE_MACH
1729*33de042dSApple OSS Distributions 	RUN_ALL(vm_remap_retyped, "realigned ", vm_remap);
1730*33de042dSApple OSS Distributions #endif
1731*33de042dSApple OSS Distributions 
1732*33de042dSApple OSS Distributions #undef RUN_ALL
1733*33de042dSApple OSS Distributions #undef RUN_HELPER
1734*33de042dSApple OSS Distributions #undef RUN_SRC_SIZE
1735*33de042dSApple OSS Distributions #undef RUN_DST_SIZE
1736*33de042dSApple OSS Distributions #undef RUN_PROT_PAIRS
1737*33de042dSApple OSS Distributions #undef RUN_INHERIT
1738*33de042dSApple OSS Distributions #undef RUN_FLAGS
1739*33de042dSApple OSS Distributions #undef RUN_SRC_DST_SIZE
1740*33de042dSApple OSS Distributions 
1741*33de042dSApple OSS Distributions 	// mmap tests
1742*33de042dSApple OSS Distributions 
1743*33de042dSApple OSS Distributions #define RUN(fn, name) dealloc_results(dump_results(test_mmap_with_allocated_vm_map_kernel_flags_t(fn, name " (kernel flags)")))
1744*33de042dSApple OSS Distributions 	RUN(call_mmap__anon_private__kernel_flags, "mmap (anon private)");
1745*33de042dSApple OSS Distributions 	RUN(call_mmap__anon_shared__kernel_flags, "mmap (anon shared)");
1746*33de042dSApple OSS Distributions #undef RUN
1747*33de042dSApple OSS Distributions 
1748*33de042dSApple OSS Distributions #define RUN(fn, name) dealloc_results(dump_results(test_mach_with_allocated_mmap_flags(fn, name " (mmap flags)")))
1749*33de042dSApple OSS Distributions 	RUN(call_mmap__mmap_flags, "mmap");
1750*33de042dSApple OSS Distributions #undef RUN
1751*33de042dSApple OSS Distributions 
1752*33de042dSApple OSS Distributions #define RUN(fn, name) dealloc_results(dump_results(test_mach_with_allocated_start_size(fn, name " (hint/size)")))
1753*33de042dSApple OSS Distributions 	RUN(call_mmap__file_private__start_size, "mmap (file private)");
1754*33de042dSApple OSS Distributions 	RUN(call_mmap__anon_private__start_size, "mmap (anon private)");
1755*33de042dSApple OSS Distributions 	RUN(call_mmap__file_shared__start_size, "mmap (file shared)");
1756*33de042dSApple OSS Distributions 	RUN(call_mmap__anon_shared__start_size, "mmap (anon shared)");
1757*33de042dSApple OSS Distributions 	RUN(call_mmap__file_private_codesign__start_size, "mmap (file private codesign)");
1758*33de042dSApple OSS Distributions 	RUN(call_mmap__file_private_media__start_size, "mmap (file private media)");
1759*33de042dSApple OSS Distributions 	RUN(call_mmap__nounix03_private__start_size, "mmap (no unix03)");
1760*33de042dSApple OSS Distributions #undef RUN
1761*33de042dSApple OSS Distributions 
1762*33de042dSApple OSS Distributions #define RUN(fn, name) dealloc_results(dump_results(test_fixed_dst_size(fn, name " (dst/size)")))
1763*33de042dSApple OSS Distributions 	RUN(call_mmap__fixed_private__start_size, "mmap (fixed)");
1764*33de042dSApple OSS Distributions #undef RUN
1765*33de042dSApple OSS Distributions 
1766*33de042dSApple OSS Distributions #define RUN(fn, name) dealloc_results(dump_results(test_mach_with_allocated_start_size(fn, name " (offset/size)")))
1767*33de042dSApple OSS Distributions 	RUN(call_mmap__file_private__offset_size, "mmap (file private)");
1768*33de042dSApple OSS Distributions 	RUN(call_mmap__anon_private__offset_size, "mmap (anon private)");
1769*33de042dSApple OSS Distributions 	RUN(call_mmap__file_shared__offset_size, "mmap (file shared)");
1770*33de042dSApple OSS Distributions 	RUN(call_mmap__anon_shared__offset_size, "mmap (anon shared)");
1771*33de042dSApple OSS Distributions 	RUN(call_mmap__file_private_codesign__offset_size, "mmap (file private codesign)");
1772*33de042dSApple OSS Distributions 	RUN(call_mmap__file_private_media__offset_size, "mmap (file private media)");
1773*33de042dSApple OSS Distributions 	RUN(call_mmap__nounix03_private__offset_size, "mmap (no unix03)");
1774*33de042dSApple OSS Distributions #undef RUN
1775*33de042dSApple OSS Distributions 
1776*33de042dSApple OSS Distributions #define RUN(fn, name) dealloc_results(dump_results(test_dst_size_fileoff(fn, name " (hint/size/fileoff)")))
1777*33de042dSApple OSS Distributions 	RUN(call_mmap__file_private__dst_size_fileoff, "mmap (file private)");
1778*33de042dSApple OSS Distributions 	RUN(call_mmap__anon_private__dst_size_fileoff, "mmap (anon private)");
1779*33de042dSApple OSS Distributions 	RUN(call_mmap__file_shared__dst_size_fileoff, "mmap (file shared)");
1780*33de042dSApple OSS Distributions 	RUN(call_mmap__anon_shared__dst_size_fileoff, "mmap (anon shared)");
1781*33de042dSApple OSS Distributions 	RUN(call_mmap__file_private_codesign__dst_size_fileoff, "mmap (file private codesign)");
1782*33de042dSApple OSS Distributions 	RUN(call_mmap__file_private_media__dst_size_fileoff, "mmap (file private media)");
1783*33de042dSApple OSS Distributions 	RUN(call_mmap__nounix03_private__dst_size_fileoff, "mmap (no unix03)");
1784*33de042dSApple OSS Distributions #undef RUN
1785*33de042dSApple OSS Distributions 
1786*33de042dSApple OSS Distributions #define RUN(fn, name) dealloc_results(dump_results(test_fixed_dst_size_fileoff(fn, name " (dst/size/fileoff)")))
1787*33de042dSApple OSS Distributions 	RUN(call_mmap__fixed_private__dst_size_fileoff, "mmap (fixed)");
1788*33de042dSApple OSS Distributions #undef RUN
1789*33de042dSApple OSS Distributions 
1790*33de042dSApple OSS Distributions #define RUN(fn, name) dealloc_results(dump_results(test_mach_with_allocated_vm_prot_t(fn, name " (vm_prot_t)")))
1791*33de042dSApple OSS Distributions 	RUN(call_mmap__file_private__vm_prot, "mmap (file private)");
1792*33de042dSApple OSS Distributions 	RUN(call_mmap__anon_private__vm_prot, "mmap (anon private)");
1793*33de042dSApple OSS Distributions 	RUN(call_mmap__file_shared__vm_prot, "mmap (file shared)");
1794*33de042dSApple OSS Distributions 	RUN(call_mmap__anon_shared__vm_prot, "mmap (anon shared)");
1795*33de042dSApple OSS Distributions 	RUN(call_mmap__file_private_codesign__vm_prot, "mmap (file private codesign)");
1796*33de042dSApple OSS Distributions 	RUN(call_mmap__file_private_media__vm_prot, "mmap (file private media)");
1797*33de042dSApple OSS Distributions 	RUN(call_mmap__nounix03_private__vm_prot, "mmap (no unix03)");
1798*33de042dSApple OSS Distributions 	RUN(call_mmap__fixed_private__vm_prot, "mmap (fixed)");
1799*33de042dSApple OSS Distributions #undef RUN
1800*33de042dSApple OSS Distributions 
1801*33de042dSApple OSS Distributions #define RUN(fn, name) dealloc_results(dump_results(test_unix_with_allocated_start_size(fn, name " (start/size)")))
1802*33de042dSApple OSS Distributions 	RUN(call_mremap_encrypted, "mremap_encrypted");
1803*33de042dSApple OSS Distributions #undef RUN
1804*33de042dSApple OSS Distributions 
1805*33de042dSApple OSS Distributions 	/*
1806*33de042dSApple OSS Distributions 	 * Group 4: wire/unwire
1807*33de042dSApple OSS Distributions 	 */
1808*33de042dSApple OSS Distributions 
1809*33de042dSApple OSS Distributions #define RUN(fn, name) dealloc_results(dump_results(test_unix_with_allocated_start_size(fn, name " (start/size)")))
1810*33de042dSApple OSS Distributions 	RUN(call_mlock, "mlock");
1811*33de042dSApple OSS Distributions 	RUN(call_munlock, "munlock");
1812*33de042dSApple OSS Distributions #undef RUN
1813*33de042dSApple OSS Distributions 
1814*33de042dSApple OSS Distributions #define RUN(fn, name) dealloc_results(dump_results(test_mach_with_allocated_start_size(fn, name " (start/size)")))
1815*33de042dSApple OSS Distributions 	RUN(call_mach_vm_wire__wire, "mach_vm_wire (wire)");
1816*33de042dSApple OSS Distributions 	RUN(call_replacement_vm_wire__wire, "vm_wire (wire)");
1817*33de042dSApple OSS Distributions 	RUN(call_mach_vm_wire__unwire, "mach_vm_wire (unwire)");
1818*33de042dSApple OSS Distributions 	RUN(call_replacement_vm_wire__unwire, "vm_wire (unwire)");
1819*33de042dSApple OSS Distributions #undef RUN
1820*33de042dSApple OSS Distributions 
1821*33de042dSApple OSS Distributions #define RUN(fn, name) dealloc_results(dump_results(test_mach_with_allocated_vm_prot_t(fn, name " (vm_prot_t)")))
1822*33de042dSApple OSS Distributions 	RUN(call_mach_vm_wire__vm_prot, "mach_vm_wire");
1823*33de042dSApple OSS Distributions 	RUN(call_replacement_vm_wire__vm_prot, "vm_wire");
1824*33de042dSApple OSS Distributions #undef RUN
1825*33de042dSApple OSS Distributions 
1826*33de042dSApple OSS Distributions 	/*
1827*33de042dSApple OSS Distributions 	 * Group 5: copyin/copyout
1828*33de042dSApple OSS Distributions 	 */
1829*33de042dSApple OSS Distributions 
1830*33de042dSApple OSS Distributions #define RUN_NEW(fn, name) dealloc_results(dump_results(test_mach_with_allocated_start_size(fn, name " (start/size)")))
1831*33de042dSApple OSS Distributions #if TEST_OLD_STYLE_MACH
1832*33de042dSApple OSS Distributions #define RUN_OLD(fn, name) dealloc_results(dump_results(test_oldmach_with_allocated_start_size(fn, name " (start/size)")))
1833*33de042dSApple OSS Distributions #else
1834*33de042dSApple OSS Distributions #define RUN_OLD(fn, name) do {} while (0)
1835*33de042dSApple OSS Distributions #endif
1836*33de042dSApple OSS Distributions 	RUN_NEW(call_mach_vm_read, "mach_vm_read");
1837*33de042dSApple OSS Distributions 	RUN_OLD(call_vm_read, "vm_read");
1838*33de042dSApple OSS Distributions 	RUN_NEW(call_mach_vm_read_list, "mach_vm_read_list");
1839*33de042dSApple OSS Distributions 	RUN_OLD(call_vm_read_list, "vm_read_list");
1840*33de042dSApple OSS Distributions 
1841*33de042dSApple OSS Distributions 	RUN_NEW(call_mach_vm_read_overwrite__src, "mach_vm_read_overwrite (src)");
1842*33de042dSApple OSS Distributions 	RUN_NEW(call_mach_vm_read_overwrite__dst, "mach_vm_read_overwrite (dst)");
1843*33de042dSApple OSS Distributions 	RUN_OLD(call_vm_read_overwrite__src, "vm_read_overwrite (src)");
1844*33de042dSApple OSS Distributions 	RUN_OLD(call_vm_read_overwrite__dst, "vm_read_overwrite (dst)");
1845*33de042dSApple OSS Distributions 
1846*33de042dSApple OSS Distributions 	RUN_NEW(call_mach_vm_write__src, "mach_vm_write (src)");
1847*33de042dSApple OSS Distributions 	RUN_NEW(call_mach_vm_write__dst, "mach_vm_write (dst)");
1848*33de042dSApple OSS Distributions 	RUN_OLD(call_vm_write__src, "vm_write (src)");
1849*33de042dSApple OSS Distributions 	RUN_OLD(call_vm_write__dst, "vm_write (dst)");
1850*33de042dSApple OSS Distributions 
1851*33de042dSApple OSS Distributions 	RUN_NEW(call_mach_vm_copy__src, "mach_vm_copy (src)");
1852*33de042dSApple OSS Distributions 	RUN_NEW(call_mach_vm_copy__dst, "mach_vm_copy (dst)");
1853*33de042dSApple OSS Distributions 	RUN_OLD(call_vm_copy__src, "vm_copy (src)");
1854*33de042dSApple OSS Distributions 	RUN_OLD(call_vm_copy__dst, "vm_copy (dst)");
1855*33de042dSApple OSS Distributions #undef RUN_NEW
1856*33de042dSApple OSS Distributions #undef RUN_OLD
1857*33de042dSApple OSS Distributions 
1858*33de042dSApple OSS Distributions 	restore_exc_guard();
1859*33de042dSApple OSS Distributions 
1860*33de042dSApple OSS Distributions 	if (test_results) {
1861*33de042dSApple OSS Distributions 		clean_golden_results();
1862*33de042dSApple OSS Distributions 	}
1863*33de042dSApple OSS Distributions 
1864*33de042dSApple OSS Distributions 	if (reenable_vm_sanitize_telemetry() != 0) {
1865*33de042dSApple OSS Distributions 		T_FAIL("Failed to reenable VM API telemetry.");
1866*33de042dSApple OSS Distributions 		return;
1867*33de042dSApple OSS Distributions 	}
1868*33de042dSApple OSS Distributions 
1869*33de042dSApple OSS Distributions 	T_PASS("vm parameter validation userspace");
1870*33de042dSApple OSS Distributions }
1871*33de042dSApple OSS Distributions 
1872*33de042dSApple OSS Distributions 
1873*33de042dSApple OSS Distributions /////////////////////////////////////////////////////
1874*33de042dSApple OSS Distributions // Kernel test invocation.
1875*33de042dSApple OSS Distributions // The actual test code is in:
1876*33de042dSApple OSS Distributions // osfmk/tests/vm_parameter_validation_kern.c
1877*33de042dSApple OSS Distributions 
1878*33de042dSApple OSS Distributions #define KERN_RESULT_DELIMITER "\n"
1879*33de042dSApple OSS Distributions 
1880*33de042dSApple OSS Distributions // Read results written by __dump_results()
1881*33de042dSApple OSS Distributions static int
populate_kernel_results(char * kern_buffer)1882*33de042dSApple OSS Distributions populate_kernel_results(char *kern_buffer)
1883*33de042dSApple OSS Distributions {
1884*33de042dSApple OSS Distributions 	char *line = NULL;
1885*33de042dSApple OSS Distributions 	char *sub_line = NULL;
1886*33de042dSApple OSS Distributions 	char *test_name = NULL;
1887*33de042dSApple OSS Distributions 	char *result_name = NULL;
1888*33de042dSApple OSS Distributions 	char *token = NULL;
1889*33de042dSApple OSS Distributions 	results_t *kern_results = NULL;
1890*33de042dSApple OSS Distributions 	uint32_t num_kern_results = 0;
1891*33de042dSApple OSS Distributions 	uint32_t result_number = 0;
1892*33de042dSApple OSS Distributions 	int result_ret = 0;
1893*33de042dSApple OSS Distributions 	bool in_test = FALSE;
1894*33de042dSApple OSS Distributions 
1895*33de042dSApple OSS Distributions 	line = strtok(kern_buffer, KERN_RESULT_DELIMITER);
1896*33de042dSApple OSS Distributions 	while (line != NULL) {
1897*33de042dSApple OSS Distributions 		if (strncmp(line, TESTNAME_DELIMITER, strlen(TESTNAME_DELIMITER)) == 0) {
1898*33de042dSApple OSS Distributions 			sub_line = line + strlen(TESTNAME_DELIMITER);
1899*33de042dSApple OSS Distributions 			test_name = strdup(sub_line);
1900*33de042dSApple OSS Distributions 			// Some test trials are up to 614656 combinations, use count from golden list if possible.
1901*33de042dSApple OSS Distributions 			// Otherwise just get a small number of them (full results can be printed with DUMP=1)
1902*33de042dSApple OSS Distributions 			num_kern_results = KERN_MAX_UNKNOWN_TEST_RESULTS;
1903*33de042dSApple OSS Distributions 			results_t *golden_result = test_name_to_golden_results(test_name);
1904*33de042dSApple OSS Distributions 			if (golden_result) {
1905*33de042dSApple OSS Distributions 				num_kern_results = golden_result->count;
1906*33de042dSApple OSS Distributions 			} else {
1907*33de042dSApple OSS Distributions 				T_LOG("kern %s not found in golden list\n", test_name);
1908*33de042dSApple OSS Distributions 			}
1909*33de042dSApple OSS Distributions 			kern_results = alloc_results(test_name, NULL, num_kern_results);
1910*33de042dSApple OSS Distributions 			kern_results->count = num_kern_results;
1911*33de042dSApple OSS Distributions 			kern_list[num_kern_tests++] = kern_results;
1912*33de042dSApple OSS Distributions 			result_number = 0;
1913*33de042dSApple OSS Distributions 			in_test = TRUE;
1914*33de042dSApple OSS Distributions 		} else if (in_test && strncmp(line, TESTCONFIG_DELIMITER, strlen(TESTCONFIG_DELIMITER)) == 0) {
1915*33de042dSApple OSS Distributions 			assert(kern_results->testconfig == NULL);
1916*33de042dSApple OSS Distributions 			sub_line = line + strlen(TESTCONFIG_DELIMITER);
1917*33de042dSApple OSS Distributions 			kern_results->testconfig = strdup(sub_line);
1918*33de042dSApple OSS Distributions 		} else if (in_test && strstr(line, KERN_TESTRESULT_DELIMITER)) {
1919*33de042dSApple OSS Distributions 			// should have found TESTCONFIG already
1920*33de042dSApple OSS Distributions 			assert(kern_results->testconfig != NULL);
1921*33de042dSApple OSS Distributions 			sscanf(line, KERN_TESTRESULT_DELIMITER "%d", &result_ret);
1922*33de042dSApple OSS Distributions 			// get result name (comes after the first ,)
1923*33de042dSApple OSS Distributions 			token = strchr(line, ',');
1924*33de042dSApple OSS Distributions 			if (token) {
1925*33de042dSApple OSS Distributions 				token = token + 2; // skip the , and the extra space
1926*33de042dSApple OSS Distributions 				result_name = strdup(token);
1927*33de042dSApple OSS Distributions 				if (result_number >= num_kern_results) {
1928*33de042dSApple OSS Distributions 					T_LOG("\tKERN Recreate Golden List? skipping result %d - %s from test %s\n", result_ret, result_name, test_name);
1929*33de042dSApple OSS Distributions 					free(result_name);
1930*33de042dSApple OSS Distributions 				} else {
1931*33de042dSApple OSS Distributions 					kern_results->list[result_number++] = (result_t){.ret = result_ret, .name = result_name};
1932*33de042dSApple OSS Distributions 				}
1933*33de042dSApple OSS Distributions 			}
1934*33de042dSApple OSS Distributions 		} else {
1935*33de042dSApple OSS Distributions 			// T_LOG("Unknown kernel result line: %s\n", line);
1936*33de042dSApple OSS Distributions 			//in_test = FALSE;
1937*33de042dSApple OSS Distributions 		}
1938*33de042dSApple OSS Distributions 
1939*33de042dSApple OSS Distributions 		line = strtok(NULL, KERN_RESULT_DELIMITER);
1940*33de042dSApple OSS Distributions 	}
1941*33de042dSApple OSS Distributions 
1942*33de042dSApple OSS Distributions 	dump_kernel_results_list();
1943*33de042dSApple OSS Distributions 
1944*33de042dSApple OSS Distributions 	return 0;
1945*33de042dSApple OSS Distributions }
1946*33de042dSApple OSS Distributions 
1947*33de042dSApple OSS Distributions static int64_t
run_sysctl_test(const char * t,int64_t value)1948*33de042dSApple OSS Distributions run_sysctl_test(const char *t, int64_t value)
1949*33de042dSApple OSS Distributions {
1950*33de042dSApple OSS Distributions 	char name[1024];
1951*33de042dSApple OSS Distributions 	int64_t result = 0;
1952*33de042dSApple OSS Distributions 	size_t s = sizeof(value);
1953*33de042dSApple OSS Distributions 	int rc;
1954*33de042dSApple OSS Distributions 
1955*33de042dSApple OSS Distributions 	snprintf(name, sizeof(name), "debug.test.%s", t);
1956*33de042dSApple OSS Distributions 	rc = sysctlbyname(name, &result, &s, &value, s);
1957*33de042dSApple OSS Distributions 	T_QUIET; T_ASSERT_POSIX_SUCCESS(rc, "sysctlbyname(%s)", t);
1958*33de042dSApple OSS Distributions 	return result;
1959*33de042dSApple OSS Distributions }
1960*33de042dSApple OSS Distributions 
1961*33de042dSApple OSS Distributions T_DECL(vm_parameter_validation_kern,
1962*33de042dSApple OSS Distributions     "parameter validation for kext/xnu calls",
1963*33de042dSApple OSS Distributions     T_META_SPAWN_TOOL(DECOMPRESS),
1964*33de042dSApple OSS Distributions     T_META_SPAWN_TOOL_ARG("kern"),
1965*33de042dSApple OSS Distributions     T_META_SPAWN_TOOL_ARG(TMP_DIR),
1966*33de042dSApple OSS Distributions     T_META_SPAWN_TOOL_ARG(GOLDEN_FILES_VERSION)
1967*33de042dSApple OSS Distributions     )
1968*33de042dSApple OSS Distributions {
1969*33de042dSApple OSS Distributions 	if (disable_vm_sanitize_telemetry() != 0) {
1970*33de042dSApple OSS Distributions 		T_FAIL("Could not disable VM API telemetry. Bailing out early.");
1971*33de042dSApple OSS Distributions 		return;
1972*33de042dSApple OSS Distributions 	}
1973*33de042dSApple OSS Distributions 
1974*33de042dSApple OSS Distributions 	read_env();
1975*33de042dSApple OSS Distributions 
1976*33de042dSApple OSS Distributions 	// Check if kernel will return using golding list format.
1977*33de042dSApple OSS Distributions 	int64_t kern_golden_arg = 0;
1978*33de042dSApple OSS Distributions 	if (os_parse_boot_arg_int("vm_parameter_validation_kern_golden", &kern_golden_arg)) {
1979*33de042dSApple OSS Distributions 		T_LOG("vm_parameter_validation_kern_golden=%lld found in boot args\n", kern_golden_arg);
1980*33de042dSApple OSS Distributions 		generate_golden |= (kern_golden_arg == 1);
1981*33de042dSApple OSS Distributions 	}
1982*33de042dSApple OSS Distributions 
1983*33de042dSApple OSS Distributions 	T_LOG("dump %d, golden %d, test %d\n", dump, generate_golden, test_results);
1984*33de042dSApple OSS Distributions 	if (test_results && populate_golden_results(KERN_GOLDEN_FILE)) {
1985*33de042dSApple OSS Distributions 		// couldn't load golden test results
1986*33de042dSApple OSS Distributions 		T_FAIL("Could not open golden file '%s'\n", KERN_GOLDEN_FILE);
1987*33de042dSApple OSS Distributions 		return;
1988*33de042dSApple OSS Distributions 	}
1989*33de042dSApple OSS Distributions 
1990*33de042dSApple OSS Distributions 	disable_exc_guard();
1991*33de042dSApple OSS Distributions 
1992*33de042dSApple OSS Distributions 	T_LOG("Continue to test part\n");
1993*33de042dSApple OSS Distributions 
1994*33de042dSApple OSS Distributions 	// We allocate a large buffer. The kernel-side code writes output to it.
1995*33de042dSApple OSS Distributions 	// Then we print that output. This is faster than making the kernel-side
1996*33de042dSApple OSS Distributions 	// code print directly to the serial console, which takes many minutes
1997*33de042dSApple OSS Distributions 	// to transfer our test output at 14.4 KB/s.
1998*33de042dSApple OSS Distributions 	// We align this buffer to KB16 to allow the lower bits to be used for a fd.
1999*33de042dSApple OSS Distributions 	void *output;
2000*33de042dSApple OSS Distributions 	int alloc_failed = posix_memalign(&output, KB16, SYSCTL_OUTPUT_BUFFER_SIZE);
2001*33de042dSApple OSS Distributions 	assert(alloc_failed == 0);
2002*33de042dSApple OSS Distributions 
2003*33de042dSApple OSS Distributions 	memset(output, 0, SYSCTL_OUTPUT_BUFFER_SIZE);
2004*33de042dSApple OSS Distributions 
2005*33de042dSApple OSS Distributions 	int fd = get_fd();
2006*33de042dSApple OSS Distributions 	assert((fd & ((int)KB16 - 1)) == fd);
2007*33de042dSApple OSS Distributions 	if (generate_golden) {
2008*33de042dSApple OSS Distributions 		// pass flag on the msb of the fd
2009*33de042dSApple OSS Distributions 		assert((fd & ((int)(KB16 >> 1) - 1)) == fd);
2010*33de042dSApple OSS Distributions 		fd |=  KB16 >> 1;
2011*33de042dSApple OSS Distributions 	}
2012*33de042dSApple OSS Distributions 	int64_t result = run_sysctl_test("vm_parameter_validation_kern", (int64_t)output + fd);
2013*33de042dSApple OSS Distributions 
2014*33de042dSApple OSS Distributions 	T_QUIET; T_EXPECT_EQ(1ull, result, "vm_parameter_validation_kern");
2015*33de042dSApple OSS Distributions 
2016*33de042dSApple OSS Distributions 	if (generate_golden || !test_results) {
2017*33de042dSApple OSS Distributions 		// just print the reduced list result
2018*33de042dSApple OSS Distributions 		printf("%s", output);
2019*33de042dSApple OSS Distributions 	} else {
2020*33de042dSApple OSS Distributions 		// recreate a results_t to compare against the golden file results
2021*33de042dSApple OSS Distributions 		if (populate_kernel_results(output)) {
2022*33de042dSApple OSS Distributions 			T_FAIL("Error while parsing results\n");
2023*33de042dSApple OSS Distributions 		}
2024*33de042dSApple OSS Distributions 
2025*33de042dSApple OSS Distributions 		// compare results against values from golden list
2026*33de042dSApple OSS Distributions 		for (uint32_t x = 0; x < num_kern_tests; ++x) {
2027*33de042dSApple OSS Distributions 			dump_results(kern_list[x]);
2028*33de042dSApple OSS Distributions 		}
2029*33de042dSApple OSS Distributions 	}
2030*33de042dSApple OSS Distributions 
2031*33de042dSApple OSS Distributions 	free(output);
2032*33de042dSApple OSS Distributions 
2033*33de042dSApple OSS Distributions 	if (!generate_golden) {
2034*33de042dSApple OSS Distributions 		clean_kernel_results();
2035*33de042dSApple OSS Distributions 		clean_golden_results();
2036*33de042dSApple OSS Distributions 	}
2037*33de042dSApple OSS Distributions 
2038*33de042dSApple OSS Distributions 	restore_exc_guard();
2039*33de042dSApple OSS Distributions 
2040*33de042dSApple OSS Distributions 	if (reenable_vm_sanitize_telemetry() != 0) {
2041*33de042dSApple OSS Distributions 		T_FAIL("Failed to reenable VM API telemetry.");
2042*33de042dSApple OSS Distributions 		return;
2043*33de042dSApple OSS Distributions 	}
2044*33de042dSApple OSS Distributions 
2045*33de042dSApple OSS Distributions 	T_PASS("vm parameter validation kern");
2046*33de042dSApple OSS Distributions }
2047