Improve trap handling under NetBSD.
authorTaylor R Campbell <campbell@mumble.net>
Thu, 22 Jul 2010 17:28:07 +0000 (17:28 +0000)
committerTaylor R Campbell <campbell@mumble.net>
Thu, 22 Jul 2010 17:28:07 +0000 (17:28 +0000)
src/microcode/ux.h
src/microcode/uxsig.c
src/microcode/uxtrap.h

index ea62e7c95667c4b27427c53a649adf6791c5b182..06929fa1d67ee4efa49c6afe8b4abe3fe7629a42 100644 (file)
@@ -72,6 +72,10 @@ USA.
 
 #if defined(__netbsd__) || defined(__NetBSD__)
 #  define SYSTEM_VARIANT "NetBSD"
+#  include <sys/param.h>
+#  if defined(__NetBSD_Version__) && __NetBSD_Version__ >= 200000000
+#    define HAVE_SIGACTION_SIGINFO_SIGNALS
+#  endif
 #endif
 
 #ifdef _NEXTOS
@@ -270,6 +274,10 @@ USA.
 typedef RETSIGTYPE Tsignal_handler_result;
 
 #ifdef _POSIX_REALTIME_SIGNALS
+#  define HAVE_SIGACTION_SIGINFO_SIGNALS
+#endif
+
+#ifdef HAVE_SIGACTION_SIGINFO_SIGNALS
    typedef void (*Tsignal_handler) (int, siginfo_t *, void *);
 #else
    typedef RETSIGTYPE (*Tsignal_handler) (int);
index 8951d1f2341ce38bb5eb8e7ec2619dc2f0204a88..f91c16ee978fc0cd1e6e80d6432020e8055a9fc3 100644 (file)
@@ -46,7 +46,7 @@ extern void UX_reinitialize_tty (void);
 
 #ifdef HAVE_POSIX_SIGNALS
 
-#ifdef _POSIX_REALTIME_SIGNALS
+#ifdef HAVE_SIGACTION_SIGINFO_SIGNALS
 #  define SIGACT_HANDLER(act) ((act) -> sa_sigaction)
 #else
 #  define SIGACT_HANDLER(act) ((act) -> sa_handler)
index c23b76faa4c5570311367af5bc8085d30a58ddc4..052c2253f8ca60c3900ced43136979e659e94dee 100644 (file)
@@ -637,7 +637,67 @@ typedef struct
 
 #endif /* __sparc */
 \f
