1.0.30.41: Octets support for ebcdic-us
[sbcl.git] / src / runtime / runtime.c
index 159d7f6..573b389 100644 (file)
 #include "signal.h"
 
 #include "runtime.h"
-#include "alloc.h"
 #include "vars.h"
 #include "globals.h"
 #include "os.h"
+#include "interr.h"
+#include "alloc.h"
 #include "interrupt.h"
 #include "arch.h"
 #include "gc.h"
-#include "interr.h"
 #include "validate.h"
 #include "core.h"
 #include "save.h"
 
 #ifdef LISP_FEATURE_HPUX
 extern void *return_from_lisp_stub;
+#include "genesis/closure.h"
+#include "genesis/simple-fun.h"
 #endif
 
 \f
 /* SIGINT handler that invokes the monitor (for when Lisp isn't up to it) */
 static void
-sigint_handler(int signal, siginfo_t *info, void *void_context)
+sigint_handler(int signal, siginfo_t *info, os_context_t *context)
 {
     lose("\nSIGINT hit at 0x%08lX\n",
-         (unsigned long) *os_context_pc_addr(void_context));
+         (unsigned long) *os_context_pc_addr(context));
 }
 
 /* (This is not static, because we want to be able to call it from
@@ -227,12 +229,13 @@ main(int argc, char *argv[], char *envp[])
     /* other command line options */
     boolean noinform = 0;
     boolean end_runtime_options = 0;
+    boolean disable_lossage_handler_p = 0;
 
     lispobj initial_function;
     const char *sbcl_home = getenv("SBCL_HOME");
 
     interrupt_init();
-    block_blockable_signals();
+    block_blockable_signals(0, 0);
 
     setlocale(LC_ALL, "");
 
@@ -273,6 +276,8 @@ main(int argc, char *argv[], char *envp[])
                  * TOPLEVEL-INIT sees the option. */
                 noinform = 1;
                 end_runtime_options = 1;
+                disable_lossage_handler_p = 1;
+                lose_on_corruption_p = 1;
                 break;
             } else if (0 == strcmp(arg, "--noinform")) {
                 noinform = 1;
@@ -307,8 +312,10 @@ main(int argc, char *argv[], char *envp[])
                 if (errno)
                     lose("argument to --dynamic-space-size is not a number");
 #               ifdef MAX_DYNAMIC_SPACE_END
-                if (!((DYNAMIC_SPACE_START < DYNAMIC_SPACE_START+dynamic_space_size) &&
-                      (DYNAMIC_SPACE_START+dynamic_space_size <= MAX_DYNAMIC_SPACE_END)))
+                if (!((DYNAMIC_SPACE_START <
+                       DYNAMIC_SPACE_START+dynamic_space_size) &&
+                      (DYNAMIC_SPACE_START+dynamic_space_size <=
+                       MAX_DYNAMIC_SPACE_END)))
                     lose("specified --dynamic-space-size too large");
 #               endif
             } else if (0 == strcmp(arg, "--control-stack-size")) {
@@ -333,6 +340,12 @@ main(int argc, char *argv[], char *envp[])
                     ++n;
                 }
                 ++argi;
+            } else if (0 == strcmp(arg, "--disable-ldb")) {
+                disable_lossage_handler_p = 1;
+                ++argi;
+            } else if (0 == strcmp(arg, "--lose-on-corruption")) {
+                lose_on_corruption_p = 1;
+                ++argi;
             } else if (0 == strcmp(arg, "--end-runtime-options")) {
                 end_runtime_options = 1;
                 ++argi;
@@ -422,7 +435,8 @@ main(int argc, char *argv[], char *envp[])
     define_var("nil", NIL, 1);
     define_var("t", T, 1);
 
-    enable_lossage_handler();
+    if (!disable_lossage_handler_p)
+        enable_lossage_handler();
 
     globals_init();
 
@@ -431,8 +445,10 @@ main(int argc, char *argv[], char *envp[])
         lose("couldn't find initial function\n");
     }
 #ifdef LISP_FEATURE_HPUX
+    /* -1 = CLOSURE_FUN_OFFSET, 23 = SIMPLE_FUN_CODE_OFFSET, we are
+     * not in LANGUAGE_ASSEMBLY so we cant reach them. */
     return_from_lisp_stub = (void *) ((char *)*((unsigned long *)
-                 ((char *)initial_function - 1)) + 23);
+                 ((char *)initial_function + -1)) + 23);
 #endif
 
     gc_initialize_pointers();