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