+/* Judging by the CVS logs, NetBSD seems to have begun supporting
+   siginfo cruft somewhere around 1.5ish or 1.6ish, so 2.0 is a
+   reasonable guess.  */
+
+#if defined(__NetBSD__)
+
+#include <sys/param.h>
+
+#if defined(__NetBSD_Version__) && __NetBSD_Version__ >= 200000000
+
+#  define HAVE_SIGACTION_SIGINFO_SIGNALS
+#  include <sys/siginfo.h>
+#  include <sys/ucontext.h>
+
+#  ifdef __IA32__
+#    include <i386/mcontext.h>
+#    define SIGCONTEXT_NREGS _NGREG
+#    define __SIGCONTEXT_REG(scp, ir)           \
+  ((((scp) -> uc_mcontext) -> __gregs) [(ir)])
+#    define SIGCONTEXT_FIRST_REG(scp) (& (__SIGCONTEXT_REG (scp, _REG_GS)))
+#    define SIGCONTEXT_RFREE(scp) (__SIGCONTEXT_REG (scp, _REG_EDI))
+#  endif
+
+#  define SIGCONTEXT_SP(scp) (_UC_MACHINE_SP (scp))
+#  define SIGCONTEXT_PC(scp) (_UC_MACHINE_PC (scp))
+
+#  define INITIALIZE_UX_SIGNAL_CODES()                                  \
+  do {                                                                  \
+    DECLARE_UX_SIGNAL_CODE (SIGILL, (~0L), ILL_ILLOPC, "Illegal opcode"); \
+    DECLARE_UX_SIGNAL_CODE (SIGILL, (~0L), ILL_ILLOPN, "Illegal operand"); \
+    DECLARE_UX_SIGNAL_CODE (SIGILL, (~0L), ILL_ILLADR, "Illegal addressing mode"); \
+    DECLARE_UX_SIGNAL_CODE (SIGILL, (~0L), ILL_ILLTRP, "Illegal trap"); \
+    DECLARE_UX_SIGNAL_CODE (SIGILL, (~0L), ILL_PRVOPC, "Privileged opcode"); \
+    DECLARE_UX_SIGNAL_CODE (SIGILL, (~0L), ILL_PRVREG, "Privileged register"); \
+    DECLARE_UX_SIGNAL_CODE (SIGILL, (~0L), ILL_COPROC, "Coprocessor error"); \
+    DECLARE_UX_SIGNAL_CODE (SIGILL, (~0L), ILL_BADSTK, "Internal stack error"); \
+    DECLARE_UX_SIGNAL_CODE (SIGFPE, (~0L), FPE_INTDIV, "Integer divide by zero"); \
+    DECLARE_UX_SIGNAL_CODE (SIGFPE, (~0L), FPE_INTOVF, "Integer overflow"); \
+    DECLARE_UX_SIGNAL_CODE (SIGFPE, (~0L), FPE_FLTDIV, "Floating-point divide by zero"); \
+    DECLARE_UX_SIGNAL_CODE (SIGFPE, (~0L), FPE_FLTOVF, "Floating-point overflow"); \
+    DECLARE_UX_SIGNAL_CODE (SIGFPE, (~0L), FPE_FLTUND, "Floating-point underflow"); \
+    DECLARE_UX_SIGNAL_CODE (SIGFPE, (~0L), FPE_FLTRES, "Floating-point inexact result"); \
+    DECLARE_UX_SIGNAL_CODE (SIGFPE, (~0L), FPE_FLTINV, "Invalid floating-point operation"); \
+    DECLARE_UX_SIGNAL_CODE (SIGFPE, (~0L), FPE_FLTSUB, "Subscript out of range"); \
+    DECLARE_UX_SIGNAL_CODE (SIGSEGV, (~0L), SEGV_MAPERR, "Address not mapped to object"); \
+    DECLARE_UX_SIGNAL_CODE (SIGSEGV, (~0L), SEGV_ACCERR, "Invalid permissions for mapped object"); \
+    DECLARE_UX_SIGNAL_CODE (SIGBUS, (~0L), BUS_ADRALN, "Invalid address alignment"); \
+    DECLARE_UX_SIGNAL_CODE (SIGBUS, (~0L), BUS_ADRERR, "Nonexistent physical address"); \
+    DECLARE_UX_SIGNAL_CODE (SIGBUS, (~0L), BUS_OBJERR, "Object-specific hardware error"); \
+    DECLARE_UX_SIGNAL_CODE (SIGTRAP, (~0L), TRAP_BRKPT, "Process breakpoint"); \
+    DECLARE_UX_SIGNAL_CODE (SIGTRAP, (~0L), TRAP_TRACE, "Process trace trap"); \
+  } while (0)
+
+#endif /* __NetBSD_Version__ >= 200000000 */
+#endif /* __NetBSD__ */
+\f
 #ifdef _POSIX_REALTIME_SIGNALS
+#  define HAVE_SIGACTION_SIGINFO_SIGNALS
+#endif
+
+#ifdef HAVE_SIGACTION_SIGINFO_SIGNALS
 #  define SIGINFO_T siginfo_t *
 #  define SIGINFO_VALID_P(info) (1)
 #  define SIGINFO_CODE(info) ((info) -> si_code)
@@ -682,7 +742,7 @@ typedef struct
 #endif
 
 #ifndef SIGCONTEXT_RFREE
-#  define SIGCONTEXT_RFREE ((unsigned long) heap_alloc_limit)
+#  define SIGCONTEXT_RFREE(scp) ((unsigned long) heap_alloc_limit)
 #endif
 
 #ifndef SIGCONTEXT_SCHSP