Change find_signal_code_name to be more customizable. Implement
authorChris Hanson <org/chris-hanson/cph>
Thu, 11 Jul 1991 03:56:07 +0000 (03:56 +0000)
committerChris Hanson <org/chris-hanson/cph>
Thu, 11 Jul 1991 03:56:07 +0000 (03:56 +0000)
customization that determines correct names for floating-point
exceptions on the HP Precision Architecture.

v7/src/microcode/uxtrap.c
v7/src/microcode/uxtrap.h

index 9355ca21599858792465cf7ca3ed6aa92002f4ac..d9ebc28f9f41b98e63f5dc4c71814bbf591bfd83 100644 (file)
@@ -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)))));
 }
 \f
 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);
 }
 \f
 /* Find the compiled code block in area which contains `pc_value'.
index bfcc12c480f3720b4eedbda93a9e39258a6b4495..0b4d2428f03731914144490e923e6e163ac248ae 100644 (file)
@@ -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 */