From 5630bf33a46d9bf47e07909bc62a785440f1acf7 Mon Sep 17 00:00:00 2001 From: Bernhard Urban Date: Mon, 30 Apr 2012 10:16:37 +0200 Subject: [PATCH] codegen: explicit allocate codebuffer with proper permissions we had weird issues, when upgrading ghc: http://stackoverflow.com/questions/10341943/ghc-segmentation-fault-under-strange-conditions therefore, this fix: use `mprotect' to set the codebuffer explicitly executable. `mprotect' requires aligned memory, so we use `memalign'. --- Harpy/CodeGenMonad.hs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Harpy/CodeGenMonad.hs b/Harpy/CodeGenMonad.hs index 20e81dd..0c0a281 100644 --- a/Harpy/CodeGenMonad.hs +++ b/Harpy/CodeGenMonad.hs @@ -86,6 +86,7 @@ import Numeric import Data.List import qualified Data.Map as Map import Foreign +import Foreign.C.Types import System.IO import Control.Monad.Trans @@ -225,6 +226,12 @@ runCodeGen :: CodeGen e s a -> e -> s -> IO (s, Either ErrMsg a) runCodeGen cg uenv ustate = runCodeGenWithConfig cg uenv ustate defaultCodeGenConfig +foreign import ccall "static stdlib.h" + memalign :: CUInt -> CUInt -> IO (Ptr a) + +foreign import ccall "static sys/mman.h" + mprotect :: CUInt -> CUInt -> Int -> IO Int + -- | Like 'runCodeGen', but allows more control over the code -- generation process. In addition to a code generator and a user -- environment and state, a code generation configuration must be @@ -234,7 +241,10 @@ runCodeGenWithConfig :: CodeGen e s a -> e -> s -> CodeGenConfig -> IO (s, Eithe runCodeGenWithConfig (CodeGen cg) uenv ustate conf = do (buf, sze) <- case customCodeBuffer conf of Nothing -> do let initSize = codeBufferSize conf - arr <- mallocBytes initSize + let size = fromIntegral initSize + arr <- memalign 0x1000 size + -- 0x7 = PROT_{READ,WRITE,EXEC} + _ <- mprotect (fromIntegral $ ptrToIntPtr arr) size 0x7 return (arr, initSize) Just (buf, sze) -> return (buf, sze) let env = CodeGenEnv {tailContext = True} -- 2.25.1