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