249 lines
7.3 KiB
Rust
249 lines
7.3 KiB
Rust
//! This module roughly corresponds to `mach/mach_vm.defs`.
|
|
|
|
use boolean::boolean_t;
|
|
use kern_return::kern_return_t;
|
|
use mach_types::{mem_entry_name_port_t, vm_task_entry_t};
|
|
use memory_object_types::{memory_object_offset_t, memory_object_size_t};
|
|
use message::mach_msg_type_number_t;
|
|
use port::mach_port_t;
|
|
use vm_attributes::{vm_machine_attribute_t, vm_machine_attribute_val_t};
|
|
use vm_behavior::vm_behavior_t;
|
|
use vm_inherit::vm_inherit_t;
|
|
use vm_prot::vm_prot_t;
|
|
use vm_purgable::vm_purgable_t;
|
|
use vm_region::mach_vm_read_entry_t;
|
|
use vm_region::{
|
|
vm_page_info_flavor_t, vm_page_info_t, vm_region_flavor_t, vm_region_info_t,
|
|
vm_region_recurse_info_t,
|
|
};
|
|
use vm_sync::vm_sync_t;
|
|
use vm_types::{
|
|
integer_t, mach_vm_address_t, mach_vm_offset_t, mach_vm_size_t, natural_t, vm_map_t,
|
|
vm_offset_t, vm_size_t,
|
|
};
|
|
|
|
extern "C" {
|
|
pub fn mach_vm_allocate(
|
|
target: vm_task_entry_t,
|
|
address: *mut mach_vm_address_t,
|
|
size: mach_vm_size_t,
|
|
flags: ::libc::c_int,
|
|
) -> kern_return_t;
|
|
|
|
pub fn mach_vm_deallocate(
|
|
target: vm_task_entry_t,
|
|
address: mach_vm_address_t,
|
|
size: mach_vm_size_t,
|
|
) -> kern_return_t;
|
|
|
|
pub fn mach_vm_protect(
|
|
target_task: vm_task_entry_t,
|
|
address: mach_vm_address_t,
|
|
size: mach_vm_size_t,
|
|
set_maximum: boolean_t,
|
|
new_protection: vm_prot_t,
|
|
) -> kern_return_t;
|
|
|
|
pub fn mach_vm_inherit(
|
|
target_task: vm_task_entry_t,
|
|
address: mach_vm_address_t,
|
|
size: mach_vm_size_t,
|
|
new_inheritance: vm_inherit_t,
|
|
) -> kern_return_t;
|
|
|
|
pub fn mach_vm_read(
|
|
target_task: vm_task_entry_t,
|
|
address: mach_vm_address_t,
|
|
size: mach_vm_size_t,
|
|
data: *mut vm_offset_t,
|
|
dataCnt: *mut mach_msg_type_number_t,
|
|
) -> kern_return_t;
|
|
|
|
#[allow(improper_ctypes)]
|
|
pub fn mach_vm_read_list(
|
|
target_task: vm_task_entry_t,
|
|
data_list: mach_vm_read_entry_t,
|
|
count: natural_t,
|
|
) -> kern_return_t;
|
|
|
|
pub fn mach_vm_write(
|
|
target_task: vm_map_t,
|
|
address: mach_vm_address_t,
|
|
data: vm_offset_t,
|
|
dataCnt: mach_msg_type_number_t,
|
|
) -> kern_return_t;
|
|
|
|
pub fn mach_vm_copy(
|
|
target_task: vm_task_entry_t,
|
|
source_address: mach_vm_address_t,
|
|
size: mach_vm_size_t,
|
|
dest_address: mach_vm_address_t,
|
|
) -> kern_return_t;
|
|
|
|
pub fn mach_vm_read_overwrite(
|
|
target_task: vm_task_entry_t,
|
|
address: mach_vm_address_t,
|
|
size: mach_vm_size_t,
|
|
data: mach_vm_address_t,
|
|
outsize: *mut mach_vm_size_t,
|
|
) -> kern_return_t;
|
|
|
|
pub fn mach_vm_msync(
|
|
target_task: vm_task_entry_t,
|
|
address: mach_vm_address_t,
|
|
size: mach_vm_size_t,
|
|
sync_flags: vm_sync_t,
|
|
) -> kern_return_t;
|
|
|
|
pub fn mach_vm_behavior_set(
|
|
target_task: vm_task_entry_t,
|
|
address: mach_vm_address_t,
|
|
size: mach_vm_size_t,
|
|
new_behavior: vm_behavior_t,
|
|
) -> kern_return_t;
|
|
|
|
pub fn mach_vm_map(
|
|
target_task: vm_task_entry_t,
|
|
inout: *mut mach_vm_address_t,
|
|
size: mach_vm_size_t,
|
|
mask: mach_vm_offset_t,
|
|
flags: ::libc::c_int,
|
|
object: mem_entry_name_port_t,
|
|
offset: memory_object_offset_t,
|
|
copy: boolean_t,
|
|
cur_protection: vm_prot_t,
|
|
max_protection: vm_prot_t,
|
|
inheritance: vm_inherit_t,
|
|
) -> kern_return_t;
|
|
|
|
pub fn mach_vm_machine_attribute(
|
|
target_task: vm_task_entry_t,
|
|
address: mach_vm_address_t,
|
|
size: mach_vm_size_t,
|
|
attribute: vm_machine_attribute_t,
|
|
value: *mut vm_machine_attribute_val_t,
|
|
) -> kern_return_t;
|
|
|
|
pub fn mach_vm_remap(
|
|
target_task: vm_task_entry_t,
|
|
target_address: *mut mach_vm_address_t,
|
|
size: mach_vm_size_t,
|
|
mask: mach_vm_offset_t,
|
|
flags: ::libc::c_int,
|
|
src_task: vm_task_entry_t,
|
|
src_address: mach_vm_address_t,
|
|
copy: boolean_t,
|
|
cur_protection: *mut vm_prot_t,
|
|
out: *mut vm_prot_t,
|
|
inheritance: vm_inherit_t,
|
|
) -> kern_return_t;
|
|
|
|
pub fn mach_vm_page_query(
|
|
target_map: vm_map_t,
|
|
offset: mach_vm_offset_t,
|
|
disposition: *mut integer_t,
|
|
ref_count: *mut integer_t,
|
|
) -> kern_return_t;
|
|
|
|
pub fn mach_vm_region_recurse(
|
|
target_task: vm_task_entry_t,
|
|
address: *mut mach_vm_address_t,
|
|
size: *mut mach_vm_size_t,
|
|
nesting_depth: *mut natural_t,
|
|
info: vm_region_recurse_info_t,
|
|
infoCnt: *mut mach_msg_type_number_t,
|
|
) -> kern_return_t;
|
|
|
|
pub fn mach_vm_region(
|
|
target_task: vm_task_entry_t,
|
|
address: *mut mach_vm_address_t,
|
|
size: *mut mach_vm_size_t,
|
|
flavor: vm_region_flavor_t,
|
|
info: vm_region_info_t,
|
|
infoCnt: *mut mach_msg_type_number_t,
|
|
object_name: *mut mach_port_t,
|
|
) -> kern_return_t;
|
|
|
|
pub fn mach_make_memory_entry(
|
|
target_task: vm_map_t,
|
|
size: *mut vm_size_t,
|
|
offset: vm_offset_t,
|
|
permission: vm_prot_t,
|
|
object_handle: *mut mem_entry_name_port_t,
|
|
parent_handle: mem_entry_name_port_t,
|
|
) -> kern_return_t;
|
|
|
|
pub fn mach_make_memory_entry_64(
|
|
target_task: vm_map_t,
|
|
size: *mut memory_object_size_t,
|
|
offset: memory_object_offset_t,
|
|
permission: vm_prot_t,
|
|
object_handle: *mut mach_port_t,
|
|
parent_entry: mem_entry_name_port_t,
|
|
) -> kern_return_t;
|
|
|
|
pub fn mach_vm_purgable_control(
|
|
target_task: vm_task_entry_t,
|
|
address: mach_vm_address_t,
|
|
control: vm_purgable_t,
|
|
state: *mut ::libc::c_int,
|
|
) -> kern_return_t;
|
|
|
|
pub fn mach_vm_page_info(
|
|
target_task: vm_task_entry_t,
|
|
address: mach_vm_address_t,
|
|
flavor: vm_page_info_flavor_t,
|
|
info: vm_page_info_t,
|
|
infoCnt: *mut mach_msg_type_number_t,
|
|
) -> kern_return_t;
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
use kern_return::KERN_SUCCESS;
|
|
use traps::mach_task_self;
|
|
use vm_statistics::VM_FLAGS_ANYWHERE;
|
|
|
|
#[test]
|
|
fn mach_vm_allocate_sanity() {
|
|
unsafe {
|
|
let size = 0x100;
|
|
let task = mach_task_self();
|
|
|
|
let mut address: mach_vm_address_t = 0;
|
|
assert_eq!(
|
|
mach_vm_allocate(task, &mut address, size, VM_FLAGS_ANYWHERE),
|
|
KERN_SUCCESS
|
|
);
|
|
assert_eq!(mach_vm_deallocate(task, address, size), KERN_SUCCESS);
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn mach_vm_region_sanity() {
|
|
use mem;
|
|
use vm_prot::{VM_PROT_EXECUTE, VM_PROT_READ};
|
|
use vm_region::{vm_region_basic_info_64, VM_REGION_BASIC_INFO_64};
|
|
unsafe {
|
|
let mut size = 0x10;
|
|
let mut object_name = 0;
|
|
let mut address = mach_vm_region_sanity as mach_vm_address_t;
|
|
let mut info: vm_region_basic_info_64 = mem::zeroed();
|
|
let mut info_size = vm_region_basic_info_64::count();
|
|
|
|
let result = mach_vm_region(
|
|
mach_task_self(),
|
|
&mut address,
|
|
&mut size,
|
|
VM_REGION_BASIC_INFO_64,
|
|
(&mut info as *mut _) as vm_region_info_t,
|
|
&mut info_size,
|
|
&mut object_name,
|
|
);
|
|
assert_eq!(result, KERN_SUCCESS);
|
|
assert_eq!(info.protection, VM_PROT_READ | VM_PROT_EXECUTE);
|
|
}
|
|
}
|
|
}
|