2 * main() entry point for a stand-alone SBCL image
6 * This software is part of the SBCL system. See the README file for
9 * This software is derived from the CMU CL system, which was
10 * written at Carnegie Mellon University and released into the
11 * public domain. The software is in the public domain and is
12 * provided with absolutely no warranty. See the COPYING and CREDITS
13 * files for more information.
17 #include <sys/types.h>
21 #include <sys/param.h>
32 #include "interrupt.h"
50 /* SIGINT handler that invokes the monitor (for when Lisp isn't up to it) */
52 static void sigint_handler(int signal, siginfo_t *info, void *void_context)
54 printf("\nSIGINT hit at 0x%08lX\n", *os_context_pc_addr(void_context));
58 /* (This is not static, because we want to be able to call it from
60 void sigint_init(void)
62 install_handler(SIGINT, sigint_handler);
66 * helper functions for dealing with command line args
70 successful_malloc(size_t size)
72 void* result = malloc(size);
74 lose("malloc failure");
81 copied_string(char *string)
83 return strcpy(successful_malloc(1+strlen(string)), string);
87 copied_existing_filename_or_null(char *filename)
89 struct stat filename_stat;
90 if (stat(filename, &filename_stat)) { /* if failure */
93 return copied_string(filename);
97 /* Convert a null-terminated array of null-terminated strings (e.g.
98 * argv or envp) into a Lisp list of Lisp strings. */
100 alloc_string_list(char *array_ptr[])
103 return alloc_cons(alloc_string(*array_ptr),
104 alloc_string_list(1 + array_ptr));
111 main(int argc, char *argv[], char *envp[])
113 /* the name of the core file we're to execute. Note that this is
114 * a malloc'ed string which must be freed eventually. */
117 /* other command line options */
118 boolean noinform = 0;
119 boolean end_runtime_options = 0;
121 lispobj initial_function;
127 /* Parse our part of the command line (aka "runtime options"),
128 * stripping out those options that we handle. */
131 while (argi < argc) {
132 char *arg = argv[argi];
133 if (0 == strcmp(arg, "--noinform")) {
136 } else if (0 == strcmp(arg, "--core")) {
138 lose("more than one core file specified");
141 core = copied_string(argv[argi]);
143 lose("missing filename for --core argument");
147 } else if (0 == strcmp(arg, "--end-runtime-options")) {
148 end_runtime_options = 1;
152 /* This option was unrecognized as a runtime option,
153 * so it must be a toplevel option or a user option,
154 * so we must be past the end of the runtime option
159 /* This is where we strip out those options that we handle. We
160 * also take this opportunity to make sure that we don't find
161 * an out-of-place "--end-runtime-options" option. */
163 char *argi0 = argv[argi];
165 while (argi < argc) {
166 char *arg = argv[argi++];
167 /* If we encounter --end-runtime-options for the first
168 * time after the point where we had to give up on
169 * runtime options, then the point where we had to
170 * give up on runtime options must've been a user
172 if (!end_runtime_options &&
173 0 == strcmp(arg, "--end-runtime-options")) {
174 lose("bad runtime option \"%s\"", argi0);
183 /* If no core file was specified, look for one. */
185 char *sbcl_home = getenv("SBCL_HOME");
188 asprintf(&lookhere, "%s/sbcl.core", sbcl_home);
189 core = copied_existing_filename_or_null(lookhere);
192 core = copied_existing_filename_or_null("/usr/lib/sbcl.core");
194 core = copied_existing_filename_or_null("/usr/local/lib/sbcl.core");
198 lose("can't find core file");
204 "This is SBCL " SBCL_VERSION_STRING ", an implementation of ANSI Common Lisp.
206 SBCL is derived from the CMU CL system created at Carnegie Mellon University.
207 Besides material created at Carnegie Mellon University, and material
208 contributed by volunteers since its release into the public domain, CMU CL
209 contained, and SBCL contains, material copyrighted by
210 Massachusetts Institute of Technology, 1986;
211 Symbolics, Inc., 1989, 1990, 1991, 1992; and
212 Xerox Corporation, 1985, 1986, 1987, 1988, 1989, 1990.
213 More information about the origin of SBCL is available in the CREDITS file
216 SBCL is a free software system, provided as is, with absolutely no warranty.
217 It is mostly public domain software, but also includes some software from
218 MIT, Symbolics, and Xerox, used under BSD-style licenses which allow copying
219 only under certain conditions. More information about copying SBCL is
220 available in the COPYING file in the distribution.
222 More information on SBCL is available at <http://sbcl.sourceforge.net/>.
230 #if defined(SVR4) || defined(__linux__)
234 define_var("nil", NIL, 1);
235 define_var("t", T, 1);
237 set_lossage_handler(ldb_monitor);
246 initial_function = load_core_file(core);
247 if (initial_function == NIL) {
248 lose("couldn't find initial function");
253 gencgc_pickup_dynamic();
255 #if defined WANT_CGC && defined X86_CGC_ACTIVE_P
257 extern int use_cgc_p;
258 lispobj x = SymbolValue(X86_CGC_ACTIVE_P);
259 if (x != type_UnboundMarker && x != NIL) {
260 /* Enable allocator. */
267 #ifdef BINDING_STACK_POINTER
268 SetSymbolValue(BINDING_STACK_POINTER, BINDING_STACK_START);
270 #if defined INTERNAL_GC_TRIGGER && !defined __i386__
271 SetSymbolValue(INTERNAL_GC_TRIGGER, make_fixnum(-1));
276 arch_install_interrupt_handlers();
277 os_install_interrupt_handlers();
279 #ifdef PSEUDO_ATOMIC_ATOMIC
280 /* Turn on pseudo atomic for when we call into Lisp. */
281 SetSymbolValue(PSEUDO_ATOMIC_ATOMIC, make_fixnum(1));
282 SetSymbolValue(PSEUDO_ATOMIC_INTERRUPTED, make_fixnum(0));
285 /* Convert remaining argv values to something that Lisp can grok. */
286 SetSymbolValue(POSIX_ARGV, alloc_string_list(argv));
288 /* Install a handler to pick off SIGINT until the Lisp system gets
289 * far enough along to install its own handler. */
292 funcall0(initial_function);
294 /* initial_function() is not supposed to return. */
295 lose("Lisp initial_function gave up control.");