From b615f507015926ba2ea91b9270aacbac856821c5 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 437889f7a..4bc8a0f2a 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -50,7 +50,7 @@ - + diff --git a/src/Ryujinx.Cpu/Signal/NativeSignalHandler.cs b/src/Ryujinx.Cpu/Signal/NativeSignalHandler.cs index f00d3f770..1da59a95a 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 717d9f84a..2115be190 100644 --- a/src/Ryujinx.Tests/Memory/PartialUnmaps.cs +++ b/src/Ryujinx.Tests/Memory/PartialUnmaps.cs @@ -7,6 +7,7 @@ using NUnit.Framework.Legacy; 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; @@ -60,6 +61,8 @@ namespace Ryujinx.Tests.Memory new JitMemoryAllocator(), new MockMemoryManager(), AddressTable.CreateForArm(true, MemoryManagerType.SoftwarePageTable)); + + NativeSignalHandler.InitializeSignalHandler(); } [Test]