avoid platform dependencies: my_uintptr_t ==> StgWord
[ghc-hetmet.git] / rts / posix / OSMem.c
1 /* -----------------------------------------------------------------------------
2  *
3  * (c) The University of Glasgow 2006
4  *
5  * OS-specific memory management
6  *
7  * ---------------------------------------------------------------------------*/
8
9 #include "Rts.h"
10 #include "OSMem.h"
11
12 #include <unistd.h>
13 #include <sys/types.h>
14 #include <sys/mman.h>
15
16 lnat getPageSize (void)
17 {
18     static lnat pageSize = 0;
19     if (pageSize) {
20         return pageSize;
21     } else {
22         long ret;
23         ret = sysconf(_SC_PAGESIZE);
24         if (ret == -1) {
25             barf("getPageSize: cannot get page size");
26         }
27         return ret;
28     }
29 }
30
31 void setExecutable (void *p, lnat len, rtsBool exec)
32 {
33     StgWord pageSize = getPageSize();
34
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);
43     }
44 }