diff --git a/Ryujinx.Core/Loaders/Executable.cs b/Ryujinx.Core/Loaders/Executable.cs index c6770c7b37..95cb7d6f6c 100644 --- a/Ryujinx.Core/Loaders/Executable.cs +++ b/Ryujinx.Core/Loaders/Executable.cs @@ -56,7 +56,7 @@ namespace Ryujinx.Core.Loaders MapBss(BssStartOffset, BssEndOffset - BssStartOffset); - ImageEnd = ImageBase + BssEndOffset; + ImageEnd = BssEndOffset; while (true) { diff --git a/Ryujinx.Core/OsHle/Homebrew.cs b/Ryujinx.Core/OsHle/Homebrew.cs index b69b31c993..f177b37e36 100644 --- a/Ryujinx.Core/OsHle/Homebrew.cs +++ b/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); diff --git a/Ryujinx.Core/OsHle/Process.cs b/Ryujinx.Core/OsHle/Process.cs index 60e71ee995..9ca9a2bd5c 100644 --- a/Ryujinx.Core/OsHle/Process.cs +++ b/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 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)