* src/vm/jit/trap.cpp (trap_init): Disabled mmapping of first page by default.
[cacao.git] / src / vm / jit / trap.cpp
index 3f95aaa90909159728f7a127770d60a3037940f4..6d9340c18377cf6dbd5d891a1740b4a26366123d 100644 (file)
@@ -1,6 +1,6 @@
 /* src/vm/jit/trap.cpp - hardware traps
 
-   Copyright (C) 2008
+   Copyright (C) 2008, 2009
    CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
    Copyright (C) 2009 Theobroma Systems Ltd.
 
@@ -66,21 +66,15 @@ extern "C" {
  */
 void trap_init(void)
 {
-#if !(defined(__ARM__) && defined(__LINUX__))
-       /* On arm-linux the first memory page can't be mmap'ed, as it
-          contains the exception vectors. */
-
-       int pagesize;
-
-       /* mmap a memory page at address 0x0, so our hardware-exceptions
-          work. */
+       TRACESUBSYSTEMINITIALIZATION("trap_init");
 
-       pagesize = os::getpagesize();
+       /* If requested we mmap a memory page at address 0x0,
+          so our hardware-exceptions work. */
 
-       (void) os::mmap_anonymous(NULL, pagesize, PROT_NONE, MAP_PRIVATE | MAP_FIXED);
-#endif
-
-       TRACESUBSYSTEMINITIALIZATION("trap_init");
+       if (opt_AlwaysMmapFirstPage) {
+               int pagesize = os::getpagesize();
+               (void) os::mmap_anonymous(NULL, pagesize, PROT_NONE, MAP_PRIVATE | MAP_FIXED);
+       }
 
 #if !defined(TRAP_INSTRUCTION_IS_LOAD)
 # error TRAP_INSTRUCTION_IS_LOAD is not defined in your md-trap.h
@@ -119,7 +113,7 @@ void trap_handle(int sig, void *xpc, void *context)
                vm_abort("trap_handle: The program counter is NULL!");
 #endif
 
-#if defined(__ALPHA__) || defined(__ARM__) || defined(__I386__) || defined(__POWERPC__) || defined(__POWERPC64__) || defined(__X86_64__)
+#if defined(__ALPHA__) || defined(__ARM__) || defined(__I386__) || defined(__MIPS__) || defined(__POWERPC__) || defined(__POWERPC64__) || defined(__X86_64__)
 # if !defined(NDEBUG)
        /* Perform a sanity check on our execution state functions. */
 
@@ -162,8 +156,8 @@ void trap_handle(int sig, void *xpc, void *context)
                // NOTE: Some archs use SIGILL for other traps too, but it's OK to
                // do this check anyway because it will fail.
                if (patcher_is_patched_at(xpc) == true) {
-                       // XXX remove this debug output!
-                       log_println("trap_handle: Detected patcher race condition (PR85) at %p", xpc);
+                       if (opt_PrintWarnings)
+                               log_println("trap_handle: Detected patcher race condition (PR85) at %p", xpc);
                        return;
                }
 
@@ -295,7 +289,7 @@ void trap_handle(int sig, void *xpc, void *context)
 
        stacktrace_stackframeinfo_remove(&sfi);
 
-#if defined(__ALPHA__) || defined(__ARM__) || defined(__I386__) || defined(__POWERPC__) || defined(__POWERPC64__) || defined(__X86_64__)
+#if defined(__ALPHA__) || defined(__ARM__) || defined(__I386__) || defined(__MIPS__) || defined(__POWERPC__) || defined(__POWERPC64__) || defined(__X86_64__)
        /* Update execution state and set registers. */
        /* AFTER: removing stackframeinfo */
 
@@ -380,4 +374,5 @@ void trap_handle(int sig, void *xpc, void *context)
  * c-basic-offset: 4
  * tab-width: 4
  * End:
+ * vim:noexpandtab:sw=4:ts=4:
  */