#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
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;
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, "--script")) {
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)
errno = 0;
thread_control_stack_size = strtol(argv[argi++], 0, 0) << 20;
if (errno)
- lose("argument to --dynamic-space-size is not a number");
+ lose("argument to --control-stack-size is not a number");
} else if (0 == strcmp(arg, "--debug-environment")) {
int n = 0;
printf("; Commandline arguments:\n");
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
* it must follow os_init(). -- WHN 2000-01-26 */
/* 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 and not the empty string,
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();