#include "DebuggerState.h" #include #include namespace FEX::DebuggerState { FEXCore::Context::Context *s_CTX{}; FEXCore::Config::ConfigCore s_CoreType = FEXCore::Config::ConfigCore::CONFIG_INTERPRETER; int s_IsStepping = 0; bool NewState = false; std::function StepCallback; std::function PauseCallback; std::function ContinueCallback; std::function NewStateCallback; std::function CloseCallback; std::function CreateCallback; std::function CompileRIPCallback; std::function GetIRCallback; bool ActiveCore() { return s_CTX != nullptr; } void SetContext(FEXCore::Context::Context *ctx) { s_CTX = ctx; } FEXCore::Context::Context *GetContext() { return s_CTX; } FEXCore::Config::ConfigCore GetCoreType() { return s_CoreType; } void SetCoreType(FEXCore::Config::ConfigCore CoreType) { s_CoreType = CoreType; } int GetRunningMode() { return s_IsStepping; } int GetCoreCurrentRunningMode() { if (ActiveCore()) { return FEXCore::Config::GetConfig(s_CTX, FEXCore::Config::CONFIG_SINGLESTEP); } return s_IsStepping; } void SetRunningMode(int RunningMode) { s_IsStepping = RunningMode; if (ActiveCore()) { FEXCore::Config::SetConfig(s_CTX, FEXCore::Config::CONFIG_SINGLESTEP, RunningMode); } } FEXCore::Core::CPUState GetCPUState() { auto ret = FEXCore::Core::CPUState{}; if (ActiveCore()) { FEXCore::Context::GetCPUState(s_CTX, &ret); } return ret; } bool IsCoreRunning() { if (!ActiveCore()) { return false; } return !FEXCore::Context::IsDone(s_CTX); } // Client interface void RegisterStepCallback(std::function Callback) { StepCallback = std::move(Callback); } void RegisterPauseCallback(std::function Callback) { PauseCallback = std::move(Callback); } void RegisterContinueCallback(std::function Callback) { ContinueCallback = std::move(Callback); } void Step() { StepCallback(); } void Pause() { PauseCallback(); } void Continue() { ContinueCallback(); } void RegisterCreateCallback(std::function Callback) { CreateCallback = std::move(Callback); } void Create(char const *Filename, bool ELF) { CreateCallback(Filename, ELF); } void RegisterCompileRIPCallback(std::function Callback) { CompileRIPCallback = std::move(Callback); } void CompileRIP(uint64_t RIP) { CompileRIPCallback(RIP); } void RegisterCloseCallback(std::function Callback) { CloseCallback = std::move(Callback); } void Close() { CloseCallback(); } void RegisterNewStateCallback(std::function Callback) { NewStateCallback = std::move(Callback); } void RegisterGetIRCallback(std::function Callback) { GetIRCallback = std::move(Callback); } void GetIR(std::stringstream *out, uint64_t PC) { GetIRCallback(out, PC); } void CallNewState() { NewStateCallback(); } bool HasNewState() { return NewState; } void SetHasNewState(bool State) { NewState = State; } }