aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Core
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Core')
-rw-r--r--Ryujinx.Core/Loaders/ElfSym.cs9
-rw-r--r--Ryujinx.Core/Loaders/Executable.cs30
-rw-r--r--Ryujinx.Core/OsHle/Process.cs39
-rw-r--r--Ryujinx.Core/OsHle/Svc/SvcHandler.cs3
4 files changed, 64 insertions, 17 deletions
diff --git a/Ryujinx.Core/Loaders/ElfSym.cs b/Ryujinx.Core/Loaders/ElfSym.cs
index 35a45500..89e7c61f 100644
--- a/Ryujinx.Core/Loaders/ElfSym.cs
+++ b/Ryujinx.Core/Loaders/ElfSym.cs
@@ -16,17 +16,15 @@ namespace Ryujinx.Core.Loaders
Binding == ElfSymBinding.STB_GLOBAL ||
Binding == ElfSymBinding.STB_WEAK;
- public int SHIdx { get; private set; }
- public long ValueAbs { get; private set; }
- public long Value { get; private set; }
- public long Size { get; private set; }
+ public int SHIdx { get; private set; }
+ public long Value { get; private set; }
+ public long Size { get; private set; }
public ElfSym(
string Name,
int Info,
int Other,
int SHIdx,
- long ImageBase,
long Value,
long Size)
{
@@ -35,7 +33,6 @@ namespace Ryujinx.Core.Loaders
this.Binding = (ElfSymBinding)(Info >> 4);
this.Visibility = (ElfSymVisibility)Other;
this.SHIdx = SHIdx;
- this.ValueAbs = Value + ImageBase;
this.Value = Value;
this.Size = Size;
}
diff --git a/Ryujinx.Core/Loaders/Executable.cs b/Ryujinx.Core/Loaders/Executable.cs
index e2660838..c6770c7b 100644
--- a/Ryujinx.Core/Loaders/Executable.cs
+++ b/Ryujinx.Core/Loaders/Executable.cs
@@ -9,13 +9,21 @@ namespace Ryujinx.Core.Loaders
{
private AMemory Memory;
- private ElfDyn[] Dynamic;
+ private List<ElfDyn> Dynamic;
+
+ private Dictionary<long, string> m_SymbolTable;
+
+ public IReadOnlyDictionary<long, string> SymbolTable => m_SymbolTable;
public long ImageBase { get; private set; }
public long ImageEnd { get; private set; }
public Executable(IExecutable Exe, AMemory Memory, long ImageBase)
{
+ Dynamic = new List<ElfDyn>();
+
+ m_SymbolTable = new Dictionary<long, string>();
+
this.Memory = Memory;
this.ImageBase = ImageBase;
this.ImageEnd = ImageBase;
@@ -48,9 +56,7 @@ namespace Ryujinx.Core.Loaders
MapBss(BssStartOffset, BssEndOffset - BssStartOffset);
- ImageEnd = BssEndOffset;
-
- List<ElfDyn> Dynamic = new List<ElfDyn>();
+ ImageEnd = ImageBase + BssEndOffset;
while (true)
{
@@ -69,7 +75,19 @@ namespace Ryujinx.Core.Loaders
Dynamic.Add(new ElfDyn(Tag, Value));
}
- this.Dynamic = Dynamic.ToArray();
+ long StrTblAddr = ImageBase + GetFirstValue(ElfDynTag.DT_STRTAB);
+ long SymTblAddr = ImageBase + GetFirstValue(ElfDynTag.DT_SYMTAB);
+
+ long SymEntSize = GetFirstValue(ElfDynTag.DT_SYMENT);
+
+ while ((ulong)SymTblAddr < (ulong)StrTblAddr)
+ {
+ ElfSym Sym = GetSymbol(SymTblAddr, StrTblAddr);
+
+ m_SymbolTable.TryAdd(Sym.Value, Sym.Name);
+
+ SymTblAddr += SymEntSize;
+ }
}
private void WriteData(
@@ -135,7 +153,7 @@ namespace Ryujinx.Core.Loaders
Name += (char)Chr;
}
- return new ElfSym(Name, Info, Other, SHIdx, ImageBase, Value, Size);
+ return new ElfSym(Name, Info, Other, SHIdx, Value, Size);
}
private long GetFirstValue(ElfDynTag Tag)
diff --git a/Ryujinx.Core/OsHle/Process.cs b/Ryujinx.Core/OsHle/Process.cs
index 3e265ed3..60e71ee9 100644
--- a/Ryujinx.Core/OsHle/Process.cs
+++ b/Ryujinx.Core/OsHle/Process.cs
@@ -1,6 +1,6 @@
using ChocolArm64;
+using ChocolArm64.Events;
using ChocolArm64.Memory;
-using ChocolArm64.State;
using Ryujinx.Core.Loaders;
using Ryujinx.Core.Loaders.Executables;
using Ryujinx.Core.OsHle.Exceptions;
@@ -24,6 +24,8 @@ namespace Ryujinx.Core.OsHle
private Switch Ns;
+ private ATranslator Translator;
+
public int ProcessId { get; private set; }
public AMemory Memory { get; private set; }
@@ -171,7 +173,7 @@ namespace Ryujinx.Core.OsHle
ThreadPrio = ThreadPriority.Lowest;
}
- AThread Thread = new AThread(Memory, ThreadPrio, EntryPoint);
+ AThread Thread = new AThread(GetTranslator(), Memory, ThreadPrio, EntryPoint);
HThread ThreadHnd = new HThread(Thread, ProcessorId, Priority);
@@ -201,16 +203,45 @@ namespace Ryujinx.Core.OsHle
return Handle;
}
- private void BreakHandler(object sender, AInstExceptEventArgs e)
+ private void BreakHandler(object sender, AInstExceptionEventArgs e)
{
throw new GuestBrokeExecutionException();
}
- private void UndefinedHandler(object sender, AInstUndEventArgs e)
+ private void UndefinedHandler(object sender, AInstUndefinedEventArgs e)
{
throw new UndefinedInstructionException(e.Position, e.RawOpCode);
}
+ private ATranslator GetTranslator()
+ {
+ if (Translator == null)
+ {
+ Dictionary<long, string> SymbolTable = new Dictionary<long, string>();
+
+ foreach (Executable Exe in Executables)
+ {
+ foreach (KeyValuePair<long, string> KV in Exe.SymbolTable)
+ {
+ SymbolTable.Add(Exe.ImageBase + KV.Key, KV.Value);
+ }
+ }
+
+ Translator = new ATranslator(SymbolTable);
+
+
+
+ Translator.CpuTrace += CpuTraceHandler;
+ }
+
+ return Translator;
+ }
+
+ private void CpuTraceHandler(object sender, ACpuTraceEventArgs e)
+ {
+ Logging.Info($"Executing at 0x{e.Position:x16} {e.SubName}");
+ }
+
private int GetFreeTlsSlot(AThread Thread)
{
for (int Index = 1; Index < TotalTlsSlots; Index++)
diff --git a/Ryujinx.Core/OsHle/Svc/SvcHandler.cs b/Ryujinx.Core/OsHle/Svc/SvcHandler.cs
index c5b6da04..ec53f47f 100644
--- a/Ryujinx.Core/OsHle/Svc/SvcHandler.cs
+++ b/Ryujinx.Core/OsHle/Svc/SvcHandler.cs
@@ -1,3 +1,4 @@
+using ChocolArm64.Events;
using ChocolArm64.Memory;
using ChocolArm64.State;
using System;
@@ -62,7 +63,7 @@ namespace Ryujinx.Core.OsHle.Svc
Rng = new Random();
}
- public void SvcCall(object sender, AInstExceptEventArgs e)
+ public void SvcCall(object sender, AInstExceptionEventArgs e)
{
AThreadState ThreadState = (AThreadState)sender;