1*8d741a5dSApple OSS Distributions /* 2*8d741a5dSApple OSS Distributions * Copyright (c) 2000-2021 Apple Inc. All rights reserved. 3*8d741a5dSApple OSS Distributions * 4*8d741a5dSApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5*8d741a5dSApple OSS Distributions * 6*8d741a5dSApple OSS Distributions * This file contains Original Code and/or Modifications of Original Code 7*8d741a5dSApple OSS Distributions * as defined in and that are subject to the Apple Public Source License 8*8d741a5dSApple OSS Distributions * Version 2.0 (the 'License'). You may not use this file except in 9*8d741a5dSApple OSS Distributions * compliance with the License. The rights granted to you under the License 10*8d741a5dSApple OSS Distributions * may not be used to create, or enable the creation or redistribution of, 11*8d741a5dSApple OSS Distributions * unlawful or unlicensed copies of an Apple operating system, or to 12*8d741a5dSApple OSS Distributions * circumvent, violate, or enable the circumvention or violation of, any 13*8d741a5dSApple OSS Distributions * terms of an Apple operating system software license agreement. 14*8d741a5dSApple OSS Distributions * 15*8d741a5dSApple OSS Distributions * Please obtain a copy of the License at 16*8d741a5dSApple OSS Distributions * http://www.opensource.apple.com/apsl/ and read it before using this file. 17*8d741a5dSApple OSS Distributions * 18*8d741a5dSApple OSS Distributions * The Original Code and all software distributed under the License are 19*8d741a5dSApple OSS Distributions * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 20*8d741a5dSApple OSS Distributions * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 21*8d741a5dSApple OSS Distributions * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 22*8d741a5dSApple OSS Distributions * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 23*8d741a5dSApple OSS Distributions * Please see the License for the specific language governing rights and 24*8d741a5dSApple OSS Distributions * limitations under the License. 25*8d741a5dSApple OSS Distributions * 26*8d741a5dSApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27*8d741a5dSApple OSS Distributions */ 28*8d741a5dSApple OSS Distributions /* 29*8d741a5dSApple OSS Distributions * @OSF_COPYRIGHT@ 30*8d741a5dSApple OSS Distributions */ 31*8d741a5dSApple OSS Distributions /* 32*8d741a5dSApple OSS Distributions * Mach Operating System 33*8d741a5dSApple OSS Distributions * Copyright (c) 1991,1990,1989,1988,1987 Carnegie Mellon University 34*8d741a5dSApple OSS Distributions * All Rights Reserved. 35*8d741a5dSApple OSS Distributions * 36*8d741a5dSApple OSS Distributions * Permission to use, copy, modify and distribute this software and its 37*8d741a5dSApple OSS Distributions * documentation is hereby granted, provided that both the copyright 38*8d741a5dSApple OSS Distributions * notice and this permission notice appear in all copies of the 39*8d741a5dSApple OSS Distributions * software, derivative works or modified versions, and any portions 40*8d741a5dSApple OSS Distributions * thereof, and that both notices appear in supporting documentation. 41*8d741a5dSApple OSS Distributions * 42*8d741a5dSApple OSS Distributions * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" 43*8d741a5dSApple OSS Distributions * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR 44*8d741a5dSApple OSS Distributions * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. 45*8d741a5dSApple OSS Distributions * 46*8d741a5dSApple OSS Distributions * Carnegie Mellon requests users of this software to return to 47*8d741a5dSApple OSS Distributions * 48*8d741a5dSApple OSS Distributions * Software Distribution Coordinator or [email protected] 49*8d741a5dSApple OSS Distributions * School of Computer Science 50*8d741a5dSApple OSS Distributions * Carnegie Mellon University 51*8d741a5dSApple OSS Distributions * Pittsburgh PA 15213-3890 52*8d741a5dSApple OSS Distributions * 53*8d741a5dSApple OSS Distributions * any improvements or extensions that they make and grant Carnegie Mellon 54*8d741a5dSApple OSS Distributions * the rights to redistribute these changes. 55*8d741a5dSApple OSS Distributions */ 56*8d741a5dSApple OSS Distributions /* 57*8d741a5dSApple OSS Distributions */ 58*8d741a5dSApple OSS Distributions 59*8d741a5dSApple OSS Distributions /* 60*8d741a5dSApple OSS Distributions * File: vm/vm_map.h 61*8d741a5dSApple OSS Distributions * Author: Avadis Tevanian, Jr., Michael Wayne Young 62*8d741a5dSApple OSS Distributions * Date: 1985 63*8d741a5dSApple OSS Distributions * 64*8d741a5dSApple OSS Distributions * Virtual memory map module definitions. 65*8d741a5dSApple OSS Distributions * 66*8d741a5dSApple OSS Distributions * Contributors: 67*8d741a5dSApple OSS Distributions * avie, dlb, mwyoung 68*8d741a5dSApple OSS Distributions */ 69*8d741a5dSApple OSS Distributions 70*8d741a5dSApple OSS Distributions #ifndef _VM_VM_MAP_H_ 71*8d741a5dSApple OSS Distributions #define _VM_VM_MAP_H_ 72*8d741a5dSApple OSS Distributions 73*8d741a5dSApple OSS Distributions #include <sys/cdefs.h> 74*8d741a5dSApple OSS Distributions 75*8d741a5dSApple OSS Distributions #include <mach/mach_types.h> 76*8d741a5dSApple OSS Distributions #include <mach/kern_return.h> 77*8d741a5dSApple OSS Distributions #include <mach/boolean.h> 78*8d741a5dSApple OSS Distributions #include <mach/vm_types.h> 79*8d741a5dSApple OSS Distributions #include <mach/vm_prot.h> 80*8d741a5dSApple OSS Distributions #include <mach/vm_inherit.h> 81*8d741a5dSApple OSS Distributions #include <mach/vm_behavior.h> 82*8d741a5dSApple OSS Distributions #include <mach/vm_param.h> 83*8d741a5dSApple OSS Distributions #include <mach/sdt.h> 84*8d741a5dSApple OSS Distributions #include <vm/pmap.h> 85*8d741a5dSApple OSS Distributions #include <os/overflow.h> 86*8d741a5dSApple OSS Distributions #ifdef XNU_KERNEL_PRIVATE 87*8d741a5dSApple OSS Distributions #include <vm/vm_protos.h> 88*8d741a5dSApple OSS Distributions #endif /* XNU_KERNEL_PRIVATE */ 89*8d741a5dSApple OSS Distributions #ifdef MACH_KERNEL_PRIVATE 90*8d741a5dSApple OSS Distributions #include <mach_assert.h> 91*8d741a5dSApple OSS Distributions #include <vm/vm_map_store_internal.h> 92*8d741a5dSApple OSS Distributions #include <vm/vm_object_xnu.h> 93*8d741a5dSApple OSS Distributions #include <vm/vm_page.h> 94*8d741a5dSApple OSS Distributions #include <kern/locks.h> 95*8d741a5dSApple OSS Distributions #include <kern/zalloc.h> 96*8d741a5dSApple OSS Distributions #include <kern/macro_help.h> 97*8d741a5dSApple OSS Distributions 98*8d741a5dSApple OSS Distributions #include <kern/thread.h> 99*8d741a5dSApple OSS Distributions #include <os/refcnt.h> 100*8d741a5dSApple OSS Distributions #endif /* MACH_KERNEL_PRIVATE */ 101*8d741a5dSApple OSS Distributions 102*8d741a5dSApple OSS Distributions 103*8d741a5dSApple OSS Distributions __BEGIN_DECLS 104*8d741a5dSApple OSS Distributions 105*8d741a5dSApple OSS Distributions #ifdef KERNEL_PRIVATE 106*8d741a5dSApple OSS Distributions 107*8d741a5dSApple OSS Distributions #pragma mark - VM map basics 108*8d741a5dSApple OSS Distributions 109*8d741a5dSApple OSS Distributions /*! 110*8d741a5dSApple OSS Distributions * @function vm_map_create() 111*8d741a5dSApple OSS Distributions * 112*8d741a5dSApple OSS Distributions * @brief 113*8d741a5dSApple OSS Distributions * Creates an empty VM map. 114*8d741a5dSApple OSS Distributions * 115*8d741a5dSApple OSS Distributions * @discussion 116*8d741a5dSApple OSS Distributions * A VM map represents an address space or sub-address space that is managed 117*8d741a5dSApple OSS Distributions * by the Mach VM. 118*8d741a5dSApple OSS Distributions * 119*8d741a5dSApple OSS Distributions * It consists of a complex data structure which represents all the VM regions 120*8d741a5dSApple OSS Distributions * as configured by the address space client, which supports fast lookup 121*8d741a5dSApple OSS Distributions * by address or range. 122*8d741a5dSApple OSS Distributions * 123*8d741a5dSApple OSS Distributions * In the Mach VM, the VM map is the source of truth for all the configuration 124*8d741a5dSApple OSS Distributions * of regions, and the machine dependent physical map layer is used as a cache 125*8d741a5dSApple OSS Distributions * of that information. 126*8d741a5dSApple OSS Distributions * 127*8d741a5dSApple OSS Distributions * Most of the kernel clients never have to make VM maps themselves 128*8d741a5dSApple OSS Distributions * and will instead interact with: 129*8d741a5dSApple OSS Distributions * - the @c current_map() (or a given task map), 130*8d741a5dSApple OSS Distributions * - the @c kernel_map (which is the kernel's own map) or one of its submaps. 131*8d741a5dSApple OSS Distributions * 132*8d741a5dSApple OSS Distributions #ifdef XNU_KERNEL_PRIVATE 133*8d741a5dSApple OSS Distributions * Inside XNU, using @c vm_map_create_options() is preferred. 134*8d741a5dSApple OSS Distributions * 135*8d741a5dSApple OSS Distributions #endif XNU_KERNEL_PRIVATE 136*8d741a5dSApple OSS Distributions * @param pmap the physical map to associated with this map 137*8d741a5dSApple OSS Distributions * @param min_off the lower address bound of this map 138*8d741a5dSApple OSS Distributions * @param max_off the upper address bound of this map 139*8d741a5dSApple OSS Distributions * @param pageable whether the map will support paging. 140*8d741a5dSApple OSS Distributions */ 141*8d741a5dSApple OSS Distributions extern vm_map_t vm_map_create( 142*8d741a5dSApple OSS Distributions pmap_t pmap, 143*8d741a5dSApple OSS Distributions vm_map_offset_t min_off, 144*8d741a5dSApple OSS Distributions vm_map_offset_t max_off, 145*8d741a5dSApple OSS Distributions boolean_t pageable); 146*8d741a5dSApple OSS Distributions 147*8d741a5dSApple OSS Distributions 148*8d741a5dSApple OSS Distributions /*! 149*8d741a5dSApple OSS Distributions * @function vm_map_deallocate() 150*8d741a5dSApple OSS Distributions * 151*8d741a5dSApple OSS Distributions * @brief 152*8d741a5dSApple OSS Distributions * Deallocates a VM map. 153*8d741a5dSApple OSS Distributions * 154*8d741a5dSApple OSS Distributions * @discussion 155*8d741a5dSApple OSS Distributions * VM maps are refcounted objects, however most clients will instead 156*8d741a5dSApple OSS Distributions * hold references to the owning task, or manipulate them via Mach ports. 157*8d741a5dSApple OSS Distributions * 158*8d741a5dSApple OSS Distributions * @param map the map to deallocate. 159*8d741a5dSApple OSS Distributions */ 160*8d741a5dSApple OSS Distributions extern void vm_map_deallocate( 161*8d741a5dSApple OSS Distributions vm_map_t map); 162*8d741a5dSApple OSS Distributions 163*8d741a5dSApple OSS Distributions 164*8d741a5dSApple OSS Distributions /*! 165*8d741a5dSApple OSS Distributions * @function vm_map_page_shift() 166*8d741a5dSApple OSS Distributions * 167*8d741a5dSApple OSS Distributions * @brief 168*8d741a5dSApple OSS Distributions * Returns the page shift for a given map. 169*8d741a5dSApple OSS Distributions * 170*8d741a5dSApple OSS Distributions * @param map the specified map 171*8d741a5dSApple OSS Distributions * @returns the page shift for this map 172*8d741a5dSApple OSS Distributions */ 173*8d741a5dSApple OSS Distributions extern int vm_map_page_shift( 174*8d741a5dSApple OSS Distributions vm_map_t map) __pure2; 175*8d741a5dSApple OSS Distributions 176*8d741a5dSApple OSS Distributions 177*8d741a5dSApple OSS Distributions /*! 178*8d741a5dSApple OSS Distributions * @function vm_map_page_mask() 179*8d741a5dSApple OSS Distributions * 180*8d741a5dSApple OSS Distributions * @brief 181*8d741a5dSApple OSS Distributions * Returns the page mask for a given map. 182*8d741a5dSApple OSS Distributions * 183*8d741a5dSApple OSS Distributions * @discussion 184*8d741a5dSApple OSS Distributions * This is equivalent to @c ((1ull << vm_page_shift(mask)) - 1). 185*8d741a5dSApple OSS Distributions * 186*8d741a5dSApple OSS Distributions * @param map the specified map 187*8d741a5dSApple OSS Distributions * @returns the page mask for this map 188*8d741a5dSApple OSS Distributions */ 189*8d741a5dSApple OSS Distributions extern vm_map_offset_t vm_map_page_mask( 190*8d741a5dSApple OSS Distributions vm_map_t map) __pure2; 191*8d741a5dSApple OSS Distributions 192*8d741a5dSApple OSS Distributions 193*8d741a5dSApple OSS Distributions /*! 194*8d741a5dSApple OSS Distributions * @function vm_map_page_size() 195*8d741a5dSApple OSS Distributions * 196*8d741a5dSApple OSS Distributions * @brief 197*8d741a5dSApple OSS Distributions * Returns the page size for a given map. 198*8d741a5dSApple OSS Distributions * 199*8d741a5dSApple OSS Distributions * @discussion 200*8d741a5dSApple OSS Distributions * This is equivalent to @c ((1 << vm_page_shift(mask))) 201*8d741a5dSApple OSS Distributions * 202*8d741a5dSApple OSS Distributions * @param map the specified map 203*8d741a5dSApple OSS Distributions * @returns the page size for this map 204*8d741a5dSApple OSS Distributions */ 205*8d741a5dSApple OSS Distributions extern int vm_map_page_size( 206*8d741a5dSApple OSS Distributions vm_map_t map) __pure2; 207*8d741a5dSApple OSS Distributions 208*8d741a5dSApple OSS Distributions 209*8d741a5dSApple OSS Distributions /*! 210*8d741a5dSApple OSS Distributions * @function vm_map_round_page() 211*8d741a5dSApple OSS Distributions * 212*8d741a5dSApple OSS Distributions * @brief 213*8d741a5dSApple OSS Distributions * Rounds up a given address to the next page boundary for a given page mask. 214*8d741a5dSApple OSS Distributions * 215*8d741a5dSApple OSS Distributions * @discussion 216*8d741a5dSApple OSS Distributions * @warning 217*8d741a5dSApple OSS Distributions * This function doesn't check for overflow, 218*8d741a5dSApple OSS Distributions * clients are expected to verify the returned value wasn't 0. 219*8d741a5dSApple OSS Distributions * 220*8d741a5dSApple OSS Distributions * @param offset the address to round to a page boundary 221*8d741a5dSApple OSS Distributions * @param mask the page mask to use for the operation 222*8d741a5dSApple OSS Distributions * @returns @c offset rounded up to the next page boundary 223*8d741a5dSApple OSS Distributions */ 224*8d741a5dSApple OSS Distributions #define vm_map_round_page(x, pgmask) \ 225*8d741a5dSApple OSS Distributions (((vm_map_offset_t)(x) + (pgmask)) & ~((signed)(pgmask))) 226*8d741a5dSApple OSS Distributions 227*8d741a5dSApple OSS Distributions /*! 228*8d741a5dSApple OSS Distributions * @function vm_map_round_page_mask() 229*8d741a5dSApple OSS Distributions * 230*8d741a5dSApple OSS Distributions * @brief 231*8d741a5dSApple OSS Distributions * Rounds up a given address to the next page boundary for a given page mask. 232*8d741a5dSApple OSS Distributions * 233*8d741a5dSApple OSS Distributions * @discussion 234*8d741a5dSApple OSS Distributions * This is equivalent to @c vm_map_round_page(offset, mask) 235*8d741a5dSApple OSS Distributions * 236*8d741a5dSApple OSS Distributions * @warning 237*8d741a5dSApple OSS Distributions * This function doesn't check for overflow, 238*8d741a5dSApple OSS Distributions * clients are expected to verify the returned value wasn't 0. 239*8d741a5dSApple OSS Distributions * 240*8d741a5dSApple OSS Distributions * @param offset the address to round to a page boundary 241*8d741a5dSApple OSS Distributions * @param mask the page mask to use for the operation 242*8d741a5dSApple OSS Distributions * @returns @c offset rounded up to the next page boundary 243*8d741a5dSApple OSS Distributions */ 244*8d741a5dSApple OSS Distributions extern vm_map_offset_t vm_map_round_page_mask( 245*8d741a5dSApple OSS Distributions vm_map_offset_t offset, 246*8d741a5dSApple OSS Distributions vm_map_offset_t mask) __pure2; 247*8d741a5dSApple OSS Distributions 248*8d741a5dSApple OSS Distributions 249*8d741a5dSApple OSS Distributions /*! 250*8d741a5dSApple OSS Distributions * @function vm_map_trunc_page() 251*8d741a5dSApple OSS Distributions * 252*8d741a5dSApple OSS Distributions * @brief 253*8d741a5dSApple OSS Distributions * Truncates a given address to the previous page boundary for a given page mask. 254*8d741a5dSApple OSS Distributions * 255*8d741a5dSApple OSS Distributions * @discussion 256*8d741a5dSApple OSS Distributions * This is equivalent to @c vm_map_trunc_page(offset, mask) 257*8d741a5dSApple OSS Distributions * 258*8d741a5dSApple OSS Distributions * @param offset the address to truncate to a page boundary 259*8d741a5dSApple OSS Distributions * @param mask the page mask to use for the operation 260*8d741a5dSApple OSS Distributions * @returns @c offset truncated to the previous page boundary 261*8d741a5dSApple OSS Distributions */ 262*8d741a5dSApple OSS Distributions #define vm_map_trunc_page(offset, pgmask) \ 263*8d741a5dSApple OSS Distributions ((vm_map_offset_t)(offset) & ~((signed)(pgmask))) 264*8d741a5dSApple OSS Distributions 265*8d741a5dSApple OSS Distributions /*! 266*8d741a5dSApple OSS Distributions * @function vm_map_trunc_page_mask() 267*8d741a5dSApple OSS Distributions * 268*8d741a5dSApple OSS Distributions * @brief 269*8d741a5dSApple OSS Distributions * Truncates a given address to the previous page boundary for a given page mask. 270*8d741a5dSApple OSS Distributions * 271*8d741a5dSApple OSS Distributions * @discussion 272*8d741a5dSApple OSS Distributions * This is equivalent to @c vm_map_trunc_page(offset, mask) 273*8d741a5dSApple OSS Distributions * 274*8d741a5dSApple OSS Distributions * @param offset the address to truncate to a page boundary 275*8d741a5dSApple OSS Distributions * @param mask the page mask to use for the operation 276*8d741a5dSApple OSS Distributions * @returns @c offset truncated to the previous page boundary 277*8d741a5dSApple OSS Distributions */ 278*8d741a5dSApple OSS Distributions extern vm_map_offset_t vm_map_trunc_page_mask( 279*8d741a5dSApple OSS Distributions vm_map_offset_t offset, 280*8d741a5dSApple OSS Distributions vm_map_offset_t mask) __pure2; 281*8d741a5dSApple OSS Distributions 282*8d741a5dSApple OSS Distributions 283*8d741a5dSApple OSS Distributions /*! 284*8d741a5dSApple OSS Distributions * @function vm_map_disable_hole_optimization() 285*8d741a5dSApple OSS Distributions * 286*8d741a5dSApple OSS Distributions * @brief 287*8d741a5dSApple OSS Distributions * Disables hole list optimization 288*8d741a5dSApple OSS Distributions * 289*8d741a5dSApple OSS Distributions * @discussion 290*8d741a5dSApple OSS Distributions * This function disables the hole list optimization and deallocates all 291*8d741a5dSApple OSS Distributions * associated resources. 292*8d741a5dSApple OSS Distributions * 293*8d741a5dSApple OSS Distributions * @param map the map to disable hole list for. 294*8d741a5dSApple OSS Distributions */ 295*8d741a5dSApple OSS Distributions extern void vm_map_disable_hole_optimization( 296*8d741a5dSApple OSS Distributions vm_map_t map); 297*8d741a5dSApple OSS Distributions 298*8d741a5dSApple OSS Distributions #ifdef MACH_KERNEL_PRIVATE 299*8d741a5dSApple OSS Distributions 300*8d741a5dSApple OSS Distributions #pragma mark - MIG helpers 301*8d741a5dSApple OSS Distributions #pragma GCC visibility push(hidden) 302*8d741a5dSApple OSS Distributions 303*8d741a5dSApple OSS Distributions /*! 304*8d741a5dSApple OSS Distributions * @function convert_port_entry_to_map() 305*8d741a5dSApple OSS Distributions * 306*8d741a5dSApple OSS Distributions * @brief 307*8d741a5dSApple OSS Distributions * MIG intran for the @c vm_task_entry_t type, do not use directly. 308*8d741a5dSApple OSS Distributions */ 309*8d741a5dSApple OSS Distributions extern vm_map_t convert_port_entry_to_map( 310*8d741a5dSApple OSS Distributions ipc_port_t port) __exported; 311*8d741a5dSApple OSS Distributions 312*8d741a5dSApple OSS Distributions /*! 313*8d741a5dSApple OSS Distributions * @function vm_map_inspect_deallocate() 314*8d741a5dSApple OSS Distributions * 315*8d741a5dSApple OSS Distributions * @brief 316*8d741a5dSApple OSS Distributions * MIG destructor function for the @c vm_map_inspect_t type, 317*8d741a5dSApple OSS Distributions * do not use directly. 318*8d741a5dSApple OSS Distributions */ 319*8d741a5dSApple OSS Distributions extern void vm_map_inspect_deallocate( 320*8d741a5dSApple OSS Distributions vm_map_inspect_t map); 321*8d741a5dSApple OSS Distributions 322*8d741a5dSApple OSS Distributions 323*8d741a5dSApple OSS Distributions /*! 324*8d741a5dSApple OSS Distributions * @function vm_map_read_deallocate() 325*8d741a5dSApple OSS Distributions * 326*8d741a5dSApple OSS Distributions * @brief 327*8d741a5dSApple OSS Distributions * MIG destructor function for the @c vm_map_read_t type, 328*8d741a5dSApple OSS Distributions * do not use directly. 329*8d741a5dSApple OSS Distributions */ 330*8d741a5dSApple OSS Distributions extern void vm_map_read_deallocate( 331*8d741a5dSApple OSS Distributions vm_map_read_t map); 332*8d741a5dSApple OSS Distributions 333*8d741a5dSApple OSS Distributions #pragma GCC visibility pop 334*8d741a5dSApple OSS Distributions #endif /* MACH_KERNEL_PRIVATE */ 335*8d741a5dSApple OSS Distributions 336*8d741a5dSApple OSS Distributions #pragma mark - vm map wiring 337*8d741a5dSApple OSS Distributions #if !XNU_KERNEL_PRIVATE 338*8d741a5dSApple OSS Distributions 339*8d741a5dSApple OSS Distributions /*! 340*8d741a5dSApple OSS Distributions * @function vm_map_wire() 341*8d741a5dSApple OSS Distributions * 342*8d741a5dSApple OSS Distributions * @brief 343*8d741a5dSApple OSS Distributions * Sets the pageability of the specified address range in the 344*8d741a5dSApple OSS Distributions * target map as wired. 345*8d741a5dSApple OSS Distributions * 346*8d741a5dSApple OSS Distributions * @discussion 347*8d741a5dSApple OSS Distributions * Regions specified as not pageable require locked-down physical memory 348*8d741a5dSApple OSS Distributions * and physical page maps. 349*8d741a5dSApple OSS Distributions * 350*8d741a5dSApple OSS Distributions * The prot_u variable indicates types of accesses that must not 351*8d741a5dSApple OSS Distributions * generate page faults. This is checked against protection of memory 352*8d741a5dSApple OSS Distributions * being locked-down. 353*8d741a5dSApple OSS Distributions * 354*8d741a5dSApple OSS Distributions * The map must not be locked, but a reference must remain 355*8d741a5dSApple OSS Distributions * to the map throughout the call. 356*8d741a5dSApple OSS Distributions * 357*8d741a5dSApple OSS Distributions * 358*8d741a5dSApple OSS Distributions * @param map the target VM map (the call will recurse in submaps). 359*8d741a5dSApple OSS Distributions * @param start_u the lower bound of the address range to wire 360*8d741a5dSApple OSS Distributions * @param end_u the upper bound of the address range to wire 361*8d741a5dSApple OSS Distributions * @param prot_u the access for which to perform the wiring 362*8d741a5dSApple OSS Distributions * @param user_wire whether the wiring is on behalf of userspace. 363*8d741a5dSApple OSS Distributions * userspace wiring is equivalent to an mlock() call from 364*8d741a5dSApple OSS Distributions * userspace and will be undone at process death unlike 365*8d741a5dSApple OSS Distributions * kernel wiring which must always be undone explicitly. 366*8d741a5dSApple OSS Distributions * 367*8d741a5dSApple OSS Distributions * @returns 368*8d741a5dSApple OSS Distributions * - KERN_SUCCESS the operation was successful 369*8d741a5dSApple OSS Distributions * - KERN_INVALID_ARGUMENT 370*8d741a5dSApple OSS Distributions * @c [start_u, end_u) didn't form a valid region 371*8d741a5dSApple OSS Distributions * - KERN_RESOURCE_SHORTAGE 372*8d741a5dSApple OSS Distributions * the kernel was out of physical memory to perform 373*8d741a5dSApple OSS Distributions * the operation. 374*8d741a5dSApple OSS Distributions * - KERN_INVALID_ADDRESS 375*8d741a5dSApple OSS Distributions * some address in the range wasn't mapped. 376*8d741a5dSApple OSS Distributions * - KERN_PROTECTION_FAILURE 377*8d741a5dSApple OSS Distributions * the region doesn't support wiring for this access. 378*8d741a5dSApple OSS Distributions * - KERN_MEMORY_ERROR faulting failed. 379*8d741a5dSApple OSS Distributions * - MACH_SEND_INTERRUPTED 380*8d741a5dSApple OSS Distributions * a signal was received during the wiring 381*8d741a5dSApple OSS Distributions * 382*8d741a5dSApple OSS Distributions * User wirings: 383*8d741a5dSApple OSS Distributions * - KERN_FAILURE the process was terminated during the wiring. 384*8d741a5dSApple OSS Distributions * - KERN_FAILURE the user wire counts would overflow @c MAX_WIRE_COUNT 385*8d741a5dSApple OSS Distributions * for this region. 386*8d741a5dSApple OSS Distributions * - KERN_RESOURCE_SHORTAGE 387*8d741a5dSApple OSS Distributions * the process would overflow its user wiring limits. 388*8d741a5dSApple OSS Distributions */ 389*8d741a5dSApple OSS Distributions extern kern_return_t vm_map_wire( 390*8d741a5dSApple OSS Distributions vm_map_t map, 391*8d741a5dSApple OSS Distributions vm_map_offset_ut start_u, 392*8d741a5dSApple OSS Distributions vm_map_offset_ut end_u, 393*8d741a5dSApple OSS Distributions vm_prot_ut prot_u, 394*8d741a5dSApple OSS Distributions boolean_t user_wire); 395*8d741a5dSApple OSS Distributions 396*8d741a5dSApple OSS Distributions #endif /* !XNU_KERNEL_PRIVATE */ 397*8d741a5dSApple OSS Distributions 398*8d741a5dSApple OSS Distributions /*! 399*8d741a5dSApple OSS Distributions * @function vm_map_unwire() 400*8d741a5dSApple OSS Distributions * 401*8d741a5dSApple OSS Distributions * @brief 402*8d741a5dSApple OSS Distributions * Sets the pageability of the specified address range in the target 403*8d741a5dSApple OSS Distributions * as pageable. 404*8d741a5dSApple OSS Distributions * 405*8d741a5dSApple OSS Distributions * @discussion 406*8d741a5dSApple OSS Distributions * Regions specified must have been wired previously. 407*8d741a5dSApple OSS Distributions * 408*8d741a5dSApple OSS Distributions * The map must not be locked, but a reference must remain to the map 409*8d741a5dSApple OSS Distributions * throughout the call. 410*8d741a5dSApple OSS Distributions * 411*8d741a5dSApple OSS Distributions * User unwire ignores holes and unwired and intransition entries to avoid 412*8d741a5dSApple OSS Distributions * losing memory by leaving it unwired. Kernel unwires will panic on failures. 413*8d741a5dSApple OSS Distributions * 414*8d741a5dSApple OSS Distributions * 415*8d741a5dSApple OSS Distributions * @param map the target VM map (the call will recurse in submaps). 416*8d741a5dSApple OSS Distributions * @param start_u the lower bound of the address range to wire 417*8d741a5dSApple OSS Distributions * @param end_u the upper bound of the address range to wire 418*8d741a5dSApple OSS Distributions * @param user_wire whether the wiring is on behalf of userspace. 419*8d741a5dSApple OSS Distributions */ 420*8d741a5dSApple OSS Distributions extern kern_return_t vm_map_unwire( 421*8d741a5dSApple OSS Distributions vm_map_t map, 422*8d741a5dSApple OSS Distributions vm_map_offset_ut start_u, 423*8d741a5dSApple OSS Distributions vm_map_offset_ut end_u, 424*8d741a5dSApple OSS Distributions boolean_t user_wire); 425*8d741a5dSApple OSS Distributions 426*8d741a5dSApple OSS Distributions 427*8d741a5dSApple OSS Distributions #if XNU_PLATFORM_MacOSX 428*8d741a5dSApple OSS Distributions 429*8d741a5dSApple OSS Distributions /*! 430*8d741a5dSApple OSS Distributions * @function vm_map_wire_and_extract() 431*8d741a5dSApple OSS Distributions * 432*8d741a5dSApple OSS Distributions * @brief 433*8d741a5dSApple OSS Distributions * Sets the pageability of the specified page in the target map, 434*8d741a5dSApple OSS Distributions * and returns the resulting physical page number for it. 435*8d741a5dSApple OSS Distributions * 436*8d741a5dSApple OSS Distributions * @discussion 437*8d741a5dSApple OSS Distributions * This function should not be called by kernel extensions and is only here 438*8d741a5dSApple OSS Distributions * for backward compatibility of macOS kernels. 439*8d741a5dSApple OSS Distributions * 440*8d741a5dSApple OSS Distributions * 441*8d741a5dSApple OSS Distributions * @param map the target VM map (the call will recurse in submaps). 442*8d741a5dSApple OSS Distributions * @param address the address of the page to wire 443*8d741a5dSApple OSS Distributions * @param access_type the access for which to perform the wiring 444*8d741a5dSApple OSS Distributions * @param user_wire whether the wiring is on behalf of userspace. 445*8d741a5dSApple OSS Distributions * userspace wiring is equivalent to an mlock() call from 446*8d741a5dSApple OSS Distributions * userspace and will be undone at process death unlike 447*8d741a5dSApple OSS Distributions * kernel wiring which must always be undone explicitly. 448*8d741a5dSApple OSS Distributions * @param physpage_p a pointer filled with the page number for the wired down 449*8d741a5dSApple OSS Distributions * physical page, or 0 in case of failure. 450*8d741a5dSApple OSS Distributions * 451*8d741a5dSApple OSS Distributions * @returns @c KERN_SUCCESS or an error denoting the reason for 452*8d741a5dSApple OSS Distributions * failure. 453*8d741a5dSApple OSS Distributions */ 454*8d741a5dSApple OSS Distributions extern kern_return_t vm_map_wire_and_extract( 455*8d741a5dSApple OSS Distributions vm_map_t map, 456*8d741a5dSApple OSS Distributions vm_map_offset_ut address, 457*8d741a5dSApple OSS Distributions vm_prot_ut access_type, 458*8d741a5dSApple OSS Distributions boolean_t user_wire, 459*8d741a5dSApple OSS Distributions ppnum_t *physpage_p); 460*8d741a5dSApple OSS Distributions 461*8d741a5dSApple OSS Distributions #endif /* XNU_PLATFORM_MacOSX */ 462*8d741a5dSApple OSS Distributions 463*8d741a5dSApple OSS Distributions #pragma mark - vm map copy 464*8d741a5dSApple OSS Distributions 465*8d741a5dSApple OSS Distributions /*! 466*8d741a5dSApple OSS Distributions * @const VM_MAP_COPY_OVERWRITE_OPTIMIZATION_THRESHOLD_PAGES 467*8d741a5dSApple OSS Distributions * Number of pages under which the VM will copy by content rather 468*8d741a5dSApple OSS Distributions * than trying to do a copy-on-write mapping to form a vm_map_copy_t. 469*8d741a5dSApple OSS Distributions * 470*8d741a5dSApple OSS Distributions * Note: this constant has unfortunately been exposed historically 471*8d741a5dSApple OSS Distributions * but should not be considered ABI. 472*8d741a5dSApple OSS Distributions */ 473*8d741a5dSApple OSS Distributions #define VM_MAP_COPY_OVERWRITE_OPTIMIZATION_THRESHOLD_PAGES (3) 474*8d741a5dSApple OSS Distributions 475*8d741a5dSApple OSS Distributions 476*8d741a5dSApple OSS Distributions /*! 477*8d741a5dSApple OSS Distributions * @function vm_map_copyin() 478*8d741a5dSApple OSS Distributions * 479*8d741a5dSApple OSS Distributions * @brief 480*8d741a5dSApple OSS Distributions * Copy the specified region from the source address space. 481*8d741a5dSApple OSS Distributions * 482*8d741a5dSApple OSS Distributions * @description 483*8d741a5dSApple OSS Distributions * The source map should not be locked on entry. 484*8d741a5dSApple OSS Distributions * 485*8d741a5dSApple OSS Distributions * 486*8d741a5dSApple OSS Distributions * @param [in] src_map the source address space to copy from. 487*8d741a5dSApple OSS Distributions * @param [in] src_addr the address at which to start copying memory. 488*8d741a5dSApple OSS Distributions * @param [in] len the size of the region to copy. 489*8d741a5dSApple OSS Distributions * @param [in] src_destroy whether the copy also removes the region 490*8d741a5dSApple OSS Distributions * from the source address space. 491*8d741a5dSApple OSS Distributions * @param [out] copy_result the out parameter, to be filled with the created 492*8d741a5dSApple OSS Distributions * vm map copy on success. 493*8d741a5dSApple OSS Distributions * @returns 494*8d741a5dSApple OSS Distributions * - KERN_SUCCESS the operation was successful 495*8d741a5dSApple OSS Distributions * - KERN_INVALID_ARGUMENT 496*8d741a5dSApple OSS Distributions * @c (src_addr, len) didn't form a valid region 497*8d741a5dSApple OSS Distributions * - KERN_RESOURCE_SHORTAGE 498*8d741a5dSApple OSS Distributions * the kernel was out of physical memory to perform 499*8d741a5dSApple OSS Distributions * the operation. 500*8d741a5dSApple OSS Distributions * - KERN_INVALID_ADDRESS 501*8d741a5dSApple OSS Distributions * some address in the range wasn't mapped 502*8d741a5dSApple OSS Distributions * - KERN_PROTECTION_FAILURE 503*8d741a5dSApple OSS Distributions * the region isn't readable (it doesn't have 504*8d741a5dSApple OSS Distributions * @c VM_PROT_READ set). 505*8d741a5dSApple OSS Distributions * - KERN_PROTECTION_FAILURE 506*8d741a5dSApple OSS Distributions * the memory range contains a physically contiguous 507*8d741a5dSApple OSS Distributions * object 508*8d741a5dSApple OSS Distributions * - KERN_MEMORY_ERROR faulting failed. 509*8d741a5dSApple OSS Distributions * - MACH_SEND_INTERRUPTED 510*8d741a5dSApple OSS Distributions * a signal was received during the copy 511*8d741a5dSApple OSS Distributions * 512*8d741a5dSApple OSS Distributions */ 513*8d741a5dSApple OSS Distributions extern kern_return_t vm_map_copyin( 514*8d741a5dSApple OSS Distributions vm_map_t src_map, 515*8d741a5dSApple OSS Distributions vm_map_address_ut src_addr, 516*8d741a5dSApple OSS Distributions vm_map_size_ut len, 517*8d741a5dSApple OSS Distributions boolean_t src_destroy, 518*8d741a5dSApple OSS Distributions vm_map_copy_t *copy_result); /* OUT */ 519*8d741a5dSApple OSS Distributions 520*8d741a5dSApple OSS Distributions 521*8d741a5dSApple OSS Distributions /*! 522*8d741a5dSApple OSS Distributions * @function vm_map_copyout() 523*8d741a5dSApple OSS Distributions * 524*8d741a5dSApple OSS Distributions * @brief 525*8d741a5dSApple OSS Distributions * Place a VM map copy made with @c vm_map_copyin() into a destination map. 526*8d741a5dSApple OSS Distributions * 527*8d741a5dSApple OSS Distributions * @description 528*8d741a5dSApple OSS Distributions * The specified VM map copy is consumed on success, 529*8d741a5dSApple OSS Distributions * otherwise the caller is responsible for it. 530*8d741a5dSApple OSS Distributions * @see @c vm_map_copy_discard below. 531*8d741a5dSApple OSS Distributions * 532*8d741a5dSApple OSS Distributions * @param [in] dst_map the destination address space to insert into. 533*8d741a5dSApple OSS Distributions * @param [out] addr the address at which the data was inserted. 534*8d741a5dSApple OSS Distributions * @param [in] copy the VM map copy to place. 535*8d741a5dSApple OSS Distributions * @returns 536*8d741a5dSApple OSS Distributions * - KERN_SUCCESS the operation succeeded, @c copy has been consumed. 537*8d741a5dSApple OSS Distributions * - KERN_NO_SPACE the destination map was out of address space. 538*8d741a5dSApple OSS Distributions * - KERN_NOT_SUPPORTED the vm map copy can't be mapped in this address space. 539*8d741a5dSApple OSS Distributions * This can for example happen for certain cases of a VM 540*8d741a5dSApple OSS Distributions * map copy using a 4k page size into a space that is 16k 541*8d741a5dSApple OSS Distributions * aligned, requiring different physical pages within the 542*8d741a5dSApple OSS Distributions * same 16k page boundary. 543*8d741a5dSApple OSS Distributions */ 544*8d741a5dSApple OSS Distributions extern kern_return_t vm_map_copyout( 545*8d741a5dSApple OSS Distributions vm_map_t dst_map, 546*8d741a5dSApple OSS Distributions vm_map_address_t *addr, /* OUT */ 547*8d741a5dSApple OSS Distributions vm_map_copy_t copy); 548*8d741a5dSApple OSS Distributions 549*8d741a5dSApple OSS Distributions /*! 550*8d741a5dSApple OSS Distributions * @function vm_map_copy_discard() 551*8d741a5dSApple OSS Distributions * 552*8d741a5dSApple OSS Distributions * @brief 553*8d741a5dSApple OSS Distributions * Dispose of a @c vm_map_copy_t object made by @c vm_map_copyin(). 554*8d741a5dSApple OSS Distributions * 555*8d741a5dSApple OSS Distributions * @description 556*8d741a5dSApple OSS Distributions * VM map copies are typically placed in an address space using 557*8d741a5dSApple OSS Distributions * @c vm_map_copyout(), but when that has not happened, this function must be 558*8d741a5dSApple OSS Distributions * used to dispose of it. 559*8d741a5dSApple OSS Distributions * 560*8d741a5dSApple OSS Distributions * @param copy the VM map copy object to dispose of. 561*8d741a5dSApple OSS Distributions */ 562*8d741a5dSApple OSS Distributions extern void vm_map_copy_discard( 563*8d741a5dSApple OSS Distributions vm_map_copy_t copy); 564*8d741a5dSApple OSS Distributions 565*8d741a5dSApple OSS Distributions #endif /* KERNEL_PRIVATE */ 566*8d741a5dSApple OSS Distributions 567*8d741a5dSApple OSS Distributions __END_DECLS 568*8d741a5dSApple OSS Distributions 569*8d741a5dSApple OSS Distributions #endif /* _VM_VM_MAP_H_ */ 570