aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Cpu/LightningJit/CodeGen/Arm64/StackWalker.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Ryujinx.Cpu/LightningJit/CodeGen/Arm64/StackWalker.cs')
-rw-r--r--src/Ryujinx.Cpu/LightningJit/CodeGen/Arm64/StackWalker.cs30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/Ryujinx.Cpu/LightningJit/CodeGen/Arm64/StackWalker.cs b/src/Ryujinx.Cpu/LightningJit/CodeGen/Arm64/StackWalker.cs
new file mode 100644
index 00000000..3b01e674
--- /dev/null
+++ b/src/Ryujinx.Cpu/LightningJit/CodeGen/Arm64/StackWalker.cs
@@ -0,0 +1,30 @@
+using System;
+using System.Collections.Generic;
+using System.Runtime.InteropServices;
+
+namespace Ryujinx.Cpu.LightningJit.CodeGen.Arm64
+{
+ class StackWalker : IStackWalker
+ {
+ public IEnumerable<ulong> GetCallStack(IntPtr framePointer, IntPtr codeRegionStart, int codeRegionSize, IntPtr codeRegion2Start, int codeRegion2Size)
+ {
+ List<ulong> functionPointers = new();
+
+ while (true)
+ {
+ IntPtr functionPointer = Marshal.ReadIntPtr(framePointer, IntPtr.Size);
+
+ if ((functionPointer < codeRegionStart || functionPointer >= codeRegionStart + codeRegionSize) &&
+ (functionPointer < codeRegion2Start || functionPointer >= codeRegion2Start + codeRegion2Size))
+ {
+ break;
+ }
+
+ functionPointers.Add((ulong)functionPointer - 4);
+ framePointer = Marshal.ReadIntPtr(framePointer);
+ }
+
+ return functionPointers;
+ }
+ }
+}