1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Replacement for sys/mman.h which factors out platform differences. 2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <sys/mman.h> 4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined(VGO_darwin) 6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# define MAP_ANONYMOUS MAP_ANON 7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif 8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <assert.h> 11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <unistd.h> 12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Map a page, then unmap it, then return that address. That 14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// guarantees to give an address which will fault when accessed, 15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// without making any assumptions about the layout of the address 16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// space. 17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown__attribute__((unused)) 19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void* get_unmapped_page(void) 20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void* ptr; 22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int r; 23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown long pagesz = sysconf(_SC_PAGE_SIZE); 24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown assert(pagesz == 4096 || pagesz == 65536); 25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ptr = mmap(0, pagesz, PROT_READ, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0); 26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown assert(ptr != (void*)-1); 27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown r = munmap(ptr, pagesz); 28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown assert(r == 0); 29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return ptr; 30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 32