From 4d17cf41d3807684babb5a6f167bfbf108a60ec9 Mon Sep 17 00:00:00 2001 From: Chris Hanson Date: Thu, 11 Jul 1991 03:56:07 +0000 Subject: [PATCH] Change find_signal_code_name to be more customizable. Implement customization that determines correct names for floating-point exceptions on the HP Precision Architecture. --- v7/src/microcode/uxtrap.c | 53 ++++++++++++++++++--------------------- v7/src/microcode/uxtrap.h | 41 +++++++++++++++++++++++++++--- 2 files changed, 63 insertions(+), 31 deletions(-) diff --git a/v7/src/microcode/uxtrap.c b/v7/src/microcode/uxtrap.c index 9355ca215..d9ebc28f9 100644 --- a/v7/src/microcode/uxtrap.c +++ b/v7/src/microcode/uxtrap.c @@ -1,6 +1,6 @@ /* -*-C-*- -$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/uxtrap.c,v 1.11 1991/06/15 00:40:54 cph Exp $ +$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/uxtrap.c,v 1.12 1991/07/11 03:56:07 cph Exp $ Copyright (c) 1990-91 Massachusetts Institute of Technology @@ -257,39 +257,36 @@ DEFUN_VOID (initialize_ux_signal_codes) } static SCHEME_OBJECT -DEFUN (find_signal_code_name, (signo, info), +DEFUN (find_signal_code_name, (signo, info, scp), int signo AND - SIGINFO_T info) + SIGINFO_T info AND + struct FULL_SIGCONTEXT * scp) { - SCHEME_OBJECT codenam, codenum, result; - struct ux_sig_code_desc *entry; unsigned long code = (SIGINFO_CODE (info)); - - for (entry = &ux_signal_codes[0]; - entry->signo != 0; - entry += 1) + char * name = 0; +#ifdef SPECIAL_SIGNAL_CODE_NAMES + SPECIAL_SIGNAL_CODE_NAMES (); + if (name == 0) +#endif { - if ((entry->signo == signo) - && (((entry->code_mask) & code) == (entry->code_value))) - break; + struct ux_sig_code_desc * entry = (& (ux_signal_codes [0])); + while ((entry -> signo) != 0) + if (((entry -> signo) == signo) + && (((entry -> code_mask) & code) == (entry -> code_value))) + { + name = (entry -> name); + break; + } } - - codenam = ((entry->signo == 0) - ? SHARP_F - : (char_pointer_to_string (entry->name))); - codenum = (long_to_integer ((long) code)); - - result = (MAKE_POINTER_OBJECT (TC_LIST, Free)); - *Free++ = codenum; - *Free++ = codenam; - - return (result); + return (cons ((long_to_integer ((long) code)), + ((name == 0) ? SHARP_F : (char_pointer_to_string (name))))); } static void -DEFUN (setup_trap_frame, (signo, info, trinfo, new_stack_pointer), +DEFUN (setup_trap_frame, (signo, info, scp, trinfo, new_stack_pointer), int signo AND SIGINFO_T info AND + struct FULL_SIGCONTEXT * scp AND struct trap_recovery_info * trinfo AND SCHEME_OBJECT * new_stack_pointer) { @@ -313,7 +310,7 @@ DEFUN (setup_trap_frame, (signo, info, trinfo, new_stack_pointer), ((signo == 0) ? SHARP_F : (char_pointer_to_string (find_signal_name (signo)))); - signal_code = (find_signal_code_name (signo, info)); + signal_code = (find_signal_code_name (signo, info, scp)); History = (Make_Dummy_History ()); if (!stack_recovered_p) { @@ -381,7 +378,7 @@ DEFUN_VOID (soft_reset) if ((Free >= Heap_Top) || (Free < Heap_Bottom)) /* Let's hope this works. */ Free = MemTop; - setup_trap_frame (0, 0, (&trinfo), new_stack_pointer); + setup_trap_frame (0, 0, 0, (&trinfo), new_stack_pointer); } #if !defined(HAVE_SIGCONTEXT) || !defined(HAS_COMPILER_SUPPORT) || defined(USE_STACKLETS) @@ -396,7 +393,7 @@ DEFUN (continue_from_trap, (signo, info, scp), { Free = MemTop; } - setup_trap_frame (signo, info, (&dummy_recovery_info), 0); + setup_trap_frame (signo, info, scp, (&dummy_recovery_info), 0); } #else /* HAVE_SIGCONTEXT and HAS_COMPILER_SUPPORT and not USE_STACKLETS */ @@ -623,7 +620,7 @@ DEFUN (continue_from_trap, (signo, info, scp), { (*xtra_info++) = ((SCHEME_OBJECT) the_pc); } - setup_trap_frame (signo, info, (&trinfo), new_stack_pointer); + setup_trap_frame (signo, info, scp, (&trinfo), new_stack_pointer); } /* Find the compiled code block in area which contains `pc_value'. diff --git a/v7/src/microcode/uxtrap.h b/v7/src/microcode/uxtrap.h index bfcc12c48..0b4d2428f 100644 --- a/v7/src/microcode/uxtrap.h +++ b/v7/src/microcode/uxtrap.h @@ -1,6 +1,6 @@ /* -*-C-*- -$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/uxtrap.h,v 1.8 1991/07/11 01:48:38 cph Exp $ +$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/uxtrap.h,v 1.9 1991/07/11 03:55:53 cph Exp $ Copyright (c) 1990-91 Massachusetts Institute of Technology @@ -138,9 +138,44 @@ MIT in each case. */ DECLARE_UX_SIGNAL_CODE \ (SIGFPE, (~ 0L), 13, "conditional trap"); \ DECLARE_UX_SIGNAL_CODE \ - (SIGFPE, (~ 0L), 14, "floating-point assist exception trap"); \ + (SIGFPE, (~ 0L), 14, "assist exception trap"); \ DECLARE_UX_SIGNAL_CODE \ - (SIGFPE, (~ 0L), 22, "floating-point assist emulation trap"); \ + (SIGFPE, (~ 0L), 22, "assist emulation trap"); \ +} + +#define SPECIAL_SIGNAL_CODE_NAMES() \ +{ \ + if ((signo == SIGFPE) && (code == 14)) \ + switch ((((*scp) . sc_sl . sl_ss . ss_frexcp1) >> 26) & 0x3f) \ + { \ + case 0x20: \ + name = "invalid operation"; \ + break; \ + case 0x10: \ + name = "divide by zero"; \ + break; \ + case 0x08: \ + name = "overflow"; \ + break; \ + case 0x04: \ + case 0x14: \ + case 0x24: \ + case 0x34: \ + name = "underflow"; \ + break; \ + case 0x02: \ + name = "inexact"; \ + break; \ + case 0x0a: \ + name = "inexact and overflow"; \ + break; \ + case 0x06: \ + case 0x16: \ + case 0x26: \ + case 0x36: \ + name = "inexact and underflow"; \ + break; \ + } \ } #endif /* hp9000s800 */ -- 2.25.1