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 Software.Distribution@CS.CMU.EDU 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: mach/vm_param.h 60 * Author: Avadis Tevanian, Jr., Michael Wayne Young 61 * Date: 1985 62 * 63 * Machine independent virtual memory parameters. 64 * 65 */ 66 67#ifndef _MACH_VM_PARAM_H_ 68#define _MACH_VM_PARAM_H_ 69 70#include <mach/machine/vm_param.h> 71 72#ifdef KERNEL 73 74#ifndef ASSEMBLER 75#include <mach/vm_types.h> 76#endif /* ASSEMBLER */ 77 78/* 79 * The machine independent pages are refered to as PAGES. A page 80 * is some number of hardware pages, depending on the target machine. 81 */ 82 83#ifndef ASSEMBLER 84 85#define PAGE_SIZE_64 (unsigned long long)PAGE_SIZE /* pagesize in addr units */ 86#define PAGE_MASK_64 (unsigned long long)PAGE_MASK /* mask for off in page */ 87 88/* 89 * Convert addresses to pages and vice versa. No rounding is used. 90 * The atop_32 and ptoa_32 macros should not be use on 64 bit types. 91 * The round_page_64 and trunc_page_64 macros should be used instead. 92 */ 93 94#define atop_32(x) ((uint32_t)(x) >> PAGE_SHIFT) 95#define ptoa_32(x) ((uint32_t)(x) << PAGE_SHIFT) 96#define atop_64(x) ((uint64_t)(x) >> PAGE_SHIFT) 97#define ptoa_64(x) ((uint64_t)(x) << PAGE_SHIFT) 98 99#define atop_kernel(x) ((vm_address_t)(x) >> PAGE_SHIFT) 100#define ptoa_kernel(x) ((vm_address_t)(x) << PAGE_SHIFT) 101 102/* 103 * While the following block is enabled, the legacy atop and ptoa 104 * macros will behave correctly. If not, they will generate 105 * invalid lvalue errors. 106 */ 107 108#if 1 109#define atop(x) ((vm_address_t)(x) >> PAGE_SHIFT) 110#define ptoa(x) ((vm_address_t)(x) << PAGE_SHIFT) 111#else 112#define atop(x) (0UL = 0) 113#define ptoa(x) (0UL = 0) 114#endif 115 116/* 117 * Page-size rounding macros for the Public fixed-width VM types. 118 */ 119#define mach_vm_round_page(x) (((mach_vm_offset_t)(x) + PAGE_MASK) & ~((signed)PAGE_MASK)) 120#define mach_vm_trunc_page(x) ((mach_vm_offset_t)(x) & ~((signed)PAGE_MASK)) 121 122#define memory_object_round_page(x) (((memory_object_offset_t)(x) + PAGE_MASK) & ~((signed)PAGE_MASK)) 123#define memory_object_trunc_page(x) ((memory_object_offset_t)(x) & ~((signed)PAGE_MASK)) 124 125/* 126 * Rounding macros for the legacy (scalable with the current task's 127 * address space size) VM types. 128 */ 129 130#define round_page(x) (((vm_offset_t)(x) + PAGE_MASK) & ~((vm_offset_t)PAGE_MASK)) 131#define trunc_page(x) ((vm_offset_t)(x) & ~((vm_offset_t)PAGE_MASK)) 132 133/* 134 * Round off or truncate to the nearest page. These will work 135 * for either addresses or counts. (i.e. 1 byte rounds to 1 page 136 * bytes. The round_page_32 and trunc_page_32 macros should not be 137 * use on 64 bit types. The round_page_64 and trunc_page_64 macros 138 * should be used instead. 139 * 140 * These should only be used in the rare case the size of the address 141 * or length is hard-coded as 32 or 64 bit. Otherwise, the macros 142 * associated with the specific VM type should be used. 143 */ 144 145#define round_page_32(x) (((uint32_t)(x) + PAGE_MASK) & ~((uint32_t)PAGE_MASK)) 146#define trunc_page_32(x) ((uint32_t)(x) & ~((uint32_t)PAGE_MASK)) 147#define round_page_64(x) (((uint64_t)(x) + PAGE_MASK_64) & ~((uint64_t)PAGE_MASK_64)) 148#define trunc_page_64(x) ((uint64_t)(x) & ~((uint64_t)PAGE_MASK_64)) 149 150/* 151 * Enable the following block to find uses of xxx_32 macros that should 152 * be xxx_64. These macros only work in C code, not C++. The resulting 153 * binaries are not functional. Look for invalid lvalue errors in 154 * the compiler output. 155 * 156 * Enabling the following block will also find use of the xxx_64 macros 157 * that have been passed pointers. The parameters should be case to an 158 * unsigned long type first. Look for invalid operands to binary + error 159 * in the compiler output. 160 */ 161 162#if 0 163#undef atop_32 164#undef ptoa_32 165#undef round_page_32 166#undef trunc_page_32 167#undef atop_64 168#undef ptoa_64 169#undef round_page_64 170#undef trunc_page_64 171 172#ifndef __cplusplus 173 174#define atop_32(x) \ 175 (__builtin_choose_expr (sizeof(x) != sizeof(uint64_t), \ 176 (*(long *)0), \ 177 (0UL)) = 0) 178 179#define ptoa_32(x) \ 180 (__builtin_choose_expr (sizeof(x) != sizeof(uint64_t), \ 181 (*(long *)0), \ 182 (0UL)) = 0) 183 184#define round_page_32(x) \ 185 (__builtin_choose_expr (sizeof(x) != sizeof(uint64_t), \ 186 (*(long *)0), \ 187 (0UL)) = 0) 188 189#define trunc_page_32(x) \ 190 (__builtin_choose_expr (sizeof(x) != sizeof(uint64_t), \ 191 (*(long *)0), \ 192 (0UL)) = 0) 193#else 194 195#define atop_32(x) (0) 196#define ptoa_32(x) (0) 197#define round_page_32(x) (0) 198#define trunc_page_32(x) (0) 199 200#endif /* ! __cplusplus */ 201 202#define atop_64(x) ((uint64_t)((x) + (uint8_t *)0)) 203#define ptoa_64(x) ((uint64_t)((x) + (uint8_t *)0)) 204#define round_page_64(x) ((uint64_t)((x) + (uint8_t *)0)) 205#define trunc_page_64(x) ((uint64_t)((x) + (uint8_t *)0)) 206 207#endif 208 209/* 210 * Determine whether an address is page-aligned, or a count is 211 * an exact page multiple. 212 */ 213 214#define page_aligned(x) (((x) & PAGE_MASK) == 0) 215 216extern vm_size_t mem_size; /* 32-bit size of memory - limited by maxmem - deprecated */ 217extern uint64_t max_mem; /* 64-bit size of memory - limited by maxmem */ 218 219/* 220 * The default pager does not handle 64-bit offsets inside its objects, 221 * so this limits the size of anonymous memory objects to 4GB minus 1 page. 222 * When we need to allocate a chunk of anonymous memory over that size, 223 * we have to allocate more than one chunk. 224 */ 225#define ANON_MAX_SIZE 0xFFFFF000ULL 226/* 227 * Work-around for <rdar://problem/6626493> 228 * Break large anonymous memory areas into 128MB chunks to alleviate 229 * the cost of copying when copy-on-write is not possible because a small 230 * portion of it being wired. 231 */ 232#define ANON_CHUNK_SIZE (128ULL * 1024 * 1024) /* 128MB */ 233 234#ifdef XNU_KERNEL_PRIVATE 235 236extern uint64_t mem_actual; /* 64-bit size of memory - not limited by maxmem */ 237extern uint64_t sane_size; /* Memory size to use for defaults calculations */ 238extern addr64_t vm_last_addr; /* Highest kernel virtual address known to the VM system */ 239 240extern const vm_offset_t vm_min_kernel_address; 241extern const vm_offset_t vm_max_kernel_address; 242 243extern vm_offset_t vm_kernel_stext; 244extern vm_offset_t vm_kernel_etext; 245extern vm_offset_t vm_kernel_base; 246extern vm_offset_t vm_kernel_top; 247extern vm_offset_t vm_kernel_slide; 248extern vm_offset_t vm_kernel_addrperm; 249 250#define VM_KERNEL_IS_SLID(_o) \ 251 (((vm_offset_t)(_o) >= vm_kernel_base) && \ 252 ((vm_offset_t)(_o) < vm_kernel_top)) 253/* 254 * VM_KERNEL_IS_KEXT is platform-specific, defined in <mach/machine/vm_param.h>. 255 * Set default if undefined. 256 */ 257#ifndef VM_KERNEL_IS_KEXT 258#define VM_KERNEL_IS_KEXT(_o) (FALSE) 259#endif 260#define VM_KERNEL_UNSLIDE(_v) \ 261 ((VM_KERNEL_IS_SLID(_v) || \ 262 VM_KERNEL_IS_KEXT(_v)) ? \ 263 (vm_offset_t)(_v) - vm_kernel_slide : \ 264 (vm_offset_t)(_v)) 265#define VM_KERNEL_SLIDE(_u) \ 266 ((vm_offset_t)(_u) + vm_kernel_slide) 267 268#define VM_KERNEL_ADDRPERM(_v) \ 269 (((vm_offset_t)(_v) == 0) ? \ 270 (vm_offset_t)(0) : \ 271 (vm_offset_t)(_v) + vm_kernel_addrperm) 272 273#endif /* XNU_KERNEL_PRIVATE */ 274 275extern vm_size_t page_size; 276extern vm_size_t page_mask; 277extern int page_shift; 278 279/* We need a way to get rid of compiler warnings when we cast from */ 280/* a 64 bit value to an address (which may be 32 bits or 64-bits). */ 281/* An intptr_t is used convert the value to the right precision, and */ 282/* then to an address. This macro is also used to convert addresses */ 283/* to 32-bit integers, which is a hard failure for a 64-bit kernel */ 284#include <stdint.h> 285#ifndef __CAST_DOWN_CHECK 286#define __CAST_DOWN_CHECK 287 288#define CAST_DOWN( type, addr ) \ 289 ( ((type)((uintptr_t) (addr)/(sizeof(type) < sizeof(uintptr_t) ? 0 : 1))) ) 290 291#define CAST_DOWN_EXPLICIT( type, addr ) ( ((type)((uintptr_t) (addr))) ) 292 293#endif /* __CAST_DOWN_CHECK */ 294 295#endif /* ASSEMBLER */ 296 297#endif /* KERNEL */ 298 299#endif /* _MACH_VM_PARAM_H_ */ 300