projects
/
ghc-hetmet.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
[project @ 1998-11-26 09:17:22 by sof]
[ghc-hetmet.git]
/
ghc
/
runtime
/
storage
/
mprotect.lc
diff --git
a/ghc/runtime/storage/mprotect.lc
b/ghc/runtime/storage/mprotect.lc
index
dabf3c4
..
1cef887
100644
(file)
--- a/
ghc/runtime/storage/mprotect.lc
+++ b/
ghc/runtime/storage/mprotect.lc
@@
-7,7
+7,7
@@
%* *
%************************************************************************
%* *
%************************************************************************
-Is @mprotect@ POSIX now?
+Is @mprotect@ POSIX now? [Yup, POSIX.4 -- sof]
\begin{code}
#if STACK_CHECK_BY_PAGE_FAULT
\begin{code}
#if STACK_CHECK_BY_PAGE_FAULT
@@
-45,23
+45,35
@@
Is @mprotect@ POSIX now?
# endif
#if defined(sunos4_TARGET_OS)
# endif
#if defined(sunos4_TARGET_OS)
-extern int getpagesize PROTO((void));
-extern int mprotect PROTO((caddr_t, size_t, int));
+int getpagesize PROTO((void));
+int mprotect PROTO((caddr_t, size_t, int));
#endif
#endif
+#if defined(aix_TARGET_OS)
+/* PROT_NONE doesn't work on aix, PROT_READ works and should suit the job */
+#define PROT_NONE PROT_READ
+#endif
+
/* Needed for FreeBSD (SDM, 96/03) */
#ifndef PROT_NONE
#define PROT_NONE 0
#endif
/* Needed for FreeBSD (SDM, 96/03) */
#ifndef PROT_NONE
#define PROT_NONE 0
#endif
+/* For VirtualProtect() and its flags */
+#if defined(cygwin32_TARGET_OS)
+#include <windows.h>
+#endif
+
void
void
-unmapMiddleStackPage(addr_, size)
-char * /*caddr_t*/ addr_;
+unmapMiddleStackPage(addr, size)
+char * /*caddr_t*/ addr;
int size;
{
int pagesize = GETPAGESIZE();
int size;
{
int pagesize = GETPAGESIZE();
- caddr_t addr = addr_;
- caddr_t middle = (caddr_t) (((W_) (addr + size / 2)) / pagesize * pagesize);
+ char * middle = (char *) (((W_) (addr + size / 2)) / pagesize * pagesize);
+#if defined(cygwin32_TARGET_OS)
+ unsigned int old_prot;
+#endif
# ifdef STK_CHK_DEBUG
fprintf(stderr, "pagesize: %x\nstack start: %08lx\nstack size: %08lx\nstack middle: %08lx\n",
# ifdef STK_CHK_DEBUG
fprintf(stderr, "pagesize: %x\nstack start: %08lx\nstack size: %08lx\nstack middle: %08lx\n",
@@
-72,7
+84,14
@@
int size;
fprintf(stderr, "Stack too small; stack overflow trap disabled.\n");
return;
}
fprintf(stderr, "Stack too small; stack overflow trap disabled.\n");
return;
}
+/* mprotect() is broken in beta18, so we use the native Win32
+ call instead
+*/
+#if defined(cygwin32_TARGET_OS)
+ if (VirtualProtect(middle, pagesize, PAGE_NOACCESS, &old_prot) == 0) {
+#else
if (mprotect(middle, pagesize, PROT_NONE) == -1) {
if (mprotect(middle, pagesize, PROT_NONE) == -1) {
+#endif
perror("mprotect");
EXIT(EXIT_FAILURE);
}
perror("mprotect");
EXIT(EXIT_FAILURE);
}