From 80498a8a061475f74b2c093dfe97d454387581b8 Mon Sep 17 00:00:00 2001 From: wolfgang Date: Sun, 27 Oct 2002 21:46:27 +0000 Subject: [PATCH] [project @ 2002-10-27 21:46:27 by wolfgang] For Mac OS X, use the underlying Mach Microkernel calls instead of mmap. Darwin's mmap doesn't honor the passed-in address without MAP_FIXED, and MAP_FIXED replaces all existing mappings, so it can't be used. --- ghc/rts/MBlock.c | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/ghc/rts/MBlock.c b/ghc/rts/MBlock.c index 7ada8e9..5f6cfb7 100644 --- a/ghc/rts/MBlock.c +++ b/ghc/rts/MBlock.c @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: MBlock.c,v 1.33 2002/10/25 12:56:34 simonmar Exp $ + * $Id: MBlock.c,v 1.34 2002/10/27 21:46:27 wolfgang Exp $ * * (c) The GHC Team 1998-1999 * @@ -38,6 +38,9 @@ #if HAVE_WINDOWS_H #include #endif +#if darwin_TARGET_OS +#include +#endif #include @@ -102,8 +105,25 @@ my_mmap (void *addr, int size) ret = mmap(addr, size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); #elif darwin_TARGET_OS - ret = mmap(addr, size, PROT_READ | PROT_WRITE, - MAP_FIXED | MAP_ANON | MAP_PRIVATE, -1, 0); + // Without MAP_FIXED, Apple's mmap ignores addr. + // With MAP_FIXED, it overwrites already mapped regions, whic + // mmap(0, ... MAP_FIXED ...) is worst of all: It unmaps the program text + // and replaces it with zeroes, causing instant death. + // This behaviour seems to be conformant with IEEE Std 1003.1-2001. + // Let's just use the underlying Mach Microkernel calls directly, + // they're much nicer. + + kern_return_t err; + ret = addr; + if(addr) // try to allocate at adress + err = vm_allocate(mach_task_self(),(vm_address_t*) &ret, size, FALSE); + if(!addr || err) // try to allocate anywhere + err = vm_allocate(mach_task_self(),(vm_address_t*) &ret, size, TRUE); + + if(err) + ret = (void*) -1; + else + vm_protect(mach_task_self(),ret,size,FALSE,VM_PROT_READ|VM_PROT_WRITE); #else ret = mmap(addr, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); -- 1.7.10.4