From b59b8ac943007b12e9d92464bd811488b483849a Mon Sep 17 00:00:00 2001
From: LotP1 <68976644+LotP1@users.noreply.github.com>
Date: Fri, 29 Nov 2024 23:32:55 +0100
Subject: [PATCH] JIT Sparse Function Table random crash fix (#319)
A couple of games have random crashing with the JIT Sparse Ftable changes, and it seems to have been caused by an insufficient int size returned by `AddressTableLevel#GetValue(ulong address)`.
It was 32 bits (Int32), but the GiantBlock (which is the current address table impl) uses potentially 36 bits for the first level.
---
src/ARMeilleure/Common/AddressTableLevel.cs | 4 ++--
src/ARMeilleure/Translation/PTC/Ptc.cs | 2 +-
src/Ryujinx.Cpu/AddressTable.cs | 2 +-
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/ARMeilleure/Common/AddressTableLevel.cs b/src/ARMeilleure/Common/AddressTableLevel.cs
index 6107726ee..af3b9b99f 100644
--- a/src/ARMeilleure/Common/AddressTableLevel.cs
+++ b/src/ARMeilleure/Common/AddressTableLevel.cs
@@ -36,9 +36,9 @@ namespace ARMeilleure.Common
///
/// Guest address
/// Value of the from the specified guest
- public int GetValue(ulong address)
+ public long GetValue(ulong address)
{
- return (int)((address & Mask) >> Index);
+ return (long)((address & Mask) >> Index);
}
}
}
diff --git a/src/ARMeilleure/Translation/PTC/Ptc.cs b/src/ARMeilleure/Translation/PTC/Ptc.cs
index c722ce6be..841e5fefa 100644
--- a/src/ARMeilleure/Translation/PTC/Ptc.cs
+++ b/src/ARMeilleure/Translation/PTC/Ptc.cs
@@ -30,7 +30,7 @@ namespace ARMeilleure.Translation.PTC
private const string OuterHeaderMagicString = "PTCohd\0\0";
private const string InnerHeaderMagicString = "PTCihd\0\0";
- private const uint InternalVersion = 6992; //! To be incremented manually for each change to the ARMeilleure project.
+ private const uint InternalVersion = 6997; //! To be incremented manually for each change to the ARMeilleure project.
private const string ActualDir = "0";
private const string BackupDir = "1";
diff --git a/src/Ryujinx.Cpu/AddressTable.cs b/src/Ryujinx.Cpu/AddressTable.cs
index d87b12ab0..038a2009c 100644
--- a/src/Ryujinx.Cpu/AddressTable.cs
+++ b/src/Ryujinx.Cpu/AddressTable.cs
@@ -238,7 +238,7 @@ namespace ARMeilleure.Common
{
TEntry* page = GetPage(address);
- int index = Levels[^1].GetValue(address);
+ long index = Levels[^1].GetValue(address);
EnsureMapped((IntPtr)(page + index));