#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"
#define SBCL_HOME "/usr/local/lib/sbcl/"
#endif
+#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
return copied_string(filename);
}
}
-
-/* Convert a null-terminated array of null-terminated strings (e.g.
- * argv or envp) into a Lisp list of Lisp base-strings. */
-static lispobj
-alloc_base_string_list(char *array_ptr[])
-{
- if (*array_ptr) {
- return alloc_cons(alloc_base_string(*array_ptr),
- alloc_base_string_list(1 + array_ptr));
- } else {
- return NIL;
- }
-}
\f
/* miscellaneous chattiness */
--version Print version information and exit.\n\
--core <filename> Use the specified core file instead of the default.\n\
--dynamic-space-size <MiB> Size of reserved dynamic space in megabytes.\n\
+ --control-stack-size <MiB> Size of reserved control stack in megabytes.\n\
\n\
Common toplevel options:\n\
--sysinit <filename> System-wide init-file to use instead of default.\n\
char *stem = "/sbcl.core";
char *core;
- if(!sbcl_home) sbcl_home = SBCL_HOME;
+ if (!(sbcl_home && *sbcl_home)) sbcl_home = SBCL_HOME;
lookhere = (char *) calloc(strlen(sbcl_home) +
strlen(stem) +
1,
char **posix_argv;
char *core_string;
+struct runtime_options *runtime_options;
+
\f
int
main(int argc, char *argv[], char *envp[])
char *core = 0;
char **sbcl_argv = 0;
os_vm_offset_t embedded_core_offset = 0;
+ char *runtime_path = 0;
/* 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, "");
+ runtime_options = NULL;
+
+ /* Check early to see if this executable has an embedded core,
+ * which also populates runtime_options if the core has runtime
+ * options */
+ runtime_path = os_get_runtime_executable_path();
+ if (runtime_path) {
+ os_vm_offset_t offset = search_for_embedded_core(runtime_path);
+ if (offset != -1) {
+ embedded_core_offset = offset;
+ core = runtime_path;
+ } else {
+ free(runtime_path);
+ }
+ }
+
+
/* Parse our part of the command line (aka "runtime options"),
* stripping out those options that we handle. */
- {
+ if (runtime_options != NULL) {
+ dynamic_space_size = runtime_options->dynamic_space_size;
+ thread_control_stack_size = runtime_options->thread_control_stack_size;
+ sbcl_argv = argv;
+ } else {
int argi = 1;
+
+ runtime_options = successful_malloc(sizeof(struct runtime_options));
+
while (argi < argc) {
char *arg = argv[argi];
- if (0 == strcmp(arg, "--noinform")) {
+ if (0 == strcmp(arg, "--script")) {
+ /* This is both a runtime and a toplevel option. As a
+ * runtime option, it is equivalent to --noinform.
+ * This exits, and does not increment argi, so that
+ * 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;
++argi;
} else if (0 == strcmp(arg, "--core")) {
dynamic_space_size = strtol(argv[argi++], 0, 0) << 20;
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)))
+ lose("specified --dynamic-space-size too large");
+# endif
+ } else if (0 == strcmp(arg, "--control-stack-size")) {
+ ++argi;
+ if (argi >= argc)
+ lose("missing argument for --control-stack-size");
+ errno = 0;
+ thread_control_stack_size = strtol(argv[argi++], 0, 0) << 20;
+ if (errno)
+ lose("argument to --control-stack-size is not a number");
} else if (0 == strcmp(arg, "--debug-environment")) {
int n = 0;
printf("; Commandline arguments:\n");
++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;
}
}
- /* Align down to multiple of page_table page size */
- dynamic_space_size = (dynamic_space_size/PAGE_BYTES) * PAGE_BYTES;
+ /* Align down to multiple of page_table page size, and to the appropriate
+ * stack alignment. */
+ dynamic_space_size &= ~(PAGE_BYTES-1);
+ thread_control_stack_size &= ~(CONTROL_STACK_ALIGNMENT_BYTES-1);
+
+ /* Preserve the runtime options for possible future core saving */
+ runtime_options->dynamic_space_size = dynamic_space_size;
+ runtime_options->thread_control_stack_size = thread_control_stack_size;
/* KLUDGE: os_vm_page_size is set by os_init(), and on some
* systems (e.g. Alpha) arch_init() needs need os_vm_page_size, so
/* If no core file was specified, look for one. */
if (!core) {
- char *runtime_path = os_get_runtime_executable_path();
-
- if (runtime_path) {
- os_vm_offset_t offset = search_for_embedded_core(runtime_path);
-
- if (offset != -1) {
- embedded_core_offset = offset;
- core = runtime_path;
- } else {
- free(runtime_path);
- core = search_for_core();
- }
- } else {
- core = search_for_core();
- }
+ core = search_for_core();
}
- /* Make sure that SBCL_HOME is set, unless loading an embedded core. */
- if (!getenv("SBCL_HOME") && embedded_core_offset == 0) {
+ /* Make sure that SBCL_HOME is set and not the empty string,
+ unless loading an embedded core. */
+ if (!(sbcl_home && *sbcl_home) && embedded_core_offset == 0) {
char *envstring, *copied_core, *dir;
char *stem = "SBCL_HOME=";
copied_core = copied_string(core);
free(copied_core);
}
- if (!noinform) {
+ if (!noinform && embedded_core_offset == 0) {
print_banner();
fflush(stdout);
}
define_var("nil", NIL, 1);
define_var("t", T, 1);
- enable_lossage_handler();
+ if (!disable_lossage_handler_p)
+ enable_lossage_handler();
globals_init();
if (initial_function == NIL) {
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);
+#endif
gc_initialize_pointers();