Files
2016-01-21 23:40:00 +01:00

72 lines
2.6 KiB
Plaintext

$NetBSD: patch-ag,v 1.5 2015/02/28 23:43:32 joerg Exp $
--- src/Unix/sigsegv.cpp.orig 2006-03-30 22:45:49.000000000 +0000
+++ src/Unix/sigsegv.cpp
@@ -226,7 +226,7 @@ static void powerpc_decode_instruction(i
#if HAVE_SIGINFO_T
// Generic extended signal handler
-#if defined(__FreeBSD__)
+#if defined(__FreeBSD__) || defined(__DragonFly__)
#define SIGSEGV_ALL_SIGNALS FAULT_HANDLER(SIGBUS)
#else
#define SIGSEGV_ALL_SIGNALS FAULT_HANDLER(SIGSEGV)
@@ -264,7 +264,7 @@ static void powerpc_decode_instruction(i
#define SIGSEGV_SKIP_INSTRUCTION ix86_skip_instruction
#endif
#endif
-#if defined(__FreeBSD__) || defined(__OpenBSD__)
+#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__DragonFly__)
#if (defined(i386) || defined(__i386__))
#define SIGSEGV_FAULT_INSTRUCTION (((struct sigcontext *)scp)->sc_eip)
#define SIGSEGV_REGISTER_FILE ((unsigned long *)&(((struct sigcontext *)scp)->sc_edi)) /* EDI is the first GPR (even below EIP) in sigcontext */
@@ -286,6 +286,13 @@ static void powerpc_decode_instruction(i
#define SIGSEGV_REGISTER_FILE (unsigned long *)&SIGSEGV_CONTEXT_REGS[_REG_PC], (unsigned long *)&SIGSEGV_CONTEXT_REGS[_REG_R0]
#define SIGSEGV_SKIP_INSTRUCTION powerpc_skip_instruction
#endif
+#if (defined(arm) || defined(__arm__))
+#include <sys/ucontext.h>
+#define SIGSEGV_CONTEXT_REGS (((ucontext_t *)scp)->uc_mcontext.__gregs)
+#define SIGSEGV_FAULT_INSTRUCTION SIGSEGV_CONTEXT_REGS[_REG_PC]
+#define SIGSEGV_REGISTER_FILE (unsigned long *)SIGSEGV_CONTEXT_REGS
+#define SIGSEGV_SKIP_INSTRUCTION arm_skip_instruction
+#endif
#endif
#if defined(__linux__)
#if (defined(i386) || defined(__i386__))
@@ -451,7 +458,7 @@ static sigsegv_address_t get_fault_addre
#define SIGSEGV_ALL_SIGNALS FAULT_HANDLER(SIGSEGV)
#endif
#endif
-#if defined(__FreeBSD__)
+#if defined(__FreeBSD__) || defined(__DragonFly__)
#if (defined(i386) || defined(__i386__))
#define SIGSEGV_ALL_SIGNALS FAULT_HANDLER(SIGBUS)
#define SIGSEGV_FAULT_HANDLER_ARGLIST int sig, int code, struct sigcontext *scp, char *addr
@@ -721,10 +728,14 @@ enum {
#endif
};
#endif
-#if defined(__FreeBSD__)
+#if defined(__FreeBSD__) || defined(__DragonFly__)
enum {
#if (defined(i386) || defined(__i386__))
+# if (defined(__FreeBSD__) && __FreeBSD_version >= 500000)
X86_REG_EIP = 10,
+#else
+ X86_REG_EIP = 11,
+#endif
X86_REG_EAX = 7,
X86_REG_ECX = 6,
X86_REG_EDX = 5,
@@ -1450,6 +1461,9 @@ enum {
#if (defined(__linux__))
ARM_REG_PC = 15,
ARM_REG_CPSR = 16
+#elif defined(__NetBSD__)
+ ARM_REG_PC = _REG_PC,
+ ARM_REG_CPSR = _REG_CPSR
#endif
};
static bool arm_skip_instruction(unsigned long * regs)