2 * stuff to handle internal errors
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.
28 /* the way that we shut down the system on a fatal error */
31 default_lossage_handler(void)
35 static void (*lossage_handler)(void) = default_lossage_handler;
37 set_lossage_handler(void handler(void))
39 lossage_handler = handler;
46 fprintf(stderr, "fatal error encountered in SBCL runtime system");
48 fprintf(stderr, ":\n");
50 vfprintf(stderr, fmt, ap);
53 fprintf(stderr, "\n");
56 fprintf(stderr, "Argh! lossage_handler() returned, total confusion..\n");
60 /* internal error handler for when the Lisp error system doesn't exist
62 * FIXME: Shouldn't error output go to stderr instead of stdout? (Alas,
63 * this'd require changes in a number of things like brief_print(..),
64 * or I'd have changed it immediately.) */
66 describe_internal_error(os_context_t *context)
68 unsigned char *ptr = arch_internal_error_arguments(context);
69 int len, scoffset, sc, offset, ch;
72 printf("internal error #%d\n", *ptr++);
77 if (scoffset == 253) {
81 else if (scoffset == 254) {
82 scoffset = ptr[0] + ptr[1]*256;
86 else if (scoffset == 255) {
87 scoffset = ptr[0] + (ptr[1]<<8) + (ptr[2]<<16) + (ptr[3]<<24);
92 offset = scoffset >> 5;
94 printf(" SC: %d, Offset: %d", sc, offset);
97 case sc_DescriptorReg:
99 brief_print(*os_context_register_addr(context, offset));
103 ch = *os_context_register_addr(context, offset);
110 case '\n': printf("\t'\\n'\n"); break;
111 case '\b': printf("\t'\\b'\n"); break;
112 case '\t': printf("\t'\\t'\n"); break;
113 case '\r': printf("\t'\\r'\n"); break;
115 if (ch < 32 || ch > 127)
116 printf("\\%03o", ch);
118 printf("\t'%c'\n", ch);
123 #ifdef sc_WordPointerReg
124 case sc_WordPointerReg:
126 printf("\t0x%08x\n", *os_context_register_addr(context, offset));
129 printf("\t%d\n", *os_context_register_addr(context, offset));
132 printf("\t%u\n", *os_context_register_addr(context, offset));
134 #ifdef sc_SingleFloatReg
135 case sc_SingleFloatReg:
136 printf("\t%g\n", *(float *)&context->sc_fpregs[offset]);
139 #ifdef sc_DoubleFloatReg
140 case sc_DoubleFloatReg:
141 printf("\t%g\n", *(double *)&context->sc_fpregs[offset]);
151 /* utility routines used by miscellaneous pieces of code */
153 lispobj debug_print(lispobj string)
155 fprintf(stderr, "%s\n", (char *)(((struct vector *)PTR(string))->data));