1 /* 2 * Copyright (c) 2000-2006 Apple Computer, 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 * @OSF_COPYRIGHT@ 30 */ 31 /* 32 * Mach Operating System 33 * Copyright (c) 1991,1990,1989,1988,1987 Carnegie Mellon University 34 * All Rights Reserved. 35 * 36 * Permission to use, copy, modify and distribute this software and its 37 * documentation is hereby granted, provided that both the copyright 38 * notice and this permission notice appear in all copies of the 39 * software, derivative works or modified versions, and any portions 40 * thereof, and that both notices appear in supporting documentation. 41 * 42 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" 43 * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR 44 * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. 45 * 46 * Carnegie Mellon requests users of this software to return to 47 * 48 * Software Distribution Coordinator or [email protected] 49 * School of Computer Science 50 * Carnegie Mellon University 51 * Pittsburgh PA 15213-3890 52 * 53 * any improvements or extensions that they make and grant Carnegie Mellon 54 * the rights to redistribute these changes. 55 */ 56 /* 57 */ 58 /* 59 * File: vm/vm_kern.h 60 * Author: Avadis Tevanian, Jr., Michael Wayne Young 61 * Date: 1985 62 * 63 * Kernel memory management definitions. 64 */ 65 66 #ifndef _VM_VM_KERN_H_ 67 #define _VM_VM_KERN_H_ 68 69 #ifdef XNU_KERNEL_PRIVATE 70 #include <kern/locks.h> 71 #endif /* XNU_KERNEL_PRIVATE */ 72 73 #ifdef __cplusplus 74 extern "C" { 75 #endif 76 77 #include <mach/mach_types.h> 78 #include <mach/boolean.h> 79 #include <mach/kern_return.h> 80 81 #ifdef KERNEL_PRIVATE 82 83 #ifdef XNU_KERNEL_PRIVATE 84 85 struct vm_page; 86 87 __options_decl(kma_flags_t, uint32_t, { 88 KMA_NONE = 0x00000000, 89 KMA_HERE = 0x00000001, 90 KMA_NOPAGEWAIT = 0x00000002, 91 KMA_KOBJECT = 0x00000004, 92 KMA_LOMEM = 0x00000008, 93 KMA_GUARD_FIRST = 0x00000010, 94 KMA_GUARD_LAST = 0x00000020, 95 KMA_PERMANENT = 0x00000040, 96 KMA_NOENCRYPT = 0x00000080, 97 KMA_KSTACK = 0x00000100, 98 KMA_VAONLY = 0x00000200, 99 /* 100 * Pages belonging to the compressor are not on the paging queues, 101 * nor are they counted as wired. 102 */ 103 KMA_COMPRESSOR = 0x00000400, 104 KMA_ATOMIC = 0x00000800, 105 KMA_ZERO = 0x00001000, 106 KMA_PAGEABLE = 0x00002000, 107 KMA_LAST_FREE = 0x00004000, 108 }); 109 110 extern kern_return_t kernel_memory_allocate( 111 vm_map_t map, 112 vm_offset_t *addrp, 113 vm_size_t size, 114 vm_offset_t mask, 115 kma_flags_t flags, 116 vm_tag_t tag); 117 118 extern kern_return_t kernel_memory_allocate_prot( 119 vm_map_t map, 120 vm_offset_t *addrp, 121 vm_size_t size, 122 vm_offset_t mask, 123 kma_flags_t flags, 124 vm_tag_t tag, 125 vm_prot_t protection, 126 vm_prot_t max_protection); 127 128 extern kern_return_t kmem_alloc( 129 vm_map_t map, 130 vm_offset_t *addrp, 131 vm_size_t size, 132 vm_tag_t tag) __XNU_INTERNAL(kmem_alloc); 133 134 extern kern_return_t kmem_alloc_contig( 135 vm_map_t map, 136 vm_offset_t *addrp, 137 vm_size_t size, 138 vm_offset_t mask, 139 ppnum_t max_pnum, 140 ppnum_t pnum_mask, 141 kma_flags_t flags, 142 vm_tag_t tag); 143 144 extern kern_return_t kmem_alloc_flags( 145 vm_map_t map, 146 vm_offset_t *addrp, 147 vm_size_t size, 148 vm_tag_t tag, 149 kma_flags_t flags); 150 151 extern kern_return_t kmem_alloc_pageable( 152 vm_map_t map, 153 vm_offset_t *addrp, 154 vm_size_t size, 155 vm_tag_t tag) __XNU_INTERNAL(kmem_alloc_pageable); 156 157 extern kern_return_t kmem_alloc_aligned( 158 vm_map_t map, 159 vm_offset_t *addrp, 160 vm_size_t size, 161 vm_tag_t tag); 162 163 extern kern_return_t kmem_realloc( 164 vm_map_t map, 165 vm_offset_t oldaddr, 166 vm_size_t oldsize, 167 vm_offset_t *newaddrp, 168 vm_size_t newsize, 169 vm_tag_t tag); 170 171 extern void kmem_free( 172 vm_map_t map, 173 vm_offset_t addr, 174 vm_size_t size); 175 176 extern kern_return_t kmem_suballoc( 177 vm_map_t parent, 178 vm_offset_t *addr, 179 vm_size_t size, 180 boolean_t pageable, 181 int flags, 182 vm_map_kernel_flags_t vmk_flags, 183 vm_tag_t tag, 184 vm_map_t *new_map); 185 186 extern kern_return_t kmem_alloc_kobject( 187 vm_map_t map, 188 vm_offset_t *addrp, 189 vm_size_t size, 190 vm_tag_t tag) __XNU_INTERNAL(kmem_alloc_kobject); 191 192 extern void kernel_memory_populate_with_pages( 193 vm_map_t map, 194 vm_offset_t addr, 195 vm_size_t size, 196 struct vm_page *page_list, 197 kma_flags_t flags, 198 vm_tag_t tag, 199 vm_prot_t prot); 200 201 extern kern_return_t kernel_memory_populate( 202 vm_map_t map, 203 vm_offset_t addr, 204 vm_size_t size, 205 kma_flags_t flags, 206 vm_tag_t tag); 207 208 extern void kernel_memory_depopulate( 209 vm_map_t map, 210 vm_offset_t addr, 211 vm_size_t size, 212 kma_flags_t flags, 213 vm_tag_t tag); 214 215 extern kern_return_t memory_object_iopl_request( 216 ipc_port_t port, 217 memory_object_offset_t offset, 218 upl_size_t *upl_size, 219 upl_t *upl_ptr, 220 upl_page_info_array_t user_page_list, 221 unsigned int *page_list_count, 222 upl_control_flags_t *flags, 223 vm_tag_t tag); 224 225 struct mach_memory_info; 226 extern kern_return_t vm_page_diagnose( 227 struct mach_memory_info *info, 228 unsigned int num_info, 229 uint64_t zones_collectable_bytes); 230 231 extern uint32_t vm_page_diagnose_estimate(void); 232 233 typedef enum { 234 PMAP_FEAT_UEXEC = 1 235 } pmap_feature_flags_t; 236 237 #if defined(__x86_64__) 238 extern bool pmap_supported_feature(pmap_t pmap, pmap_feature_flags_t feat); 239 #endif 240 241 #if DEBUG || DEVELOPMENT 242 243 extern kern_return_t mach_memory_info_check(void); 244 245 extern kern_return_t vm_kern_allocation_info(uintptr_t addr, vm_size_t * size, vm_tag_t * tag, vm_size_t * zone_size); 246 247 #endif /* DEBUG || DEVELOPMENT */ 248 249 #if HIBERNATION 250 extern void hibernate_rebuild_vm_structs(void); 251 #endif /* HIBERNATION */ 252 253 extern vm_tag_t vm_tag_bt(void); 254 255 extern vm_tag_t vm_tag_alloc(vm_allocation_site_t * site); 256 257 extern void vm_tag_alloc_locked(vm_allocation_site_t * site, vm_allocation_site_t ** releasesiteP); 258 259 extern void vm_tag_update_size(vm_tag_t tag, int64_t size); 260 261 #if VM_TAG_SIZECLASSES 262 263 extern void vm_allocation_zones_init(void); 264 extern vm_tag_t vm_tag_will_update_zone(vm_tag_t tag, uint32_t zidx, uint32_t zflags); 265 extern void vm_tag_update_zone_size(vm_tag_t tag, uint32_t zidx, long delta); 266 267 #endif /* VM_TAG_SIZECLASSES */ 268 269 extern vm_tag_t vm_tag_bt_debug(void); 270 271 extern uint32_t vm_tag_get_kext(vm_tag_t tag, char * name, vm_size_t namelen); 272 273 extern boolean_t vm_kernel_map_is_kernel(vm_map_t map); 274 275 extern ppnum_t kernel_pmap_present_mapping(uint64_t vaddr, uint64_t * pvincr, uintptr_t * pvphysaddr); 276 277 #else /* XNU_KERNEL_PRIVATE */ 278 279 extern kern_return_t kmem_alloc( 280 vm_map_t map, 281 vm_offset_t *addrp, 282 vm_size_t size); 283 284 extern kern_return_t kmem_alloc_pageable( 285 vm_map_t map, 286 vm_offset_t *addrp, 287 vm_size_t size); 288 289 extern kern_return_t kmem_alloc_kobject( 290 vm_map_t map, 291 vm_offset_t *addrp, 292 vm_size_t size); 293 294 extern void kmem_free( 295 vm_map_t map, 296 vm_offset_t addr, 297 vm_size_t size); 298 299 #endif /* !XNU_KERNEL_PRIVATE */ 300 301 302 #ifdef XNU_KERNEL_PRIVATE 303 typedef struct vm_allocation_site kern_allocation_name; 304 typedef kern_allocation_name * kern_allocation_name_t; 305 #else /* XNU_KERNEL_PRIVATE */ 306 struct kern_allocation_name; 307 typedef struct kern_allocation_name * kern_allocation_name_t; 308 #endif /* !XNU_KERNEL_PRIVATE */ 309 310 extern kern_allocation_name_t kern_allocation_name_allocate(const char * name, uint16_t suballocs); 311 extern void kern_allocation_name_release(kern_allocation_name_t allocation); 312 extern const char * kern_allocation_get_name(kern_allocation_name_t allocation); 313 #ifdef XNU_KERNEL_PRIVATE 314 extern void kern_allocation_update_size(kern_allocation_name_t allocation, int64_t delta); 315 extern void kern_allocation_update_subtotal(kern_allocation_name_t allocation, uint32_t subtag, int64_t delta); 316 extern vm_tag_t kern_allocation_name_get_vm_tag(kern_allocation_name_t allocation); 317 #endif /* XNU_KERNEL_PRIVATE */ 318 319 #ifdef MACH_KERNEL_PRIVATE 320 321 extern void kmem_init( 322 vm_offset_t start, 323 vm_offset_t end); 324 325 extern kern_return_t copyinmap( 326 vm_map_t map, 327 vm_map_offset_t fromaddr, 328 void *todata, 329 vm_size_t length); 330 331 extern kern_return_t copyoutmap( 332 vm_map_t map, 333 void *fromdata, 334 vm_map_offset_t toaddr, 335 vm_size_t length); 336 337 extern kern_return_t copyoutmap_atomic32( 338 vm_map_t map, 339 uint32_t value, 340 vm_map_offset_t toaddr); 341 342 extern kern_return_t copyoutmap_atomic64( 343 vm_map_t map, 344 uint64_t value, 345 vm_map_offset_t toaddr); 346 347 extern kern_return_t kmem_alloc_external( 348 vm_map_t map, 349 vm_offset_t *addrp, 350 vm_size_t size); 351 352 extern kern_return_t kmem_alloc_kobject_external( 353 vm_map_t map, 354 vm_offset_t *addrp, 355 vm_size_t size); 356 357 extern kern_return_t kmem_alloc_pageable_external( 358 vm_map_t map, 359 vm_offset_t *addrp, 360 vm_size_t size); 361 362 #endif /* MACH_KERNEL_PRIVATE */ 363 364 #ifdef XNU_KERNEL_PRIVATE 365 366 extern kern_return_t mach_vm_allocate_kernel( 367 vm_map_t map, 368 mach_vm_offset_t *addr, 369 mach_vm_size_t size, 370 int flags, 371 vm_tag_t tag); 372 373 extern kern_return_t vm_allocate_kernel( 374 vm_map_t map, 375 vm_offset_t *addr, 376 vm_size_t size, 377 int flags, 378 vm_tag_t tag); 379 380 381 extern kern_return_t mach_vm_map_kernel( 382 vm_map_t target_map, 383 mach_vm_offset_t *address, 384 mach_vm_size_t initial_size, 385 mach_vm_offset_t mask, 386 int flags, 387 vm_map_kernel_flags_t vmk_flags, 388 vm_tag_t tag, 389 ipc_port_t port, 390 vm_object_offset_t offset, 391 boolean_t copy, 392 vm_prot_t cur_protection, 393 vm_prot_t max_protection, 394 vm_inherit_t inheritance); 395 396 397 extern kern_return_t vm_map_kernel( 398 vm_map_t target_map, 399 vm_offset_t *address, 400 vm_size_t size, 401 vm_offset_t mask, 402 int flags, 403 vm_map_kernel_flags_t vmk_flags, 404 vm_tag_t tag, 405 ipc_port_t port, 406 vm_offset_t offset, 407 boolean_t copy, 408 vm_prot_t cur_protection, 409 vm_prot_t max_protection, 410 vm_inherit_t inheritance); 411 412 extern kern_return_t mach_vm_remap_kernel( 413 vm_map_t target_map, 414 mach_vm_offset_t *address, 415 mach_vm_size_t size, 416 mach_vm_offset_t mask, 417 int flags, 418 vm_tag_t tag, 419 vm_map_t src_map, 420 mach_vm_offset_t memory_address, 421 boolean_t copy, 422 vm_prot_t *cur_protection, 423 vm_prot_t *max_protection, 424 vm_inherit_t inheritance); 425 426 extern kern_return_t vm_remap_kernel( 427 vm_map_t target_map, 428 vm_offset_t *address, 429 vm_size_t size, 430 vm_offset_t mask, 431 int flags, 432 vm_tag_t tag, 433 vm_map_t src_map, 434 vm_offset_t memory_address, 435 boolean_t copy, 436 vm_prot_t *cur_protection, 437 vm_prot_t *max_protection, 438 vm_inherit_t inheritance); 439 440 extern kern_return_t vm_map_64_kernel( 441 vm_map_t target_map, 442 vm_offset_t *address, 443 vm_size_t size, 444 vm_offset_t mask, 445 int flags, 446 vm_map_kernel_flags_t vmk_flags, 447 vm_tag_t tag, 448 ipc_port_t port, 449 vm_object_offset_t offset, 450 boolean_t copy, 451 vm_prot_t cur_protection, 452 vm_prot_t max_protection, 453 vm_inherit_t inheritance); 454 455 extern kern_return_t mach_vm_wire_kernel( 456 host_priv_t host_priv, 457 vm_map_t map, 458 mach_vm_offset_t start, 459 mach_vm_size_t size, 460 vm_prot_t access, 461 vm_tag_t tag); 462 463 extern kern_return_t vm_map_wire_kernel( 464 vm_map_t map, 465 vm_map_offset_t start, 466 vm_map_offset_t end, 467 vm_prot_t caller_prot, 468 vm_tag_t tag, 469 boolean_t user_wire); 470 471 extern kern_return_t vm_map_wire_and_extract_kernel( 472 vm_map_t map, 473 vm_map_offset_t start, 474 vm_prot_t caller_prot, 475 vm_tag_t tag, 476 boolean_t user_wire, 477 ppnum_t *physpage_p); 478 479 #endif /* XNU_KERNEL_PRIVATE */ 480 481 extern vm_map_t kernel_map; 482 extern vm_map_t kernel_pageable_map; 483 extern vm_map_t ipc_kernel_map; 484 extern vm_map_t g_kext_map; 485 486 #endif /* KERNEL_PRIVATE */ 487 488 #ifdef KERNEL 489 490 __BEGIN_DECLS 491 #if MACH_KERNEL_PRIVATE 492 extern vm_offset_t vm_kernel_addrhash(vm_offset_t addr) 493 __XNU_INTERNAL(vm_kernel_addrhash); 494 #else 495 extern vm_offset_t vm_kernel_addrhash(vm_offset_t addr); 496 #endif 497 __END_DECLS 498 499 extern void vm_kernel_addrhide( 500 vm_offset_t addr, 501 vm_offset_t *hide_addr); 502 503 extern vm_offset_t vm_kernel_addrperm_ext; 504 505 extern void vm_kernel_addrperm_external( 506 vm_offset_t addr, 507 vm_offset_t *perm_addr); 508 509 extern void vm_kernel_unslide_or_perm_external( 510 vm_offset_t addr, 511 vm_offset_t *up_addr); 512 513 #if MACH_KERNEL_PRIVATE 514 extern uint64_t vm_kernel_addrhash_salt; 515 extern uint64_t vm_kernel_addrhash_salt_ext; 516 517 extern void vm_kernel_addrhash_external( 518 vm_offset_t addr, 519 vm_offset_t *perm_addr); 520 #endif /* MACH_KERNEL_PRIVATE */ 521 522 extern void vm_init_before_launchd(void); 523 524 #endif /* KERNEL */ 525 526 #ifdef __cplusplus 527 } 528 #endif 529 530 #endif /* _VM_VM_KERN_H_ */ 531