aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Kernel/Process/HleProcessDebugger.cs
diff options
context:
space:
mode:
authorThog <me@thog.eu>2020-01-12 12:06:26 +0100
committerGitHub <noreply@github.com>2020-01-12 12:06:26 +0100
commit9c8d48edff8e43318550a087816542391dffea83 (patch)
tree66423944888c0f5c299846877762f87c693386a9 /Ryujinx.HLE/HOS/Kernel/Process/HleProcessDebugger.cs
parent78f6b1d3968a6c439cb36af74cae13c040c61af1 (diff)
Add 32 bits support to HleProcessDebugger (#859)
Co-authored-by: riperiperi <rhy3756547@hotmail.com>
Diffstat (limited to 'Ryujinx.HLE/HOS/Kernel/Process/HleProcessDebugger.cs')
-rw-r--r--Ryujinx.HLE/HOS/Kernel/Process/HleProcessDebugger.cs117
1 files changed, 86 insertions, 31 deletions
diff --git a/Ryujinx.HLE/HOS/Kernel/Process/HleProcessDebugger.cs b/Ryujinx.HLE/HOS/Kernel/Process/HleProcessDebugger.cs
index 4219eb75..75f52851 100644
--- a/Ryujinx.HLE/HOS/Kernel/Process/HleProcessDebugger.cs
+++ b/Ryujinx.HLE/HOS/Kernel/Process/HleProcessDebugger.cs
@@ -1,9 +1,12 @@
using ARMeilleure.Memory;
+using Ryujinx.Common;
using Ryujinx.HLE.HOS.Diagnostics.Demangler;
using Ryujinx.HLE.HOS.Kernel.Memory;
using Ryujinx.HLE.Loaders.Elf;
using System.Collections.Generic;
+using System.IO;
using System.Linq;
+using System.Runtime.CompilerServices;
using System.Text;
using System.Threading;
@@ -72,25 +75,43 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
}
}
- // TODO: ARM32.
- long framePointer = (long)context.GetX(29);
-
trace.AppendLine($"Process: {_owner.Name}, PID: {_owner.Pid}");
- while (framePointer != 0)
+ if (context.IsAarch32)
{
- if ((framePointer & 7) != 0 ||
- !_owner.CpuMemory.IsMapped(framePointer) ||
- !_owner.CpuMemory.IsMapped(framePointer + 8))
+ long framePointer = (long)context.GetX(11);
+
+ while (framePointer != 0)
{
- break;
+ if ((framePointer & 3) != 0 ||
+ !_owner.CpuMemory.IsMapped(framePointer) ||
+ !_owner.CpuMemory.IsMapped(framePointer + 4))
+ {
+ break;
+ }
+
+ AppendTrace(_owner.CpuMemory.ReadInt32(framePointer + 4));
+
+ framePointer = _owner.CpuMemory.ReadInt32(framePointer);
}
+ }
+ else
+ {
+ long framePointer = (long)context.GetX(29);
- // Note: This is the return address, we need to subtract one instruction
- // worth of bytes to get the branch instruction address.
- AppendTrace(_owner.CpuMemory.ReadInt64(framePointer + 8) - 4);
+ while (framePointer != 0)
+ {
+ if ((framePointer & 7) != 0 ||
+ !_owner.CpuMemory.IsMapped(framePointer) ||
+ !_owner.CpuMemory.IsMapped(framePointer + 8))
+ {
+ break;
+ }
- framePointer = _owner.CpuMemory.ReadInt64(framePointer);
+ AppendTrace(_owner.CpuMemory.ReadInt64(framePointer + 8));
+
+ framePointer = _owner.CpuMemory.ReadInt64(framePointer);
+ }
}
return trace.ToString();
@@ -111,9 +132,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
ElfSymbol symbol = image.Symbols[middle];
- long endAddr = symbol.Value + symbol.Size;
+ ulong endAddr = symbol.Value + symbol.Size;
- if ((ulong)address >= (ulong)symbol.Value && (ulong)address < (ulong)endAddr)
+ if ((ulong)address >= symbol.Value && (ulong)address < endAddr)
{
name = symbol.Name;
@@ -242,13 +263,28 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
long ehHdrEndOffset = memory.ReadInt32(mod0Offset + 0x14) + mod0Offset;
long modObjOffset = memory.ReadInt32(mod0Offset + 0x18) + mod0Offset;
- // TODO: Elf32.
+ bool isAArch32 = memory.ReadUInt64(dynamicOffset) > 0xFFFFFFFF || memory.ReadUInt64(dynamicOffset + 0x10) > 0xFFFFFFFF;
+
while (true)
{
- long tagVal = memory.ReadInt64(dynamicOffset + 0);
- long value = memory.ReadInt64(dynamicOffset + 8);
+ long tagVal;
+ long value;
+
+ if (isAArch32)
+ {
+ tagVal = memory.ReadInt32(dynamicOffset + 0);
+ value = memory.ReadInt32(dynamicOffset + 4);
+
+ dynamicOffset += 0x8;
+ }
+ else
+ {
+ tagVal = memory.ReadInt64(dynamicOffset + 0);
+ value = memory.ReadInt64(dynamicOffset + 8);
+
+ dynamicOffset += 0x10;
+ }
- dynamicOffset += 0x10;
ElfDynamicTag tag = (ElfDynamicTag)tagVal;
@@ -274,7 +310,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
while ((ulong)symTblAddr < (ulong)strTblAddr)
{
- ElfSymbol sym = GetSymbol(memory, symTblAddr, strTblAddr);
+ ElfSymbol sym = isAArch32 ? GetSymbol32(memory, symTblAddr, strTblAddr) : GetSymbol64(memory, symTblAddr, strTblAddr);
symbols.Add(sym);
@@ -287,23 +323,42 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
}
}
- private ElfSymbol GetSymbol(MemoryManager memory, long address, long strTblAddr)
+ private ElfSymbol GetSymbol64(MemoryManager memory, long address, long strTblAddr)
{
- int nameIndex = memory.ReadInt32(address + 0);
- int info = memory.ReadByte (address + 4);
- int other = memory.ReadByte (address + 5);
- int shIdx = memory.ReadInt16(address + 6);
- long value = memory.ReadInt64(address + 8);
- long size = memory.ReadInt64(address + 16);
+ using (BinaryReader inputStream = new BinaryReader(new MemoryStream(memory.ReadBytes(address, Unsafe.SizeOf<ElfSymbol64>()))))
+ {
+ ElfSymbol64 sym = inputStream.ReadStruct<ElfSymbol64>();
- string name = string.Empty;
+ uint nameIndex = sym.NameOffset;
- for (int chr; (chr = memory.ReadByte(strTblAddr + nameIndex++)) != 0;)
- {
- name += (char)chr;
+ string name = string.Empty;
+
+ for (int chr; (chr = memory.ReadByte(strTblAddr + nameIndex++)) != 0;)
+ {
+ name += (char)chr;
+ }
+
+ return new ElfSymbol(name, sym.Info, sym.Other, sym.SectionIndex, sym.ValueAddress, sym.Size);
}
+ }
+
+ private ElfSymbol GetSymbol32(MemoryManager memory, long address, long strTblAddr)
+ {
+ using (BinaryReader inputStream = new BinaryReader(new MemoryStream(memory.ReadBytes(address, Unsafe.SizeOf<ElfSymbol32>()))))
+ {
+ ElfSymbol32 sym = inputStream.ReadStruct<ElfSymbol32>();
+
+ uint nameIndex = sym.NameOffset;
- return new ElfSymbol(name, info, other, shIdx, value, size);
+ string name = string.Empty;
+
+ for (int chr; (chr = memory.ReadByte(strTblAddr + nameIndex++)) != 0;)
+ {
+ name += (char)chr;
+ }
+
+ return new ElfSymbol(name, sym.Info, sym.Other, sym.SectionIndex, sym.ValueAddress, sym.Size);
+ }
}
}
} \ No newline at end of file