--- CrossPlatform/sigsegv.h +++ CrossPlatform/sigsegv.h @@ -105,7 +105,24 @@ extern "C" { #define SIGSEGV_SKIP_INSTRUCTION ix86_skip_instruction #define SIGSEGV_REGISTER_FILE ((SIGSEGV_REGISTER_TYPE *)&SIP->thr_state.MACH_FIELD_NAME(rax)) /* RAX is the first GPR we consider */ #endif -#ifdef __x86_64__ + +#ifdef __arm64__ +#if __DARWIN_UNIX03 && defined _STRUCT_ARM_THREAD_STATE64 +#define MACH_FIELD_NAME(X) __CONCAT(__,X) +#endif +#define SIGSEGV_EXCEPTION_STATE_TYPE arm_exception_state64_t +#define SIGSEGV_EXCEPTION_STATE_FLAVOR ARM_EXCEPTION_STATE64 +#define SIGSEGV_EXCEPTION_STATE_COUNT ARM_EXCEPTION_STATE64_COUNT +#define SIGSEGV_FAULT_ADDRESS SIP->exc_state.MACH_FIELD_NAME(far) +#define SIGSEGV_THREAD_STATE_TYPE arm_thread_state64_t +#define SIGSEGV_THREAD_STATE_FLAVOR ARM_THREAD_STATE64 +#define SIGSEGV_THREAD_STATE_COUNT ARM_THREAD_STATE64_COUNT +#define SIGSEGV_FAULT_INSTRUCTION SIP->thr_state.MACH_FIELD_NAME(pc) +// #define SIGSEGV_SKIP_INSTRUCTION aarch64_skip_instruction +#define SIGSEGV_REGISTER_FILE (SIGSEGV_REGISTER_TYPE *)&SIP->thr_state.MACH_FIELD_NAME(pc) +#endif + +#if defined(__x86_64__) || defined(__arm64__) #define SIGSEGV_FAULT_ADDRESS_FAST (((uint64_t)code[1])|0x100000000) #else #define SIGSEGV_FAULT_ADDRESS_FAST code[1]