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