/* This file is part of the dynarmic project. * Copyright (c) 2016 MerryMage * SPDX-License-Identifier: 0BSD */ #pragma once #include #include #include #include #include #include "dynarmic/interface/A32/config.h" #include "dynarmic/interface/halt_reason.h" namespace Dynarmic { namespace A32 { class Jit final { public: explicit Jit(UserConfig conf); ~Jit(); /** * Runs the emulated CPU. * Cannot be recursively called. */ HaltReason Run(); /** * Steps the emulated CPU. * Cannot be recursively called. */ HaltReason Step(); /** * Clears the code cache of all compiled code. * Can be called at any time. Halts execution if called within a callback. */ void ClearCache(); /** * Invalidate the code cache at a range of addresses. * @param start_address The starting address of the range to invalidate. * @param length The length (in bytes) of the range to invalidate. */ void InvalidateCacheRange(std::uint32_t start_address, std::size_t length); /** * Reset CPU state to state at startup. Does not clear code cache. * Cannot be called from a callback. */ void Reset(); /** * Stops execution in Jit::Run. */ void HaltExecution(HaltReason hr = HaltReason::UserDefined1); /** * Clears a halt reason from flags. * Warning: Only use this if you're sure this won't introduce races. */ void ClearHalt(HaltReason hr = HaltReason::UserDefined1); /// View and modify registers. std::array& Regs(); const std::array& Regs() const; std::array& ExtRegs(); const std::array& ExtRegs() const; /// View and modify CPSR. std::uint32_t Cpsr() const; void SetCpsr(std::uint32_t value); /// View and modify FPSCR. std::uint32_t Fpscr() const; void SetFpscr(std::uint32_t value); /// Clears exclusive state for this core. void ClearExclusiveState(); /** * Returns true if Jit::Run was called but hasn't returned yet. * i.e.: We're in a callback. */ bool IsExecuting() const { return is_executing; } /// Debugging: Dump a disassembly all compiled code to the console. void DumpDisassembly() const; /** * Disassemble the instructions following the current pc and return * the resulting instructions as a vector of their string representations. */ std::vector Disassemble() const; private: bool is_executing = false; struct Impl; std::unique_ptr impl; }; } // namespace A32 } // namespace Dynarmic