Exploit common mcontext structure shared between NetBSD ports.
authorTaylor R Campbell <campbell@mumble.net>
Thu, 22 Jul 2010 20:23:04 +0000 (20:23 +0000)
committerTaylor R Campbell <campbell@mumble.net>
Thu, 22 Jul 2010 20:23:04 +0000 (20:23 +0000)
src/microcode/uxtrap.h

index 05cc4fb8d2b2a6d9fd4be9c9685f8661e6c20e2e..c6fe50dbc3a32d5f17fd3760a8680a42adf23359 100644 (file)
@@ -646,22 +646,31 @@ typedef struct
 #if defined(__NetBSD_Version__) && __NetBSD_Version__ >= 200000000
 
 #  define HAVE_SIGACTION_SIGINFO_SIGNALS
-#  define HAVE_SIGCONTEXT
 
 #  include <sys/siginfo.h>
 #  include <sys/ucontext.h>
+#  include <machine/mcontext.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))
+#    define SIGCONTEXT_RFREE(scp) ((SIGCONTEXT_FIRST_REG (scp)) [_REG_EDI])
+#    define HAVE_NETBSD_GENERIC_MCONTEXT
+#  endif
+
+#  ifdef __x86_64__
+#    define SIGCONTEXT_RFREE(scp) ((SIGCONTEXT_FIRST_REG (scp)) [_REG_RDI])
+#    define HAVE_NETBSD_GENERIC_MCONTEXT
 #  endif
 
-#  define SIGCONTEXT_SP(scp) (_UC_MACHINE_SP (scp))
-#  define SIGCONTEXT_PC(scp) (_UC_MACHINE_PC (scp))
+/* When I checked, on 2010-07-22, the only NetBSD ports without the
+   generic mcontext interface were IA-64 and usermode.  */
+
+#  ifdef HAVE_NETBSD_GENERIC_MCONTEXT
+#    define HAVE_SIGCONTEXT
+#    define SIGCONTEXT_NREGS _NGREG
+#    define SIGCONTEXT_FIRST_REG(scp) (((scp) -> uc_mcontext) . __gregs)
+#    define SIGCONTEXT_SP(scp) (_UC_MACHINE_SP (scp))
+#    define SIGCONTEXT_PC(scp) (_UC_MACHINE_PC (scp))
+#  endif
 
 #  define INITIALIZE_UX_SIGNAL_CODES()                                  \
   do {                                                                  \