Path: blob/main/emulators/amiberry/files/patch-src_osdep_sigsegv__handler.cpp
46590 views
--- src/osdep/sigsegv_handler.cpp.orig 2026-04-26 06:59:39 UTC1+++ src/osdep/sigsegv_handler.cpp2@@ -63,6 +63,9 @@ void init_max_signals()3#else4#include <sys/ucontext.h>5#endif6+#if defined(__FreeBSD__) && defined(CPU_AARCH64)7+#include <machine/ucontext.h>8+#endif9#include <csignal>10#include <dlfcn.h>1112@@ -154,8 +157,10 @@ static int handle_exception(mcontext_t sigcont, long f13#endif14{15int handled = HANDLE_EXCEPTION_NONE;16+#if defined(__FreeBSD__) && defined(CPU_AARCH64)17+ auto fault_pc = static_cast<uintptr>(sigcont->mc_gpregs.gp_elr);18+#elif !defined(__MACH__)19// Mac OS X struct for this is different20-#ifndef __MACH__21auto fault_pc = static_cast<uintptr>(sigcont->pc);22#else23auto fault_pc = static_cast<uintptr>(sigcont->__ss.__pc);24@@ -199,7 +204,9 @@ static int handle_exception(mcontext_t sigcont, long f25// Check for stupid RAM detection of kickstart26if (a3000lmem_bank.allocated_size > 0 && amiga_addr >= a3000lmem_bank.start - 0x00100000 && amiga_addr < a3000lmem_bank.start - 0x00100000 + 8) {27output_log(_T(" Stupid kickstart detection for size of ramsey_low at 0x%08x.\n"), amiga_addr);28-#ifndef __MACH__29+#if defined(__FreeBSD__) && defined(CPU_AARCH64)30+ sigcont->mc_gpregs.gp_elr += 4;31+#elif !defined(__MACH__)32sigcont->pc += 4;33#else34sigcont->__ss.__pc += 4;35@@ -211,7 +218,9 @@ static int handle_exception(mcontext_t sigcont, long f36// Check for stupid RAM detection of kickstart37if (a3000hmem_bank.allocated_size > 0 && amiga_addr >= a3000hmem_bank.start + a3000hmem_bank.allocated_size && amiga_addr < a3000hmem_bank.start + a3000hmem_bank.allocated_size + 8) {38output_log(_T(" Stupid kickstart detection for size of ramsey_high at 0x%08x.\n"), amiga_addr);39-#ifndef __MACH__40+#if defined(__FreeBSD__) && defined(CPU_AARCH64)41+ sigcont->mc_gpregs.gp_elr += 4;42+#elif !defined(__MACH__)43sigcont->pc += 4;44#else45sigcont->__ss.__pc += 4;46@@ -241,43 +250,58 @@ static int handle_exception(mcontext_t sigcont, long f47transfer_type_t transfer_type = TYPE_UNKNOWN;48int transfer_size = SIZE_UNKNOWN;4950- const auto get_reg_w = [&](const int reg) -> uae_u32 {51- if (reg == 31)52- return 0;53-#ifndef __MACH__54- return static_cast<uae_u32>(sigcont->regs[reg]);55+ const auto get_reg_w = [&](const int reg) -> uae_u32 {56+ if (reg == 31)57+ return 0;58+#if defined(__FreeBSD__) && defined(CPU_AARCH64)59+ if (reg < 30)60+ return static_cast<uae_u32>(sigcont->mc_gpregs.gp_x[reg]);61+ return static_cast<uae_u32>(sigcont->mc_gpregs.gp_lr);62+#elif !defined(__MACH__)63+ return static_cast<uae_u32>(sigcont->regs[reg]);64#else65- return static_cast<uae_u32>(sigcont->__ss.__x[reg]);66+ return static_cast<uae_u32>(sigcont->__ss.__x[reg]);67#endif68- };69- const auto get_reg_x = [&](const int reg) -> uae_u64 {70- if (reg == 31)71- return 0;72-#ifndef __MACH__73- return static_cast<uae_u64>(sigcont->regs[reg]);74+ };75+ const auto get_reg_x = [&](const int reg) -> uae_u64 {76+ if (reg == 31)77+ return 0;78+#if defined(__FreeBSD__) && defined(CPU_AARCH64)79+ if (reg < 30)80+ return static_cast<uae_u64>(sigcont->mc_gpregs.gp_x[reg]);81+ return static_cast<uae_u64>(sigcont->mc_gpregs.gp_lr);82+#elif !defined(__MACH__)83+ return static_cast<uae_u64>(sigcont->regs[reg]);84#else85- return static_cast<uae_u64>(sigcont->__ss.__x[reg]);86+ return static_cast<uae_u64>(sigcont->__ss.__x[reg]);87#endif88- };89- const auto get_base_x = [&](const int reg) -> uae_u64 {90- if (reg == 31) {91-#ifndef __MACH__92- return static_cast<uae_u64>(sigcont->sp);93+ };94+ const auto get_base_x = [&](const int reg) -> uae_u64 {95+ if (reg == 31) {96+#if defined(__FreeBSD__) && defined(CPU_AARCH64)97+ return static_cast<uae_u64>(sigcont->mc_gpregs.gp_sp);98+#elif !defined(__MACH__)99+ return static_cast<uae_u64>(sigcont->sp);100#else101- return static_cast<uae_u64>(sigcont->__ss.__sp);102+ return static_cast<uae_u64>(sigcont->__ss.__sp);103#endif104- }105- return get_reg_x(reg);106- };107- const auto set_reg_w = [&](const int reg, const uae_u32 value) {108- if (reg == 31)109- return;110-#ifndef __MACH__111- sigcont->regs[reg] = value;112+ }113+ return get_reg_x(reg);114+ };115+ const auto set_reg_w = [&](const int reg, const uae_u32 value) {116+ if (reg == 31)117+ return;118+#if defined(__FreeBSD__) && defined(CPU_AARCH64)119+ if (reg < 30)120+ sigcont->mc_gpregs.gp_x[reg] = value;121+ else122+ sigcont->mc_gpregs.gp_lr = value;123+#elif !defined(__MACH__)124+ sigcont->regs[reg] = value;125#else126- sigcont->__ss.__x[reg] = value;127+ sigcont->__ss.__x[reg] = value;128#endif129- };130+ };131132// Decode memory operands for additional diagnostics.133const int rd = opcode & 0x1f;134@@ -489,7 +513,9 @@ static int handle_exception(mcontext_t sigcont, long f135}136137// Go to next instruction138-#ifndef __MACH__139+#if defined(__FreeBSD__) && defined(CPU_AARCH64)140+ sigcont->mc_gpregs.gp_elr += 4;141+#elif !defined(__MACH__)142sigcont->pc += 4;143#else144sigcont->__ss.__pc += 4;145@@ -557,10 +583,14 @@ void signal_segv(int signum, siginfo_t* info, void* pt146147#ifndef __MACH__148mcontext_t* context = &(ucontext->uc_mcontext);149- unsigned long long* regs = context->regs;150+#if defined(__FreeBSD__) && defined(CPU_AARCH64)151+ [[maybe_unused]] unsigned long long* regs = reinterpret_cast<unsigned long long*>(context->mc_gpregs.gp_x);152#else153+ [[maybe_unused]] unsigned long long* regs = context->regs;154+#endif155+#else156mcontext_t context = ucontext->uc_mcontext;157- unsigned long long* regs = context->__ss.__x;158+ [[maybe_unused]] unsigned long long* regs = context->__ss.__x;159#endif160161const auto addr = reinterpret_cast<uintptr>(info->si_addr);162@@ -585,13 +615,24 @@ void signal_segv(int signum, siginfo_t* info, void* pt163if (signum == 4)164output_log(_T(" value = 0x%08x\n"), *static_cast<uae_u32*>(info->si_addr));165166- for (int i = 0; i < 31; ++i)167-#ifndef __MACH__168- output_log(_T("x%02d = 0x%016llx\n"), i, ucontext->uc_mcontext.regs[i]);169-#else170- output_log(_T("x%02d = 0x%016llx\n"), i, context->__ss.__x[i]);171-#endif172-#ifndef __MACH__173+ #if defined(__FreeBSD__) && defined(CPU_AARCH64)174+ for (int i = 0; i < 30; ++i)175+ output_log(_T("x%02d = 0x%016llx\n"), i, ucontext->uc_mcontext.mc_gpregs.gp_x[i]);176+ output_log(_T("x30 = 0x%016llx\n"), ucontext->uc_mcontext.mc_gpregs.gp_lr);177+ #elif !defined(__MACH__)178+ for (int i = 0; i < 31; ++i)179+ output_log(_T("x%02d = 0x%016llx\n"), i, ucontext->uc_mcontext.regs[i]);180+ #else181+ for (int i = 0; i < 31; ++i)182+ output_log(_T("x%02d = 0x%016llx\n"), i, context->__ss.__x[i]);183+ #endif184+#if defined(__FreeBSD__) && defined(CPU_AARCH64)185+ output_log(_T("SP = 0x%016llx\n"), ucontext->uc_mcontext.mc_gpregs.gp_sp);186+ output_log(_T("PC = 0x%016llx\n"), ucontext->uc_mcontext.mc_gpregs.gp_elr);187+ output_log(_T("Fault Address = 0x%016llx\n"), static_cast<unsigned long long>(reinterpret_cast<uintptr_t>(info->si_addr)));188+ output_log(_T("SPSR = 0x%016llx\n"), static_cast<unsigned long long>(ucontext->uc_mcontext.mc_gpregs.gp_spsr));189+ void* getaddr = reinterpret_cast<void*>(ucontext->uc_mcontext.mc_gpregs.gp_lr);190+#elif !defined(__MACH__)191output_log(_T("SP = 0x%016llx\n"), ucontext->uc_mcontext.sp);192output_log(_T("PC = 0x%016llx\n"), ucontext->uc_mcontext.pc);193output_log(_T("Fault Address = 0x%016llx\n"), ucontext->uc_mcontext.fault_address);194@@ -672,10 +713,14 @@ void signal_buserror(int signum, siginfo_t* info, void195196#ifndef __MACH__197mcontext_t* context = &(ucontext->uc_mcontext);198- unsigned long long* regs = context->regs;199+#if defined(__FreeBSD__) && defined(CPU_AARCH64)200+ [[maybe_unused]] unsigned long long* regs = reinterpret_cast<unsigned long long*>(context->mc_gpregs.gp_x);201#else202+ [[maybe_unused]] unsigned long long* regs = context->regs;203+#endif204+#else205mcontext_t context = ucontext->uc_mcontext;206- unsigned long long* regs = context->__ss.__x;207+ [[maybe_unused]] unsigned long long* regs = context->__ss.__x;208#endif209210auto addr = reinterpret_cast<uintptr_t>(info->si_addr);211@@ -695,8 +740,17 @@ void signal_buserror(int signum, siginfo_t* info, void212if (signum == 4)213output_log(_T(" value = 0x%08x\n"), *static_cast<uae_u32*>(info->si_addr));214215+ #if defined(__FreeBSD__) && defined(CPU_AARCH64)216+ for (int i = 0; i < 30; ++i)217+ output_log(_T("x%02d = 0x%016llx\n"), i, ucontext->uc_mcontext.mc_gpregs.gp_x[i]);218+ output_log(_T("x30 = 0x%016llx\n"), ucontext->uc_mcontext.mc_gpregs.gp_lr);219+ output_log(_T("SP = 0x%016llx\n"), ucontext->uc_mcontext.mc_gpregs.gp_sp);220+ output_log(_T("PC = 0x%016llx\n"), ucontext->uc_mcontext.mc_gpregs.gp_elr);221+ output_log(_T("Fault Address = 0x%016llx\n"), static_cast<unsigned long long>(reinterpret_cast<uintptr_t>(info->si_addr)));222+ output_log(_T("SPSR = 0x%016llx\n"), static_cast<unsigned long long>(ucontext->uc_mcontext.mc_gpregs.gp_spsr));223+ void* getaddr = reinterpret_cast<void*>(ucontext->uc_mcontext.mc_gpregs.gp_lr);224+ #elif !defined(__MACH__)225for (int i = 0; i < 31; ++i)226-#ifndef __MACH__227output_log(_T("x%02d = 0x%016llx\n"), i, ucontext->uc_mcontext.regs[i]);228output_log(_T("SP = 0x%016llx\n"), ucontext->uc_mcontext.sp);229output_log(_T("PC = 0x%016llx\n"), ucontext->uc_mcontext.pc);230@@ -704,7 +758,8 @@ void signal_buserror(int signum, siginfo_t* info, void231output_log(_T("pstate = 0x%016llx\n"), ucontext->uc_mcontext.pstate);232233void* getaddr = (void*)ucontext->uc_mcontext.regs[30];234-#else235+ #else236+ for (int i = 0; i < 31; ++i)237output_log(_T("x%02d = 0x%016llx\n"), i, context->__ss.__x[i]);238output_log(_T("SP = 0x%016llx\n"), context->__ss.__sp);239output_log(_T("PC = 0x%016llx\n"), context->__ss.__pc);240241242