$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 +#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)