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