aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Cpu/LightningJit/CodeGen/Arm64/StackWalker.cs
blob: 3b01e674bc1f8cf2a41d6623add4a47a68842839 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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;
        }
    }
}