xref: /xnu-10063.121.3/osfmk/vm/vm32_user.c (revision 2c2f96dc2b9a4408a43d3150ae9c105355ca3daa)
1*2c2f96dcSApple OSS Distributions /*
2*2c2f96dcSApple OSS Distributions  * Copyright (c) 2008-2016 Apple Inc. All rights reserved.
3*2c2f96dcSApple OSS Distributions  *
4*2c2f96dcSApple OSS Distributions  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5*2c2f96dcSApple OSS Distributions  *
6*2c2f96dcSApple OSS Distributions  * This file contains Original Code and/or Modifications of Original Code
7*2c2f96dcSApple OSS Distributions  * as defined in and that are subject to the Apple Public Source License
8*2c2f96dcSApple OSS Distributions  * Version 2.0 (the 'License'). You may not use this file except in
9*2c2f96dcSApple OSS Distributions  * compliance with the License. The rights granted to you under the License
10*2c2f96dcSApple OSS Distributions  * may not be used to create, or enable the creation or redistribution of,
11*2c2f96dcSApple OSS Distributions  * unlawful or unlicensed copies of an Apple operating system, or to
12*2c2f96dcSApple OSS Distributions  * circumvent, violate, or enable the circumvention or violation of, any
13*2c2f96dcSApple OSS Distributions  * terms of an Apple operating system software license agreement.
14*2c2f96dcSApple OSS Distributions  *
15*2c2f96dcSApple OSS Distributions  * Please obtain a copy of the License at
16*2c2f96dcSApple OSS Distributions  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17*2c2f96dcSApple OSS Distributions  *
18*2c2f96dcSApple OSS Distributions  * The Original Code and all software distributed under the License are
19*2c2f96dcSApple OSS Distributions  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20*2c2f96dcSApple OSS Distributions  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21*2c2f96dcSApple OSS Distributions  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22*2c2f96dcSApple OSS Distributions  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23*2c2f96dcSApple OSS Distributions  * Please see the License for the specific language governing rights and
24*2c2f96dcSApple OSS Distributions  * limitations under the License.
25*2c2f96dcSApple OSS Distributions  *
26*2c2f96dcSApple OSS Distributions  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27*2c2f96dcSApple OSS Distributions  */
28*2c2f96dcSApple OSS Distributions /*
29*2c2f96dcSApple OSS Distributions  * @OSF_COPYRIGHT@
30*2c2f96dcSApple OSS Distributions  */
31*2c2f96dcSApple OSS Distributions /*
32*2c2f96dcSApple OSS Distributions  * Mach Operating System
33*2c2f96dcSApple OSS Distributions  * Copyright (c) 1991,1990,1989,1988 Carnegie Mellon University
34*2c2f96dcSApple OSS Distributions  * All Rights Reserved.
35*2c2f96dcSApple OSS Distributions  *
36*2c2f96dcSApple OSS Distributions  * Permission to use, copy, modify and distribute this software and its
37*2c2f96dcSApple OSS Distributions  * documentation is hereby granted, provided that both the copyright
38*2c2f96dcSApple OSS Distributions  * notice and this permission notice appear in all copies of the
39*2c2f96dcSApple OSS Distributions  * software, derivative works or modified versions, and any portions
40*2c2f96dcSApple OSS Distributions  * thereof, and that both notices appear in supporting documentation.
41*2c2f96dcSApple OSS Distributions  *
42*2c2f96dcSApple OSS Distributions  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
43*2c2f96dcSApple OSS Distributions  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
44*2c2f96dcSApple OSS Distributions  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
45*2c2f96dcSApple OSS Distributions  *
46*2c2f96dcSApple OSS Distributions  * Carnegie Mellon requests users of this software to return to
47*2c2f96dcSApple OSS Distributions  *
48*2c2f96dcSApple OSS Distributions  *  Software Distribution Coordinator  or  [email protected]
49*2c2f96dcSApple OSS Distributions  *  School of Computer Science
50*2c2f96dcSApple OSS Distributions  *  Carnegie Mellon University
51*2c2f96dcSApple OSS Distributions  *  Pittsburgh PA 15213-3890
52*2c2f96dcSApple OSS Distributions  *
53*2c2f96dcSApple OSS Distributions  * any improvements or extensions that they make and grant Carnegie Mellon
54*2c2f96dcSApple OSS Distributions  * the rights to redistribute these changes.
55*2c2f96dcSApple OSS Distributions  */
56*2c2f96dcSApple OSS Distributions /*
57*2c2f96dcSApple OSS Distributions  */
58*2c2f96dcSApple OSS Distributions /*
59*2c2f96dcSApple OSS Distributions  *	File:	vm/vm32_user.c
60*2c2f96dcSApple OSS Distributions  *	Author:	Avadis Tevanian, Jr., Michael Wayne Young
61*2c2f96dcSApple OSS Distributions  *
62*2c2f96dcSApple OSS Distributions  *	User-exported virtual memory functions.
63*2c2f96dcSApple OSS Distributions  */
64*2c2f96dcSApple OSS Distributions 
65*2c2f96dcSApple OSS Distributions #include <debug.h>
66*2c2f96dcSApple OSS Distributions 
67*2c2f96dcSApple OSS Distributions #include <mach/boolean.h>
68*2c2f96dcSApple OSS Distributions #include <mach/kern_return.h>
69*2c2f96dcSApple OSS Distributions #include <mach/mach_types.h>    /* to get vm_address_t */
70*2c2f96dcSApple OSS Distributions #include <mach/memory_object.h>
71*2c2f96dcSApple OSS Distributions #include <mach/std_types.h>     /* to get pointer_t */
72*2c2f96dcSApple OSS Distributions #include <mach/vm_attributes.h>
73*2c2f96dcSApple OSS Distributions #include <mach/vm_param.h>
74*2c2f96dcSApple OSS Distributions #include <mach/vm_statistics.h>
75*2c2f96dcSApple OSS Distributions #include <mach/mach_syscalls.h>
76*2c2f96dcSApple OSS Distributions 
77*2c2f96dcSApple OSS Distributions #include <mach/host_priv_server.h>
78*2c2f96dcSApple OSS Distributions #include <mach/mach_vm_server.h>
79*2c2f96dcSApple OSS Distributions #include <mach/vm32_map_server.h>
80*2c2f96dcSApple OSS Distributions 
81*2c2f96dcSApple OSS Distributions #include <kern/host.h>
82*2c2f96dcSApple OSS Distributions #include <kern/task.h>
83*2c2f96dcSApple OSS Distributions #include <kern/misc_protos.h>
84*2c2f96dcSApple OSS Distributions #include <vm/vm_fault.h>
85*2c2f96dcSApple OSS Distributions #include <vm/vm_map.h>
86*2c2f96dcSApple OSS Distributions #include <vm/vm_object.h>
87*2c2f96dcSApple OSS Distributions #include <vm/vm_page.h>
88*2c2f96dcSApple OSS Distributions #include <vm/memory_object.h>
89*2c2f96dcSApple OSS Distributions #include <vm/vm_pageout.h>
90*2c2f96dcSApple OSS Distributions #include <vm/vm_protos.h>
91*2c2f96dcSApple OSS Distributions 
92*2c2f96dcSApple OSS Distributions #ifdef VM32_SUPPORT
93*2c2f96dcSApple OSS Distributions 
94*2c2f96dcSApple OSS Distributions /*
95*2c2f96dcSApple OSS Distributions  * See vm_user.c for the real implementation of all of these functions.
96*2c2f96dcSApple OSS Distributions  * We call through to the mach_ "wide" versions of the routines, and trust
97*2c2f96dcSApple OSS Distributions  * that the VM system verifies the arguments and only returns address that
98*2c2f96dcSApple OSS Distributions  * are appropriate for the task's address space size.
99*2c2f96dcSApple OSS Distributions  *
100*2c2f96dcSApple OSS Distributions  * New VM call implementations should not be added here, because they would
101*2c2f96dcSApple OSS Distributions  * be available only to 32-bit userspace clients. Add them to vm_user.c
102*2c2f96dcSApple OSS Distributions  * and the corresponding prototype to mach_vm.defs (subsystem 4800).
103*2c2f96dcSApple OSS Distributions  */
104*2c2f96dcSApple OSS Distributions 
105*2c2f96dcSApple OSS Distributions kern_return_t
vm32_allocate(vm_map_t map,vm32_offset_t * addr,vm32_size_t size,int flags)106*2c2f96dcSApple OSS Distributions vm32_allocate(
107*2c2f96dcSApple OSS Distributions 	vm_map_t        map,
108*2c2f96dcSApple OSS Distributions 	vm32_offset_t   *addr,
109*2c2f96dcSApple OSS Distributions 	vm32_size_t     size,
110*2c2f96dcSApple OSS Distributions 	int             flags)
111*2c2f96dcSApple OSS Distributions {
112*2c2f96dcSApple OSS Distributions 	mach_vm_offset_t        maddr;
113*2c2f96dcSApple OSS Distributions 	kern_return_t           result;
114*2c2f96dcSApple OSS Distributions 
115*2c2f96dcSApple OSS Distributions 	maddr = *addr;
116*2c2f96dcSApple OSS Distributions 	result = mach_vm_allocate_external(map, &maddr, size, flags);
117*2c2f96dcSApple OSS Distributions 	*addr = CAST_DOWN_EXPLICIT(vm32_offset_t, maddr);
118*2c2f96dcSApple OSS Distributions 
119*2c2f96dcSApple OSS Distributions 	return result;
120*2c2f96dcSApple OSS Distributions }
121*2c2f96dcSApple OSS Distributions 
122*2c2f96dcSApple OSS Distributions kern_return_t
vm32_deallocate(vm_map_t map,vm32_offset_t start,vm32_size_t size)123*2c2f96dcSApple OSS Distributions vm32_deallocate(
124*2c2f96dcSApple OSS Distributions 	vm_map_t        map,
125*2c2f96dcSApple OSS Distributions 	vm32_offset_t           start,
126*2c2f96dcSApple OSS Distributions 	vm32_size_t             size)
127*2c2f96dcSApple OSS Distributions {
128*2c2f96dcSApple OSS Distributions 	if ((map == VM_MAP_NULL) || (start + size < start)) {
129*2c2f96dcSApple OSS Distributions 		return KERN_INVALID_ARGUMENT;
130*2c2f96dcSApple OSS Distributions 	}
131*2c2f96dcSApple OSS Distributions 
132*2c2f96dcSApple OSS Distributions 	return mach_vm_deallocate(map, start, size);
133*2c2f96dcSApple OSS Distributions }
134*2c2f96dcSApple OSS Distributions 
135*2c2f96dcSApple OSS Distributions kern_return_t
vm32_inherit(vm_map_t map,vm32_offset_t start,vm32_size_t size,vm_inherit_t new_inheritance)136*2c2f96dcSApple OSS Distributions vm32_inherit(
137*2c2f96dcSApple OSS Distributions 	vm_map_t        map,
138*2c2f96dcSApple OSS Distributions 	vm32_offset_t           start,
139*2c2f96dcSApple OSS Distributions 	vm32_size_t             size,
140*2c2f96dcSApple OSS Distributions 	vm_inherit_t            new_inheritance)
141*2c2f96dcSApple OSS Distributions {
142*2c2f96dcSApple OSS Distributions 	if ((map == VM_MAP_NULL) || (start + size < start)) {
143*2c2f96dcSApple OSS Distributions 		return KERN_INVALID_ARGUMENT;
144*2c2f96dcSApple OSS Distributions 	}
145*2c2f96dcSApple OSS Distributions 
146*2c2f96dcSApple OSS Distributions 	return mach_vm_inherit(map, start, size, new_inheritance);
147*2c2f96dcSApple OSS Distributions }
148*2c2f96dcSApple OSS Distributions 
149*2c2f96dcSApple OSS Distributions kern_return_t
vm32_protect(vm_map_t map,vm32_offset_t start,vm32_size_t size,boolean_t set_maximum,vm_prot_t new_protection)150*2c2f96dcSApple OSS Distributions vm32_protect(
151*2c2f96dcSApple OSS Distributions 	vm_map_t                map,
152*2c2f96dcSApple OSS Distributions 	vm32_offset_t           start,
153*2c2f96dcSApple OSS Distributions 	vm32_size_t             size,
154*2c2f96dcSApple OSS Distributions 	boolean_t               set_maximum,
155*2c2f96dcSApple OSS Distributions 	vm_prot_t               new_protection)
156*2c2f96dcSApple OSS Distributions {
157*2c2f96dcSApple OSS Distributions 	if ((map == VM_MAP_NULL) || (start + size < start)) {
158*2c2f96dcSApple OSS Distributions 		return KERN_INVALID_ARGUMENT;
159*2c2f96dcSApple OSS Distributions 	}
160*2c2f96dcSApple OSS Distributions 
161*2c2f96dcSApple OSS Distributions 	return mach_vm_protect(map, start, size, set_maximum, new_protection);
162*2c2f96dcSApple OSS Distributions }
163*2c2f96dcSApple OSS Distributions 
164*2c2f96dcSApple OSS Distributions kern_return_t
vm32_machine_attribute(vm_map_t map,vm32_address_t addr,vm32_size_t size,vm_machine_attribute_t attribute,vm_machine_attribute_val_t * value)165*2c2f96dcSApple OSS Distributions vm32_machine_attribute(
166*2c2f96dcSApple OSS Distributions 	vm_map_t        map,
167*2c2f96dcSApple OSS Distributions 	vm32_address_t  addr,
168*2c2f96dcSApple OSS Distributions 	vm32_size_t     size,
169*2c2f96dcSApple OSS Distributions 	vm_machine_attribute_t  attribute,
170*2c2f96dcSApple OSS Distributions 	vm_machine_attribute_val_t* value)              /* IN/OUT */
171*2c2f96dcSApple OSS Distributions {
172*2c2f96dcSApple OSS Distributions 	if ((map == VM_MAP_NULL) || (addr + size < addr)) {
173*2c2f96dcSApple OSS Distributions 		return KERN_INVALID_ARGUMENT;
174*2c2f96dcSApple OSS Distributions 	}
175*2c2f96dcSApple OSS Distributions 
176*2c2f96dcSApple OSS Distributions 	return mach_vm_machine_attribute(map, addr, size, attribute, value);
177*2c2f96dcSApple OSS Distributions }
178*2c2f96dcSApple OSS Distributions 
179*2c2f96dcSApple OSS Distributions kern_return_t
vm32_read(vm_map_t map,vm32_address_t addr,vm32_size_t size,pointer_t * data,mach_msg_type_number_t * data_size)180*2c2f96dcSApple OSS Distributions vm32_read(
181*2c2f96dcSApple OSS Distributions 	vm_map_t                map,
182*2c2f96dcSApple OSS Distributions 	vm32_address_t          addr,
183*2c2f96dcSApple OSS Distributions 	vm32_size_t             size,
184*2c2f96dcSApple OSS Distributions 	pointer_t               *data,
185*2c2f96dcSApple OSS Distributions 	mach_msg_type_number_t  *data_size)
186*2c2f96dcSApple OSS Distributions {
187*2c2f96dcSApple OSS Distributions 	return mach_vm_read(map, addr, size, data, data_size);
188*2c2f96dcSApple OSS Distributions }
189*2c2f96dcSApple OSS Distributions 
190*2c2f96dcSApple OSS Distributions kern_return_t
vm32_read_list(vm_map_t map,vm32_read_entry_t data_list,natural_t count)191*2c2f96dcSApple OSS Distributions vm32_read_list(
192*2c2f96dcSApple OSS Distributions 	vm_map_t                map,
193*2c2f96dcSApple OSS Distributions 	vm32_read_entry_t       data_list,
194*2c2f96dcSApple OSS Distributions 	natural_t               count)
195*2c2f96dcSApple OSS Distributions {
196*2c2f96dcSApple OSS Distributions 	mach_vm_read_entry_t    mdata_list;
197*2c2f96dcSApple OSS Distributions 	mach_msg_type_number_t  i;
198*2c2f96dcSApple OSS Distributions 	kern_return_t                   result;
199*2c2f96dcSApple OSS Distributions 
200*2c2f96dcSApple OSS Distributions 	for (i = 0; i < VM_MAP_ENTRY_MAX; i++) {
201*2c2f96dcSApple OSS Distributions 		mdata_list[i].address = data_list[i].address;
202*2c2f96dcSApple OSS Distributions 		mdata_list[i].size = data_list[i].size;
203*2c2f96dcSApple OSS Distributions 	}
204*2c2f96dcSApple OSS Distributions 
205*2c2f96dcSApple OSS Distributions 	result = mach_vm_read_list(map, mdata_list, count);
206*2c2f96dcSApple OSS Distributions 
207*2c2f96dcSApple OSS Distributions 	for (i = 0; i < VM_MAP_ENTRY_MAX; i++) {
208*2c2f96dcSApple OSS Distributions 		data_list[i].address = CAST_DOWN_EXPLICIT(vm32_address_t, mdata_list[i].address);
209*2c2f96dcSApple OSS Distributions 		data_list[i].size = CAST_DOWN_EXPLICIT(vm32_size_t, mdata_list[i].size);
210*2c2f96dcSApple OSS Distributions 	}
211*2c2f96dcSApple OSS Distributions 
212*2c2f96dcSApple OSS Distributions 	return result;
213*2c2f96dcSApple OSS Distributions }
214*2c2f96dcSApple OSS Distributions 
215*2c2f96dcSApple OSS Distributions kern_return_t
vm32_read_overwrite(vm_map_t map,vm32_address_t address,vm32_size_t size,vm32_address_t data,vm32_size_t * data_size)216*2c2f96dcSApple OSS Distributions vm32_read_overwrite(
217*2c2f96dcSApple OSS Distributions 	vm_map_t        map,
218*2c2f96dcSApple OSS Distributions 	vm32_address_t  address,
219*2c2f96dcSApple OSS Distributions 	vm32_size_t     size,
220*2c2f96dcSApple OSS Distributions 	vm32_address_t  data,
221*2c2f96dcSApple OSS Distributions 	vm32_size_t     *data_size)
222*2c2f96dcSApple OSS Distributions {
223*2c2f96dcSApple OSS Distributions 	kern_return_t   result;
224*2c2f96dcSApple OSS Distributions 	mach_vm_size_t  mdata_size;
225*2c2f96dcSApple OSS Distributions 
226*2c2f96dcSApple OSS Distributions 	mdata_size = *data_size;
227*2c2f96dcSApple OSS Distributions 	result = mach_vm_read_overwrite(map, address, size, data, &mdata_size);
228*2c2f96dcSApple OSS Distributions 	*data_size = CAST_DOWN_EXPLICIT(vm32_size_t, mdata_size);
229*2c2f96dcSApple OSS Distributions 
230*2c2f96dcSApple OSS Distributions 	return result;
231*2c2f96dcSApple OSS Distributions }
232*2c2f96dcSApple OSS Distributions 
233*2c2f96dcSApple OSS Distributions kern_return_t
vm32_write(vm_map_t map,vm32_address_t address,pointer_t data,mach_msg_type_number_t size)234*2c2f96dcSApple OSS Distributions vm32_write(
235*2c2f96dcSApple OSS Distributions 	vm_map_t                        map,
236*2c2f96dcSApple OSS Distributions 	vm32_address_t                  address,
237*2c2f96dcSApple OSS Distributions 	pointer_t                       data,
238*2c2f96dcSApple OSS Distributions 	mach_msg_type_number_t  size)
239*2c2f96dcSApple OSS Distributions {
240*2c2f96dcSApple OSS Distributions 	return mach_vm_write(map, address, data, size);
241*2c2f96dcSApple OSS Distributions }
242*2c2f96dcSApple OSS Distributions 
243*2c2f96dcSApple OSS Distributions kern_return_t
vm32_copy(vm_map_t map,vm32_address_t source_address,vm32_size_t size,vm32_address_t dest_address)244*2c2f96dcSApple OSS Distributions vm32_copy(
245*2c2f96dcSApple OSS Distributions 	vm_map_t        map,
246*2c2f96dcSApple OSS Distributions 	vm32_address_t  source_address,
247*2c2f96dcSApple OSS Distributions 	vm32_size_t     size,
248*2c2f96dcSApple OSS Distributions 	vm32_address_t  dest_address)
249*2c2f96dcSApple OSS Distributions {
250*2c2f96dcSApple OSS Distributions 	return mach_vm_copy(map, source_address, size, dest_address);
251*2c2f96dcSApple OSS Distributions }
252*2c2f96dcSApple OSS Distributions 
253*2c2f96dcSApple OSS Distributions kern_return_t
vm32_map_64(vm_map_t target_map,vm32_offset_t * address,vm32_size_t size,vm32_offset_t mask,int flags,ipc_port_t port,vm_object_offset_t offset,boolean_t copy,vm_prot_t cur_protection,vm_prot_t max_protection,vm_inherit_t inheritance)254*2c2f96dcSApple OSS Distributions vm32_map_64(
255*2c2f96dcSApple OSS Distributions 	vm_map_t                target_map,
256*2c2f96dcSApple OSS Distributions 	vm32_offset_t           *address,
257*2c2f96dcSApple OSS Distributions 	vm32_size_t             size,
258*2c2f96dcSApple OSS Distributions 	vm32_offset_t           mask,
259*2c2f96dcSApple OSS Distributions 	int                     flags,
260*2c2f96dcSApple OSS Distributions 	ipc_port_t              port,
261*2c2f96dcSApple OSS Distributions 	vm_object_offset_t      offset,
262*2c2f96dcSApple OSS Distributions 	boolean_t               copy,
263*2c2f96dcSApple OSS Distributions 	vm_prot_t               cur_protection,
264*2c2f96dcSApple OSS Distributions 	vm_prot_t               max_protection,
265*2c2f96dcSApple OSS Distributions 	vm_inherit_t            inheritance)
266*2c2f96dcSApple OSS Distributions {
267*2c2f96dcSApple OSS Distributions 	mach_vm_offset_t        maddress;
268*2c2f96dcSApple OSS Distributions 	kern_return_t           result;
269*2c2f96dcSApple OSS Distributions 
270*2c2f96dcSApple OSS Distributions 	maddress = *address;
271*2c2f96dcSApple OSS Distributions 	result = mach_vm_map_external(target_map, &maddress, size, mask,
272*2c2f96dcSApple OSS Distributions 	    flags, port, offset, copy,
273*2c2f96dcSApple OSS Distributions 	    cur_protection, max_protection, inheritance);
274*2c2f96dcSApple OSS Distributions 	*address = CAST_DOWN_EXPLICIT(vm32_offset_t, maddress);
275*2c2f96dcSApple OSS Distributions 
276*2c2f96dcSApple OSS Distributions 	return result;
277*2c2f96dcSApple OSS Distributions }
278*2c2f96dcSApple OSS Distributions 
279*2c2f96dcSApple OSS Distributions kern_return_t
vm32_map(vm_map_t target_map,vm32_offset_t * address,vm32_size_t size,vm32_offset_t mask,int flags,ipc_port_t port,vm32_offset_t offset,boolean_t copy,vm_prot_t cur_protection,vm_prot_t max_protection,vm_inherit_t inheritance)280*2c2f96dcSApple OSS Distributions vm32_map(
281*2c2f96dcSApple OSS Distributions 	vm_map_t                target_map,
282*2c2f96dcSApple OSS Distributions 	vm32_offset_t           *address,
283*2c2f96dcSApple OSS Distributions 	vm32_size_t             size,
284*2c2f96dcSApple OSS Distributions 	vm32_offset_t           mask,
285*2c2f96dcSApple OSS Distributions 	int                     flags,
286*2c2f96dcSApple OSS Distributions 	ipc_port_t              port,
287*2c2f96dcSApple OSS Distributions 	vm32_offset_t           offset,
288*2c2f96dcSApple OSS Distributions 	boolean_t               copy,
289*2c2f96dcSApple OSS Distributions 	vm_prot_t               cur_protection,
290*2c2f96dcSApple OSS Distributions 	vm_prot_t               max_protection,
291*2c2f96dcSApple OSS Distributions 	vm_inherit_t            inheritance)
292*2c2f96dcSApple OSS Distributions {
293*2c2f96dcSApple OSS Distributions 	return vm32_map_64(target_map, address, size, mask,
294*2c2f96dcSApple OSS Distributions 	           flags, port, offset, copy,
295*2c2f96dcSApple OSS Distributions 	           cur_protection, max_protection, inheritance);
296*2c2f96dcSApple OSS Distributions }
297*2c2f96dcSApple OSS Distributions 
298*2c2f96dcSApple OSS Distributions kern_return_t
vm32_remap(vm_map_t target_map,vm32_offset_t * address,vm32_size_t size,vm32_offset_t mask,boolean_t anywhere,vm_map_t src_map,vm32_offset_t memory_address,boolean_t copy,vm_prot_t * cur_protection,vm_prot_t * max_protection,vm_inherit_t inheritance)299*2c2f96dcSApple OSS Distributions vm32_remap(
300*2c2f96dcSApple OSS Distributions 	vm_map_t                target_map,
301*2c2f96dcSApple OSS Distributions 	vm32_offset_t           *address,
302*2c2f96dcSApple OSS Distributions 	vm32_size_t             size,
303*2c2f96dcSApple OSS Distributions 	vm32_offset_t           mask,
304*2c2f96dcSApple OSS Distributions 	boolean_t               anywhere,
305*2c2f96dcSApple OSS Distributions 	vm_map_t                src_map,
306*2c2f96dcSApple OSS Distributions 	vm32_offset_t           memory_address,
307*2c2f96dcSApple OSS Distributions 	boolean_t               copy,
308*2c2f96dcSApple OSS Distributions 	vm_prot_t               *cur_protection,
309*2c2f96dcSApple OSS Distributions 	vm_prot_t               *max_protection,
310*2c2f96dcSApple OSS Distributions 	vm_inherit_t            inheritance)
311*2c2f96dcSApple OSS Distributions {
312*2c2f96dcSApple OSS Distributions 	mach_vm_offset_t        maddress;
313*2c2f96dcSApple OSS Distributions 	kern_return_t           result;
314*2c2f96dcSApple OSS Distributions 
315*2c2f96dcSApple OSS Distributions 	maddress = *address;
316*2c2f96dcSApple OSS Distributions 	result = mach_vm_remap_external(target_map, &maddress, size, mask,
317*2c2f96dcSApple OSS Distributions 	    anywhere, src_map, memory_address, copy,
318*2c2f96dcSApple OSS Distributions 	    cur_protection, max_protection, inheritance);
319*2c2f96dcSApple OSS Distributions 	*address = CAST_DOWN_EXPLICIT(vm32_offset_t, maddress);
320*2c2f96dcSApple OSS Distributions 
321*2c2f96dcSApple OSS Distributions 	return result;
322*2c2f96dcSApple OSS Distributions }
323*2c2f96dcSApple OSS Distributions 
324*2c2f96dcSApple OSS Distributions kern_return_t
vm32_msync(vm_map_t map,vm32_address_t address,vm32_size_t size,vm_sync_t sync_flags)325*2c2f96dcSApple OSS Distributions vm32_msync(
326*2c2f96dcSApple OSS Distributions 	vm_map_t        map,
327*2c2f96dcSApple OSS Distributions 	vm32_address_t  address,
328*2c2f96dcSApple OSS Distributions 	vm32_size_t     size,
329*2c2f96dcSApple OSS Distributions 	vm_sync_t       sync_flags)
330*2c2f96dcSApple OSS Distributions {
331*2c2f96dcSApple OSS Distributions 	return mach_vm_msync(map, address, size, sync_flags);
332*2c2f96dcSApple OSS Distributions }
333*2c2f96dcSApple OSS Distributions 
334*2c2f96dcSApple OSS Distributions kern_return_t
vm32_behavior_set(vm_map_t map,vm32_offset_t start,vm32_size_t size,vm_behavior_t new_behavior)335*2c2f96dcSApple OSS Distributions vm32_behavior_set(
336*2c2f96dcSApple OSS Distributions 	vm_map_t                map,
337*2c2f96dcSApple OSS Distributions 	vm32_offset_t           start,
338*2c2f96dcSApple OSS Distributions 	vm32_size_t             size,
339*2c2f96dcSApple OSS Distributions 	vm_behavior_t           new_behavior)
340*2c2f96dcSApple OSS Distributions {
341*2c2f96dcSApple OSS Distributions 	if ((map == VM_MAP_NULL) || (start + size < start)) {
342*2c2f96dcSApple OSS Distributions 		return KERN_INVALID_ARGUMENT;
343*2c2f96dcSApple OSS Distributions 	}
344*2c2f96dcSApple OSS Distributions 
345*2c2f96dcSApple OSS Distributions 	return mach_vm_behavior_set(map, start, size, new_behavior);
346*2c2f96dcSApple OSS Distributions }
347*2c2f96dcSApple OSS Distributions 
348*2c2f96dcSApple OSS Distributions kern_return_t
vm32_region_64(vm_map_t map,vm32_offset_t * address,vm32_size_t * size,vm_region_flavor_t flavor,vm_region_info_t info,mach_msg_type_number_t * count,mach_port_t * object_name)349*2c2f96dcSApple OSS Distributions vm32_region_64(
350*2c2f96dcSApple OSS Distributions 	vm_map_t                 map,
351*2c2f96dcSApple OSS Distributions 	vm32_offset_t           *address,               /* IN/OUT */
352*2c2f96dcSApple OSS Distributions 	vm32_size_t             *size,                  /* OUT */
353*2c2f96dcSApple OSS Distributions 	vm_region_flavor_t       flavor,                /* IN */
354*2c2f96dcSApple OSS Distributions 	vm_region_info_t         info,                  /* OUT */
355*2c2f96dcSApple OSS Distributions 	mach_msg_type_number_t  *count,                 /* IN/OUT */
356*2c2f96dcSApple OSS Distributions 	mach_port_t             *object_name)           /* OUT */
357*2c2f96dcSApple OSS Distributions {
358*2c2f96dcSApple OSS Distributions 	mach_vm_offset_t        maddress;
359*2c2f96dcSApple OSS Distributions 	mach_vm_size_t          msize;
360*2c2f96dcSApple OSS Distributions 	kern_return_t           result;
361*2c2f96dcSApple OSS Distributions 
362*2c2f96dcSApple OSS Distributions 	maddress = *address;
363*2c2f96dcSApple OSS Distributions 	msize = *size;
364*2c2f96dcSApple OSS Distributions 	result = mach_vm_region(map, &maddress, &msize, flavor, info, count, object_name);
365*2c2f96dcSApple OSS Distributions 	*size = CAST_DOWN_EXPLICIT(vm32_size_t, msize);
366*2c2f96dcSApple OSS Distributions 	*address = CAST_DOWN_EXPLICIT(vm32_offset_t, maddress);
367*2c2f96dcSApple OSS Distributions 
368*2c2f96dcSApple OSS Distributions 	return result;
369*2c2f96dcSApple OSS Distributions }
370*2c2f96dcSApple OSS Distributions 
371*2c2f96dcSApple OSS Distributions kern_return_t
vm32_region(vm_map_t map,vm32_address_t * address,vm32_size_t * size,vm_region_flavor_t flavor,vm_region_info_t info,mach_msg_type_number_t * count,mach_port_t * object_name)372*2c2f96dcSApple OSS Distributions vm32_region(
373*2c2f96dcSApple OSS Distributions 	vm_map_t                        map,
374*2c2f96dcSApple OSS Distributions 	vm32_address_t                  *address,       /* IN/OUT */
375*2c2f96dcSApple OSS Distributions 	vm32_size_t                     *size,          /* OUT */
376*2c2f96dcSApple OSS Distributions 	vm_region_flavor_t              flavor, /* IN */
377*2c2f96dcSApple OSS Distributions 	vm_region_info_t                info,           /* OUT */
378*2c2f96dcSApple OSS Distributions 	mach_msg_type_number_t  *count, /* IN/OUT */
379*2c2f96dcSApple OSS Distributions 	mach_port_t                     *object_name)   /* OUT */
380*2c2f96dcSApple OSS Distributions {
381*2c2f96dcSApple OSS Distributions 	vm_map_address_t        map_addr;
382*2c2f96dcSApple OSS Distributions 	vm_map_size_t           map_size;
383*2c2f96dcSApple OSS Distributions 	kern_return_t           kr;
384*2c2f96dcSApple OSS Distributions 
385*2c2f96dcSApple OSS Distributions 	if (VM_MAP_NULL == map) {
386*2c2f96dcSApple OSS Distributions 		return KERN_INVALID_ARGUMENT;
387*2c2f96dcSApple OSS Distributions 	}
388*2c2f96dcSApple OSS Distributions 
389*2c2f96dcSApple OSS Distributions 	map_addr = (vm_map_address_t)*address;
390*2c2f96dcSApple OSS Distributions 	map_size = (vm_map_size_t)*size;
391*2c2f96dcSApple OSS Distributions 
392*2c2f96dcSApple OSS Distributions 	kr = vm_map_region(map,
393*2c2f96dcSApple OSS Distributions 	    &map_addr, &map_size,
394*2c2f96dcSApple OSS Distributions 	    flavor, info, count,
395*2c2f96dcSApple OSS Distributions 	    object_name);
396*2c2f96dcSApple OSS Distributions 
397*2c2f96dcSApple OSS Distributions 	*address = CAST_DOWN_EXPLICIT(vm32_address_t, map_addr);
398*2c2f96dcSApple OSS Distributions 	*size = CAST_DOWN_EXPLICIT(vm32_size_t, map_size);
399*2c2f96dcSApple OSS Distributions 
400*2c2f96dcSApple OSS Distributions 	if (KERN_SUCCESS == kr && map_addr + map_size > VM32_MAX_ADDRESS) {
401*2c2f96dcSApple OSS Distributions 		return KERN_INVALID_ADDRESS;
402*2c2f96dcSApple OSS Distributions 	}
403*2c2f96dcSApple OSS Distributions 	return kr;
404*2c2f96dcSApple OSS Distributions }
405*2c2f96dcSApple OSS Distributions 
406*2c2f96dcSApple OSS Distributions kern_return_t
vm32_region_recurse_64(vm_map_t map,vm32_address_t * address,vm32_size_t * size,uint32_t * depth,vm_region_recurse_info_64_t info,mach_msg_type_number_t * infoCnt)407*2c2f96dcSApple OSS Distributions vm32_region_recurse_64(
408*2c2f96dcSApple OSS Distributions 	vm_map_t                        map,
409*2c2f96dcSApple OSS Distributions 	vm32_address_t                  *address,
410*2c2f96dcSApple OSS Distributions 	vm32_size_t                     *size,
411*2c2f96dcSApple OSS Distributions 	uint32_t                        *depth,
412*2c2f96dcSApple OSS Distributions 	vm_region_recurse_info_64_t     info,
413*2c2f96dcSApple OSS Distributions 	mach_msg_type_number_t  *infoCnt)
414*2c2f96dcSApple OSS Distributions {
415*2c2f96dcSApple OSS Distributions 	mach_vm_address_t       maddress;
416*2c2f96dcSApple OSS Distributions 	mach_vm_size_t          msize;
417*2c2f96dcSApple OSS Distributions 	kern_return_t           result;
418*2c2f96dcSApple OSS Distributions 
419*2c2f96dcSApple OSS Distributions 	maddress = *address;
420*2c2f96dcSApple OSS Distributions 	msize = *size;
421*2c2f96dcSApple OSS Distributions 	result = mach_vm_region_recurse(map, &maddress, &msize, depth, info, infoCnt);
422*2c2f96dcSApple OSS Distributions 	*address = CAST_DOWN_EXPLICIT(vm32_address_t, maddress);
423*2c2f96dcSApple OSS Distributions 	*size = CAST_DOWN_EXPLICIT(vm32_size_t, msize);
424*2c2f96dcSApple OSS Distributions 
425*2c2f96dcSApple OSS Distributions 	return result;
426*2c2f96dcSApple OSS Distributions }
427*2c2f96dcSApple OSS Distributions 
428*2c2f96dcSApple OSS Distributions kern_return_t
vm32_region_recurse(vm_map_t map,vm32_offset_t * address,vm32_size_t * size,natural_t * depth,vm_region_recurse_info_t info32,mach_msg_type_number_t * infoCnt)429*2c2f96dcSApple OSS Distributions vm32_region_recurse(
430*2c2f96dcSApple OSS Distributions 	vm_map_t                        map,
431*2c2f96dcSApple OSS Distributions 	vm32_offset_t           *address,       /* IN/OUT */
432*2c2f96dcSApple OSS Distributions 	vm32_size_t                     *size,          /* OUT */
433*2c2f96dcSApple OSS Distributions 	natural_t                       *depth, /* IN/OUT */
434*2c2f96dcSApple OSS Distributions 	vm_region_recurse_info_t        info32, /* IN/OUT */
435*2c2f96dcSApple OSS Distributions 	mach_msg_type_number_t  *infoCnt)       /* IN/OUT */
436*2c2f96dcSApple OSS Distributions {
437*2c2f96dcSApple OSS Distributions 	vm_region_submap_info_data_64_t info64;
438*2c2f96dcSApple OSS Distributions 	vm_region_submap_info_t info;
439*2c2f96dcSApple OSS Distributions 	vm_map_address_t        map_addr;
440*2c2f96dcSApple OSS Distributions 	vm_map_size_t           map_size;
441*2c2f96dcSApple OSS Distributions 	kern_return_t           kr;
442*2c2f96dcSApple OSS Distributions 
443*2c2f96dcSApple OSS Distributions 	if (VM_MAP_NULL == map || *infoCnt < VM_REGION_SUBMAP_INFO_COUNT) {
444*2c2f96dcSApple OSS Distributions 		return KERN_INVALID_ARGUMENT;
445*2c2f96dcSApple OSS Distributions 	}
446*2c2f96dcSApple OSS Distributions 
447*2c2f96dcSApple OSS Distributions 
448*2c2f96dcSApple OSS Distributions 	map_addr = (vm_map_address_t)*address;
449*2c2f96dcSApple OSS Distributions 	map_size = (vm_map_size_t)*size;
450*2c2f96dcSApple OSS Distributions 	info = (vm_region_submap_info_t)info32;
451*2c2f96dcSApple OSS Distributions 	*infoCnt = VM_REGION_SUBMAP_INFO_COUNT_64;
452*2c2f96dcSApple OSS Distributions 
453*2c2f96dcSApple OSS Distributions 	kr = vm_map_region_recurse_64(map, &map_addr, &map_size,
454*2c2f96dcSApple OSS Distributions 	    depth, &info64, infoCnt);
455*2c2f96dcSApple OSS Distributions 
456*2c2f96dcSApple OSS Distributions 	info->protection = info64.protection;
457*2c2f96dcSApple OSS Distributions 	info->max_protection = info64.max_protection;
458*2c2f96dcSApple OSS Distributions 	info->inheritance = info64.inheritance;
459*2c2f96dcSApple OSS Distributions 	info->offset = (uint32_t)info64.offset; /* trouble-maker */
460*2c2f96dcSApple OSS Distributions 	info->user_tag = info64.user_tag;
461*2c2f96dcSApple OSS Distributions 	info->pages_resident = info64.pages_resident;
462*2c2f96dcSApple OSS Distributions 	info->pages_shared_now_private = info64.pages_shared_now_private;
463*2c2f96dcSApple OSS Distributions 	info->pages_swapped_out = info64.pages_swapped_out;
464*2c2f96dcSApple OSS Distributions 	info->pages_dirtied = info64.pages_dirtied;
465*2c2f96dcSApple OSS Distributions 	info->ref_count = info64.ref_count;
466*2c2f96dcSApple OSS Distributions 	info->shadow_depth = info64.shadow_depth;
467*2c2f96dcSApple OSS Distributions 	info->external_pager = info64.external_pager;
468*2c2f96dcSApple OSS Distributions 	info->share_mode = info64.share_mode;
469*2c2f96dcSApple OSS Distributions 	info->is_submap = info64.is_submap;
470*2c2f96dcSApple OSS Distributions 	info->behavior = info64.behavior;
471*2c2f96dcSApple OSS Distributions 	info->object_id = info64.object_id;
472*2c2f96dcSApple OSS Distributions 	info->user_wired_count = info64.user_wired_count;
473*2c2f96dcSApple OSS Distributions 
474*2c2f96dcSApple OSS Distributions 	*address = CAST_DOWN_EXPLICIT(vm32_address_t, map_addr);
475*2c2f96dcSApple OSS Distributions 	*size = CAST_DOWN_EXPLICIT(vm32_size_t, map_size);
476*2c2f96dcSApple OSS Distributions 	*infoCnt = VM_REGION_SUBMAP_INFO_COUNT;
477*2c2f96dcSApple OSS Distributions 
478*2c2f96dcSApple OSS Distributions 	if (KERN_SUCCESS == kr && map_addr + map_size > VM32_MAX_ADDRESS) {
479*2c2f96dcSApple OSS Distributions 		return KERN_INVALID_ADDRESS;
480*2c2f96dcSApple OSS Distributions 	}
481*2c2f96dcSApple OSS Distributions 	return kr;
482*2c2f96dcSApple OSS Distributions }
483*2c2f96dcSApple OSS Distributions 
484*2c2f96dcSApple OSS Distributions kern_return_t
vm32_purgable_control(vm_map_t map,vm32_offset_t address,vm_purgable_t control,int * state)485*2c2f96dcSApple OSS Distributions vm32_purgable_control(
486*2c2f96dcSApple OSS Distributions 	vm_map_t                map,
487*2c2f96dcSApple OSS Distributions 	vm32_offset_t           address,
488*2c2f96dcSApple OSS Distributions 	vm_purgable_t           control,
489*2c2f96dcSApple OSS Distributions 	int                     *state)
490*2c2f96dcSApple OSS Distributions {
491*2c2f96dcSApple OSS Distributions 	if (VM_MAP_NULL == map) {
492*2c2f96dcSApple OSS Distributions 		return KERN_INVALID_ARGUMENT;
493*2c2f96dcSApple OSS Distributions 	}
494*2c2f96dcSApple OSS Distributions 
495*2c2f96dcSApple OSS Distributions 	return vm_map_purgable_control(map,
496*2c2f96dcSApple OSS Distributions 	           vm_map_trunc_page(address, PAGE_MASK),
497*2c2f96dcSApple OSS Distributions 	           control,
498*2c2f96dcSApple OSS Distributions 	           state);
499*2c2f96dcSApple OSS Distributions }
500*2c2f96dcSApple OSS Distributions 
501*2c2f96dcSApple OSS Distributions kern_return_t
vm32_map_page_query(vm_map_t map,vm32_offset_t offset,int * disposition,int * ref_count)502*2c2f96dcSApple OSS Distributions vm32_map_page_query(
503*2c2f96dcSApple OSS Distributions 	vm_map_t                map,
504*2c2f96dcSApple OSS Distributions 	vm32_offset_t           offset,
505*2c2f96dcSApple OSS Distributions 	int                     *disposition,
506*2c2f96dcSApple OSS Distributions 	int                     *ref_count)
507*2c2f96dcSApple OSS Distributions {
508*2c2f96dcSApple OSS Distributions 	if (VM_MAP_NULL == map) {
509*2c2f96dcSApple OSS Distributions 		return KERN_INVALID_ARGUMENT;
510*2c2f96dcSApple OSS Distributions 	}
511*2c2f96dcSApple OSS Distributions 
512*2c2f96dcSApple OSS Distributions 	return vm_map_page_query_internal(
513*2c2f96dcSApple OSS Distributions 		map,
514*2c2f96dcSApple OSS Distributions 		vm_map_trunc_page(offset, PAGE_MASK),
515*2c2f96dcSApple OSS Distributions 		disposition,
516*2c2f96dcSApple OSS Distributions 		ref_count);
517*2c2f96dcSApple OSS Distributions }
518*2c2f96dcSApple OSS Distributions 
519*2c2f96dcSApple OSS Distributions kern_return_t
vm32_make_memory_entry_64(vm_map_t target_map,memory_object_size_t * size,memory_object_offset_t offset,vm_prot_t permission,ipc_port_t * object_handle,ipc_port_t parent_handle)520*2c2f96dcSApple OSS Distributions vm32_make_memory_entry_64(
521*2c2f96dcSApple OSS Distributions 	vm_map_t                target_map,
522*2c2f96dcSApple OSS Distributions 	memory_object_size_t    *size,
523*2c2f96dcSApple OSS Distributions 	memory_object_offset_t offset,
524*2c2f96dcSApple OSS Distributions 	vm_prot_t               permission,
525*2c2f96dcSApple OSS Distributions 	ipc_port_t              *object_handle,
526*2c2f96dcSApple OSS Distributions 	ipc_port_t              parent_handle)
527*2c2f96dcSApple OSS Distributions {
528*2c2f96dcSApple OSS Distributions 	// use the existing entrypoint
529*2c2f96dcSApple OSS Distributions 	return _mach_make_memory_entry(target_map, size, offset, permission, object_handle, parent_handle);
530*2c2f96dcSApple OSS Distributions }
531*2c2f96dcSApple OSS Distributions 
532*2c2f96dcSApple OSS Distributions kern_return_t
vm32_make_memory_entry(vm_map_t target_map,vm32_size_t * size,vm32_offset_t offset,vm_prot_t permission,ipc_port_t * object_handle,ipc_port_t parent_entry)533*2c2f96dcSApple OSS Distributions vm32_make_memory_entry(
534*2c2f96dcSApple OSS Distributions 	vm_map_t                target_map,
535*2c2f96dcSApple OSS Distributions 	vm32_size_t             *size,
536*2c2f96dcSApple OSS Distributions 	vm32_offset_t           offset,
537*2c2f96dcSApple OSS Distributions 	vm_prot_t               permission,
538*2c2f96dcSApple OSS Distributions 	ipc_port_t              *object_handle,
539*2c2f96dcSApple OSS Distributions 	ipc_port_t              parent_entry)
540*2c2f96dcSApple OSS Distributions {
541*2c2f96dcSApple OSS Distributions 	memory_object_size_t    mo_size;
542*2c2f96dcSApple OSS Distributions 	kern_return_t           kr;
543*2c2f96dcSApple OSS Distributions 
544*2c2f96dcSApple OSS Distributions 	mo_size = (memory_object_size_t)*size;
545*2c2f96dcSApple OSS Distributions 	kr = _mach_make_memory_entry(target_map, &mo_size,
546*2c2f96dcSApple OSS Distributions 	    (memory_object_offset_t)offset, permission, object_handle,
547*2c2f96dcSApple OSS Distributions 	    parent_entry);
548*2c2f96dcSApple OSS Distributions 	*size = CAST_DOWN_EXPLICIT(vm32_size_t, mo_size);
549*2c2f96dcSApple OSS Distributions 	return kr;
550*2c2f96dcSApple OSS Distributions }
551*2c2f96dcSApple OSS Distributions 
552*2c2f96dcSApple OSS Distributions kern_return_t
vm32__task_wire(vm_map_t map,boolean_t must_wire __unused)553*2c2f96dcSApple OSS Distributions vm32__task_wire(
554*2c2f96dcSApple OSS Distributions 	vm_map_t        map,
555*2c2f96dcSApple OSS Distributions 	boolean_t       must_wire __unused)
556*2c2f96dcSApple OSS Distributions {
557*2c2f96dcSApple OSS Distributions 	if (map == VM_MAP_NULL) {
558*2c2f96dcSApple OSS Distributions 		return KERN_INVALID_ARGUMENT;
559*2c2f96dcSApple OSS Distributions 	}
560*2c2f96dcSApple OSS Distributions 
561*2c2f96dcSApple OSS Distributions 	return KERN_NOT_SUPPORTED;
562*2c2f96dcSApple OSS Distributions }
563*2c2f96dcSApple OSS Distributions 
564*2c2f96dcSApple OSS Distributions kern_return_t
vm32__map_exec_lockdown(vm_map_t map)565*2c2f96dcSApple OSS Distributions vm32__map_exec_lockdown(
566*2c2f96dcSApple OSS Distributions 	vm_map_t        map)
567*2c2f96dcSApple OSS Distributions {
568*2c2f96dcSApple OSS Distributions 	if (map == VM_MAP_NULL) {
569*2c2f96dcSApple OSS Distributions 		return KERN_INVALID_ARGUMENT;
570*2c2f96dcSApple OSS Distributions 	}
571*2c2f96dcSApple OSS Distributions 
572*2c2f96dcSApple OSS Distributions 	vm_map_lock(map);
573*2c2f96dcSApple OSS Distributions 	map->map_disallow_new_exec = TRUE;
574*2c2f96dcSApple OSS Distributions 	vm_map_unlock(map);
575*2c2f96dcSApple OSS Distributions 
576*2c2f96dcSApple OSS Distributions 	return KERN_SUCCESS;
577*2c2f96dcSApple OSS Distributions }
578*2c2f96dcSApple OSS Distributions 
579*2c2f96dcSApple OSS Distributions 
580*2c2f96dcSApple OSS Distributions #endif /* VM32_SUPPORT */
581