19a55ee834027e19034e609f8f6bd29f32a95bf57njn// Replacement for sys/mman.h which factors out platform differences. 29a55ee834027e19034e609f8f6bd29f32a95bf57njn 39a55ee834027e19034e609f8f6bd29f32a95bf57njn#include <sys/mman.h> 49a55ee834027e19034e609f8f6bd29f32a95bf57njn 5f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#if defined(VGO_darwin) 6f76d27a697a7b0bf3b84490baf60623fc96a23afnjn# define MAP_ANONYMOUS MAP_ANON 7f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#endif 8f76d27a697a7b0bf3b84490baf60623fc96a23afnjn 99a55ee834027e19034e609f8f6bd29f32a95bf57njn 109a55ee834027e19034e609f8f6bd29f32a95bf57njn#include <assert.h> 119a55ee834027e19034e609f8f6bd29f32a95bf57njn#include <unistd.h> 129a55ee834027e19034e609f8f6bd29f32a95bf57njn 139a55ee834027e19034e609f8f6bd29f32a95bf57njn// Map a page, then unmap it, then return that address. That 149a55ee834027e19034e609f8f6bd29f32a95bf57njn// guarantees to give an address which will fault when accessed, 159a55ee834027e19034e609f8f6bd29f32a95bf57njn// without making any assumptions about the layout of the address 169a55ee834027e19034e609f8f6bd29f32a95bf57njn// space. 179a55ee834027e19034e609f8f6bd29f32a95bf57njn 189a55ee834027e19034e609f8f6bd29f32a95bf57njn__attribute__((unused)) 199a55ee834027e19034e609f8f6bd29f32a95bf57njnstatic void* get_unmapped_page(void) 209a55ee834027e19034e609f8f6bd29f32a95bf57njn{ 219a55ee834027e19034e609f8f6bd29f32a95bf57njn void* ptr; 229a55ee834027e19034e609f8f6bd29f32a95bf57njn int r; 239a55ee834027e19034e609f8f6bd29f32a95bf57njn long pagesz = sysconf(_SC_PAGE_SIZE); 24a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes assert(pagesz == 4096 || pagesz == 8192 || pagesz == 16384 || pagesz == 32768 25a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes || pagesz == 65536); 269a55ee834027e19034e609f8f6bd29f32a95bf57njn ptr = mmap(0, pagesz, PROT_READ, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0); 279a55ee834027e19034e609f8f6bd29f32a95bf57njn assert(ptr != (void*)-1); 289a55ee834027e19034e609f8f6bd29f32a95bf57njn r = munmap(ptr, pagesz); 299a55ee834027e19034e609f8f6bd29f32a95bf57njn assert(r == 0); 309a55ee834027e19034e609f8f6bd29f32a95bf57njn return ptr; 319a55ee834027e19034e609f8f6bd29f32a95bf57njn} 329a55ee834027e19034e609f8f6bd29f32a95bf57njn 33