1 /* 2 * vm_alloc.h - Wrapper to various virtual memory allocation schemes 3 * (supports mmap, vm_allocate or fallbacks to malloc) 4 * 5 * Basilisk II (C) 1997-2005 Christian Bauer 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License as published by 9 * the Free Software Foundation; either version 2 of the License, or 10 * (at your option) any later version. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program; if not, write to the Free Software 19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 20 */ 21 22 // TODO: Win32 VM ? 23 #ifndef VM_ALLOC_H 24 #define VM_ALLOC_H 25 26 #ifdef HAVE_CONFIG_H 27 # include "config.h" 28 #endif 29 #ifdef HAVE_UNISTD_H 30 # include <unistd.h> 31 #endif 32 #ifdef HAVE_SYS_MMAN_H 33 # include <sys/mman.h> 34 #endif 35 36 #ifdef HAVE_MACH_VM 37 extern "C" { 38 # include <mach/mach.h> 39 } 40 #endif 41 42 /* Return value of `vm_acquire' in case of an error. */ 43 #ifdef HAVE_MACH_VM 44 #define VM_MAP_FAILED ((void *)-1) 45 #else 46 #ifdef HAVE_MMAP_VM 47 #define VM_MAP_FAILED ((void *)-1) 48 #else 49 #define VM_MAP_FAILED 0 50 #endif 51 #endif 52 53 /* Mapping options. */ 54 #define VM_MAP_SHARED 0x01 55 #define VM_MAP_PRIVATE 0x02 56 #define VM_MAP_FIXED 0x04 57 #define VM_MAP_32BIT 0x08 58 59 /* Default mapping options. */ 60 #define VM_MAP_DEFAULT (VM_MAP_PRIVATE) 61 62 /* Protection bits. */ 63 #ifdef HAVE_MACH_VM 64 #define VM_PAGE_NOACCESS VM_PROT_NONE 65 #define VM_PAGE_READ VM_PROT_READ 66 #define VM_PAGE_WRITE VM_PROT_WRITE 67 #define VM_PAGE_EXECUTE VM_PROT_EXECUTE 68 #else 69 #ifdef HAVE_MMAP_VM 70 #define VM_PAGE_NOACCESS PROT_NONE 71 #define VM_PAGE_READ PROT_READ 72 #define VM_PAGE_WRITE PROT_WRITE 73 #define VM_PAGE_EXECUTE PROT_EXEC 74 #else 75 #define VM_PAGE_NOACCESS 0x0 76 #define VM_PAGE_READ 0x1 77 #define VM_PAGE_WRITE 0x2 78 #define VM_PAGE_EXECUTE 0x4 79 #endif 80 #endif 81 82 /* Default protection bits. */ 83 #define VM_PAGE_DEFAULT (VM_PAGE_READ | VM_PAGE_WRITE) 84 85 /* Initialize the VM system. Returns 0 if successful, -1 for errors. */ 86 87 extern int vm_init(void); 88 89 /* Deallocate all internal data used to wrap virtual memory allocators. */ 90 91 extern void vm_exit(void); 92 93 /* Allocate zero-filled memory of SIZE bytes. The mapping is private 94 and default protection bits are read / write. The return value 95 is the actual mapping address chosen or VM_MAP_FAILED for errors. */ 96 97 extern void * vm_acquire(size_t size, int options = VM_MAP_DEFAULT); 98 99 /* Allocate zero-filled memory at exactly ADDR (which must be page-aligned). */ 100 101 extern bool vm_acquire_fixed(void * addr, size_t size, int options = VM_MAP_DEFAULT); 102 103 /* Deallocate any mapping for the region starting at ADDR and extending 104 LEN bytes. Returns 0 if successful, -1 on errors. */ 105 106 extern int vm_release(void * addr, size_t size); 107 108 /* Change the memory protection of the region starting at ADDR and 109 extending LEN bytes to PROT. Returns 0 if successful, -1 for errors. */ 110 111 extern int vm_protect(void * addr, size_t size, int prot); 112 113 /* 114 * probe for a suitable value of fixed_memory_offset 115 */ 116 void vm_probe_fixed(void); 117 void vm_probe_fixed_hint(void); 118 119 #endif /* VM_ALLOC_H */ 120