109 lines
2.4 KiB
C
Raw Permalink Normal View History

2016-07-01 21:01:06 +08:00
/* This file is part of the dynarmic project.
* Copyright (c) 2016 MerryMage
2020-04-23 15:25:11 +01:00
* SPDX-License-Identifier: 0BSD
2016-07-01 21:01:06 +08:00
*/
#pragma once
2016-08-25 18:22:08 +01:00
#include <cstddef>
#include <cstdint>
#include <memory>
2017-02-16 18:18:29 +00:00
#include <string>
#include <dynarmic/A32/config.h>
2016-07-01 21:01:06 +08:00
namespace Dynarmic {
namespace IR {
class LocationDescriptor;
}
2018-01-04 21:12:02 +00:00
}
namespace Dynarmic {
namespace A32 {
struct Context;
class Jit final {
public:
explicit Jit(UserConfig conf);
~Jit();
/**
2018-01-04 21:12:02 +00:00
* Runs the emulated CPU.
* Cannot be recursively called.
*/
2018-01-04 21:12:02 +00:00
void Run();
2020-04-06 15:35:43 +01:00
/**
* Steps the emulated CPU.
* Cannot be recursively called.
*/
void Step();
/**
* Clears the code cache of all compiled code.
* Can be called at any time. Halts execution if called within a callback.
*/
void ClearCache();
2017-02-16 18:18:29 +00:00
/**
* 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.
* Can only be called from a callback.
*/
void HaltExecution();
/// View and modify registers.
2016-08-25 18:22:08 +01:00
std::array<std::uint32_t, 16>& Regs();
const std::array<std::uint32_t, 16>& Regs() const;
std::array<std::uint32_t, 64>& ExtRegs();
const std::array<std::uint32_t, 64>& ExtRegs() const;
/// View and modify CPSR.
2016-08-25 18:22:08 +01:00
std::uint32_t Cpsr() const;
2017-12-02 13:55:04 +00:00
void SetCpsr(std::uint32_t value);
/// View and modify FPSCR.
2016-08-25 18:22:08 +01:00
std::uint32_t Fpscr() const;
2017-12-02 13:55:04 +00:00
void SetFpscr(std::uint32_t value);
Context SaveContext() const;
void SaveContext(Context&) const;
void LoadContext(const Context&);
/**
* 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;
}
2016-08-12 18:17:31 +01:00
/**
* @param descriptor Basic block descriptor.
* @return A string containing disassembly of the host machine code produced for the basic block.
*/
std::string Disassemble(const IR::LocationDescriptor& descriptor);
private:
bool is_executing = false;
2016-07-01 21:01:06 +08:00
struct Impl;
std::unique_ptr<Impl> impl;
2016-07-01 21:01:06 +08:00
};
2018-01-04 21:12:02 +00:00
} // namespace A32
2016-07-01 21:01:06 +08:00
} // namespace Dynarmic