[Pkg-haskell-commits] darcs: ghc: Drop Fix-GHCi-segfault-on-linux-powerpc
Joachim Breitner
mail at joachim-breitner.de
Tue Oct 16 07:59:10 UTC 2012
Mon Oct 8 11:15:17 UTC 2012 Joachim Breitner <mail at joachim-breitner.de>
* Drop Fix-GHCi-segfault-on-linux-powerpc
Ignore-this: f4f90b37e2bbce4db7e6aab4fb8af00
R! ./patches/Fix-GHCi-segfault-on-linux-powerpc
Mon Oct 8 11:15:17 UTC 2012 Joachim Breitner <mail at joachim-breitner.de>
* Drop Fix-GHCi-segfault-on-linux-powerpc
Ignore-this: f4f90b37e2bbce4db7e6aab4fb8af00
diff -rN -u old-ghc//patches/Fix-GHCi-segfault-on-linux-powerpc new-ghc//patches/Fix-GHCi-segfault-on-linux-powerpc
--- old-ghc//patches/Fix-GHCi-segfault-on-linux-powerpc 2012-10-16 07:59:09.662720540 +0000
+++ new-ghc//patches/Fix-GHCi-segfault-on-linux-powerpc 1970-01-01 00:00:00.000000000 +0000
@@ -1,99 +0,0 @@
-From 0f0312f02177b842431d2f4f2a4e9b99b146faff Mon Sep 17 00:00:00 2001
-From: Erik de Castro Lopo <erikd at mega-nerd.com>
-Date: Tue, 31 Jul 2012 05:53:49 +1000
-Subject: [PATCH 2/3] Fix GHCi segfault during startup on linux-powerpc
- (#2972).
-
-Slightly modified version of a patch from Ben Collins <bcollins at ubuntu.com>
-who did the final debugging that showed the segfault was being caused the
-memory protection mechanism.
-
-Due to the requirement of "jump islands" to handle 24 bit relative jump
-offsets, GHCi on PowerPC did not use mmap to load object files like the
-other architectures. Instead, it allocated memory using malloc and fread
-to load the object code. However there is a quirk in the GNU libc malloc
-implementation. For memory regions over certain size (dynamic and
-configurable), malloc will use mmap to obtain the required memory instead
-of sbrk and malloc's call to mmap sets the memory readable and writable,
-but not executable. That means when GHCi loads code into a memory region
-that was mmapped instead of malloc-ed and tries to execute it we get a
-segfault.
-
-This solution drops the malloc/fread object loading in favour of using
-mmap and then puts the jump island for each object code module at the
-end of the mmaped region for that object.
-
-This patch may also be a solution on other ELF based powerpc systems
-but does not work on darwin-powerpc.
----
- rts/Linker.c | 37 +++++++++++++++++++++++++++++++++----
- 1 file changed, 33 insertions(+), 4 deletions(-)
-
-diff --git a/rts/Linker.c b/rts/Linker.c
-index fd5550e..6beb534 100644
---- a/rts/Linker.c
-+++ b/rts/Linker.c
-@@ -70,11 +70,12 @@
- #include <sys/wait.h>
- #endif
-
--#if !defined(powerpc_HOST_ARCH) && \
-- ( defined(linux_HOST_OS ) || defined(freebsd_HOST_OS) || \
-+#if (defined(powerpc_HOST_ARCH) && defined(linux_HOST_OS)) \
-+ || (!defined(powerpc_HOST_ARCH) && \
-+ ( defined(linux_HOST_OS) || defined(freebsd_HOST_OS) || \
- defined(dragonfly_HOST_OS) || defined(netbsd_HOST_OS ) || \
- defined(openbsd_HOST_OS ) || defined(darwin_HOST_OS ) || \
-- defined(kfreebsdgnu_HOST_OS) || defined(gnu_HOST_OS))
-+ defined(kfreebsdgnu_HOST_OS) || defined(gnu_HOST_OS)))
- /* Don't use mmap on powerpc_HOST_ARCH as mmap doesn't support
- * reallocating but we need to allocate jump islands just after each
- * object images. Otherwise relative branches to jump islands can fail
-@@ -90,6 +91,16 @@
-
- #endif
-
-+
-+/* PowerPC has relative branch instructions with only 24 bit displacements
-+ * and therefore needs jump islands contiguous with each object code module.
-+ */
-+#if (defined(USE_MMAP) && defined(powerpc_HOST_ARCH) && defined(linux_HOST_OS))
-+#define USE_CONTIGUOUS_MMAP 1
-+#else
-+#define USE_CONTIGUOUS_MMAP 0
-+#endif
-+
- #if defined(linux_HOST_OS) || defined(solaris2_HOST_OS) || defined(freebsd_HOST_OS) || defined(kfreebsdgnu_HOST_OS) || defined(dragonfly_HOST_OS) || defined(netbsd_HOST_OS) || defined(openbsd_HOST_OS) || defined(gnu_HOST_OS)
- # define OBJFORMAT_ELF
- # include <regex.h> // regex is already used by dlopen() so this is OK
-@@ -2797,8 +2808,26 @@ static int ocAllocateSymbolExtras( ObjectCode* oc, int count, int first )
- */
- if( m > n ) // we need to allocate more pages
- {
-- oc->symbol_extras = mmapForLinker(sizeof(SymbolExtra) * count,
-+ if (USE_CONTIGUOUS_MMAP)
-+ {
-+ /* Keep image and symbol_extras contiguous */
-+ void *new = mmapForLinker(n + (sizeof(SymbolExtra) * count),
-+ MAP_ANONYMOUS, -1);
-+ if (new)
-+ {
-+ memcpy(new, oc->image, oc->fileSize);
-+ munmap(oc->image, n);
-+ oc->image = new;
-+ oc->symbol_extras = (SymbolExtra *) (oc->image + n);
-+ }
-+ else
-+ oc->symbol_extras = NULL;
-+ }
-+ else
-+ {
-+ oc->symbol_extras = mmapForLinker(sizeof(SymbolExtra) * count,
- MAP_ANONYMOUS, -1);
-+ }
- }
- else
- {
---
-1.7.10.4
-
More information about the Pkg-haskell-commits
mailing list