1/* 2 * Copyright (c) 2009 Apple Inc. All rights reserved. 3 * 4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5 * 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. 14 * 15 * Please obtain a copy of the License at 16 * http://www.opensource.apple.com/apsl/ and read it before using this file. 17 * 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. 25 * 26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27 */ 28 29#include <vm/vm_map_store.h> 30 31#if MACH_ASSERT 32boolean_t 33first_free_is_valid_store( vm_map_t map ) 34{ 35 return(first_free_is_valid_ll( map )); 36} 37#endif 38 39void 40vm_map_store_init( struct vm_map_header *hdr ) 41{ 42 vm_map_store_init_ll( hdr ); 43#ifdef VM_MAP_STORE_USE_RB 44 vm_map_store_init_rb( hdr ); 45#endif 46} 47 48boolean_t 49vm_map_store_lookup_entry( 50 register vm_map_t map, 51 register vm_map_offset_t address, 52 vm_map_entry_t *entry) /* OUT */ 53{ 54#ifdef VM_MAP_STORE_USE_LL 55 return (vm_map_store_lookup_entry_ll( map, address, entry )); 56#elif defined VM_MAP_STORE_USE_RB 57 return (vm_map_store_lookup_entry_rb( map, address, entry )); 58#endif 59} 60 61void 62vm_map_store_update( vm_map_t map, vm_map_entry_t entry, int update_type ) 63{ 64 switch (update_type) { 65 case VM_MAP_ENTRY_CREATE: 66 break; 67 case VM_MAP_ENTRY_DELETE: 68 if((entry) == (map)->first_free) { 69 (map)->first_free = vm_map_to_entry(map); 70 } 71 if((entry) == (map)->hint) { 72 (map)->hint = vm_map_to_entry(map); 73 } 74 break; 75 default: 76 break; 77 } 78} 79 80void vm_map_store_copy_insert( vm_map_t map, vm_map_entry_t after_where, vm_map_copy_t copy) 81{ 82 vm_map_store_copy_insert_ll(map, after_where, copy); 83#ifdef VM_MAP_STORE_USE_RB 84 vm_map_store_copy_insert_rb(map, after_where, copy); 85#endif 86} 87 88/* 89 * vm_map_entry_{un,}link: 90 * 91 * Insert/remove entries from maps (or map copies). 92 * The _vm_map_store_entry_{un,}link variants are used at 93 * some places where updating first_free is not needed & 94 * copy maps are being modified. Also note the first argument 95 * is the map header. 96 * Modifying the vm_map_store_entry_{un,}link functions to 97 * deal with these call sites made the interface confusing 98 * and clunky. 99 */ 100 101void 102_vm_map_store_entry_link( struct vm_map_header * mapHdr, vm_map_entry_t after_where, vm_map_entry_t entry) 103{ 104 assert(entry->vme_start < entry->vme_end); 105 vm_map_store_entry_link_ll(mapHdr, after_where, entry); 106#ifdef VM_MAP_STORE_USE_RB 107 vm_map_store_entry_link_rb(mapHdr, after_where, entry); 108#endif 109} 110 111void 112vm_map_store_entry_link( vm_map_t map, vm_map_entry_t after_where, vm_map_entry_t entry) 113{ 114 vm_map_t VMEL_map; 115 vm_map_entry_t VMEL_entry; 116 VMEL_map = (map); 117 VMEL_entry = (entry); 118 119 _vm_map_store_entry_link(&VMEL_map->hdr, after_where, VMEL_entry); 120 if( VMEL_map->disable_vmentry_reuse == TRUE ) { 121 UPDATE_HIGHEST_ENTRY_END( VMEL_map, VMEL_entry); 122 } else { 123 update_first_free_ll(VMEL_map, VMEL_map->first_free); 124#ifdef VM_MAP_STORE_USE_RB 125 update_first_free_rb(VMEL_map, VMEL_map->first_free); 126#endif 127 } 128} 129 130void 131_vm_map_store_entry_unlink( struct vm_map_header * mapHdr, vm_map_entry_t entry) 132{ 133 vm_map_store_entry_unlink_ll(mapHdr, entry); 134#ifdef VM_MAP_STORE_USE_RB 135 vm_map_store_entry_unlink_rb(mapHdr, entry); 136#endif 137} 138 139void 140vm_map_store_entry_unlink( vm_map_t map, vm_map_entry_t entry) 141{ 142 vm_map_t VMEU_map; 143 vm_map_entry_t VMEU_entry; 144 vm_map_entry_t VMEU_first_free; 145 VMEU_map = (map); 146 VMEU_entry = (entry); 147 if (VMEU_entry->vme_start <= VMEU_map->first_free->vme_start){ 148 VMEU_first_free = VMEU_entry->vme_prev; 149 } else { 150 VMEU_first_free = VMEU_map->first_free; 151 } 152 153 _vm_map_store_entry_unlink(&VMEU_map->hdr, VMEU_entry); 154 vm_map_store_update( map, entry, VM_MAP_ENTRY_DELETE); 155 update_first_free_ll(VMEU_map, VMEU_first_free); 156#ifdef VM_MAP_STORE_USE_RB 157 update_first_free_rb(VMEU_map, VMEU_first_free); 158#endif 159} 160 161void 162vm_map_store_copy_reset( vm_map_copy_t copy,vm_map_entry_t entry) 163{ 164 int nentries = copy->cpy_hdr.nentries; 165 vm_map_store_copy_reset_ll(copy, entry, nentries); 166#ifdef VM_MAP_STORE_USE_RB 167 vm_map_store_copy_reset_rb(copy, entry, nentries); 168#endif 169} 170 171void 172vm_map_store_update_first_free( vm_map_t map, vm_map_entry_t first_free) 173{ 174 update_first_free_ll(map, first_free); 175#ifdef VM_MAP_STORE_USE_RB 176 update_first_free_rb(map, first_free); 177#endif 178} 179