| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- // Copyright 2014 Citra Emulator Project
- // Licensed under GPLv2 or any later version
- // Refer to the license.txt file included.
- #pragma once
- #include "common/common_types.h"
- #include "core/arm/skyeye_common/arm_regformat.h"
- #include "core/arm/skyeye_common/vfp/asm_vfp.h"
- /// Generic ARM11 CPU interface
- class ARM_Interface : NonCopyable {
- public:
- virtual ~ARM_Interface() {}
- struct ThreadContext {
- u32 cpu_registers[13];
- u32 sp;
- u32 lr;
- u32 pc;
- u32 cpsr;
- u32 fpu_registers[64];
- u32 fpscr;
- u32 fpexc;
- };
- /**
- * Runs the CPU for the given number of instructions
- * @param num_instructions Number of instructions to run
- */
- void Run(int num_instructions) {
- ExecuteInstructions(num_instructions);
- this->num_instructions += num_instructions;
- }
- /// Step CPU by one instruction
- void Step() {
- Run(1);
- }
- /// Clear all instruction cache
- virtual void ClearInstructionCache() = 0;
- /**
- * Set the Program Counter to an address
- * @param addr Address to set PC to
- */
- virtual void SetPC(u32 addr) = 0;
- /*
- * Get the current Program Counter
- * @return Returns current PC
- */
- virtual u32 GetPC() const = 0;
- /**
- * Get an ARM register
- * @param index Register index (0-15)
- * @return Returns the value in the register
- */
- virtual u32 GetReg(int index) const = 0;
- /**
- * Set an ARM register
- * @param index Register index (0-15)
- * @param value Value to set register to
- */
- virtual void SetReg(int index, u32 value) = 0;
- /**
- * Gets the value of a VFP register
- * @param index Register index (0-31)
- * @return Returns the value in the register
- */
- virtual u32 GetVFPReg(int index) const = 0;
- /**
- * Sets a VFP register to the given value
- * @param index Register index (0-31)
- * @param value Value to set register to
- */
- virtual void SetVFPReg(int index, u32 value) = 0;
- /**
- * Gets the current value within a given VFP system register
- * @param reg The VFP system register
- * @return The value within the VFP system register
- */
- virtual u32 GetVFPSystemReg(VFPSystemRegister reg) const = 0;
- /**
- * Sets the VFP system register to the given value
- * @param reg The VFP system register
- * @param value Value to set the VFP system register to
- */
- virtual void SetVFPSystemReg(VFPSystemRegister reg, u32 value) = 0;
- /**
- * Get the current CPSR register
- * @return Returns the value of the CPSR register
- */
- virtual u32 GetCPSR() const = 0;
- /**
- * Set the current CPSR register
- * @param cpsr Value to set CPSR to
- */
- virtual void SetCPSR(u32 cpsr) = 0;
- /**
- * Gets the value stored in a CP15 register.
- * @param reg The CP15 register to retrieve the value from.
- * @return the value stored in the given CP15 register.
- */
- virtual u32 GetCP15Register(CP15Register reg) = 0;
- /**
- * Stores the given value into the indicated CP15 register.
- * @param reg The CP15 register to store the value into.
- * @param value The value to store into the CP15 register.
- */
- virtual void SetCP15Register(CP15Register reg, u32 value) = 0;
- /**
- * Advance the CPU core by the specified number of ticks (e.g. to simulate CPU execution time)
- * @param ticks Number of ticks to advance the CPU core
- */
- virtual void AddTicks(u64 ticks) = 0;
- /**
- * Saves the current CPU context
- * @param ctx Thread context to save
- */
- virtual void SaveContext(ThreadContext& ctx) = 0;
- /**
- * Loads a CPU context
- * @param ctx Thread context to load
- */
- virtual void LoadContext(const ThreadContext& ctx) = 0;
- /// Prepare core for thread reschedule (if needed to correctly handle state)
- virtual void PrepareReschedule() = 0;
- /// Getter for num_instructions
- u64 GetNumInstructions() const {
- return num_instructions;
- }
- s64 down_count = 0; ///< A decreasing counter of remaining cycles before the next event,
- /// decreased by the cpu run loop
- protected:
- /**
- * Executes the given number of instructions
- * @param num_instructions Number of instructions to executes
- */
- virtual void ExecuteInstructions(int num_instructions) = 0;
- private:
- u64 num_instructions = 0; ///< Number of instructions executed
- };
|