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