2 * Copyright (c) 2011 Apple Inc. All rights reserved.
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. The rights granted to you under the License
10 * may not be used to create, or enable the creation or redistribution of,
11 * unlawful or unlicensed copies of an Apple operating system, or to
12 * circumvent, violate, or enable the circumvention or violation of, any
13 * terms of an Apple operating system software license agreement.
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
18 * The Original Code and all software distributed under the License are
19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23 * Please see the License for the specific language governing rights and
24 * limitations under the License.
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
30 * Make sure we don't accidentally include the external definitions of
31 * the routines we're interposing on below.
34 #define _mach_vm_user_
35 #include <mach/mach.h>
36 #include <mach/mach_traps.h>
38 #include <mach/vm_map_internal.h>
40 #include <mach/mach_vm_internal.h>
42 #include "stack_logging_internal.h"
44 malloc_logger_t
*__syscall_logger
= NULL
; // This may get set by Libc's malloc stack logging initialization code.
48 mach_port_name_t target
,
49 mach_vm_address_t
*address
,
55 rv
= _kernelrpc_mach_vm_allocate_trap(target
, address
, size
, flags
);
57 if (rv
== MACH_SEND_INVALID_DEST
)
58 rv
= _kernelrpc_mach_vm_allocate(target
, address
, size
, flags
);
60 if (__syscall_logger
) {
61 int userTagFlags
= flags
& VM_FLAGS_ALIAS_MASK
;
62 __syscall_logger(stack_logging_type_vm_allocate
| userTagFlags
, (uintptr_t)target
, (uintptr_t)size
, 0, (uintptr_t)*address
, 0);
70 mach_port_name_t target
,
71 mach_vm_address_t address
,
76 rv
= _kernelrpc_mach_vm_deallocate_trap(target
, address
, size
);
78 if (rv
== MACH_SEND_INVALID_DEST
)
79 rv
= _kernelrpc_mach_vm_deallocate(target
, address
, size
);
81 if (__syscall_logger
) {
82 __syscall_logger(stack_logging_type_vm_deallocate
, (uintptr_t)target
, (uintptr_t)address
, (uintptr_t)size
, 0, 0);
90 mach_port_name_t task
,
91 mach_vm_address_t address
,
93 boolean_t set_maximum
,
94 vm_prot_t new_protection
)
98 rv
= _kernelrpc_mach_vm_protect_trap(task
, address
, size
, set_maximum
,
101 if (rv
== MACH_SEND_INVALID_DEST
)
102 rv
= _kernelrpc_mach_vm_protect(task
, address
, size
,
103 set_maximum
, new_protection
);
110 mach_port_name_t task
,
111 vm_address_t
*address
,
116 mach_vm_address_t mach_addr
;
118 mach_addr
= (mach_vm_address_t
)*address
;
119 rv
= mach_vm_allocate(task
, &mach_addr
, size
, flags
);
120 #if defined(__LP64__)
121 *address
= mach_addr
;
123 *address
= (vm_address_t
)(mach_addr
& ((vm_address_t
)-1));
131 mach_port_name_t task
,
132 vm_address_t address
,
137 rv
= mach_vm_deallocate(task
, address
, size
);
144 mach_port_name_t task
,
145 vm_address_t address
,
147 boolean_t set_maximum
,
148 vm_prot_t new_protection
)
152 rv
= mach_vm_protect(task
, address
, size
, set_maximum
, new_protection
);
159 mach_port_name_t target
,
160 mach_vm_address_t
*address
,
162 mach_vm_offset_t mask
,
164 mem_entry_name_port_t object
,
165 memory_object_offset_t offset
,
167 vm_prot_t cur_protection
,
168 vm_prot_t max_protection
,
169 vm_inherit_t inheritance
)
171 kern_return_t rv
= MACH_SEND_INVALID_DEST
;
173 if (object
== MEMORY_OBJECT_NULL
&& max_protection
== VM_PROT_ALL
&&
174 inheritance
== VM_INHERIT_DEFAULT
)
175 rv
= _kernelrpc_mach_vm_map_trap(target
, address
, size
, mask
, flags
,
178 if (rv
== MACH_SEND_INVALID_DEST
)
179 rv
= _kernelrpc_mach_vm_map(target
, address
, size
, mask
, flags
, object
,
180 offset
, copy
, cur_protection
, max_protection
, inheritance
);
182 if (__syscall_logger
) {
183 int eventTypeFlags
= stack_logging_type_vm_allocate
| stack_logging_type_mapped_file_or_shared_mem
;
184 int userTagFlags
= flags
& VM_FLAGS_ALIAS_MASK
;
185 __syscall_logger(eventTypeFlags
| userTagFlags
, (uintptr_t)target
, (uintptr_t)size
, 0, (uintptr_t)*address
, 0);
193 mach_port_name_t target
,
194 mach_vm_address_t
*address
,
196 mach_vm_offset_t mask
,
198 mach_port_name_t src_task
,
199 mach_vm_address_t src_address
,
201 vm_prot_t
*cur_protection
,
202 vm_prot_t
*max_protection
,
203 vm_inherit_t inheritance
)
207 rv
= _kernelrpc_mach_vm_remap(target
, address
, size
, mask
, flags
,
208 src_task
, src_address
, copy
, cur_protection
, max_protection
,
211 if (__syscall_logger
) {
212 int eventTypeFlags
= stack_logging_type_vm_allocate
| stack_logging_type_mapped_file_or_shared_mem
;
213 int userTagFlags
= flags
& VM_FLAGS_ALIAS_MASK
;
214 __syscall_logger(eventTypeFlags
| userTagFlags
, (uintptr_t)target
, (uintptr_t)size
, 0, (uintptr_t)*address
, 0);
222 mach_port_name_t target
,
223 mach_vm_address_t address
,
226 mach_msg_type_number_t
*dataCnt
)
230 rv
= _kernelrpc_mach_vm_read(target
, address
, size
, data
, dataCnt
);
232 if (__syscall_logger
) {
233 int eventTypeFlags
= stack_logging_type_vm_allocate
| stack_logging_type_mapped_file_or_shared_mem
;
234 // The target argument is the remote task from which data is being read,
235 // so pass mach_task_self() as the destination task receiving the allocation.
236 __syscall_logger(eventTypeFlags
, (uintptr_t)mach_task_self(), (uintptr_t)*dataCnt
, 0, *data
, 0);
244 mach_port_name_t target
,
245 vm_address_t
*address
,
249 mem_entry_name_port_t object
,
252 vm_prot_t cur_protection
,
253 vm_prot_t max_protection
,
254 vm_inherit_t inheritance
)
258 rv
= _kernelrpc_vm_map(target
, address
, size
, mask
, flags
, object
,
259 offset
, copy
, cur_protection
, max_protection
, inheritance
);
261 if (__syscall_logger
) {
262 int eventTypeFlags
= stack_logging_type_vm_allocate
| stack_logging_type_mapped_file_or_shared_mem
;
263 int userTagFlags
= flags
& VM_FLAGS_ALIAS_MASK
;
264 __syscall_logger(eventTypeFlags
| userTagFlags
, (uintptr_t)target
, (uintptr_t)size
, 0, (uintptr_t)*address
, 0);
272 mach_port_name_t target
,
273 vm_address_t
*address
,
277 mach_port_name_t src_task
,
278 vm_address_t src_address
,
280 vm_prot_t
*cur_protection
,
281 vm_prot_t
*max_protection
,
282 vm_inherit_t inheritance
)
286 rv
= _kernelrpc_vm_remap(target
, address
, size
, mask
, flags
,
287 src_task
, src_address
, copy
, cur_protection
, max_protection
,
290 if (__syscall_logger
) {
291 int eventTypeFlags
= stack_logging_type_vm_allocate
| stack_logging_type_mapped_file_or_shared_mem
;
292 int userTagFlags
= flags
& VM_FLAGS_ALIAS_MASK
;
293 __syscall_logger(eventTypeFlags
| userTagFlags
, (uintptr_t)target
, (uintptr_t)size
, 0, (uintptr_t)*address
, 0);
301 mach_port_name_t target
,
302 vm_address_t address
,
305 mach_msg_type_number_t
*dataCnt
)
309 rv
= _kernelrpc_vm_read(target
, address
, size
, data
, dataCnt
);
311 if (__syscall_logger
) {
312 int eventTypeFlags
= stack_logging_type_vm_allocate
| stack_logging_type_mapped_file_or_shared_mem
;
313 // The target argument is the remote task from which data is being read,
314 // so pass mach_task_self() as the destination task receiving the allocation.
315 __syscall_logger(eventTypeFlags
, (uintptr_t)mach_task_self(), (uintptr_t)*dataCnt
, 0, *data
, 0);
322 mach_vm_purgable_control(
323 mach_port_name_t target
,
324 mach_vm_offset_t address
,
325 vm_purgable_t control
,
330 rv
= _kernelrpc_mach_vm_purgable_control_trap(target
, address
, control
, state
);
332 if (rv
== MACH_SEND_INVALID_DEST
)
333 rv
= _kernelrpc_mach_vm_purgable_control(target
, address
, control
, state
);
340 mach_port_name_t task
,
342 vm_purgable_t control
,
345 return mach_vm_purgable_control(task
,
346 (mach_vm_offset_t
) address
,