--- js/src/jsgcchunk.cpp 2011-12-22 17:13:21.000000000 +0000 +++ js/src/jsgcchunk.cpp 2011-12-22 17:18:31.000000000 +0000 @@ -213,7 +213,7 @@ #elif defined(XP_UNIX) /* Required on Solaris 10. Might improve performance elsewhere. */ -# if defined(SOLARIS) && defined(MAP_ALIGN) +# if (defined(SOLARIS) && defined(MAP_ALIGN)) || defined(MOZ_MEMORY_LINUX) # define JS_GC_HAS_MAP_ALIGN static void * --- js/src/jsgcchunk.cpp 2011-12-22 17:55:24.000000000 +0000 +++ js/src/jsgcchunk.cpp 2011-12-22 18:02:24.000000000 +0000 @@ -226,12 +226,24 @@ #ifdef SOLARIS void *p = mmap((caddr_t) alignment, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_NOSYNC | MAP_ALIGN | MAP_ANON, -1, 0); + if (p == MAP_FAILED) + return NULL; #else - void *p = mmap((void *) alignment, size, PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_NOSYNC | MAP_ALIGN | MAP_ANON, -1, 0); -#endif + void *p = mmap(NULL, size + alignment, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_NOSYNC | MAP_ANON, -1, 0); if (p == MAP_FAILED) return NULL; + uintptr_t aligned_ret; + size_t extra_size; + + aligned_ret = (uintptr_t)p + alignment - 1; + aligned_ret &= ~(alignment - 1); + extra_size = aligned_ret - (uintptr_t)p; + munmap(p, extra_size); + munmap(p + extra_size + size, alignment - extra_size); + p = (void *)aligned_ret; +#endif + return p; }