From f7a16467834a363f345c751768127b3199d52c78 Mon Sep 17 00:00:00 2001 From: wlott <wlott> Date: Thu, 30 Aug 1990 16:39:00 +0000 Subject: [PATCH] Changed the internal error reporting stuff to be able to deal with the more complicated internal error format. --- ldb/test.c | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 86 insertions(+), 6 deletions(-) diff --git a/ldb/test.c b/ldb/test.c index 3d7b564ea..6bd34a698 100644 --- a/ldb/test.c +++ b/ldb/test.c @@ -1,4 +1,4 @@ -/* $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. */ #include <signal.h> @@ -25,7 +25,7 @@ struct sigcontext *context; { int mask; unsigned long *ptr, bad_inst; - char *cptr; + unsigned char *cptr; printf("Hit with %s, code = %d, context = 0x%x\n", signames[signal], code, context); @@ -48,10 +48,90 @@ struct sigcontext *context; case trap_Error: case trap_Cerror: - cptr = (char *)(ptr+1); - printf("Error: %s\n", errors[*cptr]); - while (*++cptr != 0) - printf(" R%d: 0x%x\n", *cptr, context->sc_regs[*cptr]); + cptr = (unsigned char *)(ptr+1); + if (*cptr == 0xff) { + int len, scoffset, sc, offset, ch; + + 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) { printf("Hit a break. Use ``exit'' to continue.\n"); if (context->sc_cause & CAUSE_BD) -- GitLab