From 3ace5deadf5c1d22ae4ec0f6f4ba97fe4e9b3500 Mon Sep 17 00:00:00 2001 From: LotP Date: Sun, 14 Jun 2026 21:25:18 -0500 Subject: [PATCH] fix-tests - downgrade unicorn to last working version - update to new cp reg struct system - remove nonexistent register (used to silently continue) - fix partial unmap tests - InitializeSignalHandler() was moved out of the translator (almost 2.5 years ago), but the test code was never updated to manually call the function as it was changed to do in the real cpu context, so the tests just started failing. - by manually initializing the handler we no longer cause tests to fail. --- Directory.Packages.props | 2 +- src/Ryujinx.Cpu/Signal/NativeSignalHandler.cs | 2 +- src/Ryujinx.Tests.Unicorn/UnicornAArch32.cs | 49 ++++++++++++++++++- src/Ryujinx.Tests/Memory/PartialUnmaps.cs | 3 ++ 4 files changed, 52 insertions(+), 4 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index af6398a7f..2ffc197a8 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -50,6 +50,6 @@ - + diff --git a/src/Ryujinx.Cpu/Signal/NativeSignalHandler.cs b/src/Ryujinx.Cpu/Signal/NativeSignalHandler.cs index 299adfbbd..c271636c1 100644 --- a/src/Ryujinx.Cpu/Signal/NativeSignalHandler.cs +++ b/src/Ryujinx.Cpu/Signal/NativeSignalHandler.cs @@ -53,7 +53,7 @@ namespace Ryujinx.Cpu.Signal public SignalHandlerRangeArray Ranges; } - static class NativeSignalHandler + public static class NativeSignalHandler { private static readonly nint _handlerConfig; private static nint _signalHandlerPtr; diff --git a/src/Ryujinx.Tests.Unicorn/UnicornAArch32.cs b/src/Ryujinx.Tests.Unicorn/UnicornAArch32.cs index b35f8f146..b5579701a 100644 --- a/src/Ryujinx.Tests.Unicorn/UnicornAArch32.cs +++ b/src/Ryujinx.Tests.Unicorn/UnicornAArch32.cs @@ -1,10 +1,23 @@ using System; +using System.Runtime.InteropServices; using UnicornEngine.Const; namespace Ryujinx.Tests.Unicorn { public class UnicornAArch32 : IDisposable { + struct UcArmCpReg + { + public uint Cp; + public uint Is64; + public uint Sec; + public uint CRn; + public uint CRm; + public uint Opc1; + public uint Opc2; + public uint Val; + } + internal readonly UnicornEngine.Unicorn Uc; private bool _isDisposed; @@ -38,7 +51,7 @@ namespace Ryujinx.Tests.Unicorn public int Fpscr { - get => (int)GetRegister(Arm.UC_ARM_REG_FPSCR) | ((int)GetRegister(Arm.UC_ARM_REG_FPSCR_NZCV)); + get => (int)GetRegister(Arm.UC_ARM_REG_FPSCR); set => SetRegister(Arm.UC_ARM_REG_FPSCR, (uint)value); } @@ -86,7 +99,21 @@ namespace Ryujinx.Tests.Unicorn { Uc = new UnicornEngine.Unicorn(Common.UC_ARCH_ARM, Common.UC_MODE_LITTLE_ENDIAN); - SetRegister(Arm.UC_ARM_REG_C1_C0_2, GetRegister(Arm.UC_ARM_REG_C1_C0_2) | 0xf00000); + UcArmCpReg reg = new() + { + Cp = 15, + Is64 = 0, + Sec = 0, + CRn = 13, + Opc1 = 0, + CRm = 0, + Opc2 = 2 + }; + + GetRegister(Arm.UC_ARM_REG_CP_REG, ref reg); + reg.Val |= 0xf00000; + SetRegister(Arm.UC_ARM_REG_CP_REG, reg); + SetRegister(Arm.UC_ARM_REG_FPEXC, 0x40000000); } @@ -204,6 +231,17 @@ namespace Ryujinx.Tests.Unicorn SetVector(Arm.UC_ARM_REG_D0 + index * 2, value); } + public void GetRegister(int register, ref T obj) where T : unmanaged + { + Span span = new(ref obj); + Span dataSpan = MemoryMarshal.Cast(span); + byte[] data = dataSpan.ToArray(); + + Uc.RegRead(register, data); + + data.AsSpan().CopyTo(dataSpan); + } + public uint GetRegister(int register) { byte[] data = new byte[4]; @@ -213,6 +251,13 @@ namespace Ryujinx.Tests.Unicorn return BitConverter.ToUInt32(data, 0); } + public void SetRegister(int register, T obj) where T : unmanaged + { + byte[] data = MemoryMarshal.Cast(new Span(ref obj)).ToArray(); + + Uc.RegWrite(register, data); + } + public void SetRegister(int register, uint value) { byte[] data = BitConverter.GetBytes(value); diff --git a/src/Ryujinx.Tests/Memory/PartialUnmaps.cs b/src/Ryujinx.Tests/Memory/PartialUnmaps.cs index 6042b82df..f8ab2546c 100644 --- a/src/Ryujinx.Tests/Memory/PartialUnmaps.cs +++ b/src/Ryujinx.Tests/Memory/PartialUnmaps.cs @@ -8,6 +8,7 @@ using Ryujinx.Common.Memory; using Ryujinx.Common.Memory.PartialUnmaps; using Ryujinx.Cpu; using Ryujinx.Cpu.Jit; +using Ryujinx.Cpu.Signal; using Ryujinx.Memory; using Ryujinx.Memory.Tracking; using System; @@ -61,6 +62,8 @@ namespace Ryujinx.Tests.Memory new JitMemoryAllocator(), new MockMemoryManager(), AddressTable.CreateForArm(true, MemoryManagerType.SoftwarePageTable)); + + NativeSignalHandler.InitializeSignalHandler(); } [Test]