From f90205fd1c1585468c3043aaf0d6652911134e8d Mon Sep 17 00:00:00 2001 From: lizzie Date: Sun, 29 Mar 2026 17:19:31 +0000 Subject: [PATCH 1/2] fixup --- .../backend/exception_handler_posix.cpp | 2 +- src/dynarmic/src/dynarmic/common/context.h | 42 +++++++++++++------ 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/src/dynarmic/src/dynarmic/backend/exception_handler_posix.cpp b/src/dynarmic/src/dynarmic/backend/exception_handler_posix.cpp index 4154fd6db4..e42ab0e46d 100644 --- a/src/dynarmic/src/dynarmic/backend/exception_handler_posix.cpp +++ b/src/dynarmic/src/dynarmic/backend/exception_handler_posix.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. diff --git a/src/dynarmic/src/dynarmic/common/context.h b/src/dynarmic/src/dynarmic/common/context.h index 98dc0d8780..ced30b79af 100644 --- a/src/dynarmic/src/dynarmic/common/context.h +++ b/src/dynarmic/src/dynarmic/common/context.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #pragma once @@ -34,23 +34,21 @@ # endif #endif -#ifdef ARCHITECTURE_x86_64 +#ifdef ARCHITECTURE_arm64 # ifdef __OpenBSD__ # define CTX_DECLARE(raw_context) ucontext_t* ucontext = reinterpret_cast(raw_context); # else -# define CTX_DECLARE(raw_context) \ - ucontext_t* ucontext = reinterpret_cast(raw_context); \ - [[maybe_unused]] auto& mctx = ucontext->uc_mcontext; -# endif -#elif defined(ARCHITECTURE_arm64) -# ifdef __OpenBSD__ -# define CTX_DECLARE(raw_context) ucontext_t* ucontext = reinterpret_cast(raw_context); -# else -# define CTX_DECLARE(raw_context) \ - ucontext_t* ucontext = reinterpret_cast(raw_context); \ +# define CTX_DECLARE(raw_context) ucontext_t* ucontext = reinterpret_cast(raw_context); \ [[maybe_unused]] auto& mctx = ucontext->uc_mcontext; \ [[maybe_unused]] const auto fpctx = GetFloatingPointState(mctx); # endif +#else +# ifdef __OpenBSD__ +# define CTX_DECLARE(raw_context) ucontext_t* ucontext = reinterpret_cast(raw_context); +# else +# define CTX_DECLARE(raw_context) ucontext_t* ucontext = reinterpret_cast(raw_context); \ + [[maybe_unused]] auto& mctx = ucontext->uc_mcontext; +# endif #endif #if defined(ARCHITECTURE_x86_64) @@ -67,6 +65,7 @@ # define CTX_RIP (mctx.__gregs[_REG_RIP]) # define CTX_RSP (mctx.__gregs[_REG_RSP]) # elif defined(__OpenBSD__) +// https://github.com/openbsd/src/blob/master/sys/arch/x86_64/include/signal.h # define CTX_RIP (ucontext->sc_rip) # define CTX_RSP (ucontext->sc_rsp) # elif defined(__sun__) @@ -110,6 +109,7 @@ # define CTX_X(i) (mctx.mc_gpregs.gp_x[i]) # define CTX_Q(i) (mctx.mc_fpregs.fp_q[i]) # elif defined(__OpenBSD__) +// https://github.com/openbsd/src/blob/master/sys/arch/arm64/include/signal.h # define CTX_PC (ucontext->sc_elr) # define CTX_SP (ucontext->sc_sp) # define CTX_LR (ucontext->sc_lr) @@ -126,12 +126,30 @@ # define CTX_SEPC (mctx.__gregs[REG_PC]) # define CTX_SP (mctx.__gregs[REG_SP]) # elif defined(__NetBSD__) +// https://github.com/NetBSD/src/blob/trunk/sys/arch/riscv/include/mcontext.h # define CTX_SEPC (mctx.__gregs[_REG_PC]) # define CTX_SP (mctx.__gregs[_REG_SP]) # elif defined(__OpenBSD__) +// https://github.com/openbsd/src/blob/master/sys/arch/riscv64/include/signal.h # define CTX_SEPC (ucontext->sc_sepc) # define CTX_SP (ucontext->sc_sp) # endif +#elif defined(ARCHITECTURE_powerpc64) +# if defined(__FreeBSD__) +# define CTX_PC (mctx.mc_srr0) +# define CTX_SP (mctx.mc_gpr[1]) +# elif defined(__linux__) +// https://github.com/lattera/glibc/blob/master/sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h +# define CTX_PC (mctx.uc_regs[REG_PC]) +# define CTX_SP (mctx.uc_regs[REG_SP]) +# elif defined(__NetBSD__) +# define CTX_PC (mctx.__gregs[_REG_PC]) +# define CTX_SP (mctx.__gregs[_REG_R1]) +# elif defined(__OpenBSD__) +// https://github.com/openbsd/src/blob/master/sys/arch/powerpc64/include/signal.h +# define CTX_PC (ucontext->sc_pc) +# define CTX_SP (ucontext->sc_reg[1]) +# endif #else # error "unimplemented" #endif From c7b501d798696d04ab699aea91c8170be6b56870 Mon Sep 17 00:00:00 2001 From: lizzie Date: Sun, 29 Mar 2026 17:55:57 +0000 Subject: [PATCH 2/2] more robust --- src/dynarmic/src/dynarmic/common/context.h | 114 ++++++++++++++------- 1 file changed, 77 insertions(+), 37 deletions(-) diff --git a/src/dynarmic/src/dynarmic/common/context.h b/src/dynarmic/src/dynarmic/common/context.h index ced30b79af..e849c9861b 100644 --- a/src/dynarmic/src/dynarmic/common/context.h +++ b/src/dynarmic/src/dynarmic/common/context.h @@ -51,33 +51,7 @@ # endif #endif -#if defined(ARCHITECTURE_x86_64) -# if defined(__APPLE__) -# define CTX_RIP (mctx->__ss.__rip) -# define CTX_RSP (mctx->__ss.__rsp) -# elif defined(__linux__) -# define CTX_RIP (mctx.gregs[REG_RIP]) -# define CTX_RSP (mctx.gregs[REG_RSP]) -# elif defined(__FreeBSD__) -# define CTX_RIP (mctx.mc_rip) -# define CTX_RSP (mctx.mc_rsp) -# elif defined(__NetBSD__) -# define CTX_RIP (mctx.__gregs[_REG_RIP]) -# define CTX_RSP (mctx.__gregs[_REG_RSP]) -# elif defined(__OpenBSD__) -// https://github.com/openbsd/src/blob/master/sys/arch/x86_64/include/signal.h -# define CTX_RIP (ucontext->sc_rip) -# define CTX_RSP (ucontext->sc_rsp) -# elif defined(__sun__) -# define CTX_RIP (mctx.gregs[REG_RIP]) -# define CTX_RSP (mctx.gregs[REG_RSP]) -# elif defined(__DragonFly__) -# define CTX_RIP (mctx.mc_rip) -# define CTX_RSP (mctx.mc_rsp) -# else -# error "Unknown platform" -# endif -#elif defined(ARCHITECTURE_arm64) +#ifdef ARCHITECTURE_arm64 # if defined(__APPLE__) # define CTX_PC (mctx->__ss.__pc) # define CTX_SP (mctx->__ss.__sp) @@ -116,7 +90,39 @@ # define CTX_X(i) (ucontext->sc_x[i]) # define CTX_Q(i) (ucontext->sc_q[i]) # else -# error "Unknown platform" +# error "unknown platform" +# endif +#elif defined(__NetBSD__) +// NetBSD always has useful macros for everything don't they? +// Basically this special path means that for every arch that NetBSD supports +// it atleast has the macro for _UC_MACHINE defined, thus it will be avoided on the +// other macro branches! +// https://github.com/NetBSD/src/blob/trunk/sys/arch/powerpc/include/mcontext.h +// https://github.com/NetBSD/src/blob/trunk/sys/arch/mips/include/mcontext.h +# define CTX_PC (_UC_MACHINE_PC(ucontext)) +# define CTX_SP (_UC_MACHINE_SP(ucontext)) +#elif defined(ARCHITECTURE_x86_64) +# if defined(__APPLE__) +# define CTX_RIP (mctx->__ss.__rip) +# define CTX_RSP (mctx->__ss.__rsp) +# elif defined(__linux__) +# define CTX_RIP (mctx.gregs[REG_RIP]) +# define CTX_RSP (mctx.gregs[REG_RSP]) +# elif defined(__FreeBSD__) +# define CTX_RIP (mctx.mc_rip) +# define CTX_RSP (mctx.mc_rsp) +# elif defined(__OpenBSD__) +// https://github.com/openbsd/src/blob/master/sys/arch/x86_64/include/signal.h +# define CTX_RIP (ucontext->sc_rip) +# define CTX_RSP (ucontext->sc_rsp) +# elif defined(__sun__) +# define CTX_RIP (mctx.gregs[REG_RIP]) +# define CTX_RSP (mctx.gregs[REG_RSP]) +# elif defined(__DragonFly__) +# define CTX_RIP (mctx.mc_rip) +# define CTX_RSP (mctx.mc_rsp) +# else +# error "unknown platform" # endif #elif defined(ARCHITECTURE_riscv64) # if defined(__FreeBSD__) @@ -125,14 +131,12 @@ # elif defined(__linux__) # define CTX_SEPC (mctx.__gregs[REG_PC]) # define CTX_SP (mctx.__gregs[REG_SP]) -# elif defined(__NetBSD__) -// https://github.com/NetBSD/src/blob/trunk/sys/arch/riscv/include/mcontext.h -# define CTX_SEPC (mctx.__gregs[_REG_PC]) -# define CTX_SP (mctx.__gregs[_REG_SP]) # elif defined(__OpenBSD__) // https://github.com/openbsd/src/blob/master/sys/arch/riscv64/include/signal.h # define CTX_SEPC (ucontext->sc_sepc) # define CTX_SP (ucontext->sc_sp) +# else +# error "unknown platform" # endif #elif defined(ARCHITECTURE_powerpc64) # if defined(__FreeBSD__) @@ -140,15 +144,51 @@ # define CTX_SP (mctx.mc_gpr[1]) # elif defined(__linux__) // https://github.com/lattera/glibc/blob/master/sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h -# define CTX_PC (mctx.uc_regs[REG_PC]) -# define CTX_SP (mctx.uc_regs[REG_SP]) -# elif defined(__NetBSD__) -# define CTX_PC (mctx.__gregs[_REG_PC]) -# define CTX_SP (mctx.__gregs[_REG_R1]) +# define CTX_PC (mctx.__regs[REG_PC]) +# define CTX_SP (mctx.__regs[REG_SP]) # elif defined(__OpenBSD__) // https://github.com/openbsd/src/blob/master/sys/arch/powerpc64/include/signal.h # define CTX_PC (ucontext->sc_pc) # define CTX_SP (ucontext->sc_reg[1]) +# else +# error "unknown platform" +# endif +#elif defined(ARCHITECTURE_mips64) +# if defined(__linux__) +// https://github.com/lattera/glibc/blob/master/sysdeps/unix/sysv/linux/mips/sys/ucontext.h +# define CTX_PC (mctx.__pc) +# define CTX_SP (mctx.__gregs[29]) +# elif defined(__OpenBSD__) +// https://github.com/openbsd/src/blob/master/sys/arch/mips64/include/signal.h +# define CTX_PC (ucontext->sc_pc) +# define CTX_SP (ucontext->sc_regs[29]) +# else +# error "unknown platform" +# endif +#elif defined(ARCHITECTURE_loongarch64) +# if defined(__linux__) +// https://github.com/bminor/glibc/blob/04e750e75b73957cf1c791535a3f4319534a52fc/sysdeps/unix/sysv/linux/loongarch/sys/ucontext.h +# define CTX_PC (mctx.__pc) +# define CTX_SP (mctx.__gregs[LARCH_REG_SP]) +# elif defined(__OpenBSD__) +// Literally MIPS64 copypaste? +// https://github.com/openbsd/src/blob/master/sys/arch/loongson/include/signal.h +# define CTX_PC (ucontext->sc_pc) +# define CTX_SP (ucontext->sc_regs[29]) +# else +# error "unknown platform" +# endif +#elif defined(ARCHITECTURE_sparc64) +# if defined(__linux__) +// https://github.com/lattera/glibc/blob/master/sysdeps/unix/sysv/linux/mips/sys/ucontext.h +# define CTX_PC (mctx.__gregs[1]) //%pc +# define CTX_SP (mctx.__gregs[17]) //%o6 +# elif defined(__OpenBSD__) +// https://github.com/openbsd/src/blob/master/sys/arch/sparc64/include/signal.h +# define CTX_PC (ucontext->sc_pc) +# define CTX_SP (ucontext->sc_sp) +# else +# error "unknown platform" # endif #else # error "unimplemented"