0
0
Fork 0

Fix regression introduced on last commit with wrong ImageEnd

This commit is contained in:
gdkchan 2018-02-25 22:44:30 -03:00
parent 950011c90f
commit 13214ffa43
3 changed files with 21 additions and 14 deletions

View file

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

View file

@ -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);

View file

@ -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)