aboutsummaryrefslogtreecommitdiff
path: root/ChocolArm64/State/AThreadState.cs
diff options
context:
space:
mode:
Diffstat (limited to 'ChocolArm64/State/AThreadState.cs')
-rw-r--r--ChocolArm64/State/AThreadState.cs30
1 files changed, 30 insertions, 0 deletions
diff --git a/ChocolArm64/State/AThreadState.cs b/ChocolArm64/State/AThreadState.cs
index 6f3f62f6..ce127886 100644
--- a/ChocolArm64/State/AThreadState.cs
+++ b/ChocolArm64/State/AThreadState.cs
@@ -1,5 +1,6 @@
using ChocolArm64.Events;
using System;
+using System.Collections.Generic;
using System.Diagnostics;
namespace ChocolArm64.State
@@ -56,10 +57,17 @@ namespace ChocolArm64.State
public event EventHandler<AInstExceptionEventArgs> SvcCall;
public event EventHandler<AInstUndefinedEventArgs> Undefined;
+ private Stack<long> CallStack;
+
private static Stopwatch TickCounter;
private static double HostTickFreq;
+ public AThreadState()
+ {
+ CallStack = new Stack<long>();
+ }
+
static AThreadState()
{
HostTickFreq = 1.0 / Stopwatch.Frequency;
@@ -83,5 +91,27 @@ namespace ChocolArm64.State
{
Undefined?.Invoke(this, new AInstUndefinedEventArgs(Position, RawOpCode));
}
+
+ internal void EnterMethod(long Position)
+ {
+ CallStack.Push(Position);
+ }
+
+ internal void ExitMethod()
+ {
+ CallStack.TryPop(out _);
+ }
+
+ internal void JumpMethod(long Position)
+ {
+ CallStack.TryPop(out _);
+
+ CallStack.Push(Position);
+ }
+
+ public long[] GetCallStack()
+ {
+ return CallStack.ToArray();
+ }
}
} \ No newline at end of file