summaryrefslogtreecommitdiffstats
path: root/third_party/rust/mach2/src/vm.rs
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/mach2/src/vm.rs')
-rw-r--r--third_party/rust/mach2/src/vm.rs248
1 files changed, 248 insertions, 0 deletions
diff --git a/third_party/rust/mach2/src/vm.rs b/third_party/rust/mach2/src/vm.rs
new file mode 100644
index 0000000000..d0bf6f23ab
--- /dev/null
+++ b/third_party/rust/mach2/src/vm.rs
@@ -0,0 +1,248 @@
+//! 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);
+ }
+ }
+}