[project @ 1996-01-08 20:28:12 by partain]
[ghc-hetmet.git] / ghc / runtime / storage / mprotect.lc
1 %
2 % (c) The AQUA Project, Glasgow University, 1995
3 %
4 %************************************************************************
5 %*                                                                      *
6 \section[mprotect.lc]{Memory Protection}
7 %*                                                                      *
8 %************************************************************************
9
10 Is @mprotect@ POSIX now?
11
12 \begin{code}
13
14 #if STACK_CHECK_BY_PAGE_FAULT
15
16 /* #define STK_CHK_DEBUG */
17
18 #include "rtsdefs.h"
19
20 # ifdef HAVE_SYS_TYPES_H
21 #  include <sys/types.h>
22 # endif
23
24 # ifdef HAVE_SYS_MMAN_H
25 #  include <sys/mman.h>
26 # endif
27
28 # if defined(_SC_PAGE_SIZE) && !defined(_SC_PAGESIZE)
29     /* Death to HP-UX.  What are standards for, anyway??? */
30 #  define _SC_PAGESIZE _SC_PAGE_SIZE
31 # endif
32
33 # if defined(_SC_PAGESIZE)
34 #  define GETPAGESIZE() sysconf(_SC_PAGESIZE)
35 # else
36 #  if defined(HAVE_GETPAGESIZE)
37 #   define GETPAGESIZE()    getpagesize()
38 #  else
39 #   error getpagesize
40 #  endif
41 # endif
42
43 #if defined(sunos4_TARGET_OS)
44 extern int getpagesize PROTO((void));
45 extern int mprotect PROTO((caddr_t, size_t, int));
46 #endif
47
48 void 
49 unmapMiddleStackPage(addr_, size)
50 char * /*caddr_t*/ addr_;
51 int size;
52 {
53     int pagesize = GETPAGESIZE();
54     caddr_t addr = addr_;
55     caddr_t middle = (caddr_t) (((W_) (addr + size / 2)) / pagesize * pagesize);
56
57 # ifdef STK_CHK_DEBUG
58     fprintf(stderr, "pagesize: %x\nstack start: %08lx\nstack size: %08lx\nstack middle: %08lx\n",
59       pagesize, addr, size, middle);
60 # endif
61
62     if (middle < addr || middle + pagesize > addr + size) {
63         fprintf(stderr, "Stack too small; stack overflow trap disabled.\n");
64         return;
65     }
66     if (mprotect(middle, pagesize, PROT_NONE) == -1) {
67         perror("mprotect");
68         exit(1);
69     }
70     if (install_segv_handler()) {
71         fprintf(stderr, "Can't install SIGSEGV handler for stack overflow check.\n");
72         EXIT(EXIT_FAILURE);
73     }
74 }
75
76 #endif /* STACK_CHECK_BY_PAGE_FAULT */
77
78 \end{code}