1 /* -----------------------------------------------------------------------------
3 * (c) The University of Glasgow 2006
5 * OS-specific memory management
7 * ---------------------------------------------------------------------------*/
13 #include <sys/types.h>
16 lnat getPageSize (void)
18 static lnat pageSize = 0;
23 ret = sysconf(_SC_PAGESIZE);
25 barf("getPageSize: cannot get page size");
31 void setExecutable (void *p, lnat len, rtsBool exec)
33 StgWord pageSize = getPageSize();
35 /* malloced memory isn't executable by default on OpenBSD */
36 StgWord mask = ~(pageSize - 1);
37 StgWord startOfFirstPage = ((StgWord)p ) & mask;
38 StgWord startOfLastPage = ((StgWord)p + len - 1) & mask;
39 StgWord size = startOfLastPage - startOfFirstPage + pageSize;
40 if (mprotect((void*)startOfFirstPage, (size_t)size,
41 (exec ? PROT_EXEC : 0) | PROT_READ | PROT_WRITE) != 0) {
42 barf("makeExecutable: failed to protect 0x%p\n", p);