Просмотр исходного кода

Fix regression introduced on last commit with wrong ImageEnd

gdkchan 8 лет назад
Родитель
Сommit
13214ffa43
3 измененных файлов с 21 добавлено и 14 удалено
  1. 1 1
      Ryujinx.Core/Loaders/Executable.cs
  2. 14 7
      Ryujinx.Core/OsHle/Homebrew.cs
  3. 6 6
      Ryujinx.Core/OsHle/Process.cs

+ 1 - 1
Ryujinx.Core/Loaders/Executable.cs

@@ -56,7 +56,7 @@ namespace Ryujinx.Core.Loaders
 
             MapBss(BssStartOffset, BssEndOffset - BssStartOffset);
 
-            ImageEnd = ImageBase + BssEndOffset;
+            ImageEnd = BssEndOffset;
 
             while (true)
             {

+ 14 - 7
Ryujinx.Core/OsHle/Homebrew.cs

@@ -2,26 +2,33 @@
 
 namespace Ryujinx.Core.OsHle
 {
-    public class Homebrew
+    static class Homebrew
     {
         //http://switchbrew.org/index.php?title=Homebrew_ABI
-        public Homebrew(AMemory Memory, long Position, long MainThreadHandle)
+        public static void WriteHbAbiData(AMemory Memory, long Position, int MainThreadHandle)
         {
-            //(NbrKeys * LoaderConfigEntrySize) + 2 buffers for Key2
-            long Size = (4 * 0x18) + 0x1000;
-            Memory.Manager.MapPhys(Position, Size, (int)MemoryType.Normal, AMemoryPerm.RW);
+            Memory.Manager.MapPhys(Position, AMemoryMgr.PageSize, (int)MemoryType.Normal, AMemoryPerm.RW);
 
             //MainThreadHandle
             WriteConfigEntry(Memory, ref Position, 1, 0, MainThreadHandle);
+
             //NextLoadPath
-            WriteConfigEntry(Memory, ref Position, 2, 0, Position + Size, Position + Size + 0x200);
+            WriteConfigEntry(Memory, ref Position, 2, 0, Position + 0x200, Position + 0x400);
+
             //AppletType
             WriteConfigEntry(Memory, ref Position, 7);
+
             //EndOfList
             WriteConfigEntry(Memory, ref Position, 0);
         }
 
-        private void WriteConfigEntry(AMemory Memory, ref long Position, int Key, int Flags = 0, long Value0 = 0L, long Value1 = 0L)
+        private static void WriteConfigEntry(
+            AMemory  Memory,
+            ref long Position,
+            int      Key,
+            int      Flags  = 0,
+            long     Value0 = 0,
+            long     Value1 = 0)
         {
             Memory.WriteInt32(Position + 0x00, Key);
             Memory.WriteInt32(Position + 0x04, Flags);

+ 6 - 6
Ryujinx.Core/OsHle/Process.cs

@@ -113,9 +113,11 @@ namespace Ryujinx.Core.OsHle
 
             if (UseHbAbi)
             {
-                Homebrew Homebrew_ABI = new Homebrew(Memory, Executables[0].ImageEnd, (long)Handle);
+                long HbAbiDataPosition = (Executables[0].ImageEnd + 0xfff) & ~0xfff;
 
-                MainThread.Thread.ThreadState.X0 = (ulong)Executables[0].ImageEnd;
+                Homebrew.WriteHbAbiData(Memory, HbAbiDataPosition, Handle);
+
+                MainThread.Thread.ThreadState.X0 = (ulong)HbAbiDataPosition;
                 MainThread.Thread.ThreadState.X1 = ulong.MaxValue;
             }
 
@@ -223,14 +225,12 @@ namespace Ryujinx.Core.OsHle
                 {
                     foreach (KeyValuePair<long, string> KV in Exe.SymbolTable)
                     {                        
-                        SymbolTable.Add(Exe.ImageBase + KV.Key, KV.Value);
+                        SymbolTable.TryAdd(Exe.ImageBase + KV.Key, KV.Value);
                     }
                 }
 
                 Translator = new ATranslator(SymbolTable);
 
-                
-
                 Translator.CpuTrace += CpuTraceHandler;
             }
 
@@ -239,7 +239,7 @@ namespace Ryujinx.Core.OsHle
 
         private void CpuTraceHandler(object sender, ACpuTraceEventArgs e)
         {
-            Logging.Info($"Executing at 0x{e.Position:x16} {e.SubName}");
+            Logging.Trace($"Executing at 0x{e.Position:x16} {e.SubName}");
         }
 
         private int GetFreeTlsSlot(AThread Thread)