X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/0b4e3aa066abc0728aacb4bbeb86f53f9737156e..cf03f5cdc65293b4cb5eba3ed23fed26dad903c9:/osfmk/vm/vm_map.h diff --git a/osfmk/vm/vm_map.h b/osfmk/vm/vm_map.h index d98593232..d0f12dacc 100644 --- a/osfmk/vm/vm_map.h +++ b/osfmk/vm/vm_map.h @@ -1,21 +1,24 @@ /* - * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. + * Copyright (c) 2000-2002 Apple Computer, Inc. All rights reserved. * * @APPLE_LICENSE_HEADER_START@ * - * The contents of this file constitute Original Code as defined in and - * are subject to the Apple Public Source License Version 1.1 (the - * "License"). You may not use this file except in compliance with the - * License. Please obtain a copy of the License at - * http://www.apple.com/publicsource and read it before using this file. + * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved. * - * This Original Code and all software distributed under the License are - * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the - * License for the specific language governing rights and limitations - * under the License. + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. * * @APPLE_LICENSE_HEADER_END@ */ @@ -73,13 +76,15 @@ #include #include -typedef struct vm_map_entry *vm_map_entry_t; +#include -extern void kernel_vm_map_reference(vm_map_t map); +#ifdef __APPLE_API_PRIVATE #ifndef MACH_KERNEL_PRIVATE -struct vm_map_entry {}; +#ifdef __APPLE_API_OBSOLETE +extern void kernel_vm_map_reference(vm_map_t map); +#endif /* __APPLE_API_OBSOLETE */ extern void vm_map_reference(vm_map_t map); extern vm_map_t current_map(void); @@ -96,10 +101,6 @@ extern vm_map_t current_map(void); #include #include -#define shared_region_mapping_lock_init(object) \ - mutex_init(&(object)->Lock, ETAP_VM_OBJ) -#define shared_region_mapping_lock(object) mutex_lock(&(object)->Lock) -#define shared_region_mapping_unlock(object) mutex_unlock(&(object)->Lock) #include #define current_map_fast() (current_act_fast()->map) @@ -114,6 +115,8 @@ extern vm_map_t current_map(void); * vm_map_copy_t represents memory copied from an address map, * used for inter-map copy operations */ +typedef struct vm_map_entry *vm_map_entry_t; + /* * Type: vm_map_object_t [internal use only] @@ -266,6 +269,7 @@ struct vm_map { for space? */ boolean_t wiring_required;/* All memory wired? */ boolean_t no_zero_fill; /* No zero fill absent pages */ + boolean_t mapped; /* has this map been mapped */ unsigned int timestamp; /* Version number */ } ; @@ -423,23 +427,17 @@ struct vm_map_copy { */ #define vm_map_lock_init(map) \ -MACRO_BEGIN \ - lock_init(&(map)->lock, TRUE, ETAP_VM_MAP, ETAP_VM_MAP_I); \ - (map)->timestamp = 0; \ -MACRO_END -#define vm_map_lock(map) \ -MACRO_BEGIN \ - lock_write(&(map)->lock); \ - (map)->timestamp++; \ -MACRO_END - -#define vm_map_unlock(map) lock_write_done(&(map)->lock) -#define vm_map_lock_read(map) lock_read(&(map)->lock) -#define vm_map_unlock_read(map) lock_read_done(&(map)->lock) + ((map)->timestamp = 0 , \ + lock_init(&(map)->lock, TRUE, ETAP_VM_MAP, ETAP_VM_MAP_I)) + +#define vm_map_lock(map) lock_write(&(map)->lock) +#define vm_map_unlock(map) \ + ((map)->timestamp++ , lock_write_done(&(map)->lock)) +#define vm_map_lock_read(map) lock_read(&(map)->lock) +#define vm_map_unlock_read(map) lock_read_done(&(map)->lock) #define vm_map_lock_write_to_read(map) \ - lock_write_to_read(&(map)->lock) -#define vm_map_lock_read_to_write(map) \ - (lock_read_to_write(&(map)->lock) || (((map)->timestamp++), 0)) + ((map)->timestamp++ , lock_write_to_read(&(map)->lock)) +#define vm_map_lock_read_to_write(map) lock_read_to_write(&(map)->lock) extern zone_t vm_map_copy_zone; /* zone for vm_map_copy structures */ @@ -667,14 +665,12 @@ extern vm_object_t vm_submap_object; * Wait and wakeup macros for in_transition map entries. */ #define vm_map_entry_wait(map, interruptible) \ - MACRO_BEGIN \ - assert_wait((event_t)&(map)->hdr, interruptible); \ - vm_map_unlock(map); \ - thread_block((void (*)(void))0); \ - MACRO_END + ((map)->timestamp++ , \ + thread_sleep_lock_write((event_t)&(map)->hdr, \ + &(map)->lock, interruptible)) -#define vm_map_entry_wakeup(map) thread_wakeup((event_t)(&(map)->hdr)) +#define vm_map_entry_wakeup(map) thread_wakeup((event_t)(&(map)->hdr)) #define vm_map_ref_fast(map) \ @@ -737,22 +733,7 @@ extern int vm_map_copy_cont_is_valid( vm_map_copy_t copy); - -#endif /* !MACH_KERNEL_PRIVATE */ - -/* Get rid of a map */ -extern void vm_map_destroy( - vm_map_t map); -/* Lose a reference */ -extern void vm_map_deallocate( - vm_map_t map); - -/* Create an empty map */ -extern vm_map_t vm_map_create( - pmap_t pmap, - vm_offset_t min, - vm_offset_t max, - boolean_t pageable); +#define VM_MAP_ENTRY_NULL ((vm_map_entry_t) 0) /* Enter a mapping */ @@ -785,20 +766,59 @@ extern kern_return_t vm_map_read_user( extern vm_map_t vm_map_fork( vm_map_t old_map); -/* Change protection */ -extern kern_return_t vm_map_protect( +/* Change inheritance */ +extern kern_return_t vm_map_inherit( vm_map_t map, vm_offset_t start, vm_offset_t end, - vm_prot_t new_prot, - boolean_t set_max); + vm_inherit_t new_inheritance); -/* Change inheritance */ -extern kern_return_t vm_map_inherit( +/* Add or remove machine-dependent attributes from map regions */ +extern kern_return_t vm_map_machine_attribute( + vm_map_t map, + vm_offset_t address, + vm_size_t size, + vm_machine_attribute_t attribute, + vm_machine_attribute_val_t* value); /* IN/OUT */ +/* Set paging behavior */ +extern kern_return_t vm_map_behavior_set( vm_map_t map, vm_offset_t start, vm_offset_t end, - vm_inherit_t new_inheritance); + vm_behavior_t new_behavior); + +extern kern_return_t vm_map_submap( + vm_map_t map, + vm_offset_t start, + vm_offset_t end, + vm_map_t submap, + vm_offset_t offset, + boolean_t use_pmap); + + +#endif /* MACH_KERNEL_PRIVATE */ + +/* Create an empty map */ +extern vm_map_t vm_map_create( + pmap_t pmap, + vm_offset_t min, + vm_offset_t max, + boolean_t pageable); + +/* Get rid of a map */ +extern void vm_map_destroy( + vm_map_t map); +/* Lose a reference */ +extern void vm_map_deallocate( + vm_map_t map); + +/* Change protection */ +extern kern_return_t vm_map_protect( + vm_map_t map, + vm_offset_t start, + vm_offset_t end, + vm_prot_t new_prot, + boolean_t set_max); /* wire down a region */ extern kern_return_t vm_map_wire( @@ -828,21 +848,6 @@ extern kern_return_t vm_map_copyout( vm_offset_t *dst_addr, /* OUT */ vm_map_copy_t copy); - -/* Add or remove machine-dependent attributes from map regions */ -extern kern_return_t vm_map_machine_attribute( - vm_map_t map, - vm_offset_t address, - vm_size_t size, - vm_machine_attribute_t attribute, - vm_machine_attribute_val_t* value); /* IN/OUT */ -/* Set paging behavior */ -extern kern_return_t vm_map_behavior_set( - vm_map_t map, - vm_offset_t start, - vm_offset_t end, - vm_behavior_t new_behavior); - extern kern_return_t vm_map_copyin_common( vm_map_t src_map, vm_offset_t src_addr, @@ -852,14 +857,6 @@ extern kern_return_t vm_map_copyin_common( vm_map_copy_t *copy_result, /* OUT */ boolean_t use_maxprot); -extern kern_return_t vm_map_submap( - vm_map_t map, - vm_offset_t start, - vm_offset_t end, - vm_map_t submap, - vm_offset_t offset, - boolean_t use_pmap); - extern kern_return_t vm_region_clone( ipc_port_t src_region, ipc_port_t dst_region); @@ -871,6 +868,12 @@ extern kern_return_t vm_map_region_replace( vm_offset_t start, vm_offset_t end); +extern boolean_t vm_map_check_protection( + vm_map_t map, + vm_offset_t start, + vm_offset_t end, + vm_prot_t protection); + /* * Macros to invoke vm_map_copyin_common. vm_map_copyin is the * usual form; it handles a copyin based on the current protection @@ -889,8 +892,6 @@ extern kern_return_t vm_map_region_replace( vm_map_copyin_common(src_map, src_addr, len, src_destroy, \ FALSE, copy_result, TRUE) -#define VM_MAP_ENTRY_NULL ((vm_map_entry_t) 0) - /* * Flags for vm_map_remove() and vm_map_delete() */ @@ -899,91 +900,7 @@ extern kern_return_t vm_map_region_replace( #define VM_MAP_REMOVE_INTERRUPTIBLE 0x2 #define VM_MAP_REMOVE_WAIT_FOR_KWIRE 0x4 +#endif /* __APPLE_API_PRIVATE */ -#ifdef MACH_KERNEL_PRIVATE - -/* address space shared region descriptor */ - -struct shared_region_mapping { - decl_mutex_data(, Lock) /* Synchronization */ - int ref_count; - ipc_port_t text_region; - vm_size_t text_size; - ipc_port_t data_region; - vm_size_t data_size; - vm_offset_t region_mappings; - vm_offset_t client_base; - vm_offset_t alternate_base; - vm_offset_t alternate_next; - int flags; - int depth; - struct shared_region_object_chain *object_chain; - struct shared_region_mapping *self; - struct shared_region_mapping *next; -}; - -typedef struct shared_region_mapping *shared_region_mapping_t; - -struct shared_region_object_chain { - shared_region_mapping_t object_chain_region; - int depth; - struct shared_region_object_chain *next; -}; - -typedef struct shared_region_object_chain *shared_region_object_chain_t; - -#else /* !MACH_KERNEL_PRIVATE */ - -typedef void *shared_region_mapping_t; - -#endif /* MACH_KERNEL_PRIVATE */ - -/* address space shared region descriptor */ - -extern kern_return_t shared_region_mapping_info( - shared_region_mapping_t shared_region, - ipc_port_t *text_region, - vm_size_t *text_size, - ipc_port_t *data_region, - vm_size_t *data_size, - vm_offset_t *region_mappings, - vm_offset_t *client_base, - vm_offset_t *alternate_base, - vm_offset_t *alternate_next, - int *flags, - shared_region_mapping_t *next); - -extern kern_return_t shared_region_mapping_create( - ipc_port_t text_region, - vm_size_t text_size, - ipc_port_t data_region, - vm_size_t data_size, - vm_offset_t region_mappings, - vm_offset_t client_base, - shared_region_mapping_t *shared_region, - vm_offset_t alt_base, - vm_offset_t alt_next); - -extern kern_return_t shared_region_mapping_ref( - shared_region_mapping_t shared_region); - -extern kern_return_t shared_region_mapping_dealloc( - shared_region_mapping_t shared_region); - -extern kern_return_t -shared_region_object_chain_attach( - shared_region_mapping_t target_region, - shared_region_mapping_t object_chain); - -/* -extern kern_return_t vm_get_shared_region( - task_t task, - shared_region_mapping_t *shared_region); - -extern kern_return_t vm_set_shared_region( - task_t task, - shared_region_mapping_t shared_region); -*/ - #endif /* _VM_VM_MAP_H_ */