1*4f1223e8SApple OSS Distributions #include <darwintest.h>
2*4f1223e8SApple OSS Distributions
3*4f1223e8SApple OSS Distributions #include <stdlib.h>
4*4f1223e8SApple OSS Distributions
5*4f1223e8SApple OSS Distributions #include <mach/mach_init.h>
6*4f1223e8SApple OSS Distributions #include <mach/mach_vm.h>
7*4f1223e8SApple OSS Distributions #include <mach/vm_map.h>
8*4f1223e8SApple OSS Distributions
9*4f1223e8SApple OSS Distributions T_GLOBAL_META(
10*4f1223e8SApple OSS Distributions T_META_NAMESPACE("xnu.vm"),
11*4f1223e8SApple OSS Distributions T_META_RADAR_COMPONENT_NAME("xnu"),
12*4f1223e8SApple OSS Distributions T_META_RADAR_COMPONENT_VERSION("VM"));
13*4f1223e8SApple OSS Distributions
14*4f1223e8SApple OSS Distributions static char *_prot_str[] = {
15*4f1223e8SApple OSS Distributions /* 0 */ "---",
16*4f1223e8SApple OSS Distributions /* 1 */ "r--",
17*4f1223e8SApple OSS Distributions /* 2 */ "-w-",
18*4f1223e8SApple OSS Distributions /* 3 */ "rw-",
19*4f1223e8SApple OSS Distributions /* 4 */ "--x",
20*4f1223e8SApple OSS Distributions /* 5 */ "r-x",
21*4f1223e8SApple OSS Distributions /* 6 */ "-wx",
22*4f1223e8SApple OSS Distributions /* 7 */ "rwx"
23*4f1223e8SApple OSS Distributions };
24*4f1223e8SApple OSS Distributions static char *
prot_str(vm_prot_t prot)25*4f1223e8SApple OSS Distributions prot_str(vm_prot_t prot)
26*4f1223e8SApple OSS Distributions {
27*4f1223e8SApple OSS Distributions return _prot_str[prot & VM_PROT_ALL];
28*4f1223e8SApple OSS Distributions }
29*4f1223e8SApple OSS Distributions
30*4f1223e8SApple OSS Distributions static void
print_region_info(mach_vm_address_t vmaddr,mach_vm_size_t vmsize,vm_region_submap_short_info_64_t ri,mach_vm_address_t vmaddr2,mach_vm_size_t vmsize2,vm_region_submap_short_info_64_t ri2)31*4f1223e8SApple OSS Distributions print_region_info(
32*4f1223e8SApple OSS Distributions mach_vm_address_t vmaddr,
33*4f1223e8SApple OSS Distributions mach_vm_size_t vmsize,
34*4f1223e8SApple OSS Distributions vm_region_submap_short_info_64_t ri,
35*4f1223e8SApple OSS Distributions mach_vm_address_t vmaddr2,
36*4f1223e8SApple OSS Distributions mach_vm_size_t vmsize2,
37*4f1223e8SApple OSS Distributions vm_region_submap_short_info_64_t ri2)
38*4f1223e8SApple OSS Distributions {
39*4f1223e8SApple OSS Distributions T_LOG(" [ 0x%016llx - 0x%016llx ] size 0x%016llx prot 0x%x/0x%x %s/%s submap %d\n",
40*4f1223e8SApple OSS Distributions (uint64_t)vmaddr, (uint64_t)(vmaddr + vmsize), (uint64_t)vmsize,
41*4f1223e8SApple OSS Distributions ri->protection, ri->max_protection,
42*4f1223e8SApple OSS Distributions prot_str(ri->protection),
43*4f1223e8SApple OSS Distributions prot_str(ri->max_protection),
44*4f1223e8SApple OSS Distributions ri->is_submap);
45*4f1223e8SApple OSS Distributions if (ri2) {
46*4f1223e8SApple OSS Distributions T_LOG("-> [ 0x%016llx - 0x%016llx ] size 0x%016llx prot 0x%x/0x%x %s/%s submap %d\n",
47*4f1223e8SApple OSS Distributions (uint64_t)vmaddr2, (uint64_t)(vmaddr2 + vmsize2),
48*4f1223e8SApple OSS Distributions (uint64_t)vmsize2,
49*4f1223e8SApple OSS Distributions ri2->protection, ri2->max_protection,
50*4f1223e8SApple OSS Distributions prot_str(ri2->protection), prot_str(ri2->max_protection),
51*4f1223e8SApple OSS Distributions ri2->is_submap);
52*4f1223e8SApple OSS Distributions }
53*4f1223e8SApple OSS Distributions }
54*4f1223e8SApple OSS Distributions
55*4f1223e8SApple OSS Distributions static bool
find_first_read_only_mapping(mach_vm_address_t * vmaddr_p,mach_vm_size_t * vmsize_p,vm_region_submap_short_info_64_t ri)56*4f1223e8SApple OSS Distributions find_first_read_only_mapping(
57*4f1223e8SApple OSS Distributions mach_vm_address_t *vmaddr_p,
58*4f1223e8SApple OSS Distributions mach_vm_size_t *vmsize_p,
59*4f1223e8SApple OSS Distributions vm_region_submap_short_info_64_t ri)
60*4f1223e8SApple OSS Distributions {
61*4f1223e8SApple OSS Distributions kern_return_t kr;
62*4f1223e8SApple OSS Distributions mach_vm_address_t vmaddr;
63*4f1223e8SApple OSS Distributions mach_vm_size_t vmsize;
64*4f1223e8SApple OSS Distributions natural_t depth;
65*4f1223e8SApple OSS Distributions mach_msg_type_number_t count;
66*4f1223e8SApple OSS Distributions
67*4f1223e8SApple OSS Distributions T_LOG("===== Looking for first read-only mapping");
68*4f1223e8SApple OSS Distributions /* find the first read-only mapping */
69*4f1223e8SApple OSS Distributions for (vmaddr = 0;; vmaddr += vmsize) {
70*4f1223e8SApple OSS Distributions depth = 0;
71*4f1223e8SApple OSS Distributions count = VM_REGION_SUBMAP_SHORT_INFO_COUNT_64;
72*4f1223e8SApple OSS Distributions kr = mach_vm_region_recurse(mach_task_self(),
73*4f1223e8SApple OSS Distributions &vmaddr,
74*4f1223e8SApple OSS Distributions &vmsize,
75*4f1223e8SApple OSS Distributions &depth,
76*4f1223e8SApple OSS Distributions (vm_region_recurse_info_t)ri,
77*4f1223e8SApple OSS Distributions &count);
78*4f1223e8SApple OSS Distributions T_QUIET; T_EXPECT_MACH_SUCCESS(kr, "mach_vm_region_recurse(0x%llx)\n", vmaddr);
79*4f1223e8SApple OSS Distributions if (kr != KERN_SUCCESS) {
80*4f1223e8SApple OSS Distributions /* end of address space */
81*4f1223e8SApple OSS Distributions T_FAIL("could not find first read-only mapping");
82*4f1223e8SApple OSS Distributions return false;
83*4f1223e8SApple OSS Distributions }
84*4f1223e8SApple OSS Distributions if (ri->is_submap) {
85*4f1223e8SApple OSS Distributions /* submap: keep looking */
86*4f1223e8SApple OSS Distributions continue;
87*4f1223e8SApple OSS Distributions }
88*4f1223e8SApple OSS Distributions if (ri->max_protection != VM_PROT_READ) {
89*4f1223e8SApple OSS Distributions /* not read-only: keep looking */
90*4f1223e8SApple OSS Distributions continue;
91*4f1223e8SApple OSS Distributions }
92*4f1223e8SApple OSS Distributions T_PASS("Found first read-only mapping at 0x%llx size 0x%llx\n", (uint64_t)vmaddr, (uint64_t)vmsize);
93*4f1223e8SApple OSS Distributions *vmaddr_p = vmaddr;
94*4f1223e8SApple OSS Distributions *vmsize_p = vmsize;
95*4f1223e8SApple OSS Distributions return true;
96*4f1223e8SApple OSS Distributions }
97*4f1223e8SApple OSS Distributions return false;
98*4f1223e8SApple OSS Distributions }
99*4f1223e8SApple OSS Distributions
100*4f1223e8SApple OSS Distributions T_DECL(vm_test_linkedit_permanent, "Tests that LINKEDIT mapping can't be overwritten", T_META_TAG_VM_PREFERRED)
101*4f1223e8SApple OSS Distributions {
102*4f1223e8SApple OSS Distributions kern_return_t kr;
103*4f1223e8SApple OSS Distributions mach_vm_address_t vmaddr, vmaddr_linkedit, vmaddr_tmp, vmaddr_buf;
104*4f1223e8SApple OSS Distributions mach_vm_size_t vmsize, vmsize_linkedit, vmsize_tmp;
105*4f1223e8SApple OSS Distributions natural_t depth1, depth2;
106*4f1223e8SApple OSS Distributions mach_msg_type_number_t count;
107*4f1223e8SApple OSS Distributions vm_region_submap_short_info_data_64_t ri1, ri2;
108*4f1223e8SApple OSS Distributions vm_prot_t cur_prot, max_prot;
109*4f1223e8SApple OSS Distributions
110*4f1223e8SApple OSS Distributions #if __x86_64__
111*4f1223e8SApple OSS Distributions T_SKIP("x86_64: LINKEDIT mappings are not protected");
112*4f1223e8SApple OSS Distributions return;
113*4f1223e8SApple OSS Distributions #endif /* __x86_64 */
114*4f1223e8SApple OSS Distributions
115*4f1223e8SApple OSS Distributions #define ASSERT_UNCHANGED(clip_ok, object_change_ok) \
116*4f1223e8SApple OSS Distributions do { \
117*4f1223e8SApple OSS Distributions if (clip_ok) { \
118*4f1223e8SApple OSS Distributions T_EXPECT_GE(vmaddr_tmp, vmaddr, \
119*4f1223e8SApple OSS Distributions "vmaddr clipped 0x%llx -> 0x%llx", \
120*4f1223e8SApple OSS Distributions (uint64_t)vmaddr, (uint64_t)vmaddr_tmp); \
121*4f1223e8SApple OSS Distributions T_EXPECT_LE(vmsize_tmp, vmsize, \
122*4f1223e8SApple OSS Distributions "vmsize clipped 0x%llx -> 0x%llx", \
123*4f1223e8SApple OSS Distributions (uint64_t)vmsize, (uint64_t)vmsize_tmp); \
124*4f1223e8SApple OSS Distributions } else { \
125*4f1223e8SApple OSS Distributions T_EXPECT_EQ(vmaddr_tmp, vmaddr, \
126*4f1223e8SApple OSS Distributions "vmaddr unchanged 0x%llx -> 0x%llx", \
127*4f1223e8SApple OSS Distributions (uint64_t)vmaddr, (uint64_t)vmaddr_tmp); \
128*4f1223e8SApple OSS Distributions T_EXPECT_EQ(vmsize_tmp, vmsize, \
129*4f1223e8SApple OSS Distributions "vmsize unchanged 0x%llx -> 0x%llx", \
130*4f1223e8SApple OSS Distributions (uint64_t)vmsize, (uint64_t)vmsize_tmp); \
131*4f1223e8SApple OSS Distributions } \
132*4f1223e8SApple OSS Distributions T_EXPECT_LE(ri2.protection, VM_PROT_READ, \
133*4f1223e8SApple OSS Distributions "should not become writable"); \
134*4f1223e8SApple OSS Distributions T_EXPECT_LE(ri2.max_protection, VM_PROT_READ, \
135*4f1223e8SApple OSS Distributions "should not become able to become writable"); \
136*4f1223e8SApple OSS Distributions if (!object_change_ok) { \
137*4f1223e8SApple OSS Distributions T_EXPECT_EQ(ri2.object_id, ri1.object_id, \
138*4f1223e8SApple OSS Distributions "object id should not change"); \
139*4f1223e8SApple OSS Distributions } \
140*4f1223e8SApple OSS Distributions } while (0)
141*4f1223e8SApple OSS Distributions
142*4f1223e8SApple OSS Distributions T_LOG("==========================================");
143*4f1223e8SApple OSS Distributions if (!find_first_read_only_mapping(&vmaddr_linkedit, &vmsize_linkedit, &ri2)) {
144*4f1223e8SApple OSS Distributions T_FAIL("could not find appropriate mapping");
145*4f1223e8SApple OSS Distributions return;
146*4f1223e8SApple OSS Distributions }
147*4f1223e8SApple OSS Distributions T_LOG("==========================================");
148*4f1223e8SApple OSS Distributions /* get top-level mapping protections */
149*4f1223e8SApple OSS Distributions vmaddr = vmaddr_linkedit;
150*4f1223e8SApple OSS Distributions depth1 = 0;
151*4f1223e8SApple OSS Distributions count = VM_REGION_SUBMAP_SHORT_INFO_COUNT_64;
152*4f1223e8SApple OSS Distributions kr = mach_vm_region_recurse(mach_task_self(),
153*4f1223e8SApple OSS Distributions &vmaddr,
154*4f1223e8SApple OSS Distributions &vmsize,
155*4f1223e8SApple OSS Distributions &depth1,
156*4f1223e8SApple OSS Distributions (vm_region_recurse_info_t)&ri1,
157*4f1223e8SApple OSS Distributions &count);
158*4f1223e8SApple OSS Distributions T_EXPECT_MACH_SUCCESS(kr, "mach_vm_region_recurse(0x%llx)\n", vmaddr_linkedit);
159*4f1223e8SApple OSS Distributions print_region_info(vmaddr, vmsize, &ri1, vmaddr_linkedit, vmsize_linkedit, &ri2);
160*4f1223e8SApple OSS Distributions
161*4f1223e8SApple OSS Distributions
162*4f1223e8SApple OSS Distributions
163*4f1223e8SApple OSS Distributions /* vm_write() on LINKEDIT mapping */
164*4f1223e8SApple OSS Distributions T_LOG("==========================================");
165*4f1223e8SApple OSS Distributions T_LOG("===== vm_write() on LINKEDIT mapping");
166*4f1223e8SApple OSS Distributions T_LOG("==========================================");
167*4f1223e8SApple OSS Distributions T_EXPECT_EQ(ri1.is_submap, 0, "mapping should be nested");
168*4f1223e8SApple OSS Distributions /* get a temporary buffer */
169*4f1223e8SApple OSS Distributions kr = mach_vm_allocate(mach_task_self(),
170*4f1223e8SApple OSS Distributions &vmaddr_buf,
171*4f1223e8SApple OSS Distributions vmsize_linkedit,
172*4f1223e8SApple OSS Distributions VM_FLAGS_ANYWHERE);
173*4f1223e8SApple OSS Distributions T_EXPECT_MACH_SUCCESS(kr, "vm_allocate(0x%llx)", vmsize_linkedit);
174*4f1223e8SApple OSS Distributions /* copy the data to avoid undue crash */
175*4f1223e8SApple OSS Distributions memcpy((char *)(uintptr_t)vmaddr_buf,
176*4f1223e8SApple OSS Distributions (char *)(uintptr_t)vmaddr_linkedit,
177*4f1223e8SApple OSS Distributions (size_t)vmsize_linkedit);
178*4f1223e8SApple OSS Distributions kr = mach_vm_write(mach_task_self(),
179*4f1223e8SApple OSS Distributions vmaddr_linkedit, /* destination address */
180*4f1223e8SApple OSS Distributions vmaddr_buf, /* source buffer */
181*4f1223e8SApple OSS Distributions (mach_msg_type_number_t) vmsize_linkedit);
182*4f1223e8SApple OSS Distributions T_EXPECT_MACH_ERROR(kr, KERN_PROTECTION_FAILURE,
183*4f1223e8SApple OSS Distributions "vm_write() on LINKEDIT mapping fails with KERN_PROTECTION_FAILURE");
184*4f1223e8SApple OSS Distributions /* check protections again */
185*4f1223e8SApple OSS Distributions depth2 = 0;
186*4f1223e8SApple OSS Distributions count = VM_REGION_SUBMAP_SHORT_INFO_COUNT_64;
187*4f1223e8SApple OSS Distributions vmaddr_tmp = vmaddr_linkedit;
188*4f1223e8SApple OSS Distributions kr = mach_vm_region_recurse(mach_task_self(),
189*4f1223e8SApple OSS Distributions &vmaddr_tmp,
190*4f1223e8SApple OSS Distributions &vmsize_tmp,
191*4f1223e8SApple OSS Distributions &depth2,
192*4f1223e8SApple OSS Distributions (vm_region_recurse_info_t)&ri2,
193*4f1223e8SApple OSS Distributions &count);
194*4f1223e8SApple OSS Distributions T_EXPECT_MACH_SUCCESS(kr, "mach_vm_region_recurse(0x%llx)\n", vmaddr_linkedit);
195*4f1223e8SApple OSS Distributions print_region_info(vmaddr_linkedit, vmsize_linkedit, &ri1, vmaddr_tmp, vmsize_tmp, &ri2);
196*4f1223e8SApple OSS Distributions ASSERT_UNCHANGED(false, false);
197*4f1223e8SApple OSS Distributions T_EXPECT_EQ(ri2.is_submap, 0, "mapping should not be nested");
198*4f1223e8SApple OSS Distributions
199*4f1223e8SApple OSS Distributions /* vm_allocate(VM_FLAGS_OVERWRITE) on top of LINKEDIT */
200*4f1223e8SApple OSS Distributions T_LOG("==========================================");
201*4f1223e8SApple OSS Distributions T_LOG("===== vm_allocate(VM_FLAGS_OVERWRITE) on LINKEDIT mapping");
202*4f1223e8SApple OSS Distributions T_LOG("==========================================");
203*4f1223e8SApple OSS Distributions T_EXPECT_EQ(ri1.is_submap, 0, "mapping should not be nested");
204*4f1223e8SApple OSS Distributions vmaddr_tmp = vmaddr_linkedit;
205*4f1223e8SApple OSS Distributions kr = mach_vm_allocate(mach_task_self(),
206*4f1223e8SApple OSS Distributions &vmaddr_tmp,
207*4f1223e8SApple OSS Distributions vmsize_linkedit,
208*4f1223e8SApple OSS Distributions VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE);
209*4f1223e8SApple OSS Distributions T_EXPECT_MACH_ERROR(kr, KERN_NO_SPACE, "vm_allocate(OVERWRITE) fails with KERN_NO_SPACE");
210*4f1223e8SApple OSS Distributions T_EXPECT_EQ(vmaddr_linkedit, vmaddr_tmp, "vmaddr is unchanged");
211*4f1223e8SApple OSS Distributions /* check protections again */
212*4f1223e8SApple OSS Distributions depth2 = 0;
213*4f1223e8SApple OSS Distributions vmaddr_tmp = vmaddr_linkedit;
214*4f1223e8SApple OSS Distributions count = VM_REGION_SUBMAP_SHORT_INFO_COUNT_64;
215*4f1223e8SApple OSS Distributions kr = mach_vm_region_recurse(mach_task_self(),
216*4f1223e8SApple OSS Distributions &vmaddr_tmp,
217*4f1223e8SApple OSS Distributions &vmsize_tmp,
218*4f1223e8SApple OSS Distributions &depth2,
219*4f1223e8SApple OSS Distributions (vm_region_recurse_info_t)&ri2,
220*4f1223e8SApple OSS Distributions &count);
221*4f1223e8SApple OSS Distributions T_EXPECT_MACH_SUCCESS(kr, "mach_vm_region_recurse(0x%llx)\n", vmaddr_linkedit);
222*4f1223e8SApple OSS Distributions print_region_info(vmaddr, vmsize, &ri1, vmaddr_tmp, vmsize_tmp, &ri2);
223*4f1223e8SApple OSS Distributions ASSERT_UNCHANGED(false, false);
224*4f1223e8SApple OSS Distributions T_EXPECT_EQ(ri2.is_submap, 0, "mapping should not be nested");
225*4f1223e8SApple OSS Distributions
226*4f1223e8SApple OSS Distributions /* vm_remap(VM_FLAGS_OVERWRITE) on top of submap */
227*4f1223e8SApple OSS Distributions T_LOG("==========================================");
228*4f1223e8SApple OSS Distributions T_LOG("===== vm_remap(VM_FLAGS_OVERWRITE) on LINKEDIT mapping");
229*4f1223e8SApple OSS Distributions T_LOG("==========================================");
230*4f1223e8SApple OSS Distributions T_EXPECT_EQ(ri1.is_submap, 0, "mapping should not be nested");
231*4f1223e8SApple OSS Distributions vmaddr_tmp = vmaddr_linkedit;
232*4f1223e8SApple OSS Distributions kr = mach_vm_remap(mach_task_self(),
233*4f1223e8SApple OSS Distributions &vmaddr_tmp,
234*4f1223e8SApple OSS Distributions vmsize_linkedit,
235*4f1223e8SApple OSS Distributions 0,
236*4f1223e8SApple OSS Distributions VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE,
237*4f1223e8SApple OSS Distributions mach_task_self(),
238*4f1223e8SApple OSS Distributions vmaddr_buf,
239*4f1223e8SApple OSS Distributions TRUE,
240*4f1223e8SApple OSS Distributions &cur_prot,
241*4f1223e8SApple OSS Distributions &max_prot,
242*4f1223e8SApple OSS Distributions VM_INHERIT_DEFAULT);
243*4f1223e8SApple OSS Distributions T_EXPECT_MACH_ERROR(kr, KERN_NO_SPACE, "vm_remap(OVERWRITE) fails with KERN_NO_SPACE");
244*4f1223e8SApple OSS Distributions T_EXPECT_EQ(vmaddr_linkedit, vmaddr_tmp, "vmaddr is unchanged");
245*4f1223e8SApple OSS Distributions /* check protections again */
246*4f1223e8SApple OSS Distributions depth2 = 0;
247*4f1223e8SApple OSS Distributions vmaddr_tmp = vmaddr_linkedit;
248*4f1223e8SApple OSS Distributions count = VM_REGION_SUBMAP_SHORT_INFO_COUNT_64;
249*4f1223e8SApple OSS Distributions kr = mach_vm_region_recurse(mach_task_self(),
250*4f1223e8SApple OSS Distributions &vmaddr_tmp,
251*4f1223e8SApple OSS Distributions &vmsize_tmp,
252*4f1223e8SApple OSS Distributions &depth2,
253*4f1223e8SApple OSS Distributions (vm_region_recurse_info_t)&ri2,
254*4f1223e8SApple OSS Distributions &count);
255*4f1223e8SApple OSS Distributions T_EXPECT_MACH_SUCCESS(kr, "mach_vm_region_recurse(0x%llx)\n", vmaddr_linkedit);
256*4f1223e8SApple OSS Distributions print_region_info(vmaddr, vmsize, &ri1, vmaddr_tmp, vmsize_tmp, &ri2);
257*4f1223e8SApple OSS Distributions ASSERT_UNCHANGED(false, false);
258*4f1223e8SApple OSS Distributions T_EXPECT_EQ(ri2.is_submap, 0, "mapping should not be nested");
259*4f1223e8SApple OSS Distributions
260*4f1223e8SApple OSS Distributions /* vm_protect(VM_PROT_COPY) on LINKEDIT mapping */
261*4f1223e8SApple OSS Distributions T_LOG("==========================================");
262*4f1223e8SApple OSS Distributions T_LOG("===== vm_protect(VM_PROT_COPY) on LINKEDIT mapping");
263*4f1223e8SApple OSS Distributions T_LOG("==========================================");
264*4f1223e8SApple OSS Distributions ri1 = ri2;
265*4f1223e8SApple OSS Distributions T_EXPECT_EQ(ri1.is_submap, 0, "mapping should not be nested");
266*4f1223e8SApple OSS Distributions kr = mach_vm_protect(mach_task_self(),
267*4f1223e8SApple OSS Distributions vmaddr_linkedit,
268*4f1223e8SApple OSS Distributions vmsize_linkedit,
269*4f1223e8SApple OSS Distributions FALSE, /* set_maximum */
270*4f1223e8SApple OSS Distributions VM_PROT_COPY | VM_PROT_READ | VM_PROT_WRITE);
271*4f1223e8SApple OSS Distributions T_EXPECT_MACH_ERROR(kr, KERN_NO_SPACE,
272*4f1223e8SApple OSS Distributions "vm_protect(VM_PROT_COPY) fails with KERN_NO_SPACE");
273*4f1223e8SApple OSS Distributions /* check protections again */
274*4f1223e8SApple OSS Distributions depth2 = 0;
275*4f1223e8SApple OSS Distributions count = VM_REGION_SUBMAP_SHORT_INFO_COUNT_64;
276*4f1223e8SApple OSS Distributions vmaddr_tmp = vmaddr_linkedit;
277*4f1223e8SApple OSS Distributions kr = mach_vm_region_recurse(mach_task_self(),
278*4f1223e8SApple OSS Distributions &vmaddr_tmp,
279*4f1223e8SApple OSS Distributions &vmsize_tmp,
280*4f1223e8SApple OSS Distributions &depth2,
281*4f1223e8SApple OSS Distributions (vm_region_recurse_info_t)&ri2,
282*4f1223e8SApple OSS Distributions &count);
283*4f1223e8SApple OSS Distributions T_EXPECT_MACH_SUCCESS(kr, "mach_vm_region_recurse(0x%llx)\n", vmaddr_linkedit);
284*4f1223e8SApple OSS Distributions print_region_info(vmaddr, vmsize, &ri1, vmaddr_tmp, vmsize_tmp, &ri2);
285*4f1223e8SApple OSS Distributions ASSERT_UNCHANGED(false, true);
286*4f1223e8SApple OSS Distributions T_EXPECT_EQ(ri2.is_submap, 0, "mapping should not be nested");
287*4f1223e8SApple OSS Distributions
288*4f1223e8SApple OSS Distributions // T_LOG("pausing..."); getchar();
289*4f1223e8SApple OSS Distributions }
290