Jelajahi Sumber

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.
LotP1 1 tahun lalu
induk
melakukan
facc12a94a

+ 2 - 2
src/ARMeilleure/Common/AddressTableLevel.cs

@@ -36,9 +36,9 @@ namespace ARMeilleure.Common
         /// </summary>
         /// <param name="address">Guest address</param>
         /// <returns>Value of the <see cref="AddressTableLevel"/> from the specified guest <paramref name="address"/></returns>
-        public int GetValue(ulong address)
+        public long GetValue(ulong address)
         {
-            return (int)((address & Mask) >> Index);
+            return (long)((address & Mask) >> Index);
         }
     }
 }

+ 1 - 1
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";

+ 1 - 1
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));