Hey guys, Recent changes to malloc on OpenBSD mean that nhc98 builds now die with the "OS allocated a heap in high memory" error, as malloc is putting things above the 0x80000000 line. Switching the heap allocation to use mmap with a hint to allocate somewhere lower fixes it at least on x86/openbsd. The ghc testsuite runs, for example. The mmap code is stolen from MBlock.c in ghc. Any options on this? Is it reasonable? (I'd like to use it as a custom patch in the OpenBSD port of nhc98, but want to check I'm not doing anything hideously wrong :) -- Don Here's what I'm doing: --- src/runtime/Kernel/collector.c.orig Tue Mar 8 03:53:38 2005 +++ src/runtime/Kernel/collector.c Sat Oct 22 19:05:22 2005 @@ -7,6 +7,11 @@ /*#include "runtime.h" -- already included in node.h */ #include "mark.h" +#include <errno.h> +#include <sys/types.h> +#include <sys/mman.h> + + /*#define HEAPSIZE 100000 -- defined in top-level Makefile at config-time */ #define GCSTACKSIZE 20000 @@ -45,11 +50,22 @@ void initGc(Int hpSize,NodePtr *ihp,Int { Int totalSize = hpSize+spSize; Int tableSize = (totalSize+WORDSIZE)/(WORDSIZE+1)+1; /* Last one for end of marked */ + int size = (int)totalSize * sizeof(Node); - if(NULL == (hpStart = malloc ((int)totalSize * sizeof(Node)))) { - fprintf(stderr,"Not enough memory for heap and stack.\n"); - exit(-1); - } + /* Ask for memory well below the 0x80000000 line. The nhc runtime + * reserves the high bit on addresses for its own purposes */ + hpStart = mmap((void *)0x40000000, size, + PROT_EXEC|PROT_READ|PROT_WRITE, + MAP_PRIVATE|MAP_ANON, -1 , 0); + + if (hpStart == MAP_FAILED) { + if (errno == ENOMEM) { + fprintf(stderr,"initGc: out of memory (requested %lu bytes)", size); + exit(-1); + } else { + fprintf(stderr, "initGc: mmap failed: %s", strerror(errno)); + } + } hpEnd = hpStart + totalSize;