[project @ 2004-09-13 09:19:16 by dons]
[ghc-hetmet.git] / ghc / rts / Adjustor.c
index 44fbcf2..bf1002d 100644 (file)
@@ -46,6 +46,11 @@ Haskell side.
 #include <windows.h>
 #endif
 
+#if defined(openbsd_TARGET_OS)
+#include <unistd.h>
+#include <sys/mman.h>
+#endif
+
 /* Heavily arch-specific, I'm afraid.. */
 
 typedef enum { 
@@ -79,6 +84,15 @@ execPage (void* addr, pageMode mode)
        barf("execPage: failed to protect 0x%p; error=%lu; old protection: %lu\n", addr, rc, dwOldProtect);
     }
 #else
+
+#if defined(openbsd_TARGET_OS)
+    /* malloc memory isn't executable by default on OpenBSD */
+    unsigned long pagesize = sysconf(_SC_PAGESIZE);
+    unsigned long round    = (unsigned long)addr & (pagesize - 1);
+    if (mprotect(addr - round, pagesize, PROT_EXEC|PROT_READ|PROT_WRITE) == -1)
+        barf("execPage: failed to protect 0x%p\n", addr);
+#endif
+
     (void)addr;   (void)mode;   /* keep gcc -Wall happy */
 #endif
 }
@@ -501,7 +515,7 @@ freeHaskellFunctionPtr(void* ptr)
 #if defined(i386_TARGET_ARCH)
  if ( *(unsigned char*)ptr != 0x68 &&
       *(unsigned char*)ptr != 0x58 ) {
-   prog_belch("freeHaskellFunctionPtr: not for me, guv! %p\n", ptr);
+   errorBelch("freeHaskellFunctionPtr: not for me, guv! %p\n", ptr);
    return;
  }
 
@@ -513,7 +527,7 @@ freeHaskellFunctionPtr(void* ptr)
  }    
 #elif defined(sparc_TARGET_ARCH)
  if ( *(unsigned long*)ptr != 0x9C23A008UL ) {
-   prog_belch("freeHaskellFunctionPtr: not for me, guv! %p\n", ptr);
+   errorBelch("freeHaskellFunctionPtr: not for me, guv! %p\n", ptr);
    return;
  }
 
@@ -521,7 +535,7 @@ freeHaskellFunctionPtr(void* ptr)
  freeStablePtr(*((StgStablePtr*)((unsigned long*)ptr + 11)));
 #elif defined(alpha_TARGET_ARCH)
  if ( *(StgWord64*)ptr != 0xa77b0018a61b0010L ) {
-   prog_belch("freeHaskellFunctionPtr: not for me, guv! %p\n", ptr);
+   errorBelch("freeHaskellFunctionPtr: not for me, guv! %p\n", ptr);
    return;
  }
 
@@ -529,7 +543,7 @@ freeHaskellFunctionPtr(void* ptr)
  freeStablePtr(*((StgStablePtr*)((unsigned char*)ptr + 0x10)));
 #elif defined(powerpc_TARGET_ARCH)
  if ( *(StgWord*)ptr != 0x7d0a4378 ) {
-   prog_belch("freeHaskellFunctionPtr: not for me, guv! %p\n", ptr);
+   errorBelch("freeHaskellFunctionPtr: not for me, guv! %p\n", ptr);
    return;
  }
  freeStablePtr(*((StgStablePtr*)((unsigned char*)ptr + 4*12)));
@@ -538,7 +552,7 @@ freeHaskellFunctionPtr(void* ptr)
  StgWord64 *code = (StgWord64 *)(fdesc+1);
 
  if (fdesc->ip != (StgWord64)code) {
-   prog_belch("freeHaskellFunctionPtr: not for me, guv! %p\n", ptr);
+   errorBelch("freeHaskellFunctionPtr: not for me, guv! %p\n", ptr);
    return;
  }
  freeStablePtr((StgStablePtr)code[16]);