Skip to content
Snippets Groups Projects
Commit f7a16467 authored by wlott's avatar wlott
Browse files

Changed the internal error reporting stuff to be able to deal with the

more complicated internal error format.
parent 71f14e0d
Branches
No related tags found
No related merge requests found
/* $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/ldb/Attic/test.c,v 1.6 1990/07/01 04:49:00 wlott Exp $ */ /* $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/ldb/Attic/test.c,v 1.7 1990/08/30 16:39:00 wlott Exp $ */
/* Extra random routines for testing stuff. */ /* Extra random routines for testing stuff. */
#include <signal.h> #include <signal.h>
...@@ -25,7 +25,7 @@ struct sigcontext *context; ...@@ -25,7 +25,7 @@ struct sigcontext *context;
{ {
int mask; int mask;
unsigned long *ptr, bad_inst; unsigned long *ptr, bad_inst;
char *cptr; unsigned char *cptr;
printf("Hit with %s, code = %d, context = 0x%x\n", signames[signal], code, context); printf("Hit with %s, code = %d, context = 0x%x\n", signames[signal], code, context);
...@@ -48,10 +48,90 @@ struct sigcontext *context; ...@@ -48,10 +48,90 @@ struct sigcontext *context;
case trap_Error: case trap_Error:
case trap_Cerror: case trap_Cerror:
cptr = (char *)(ptr+1); cptr = (unsigned char *)(ptr+1);
printf("Error: %s\n", errors[*cptr]); if (*cptr == 0xff) {
while (*++cptr != 0) int len, scoffset, sc, offset, ch;
printf(" R%d: 0x%x\n", *cptr, context->sc_regs[*cptr]);
cptr++;
len = *cptr++;
printf("Error: %s\n", errors[*cptr++]);
len--;
while (len > 0) {
scoffset = *cptr++;
len--;
if (scoffset == 253) {
scoffset = *cptr++;
len--;
}
else if (scoffset == 254) {
scoffset = cptr[0] + cptr[1]*256;
cptr += 2;
len -= 2;
}
else if (scoffset == 255) {
scoffset = cptr[0] + (cptr[1]<<8) +
(cptr[2]<<16) + (cptr[3]<<24);
cptr += 4;
len -= 4;
}
sc = scoffset & 0x1f;
offset = scoffset >> 5;
printf(" SC: %d, Offset: %d", sc, offset);
switch (sc) {
case 16: /* Any reg */
case 17: /* Descriptor reg */
putchar('\t');
brief_print(context->sc_regs[offset]);
break;
case 18: /* base char reg */
ch = context->sc_regs[offset];
switch (ch) {
case '\n': printf("\t'\\n'\n"); break;
case '\b': printf("\t'\\b'\n"); break;
case '\t': printf("\t'\\t'\n"); break;
case '\r': printf("\t'\\r'\n"); break;
default:
if (ch < 32 || ch > 127)
printf("\\%03o", ch);
else
printf("\t'%c'\n", ch);
break;
}
break;
case 19: /* sap reg */
printf("\t0x%08x\n", context->sc_regs[offset]);
break;
case 20: /* signed reg */
printf("\t%ld\n", context->sc_regs[offset]);
break;
case 21: /* unsigned reg */
printf("\t%lu\n", context->sc_regs[offset]);
break;
case 22: /* non-descr reg */
case 23: /* interior reg */
printf("\t???\n");
break;
case 24: /* single-float reg */
printf("\t%g\n",
*(float *)&context->sc_fpregs[offset]);
break;
case 25: /* double-float reg */
printf("\t%g\n",
*(double *)&context->sc_fpregs[offset]);
break;
default:
printf("\t???\n");
break;
}
}
}
else {
printf("Error: %s\n", errors[*cptr]);
while (*++cptr != 0)
printf(" R%d: 0x%x\n", *cptr,
context->sc_regs[*cptr]);
}
if (code == trap_Cerror) { if (code == trap_Cerror) {
printf("Hit a break. Use ``exit'' to continue.\n"); printf("Hit a break. Use ``exit'' to continue.\n");
if (context->sc_cause & CAUSE_BD) if (context->sc_cause & CAUSE_BD)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment