From 3b457a5876fda457b076dcd38e00c6f790d65691 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 6 Aug 2015 21:24:25 -0400 Subject: [PATCH] arm_interface: Implement interface for retrieving VFP registers --- src/core/arm/arm_interface.h | 28 ++++++++++++++++++++++ src/core/arm/dyncom/arm_dyncom.cpp | 16 +++++++++++++ src/core/arm/dyncom/arm_dyncom.h | 4 ++++ src/core/arm/skyeye_common/arm_regformat.h | 2 +- 4 files changed, 49 insertions(+), 1 deletion(-) diff --git a/src/core/arm/arm_interface.h b/src/core/arm/arm_interface.h index 85ed2c698d..5cffe513c9 100644 --- a/src/core/arm/arm_interface.h +++ b/src/core/arm/arm_interface.h @@ -61,6 +61,34 @@ public: */ 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 diff --git a/src/core/arm/dyncom/arm_dyncom.cpp b/src/core/arm/dyncom/arm_dyncom.cpp index c665f706f3..f3be2c857e 100644 --- a/src/core/arm/dyncom/arm_dyncom.cpp +++ b/src/core/arm/dyncom/arm_dyncom.cpp @@ -40,6 +40,22 @@ void ARM_DynCom::SetReg(int index, u32 value) { state->Reg[index] = value; } +u32 ARM_DynCom::GetVFPReg(int index) const { + return state->ExtReg[index]; +} + +void ARM_DynCom::SetVFPReg(int index, u32 value) { + state->ExtReg[index] = value; +} + +u32 ARM_DynCom::GetVFPSystemReg(VFPSystemRegister reg) const { + return state->VFP[reg]; +} + +void ARM_DynCom::SetVFPSystemReg(VFPSystemRegister reg, u32 value) { + state->VFP[reg] = value; +} + u32 ARM_DynCom::GetCPSR() const { return state->Cpsr; } diff --git a/src/core/arm/dyncom/arm_dyncom.h b/src/core/arm/dyncom/arm_dyncom.h index 87ab6908ab..3664fd7282 100644 --- a/src/core/arm/dyncom/arm_dyncom.h +++ b/src/core/arm/dyncom/arm_dyncom.h @@ -25,6 +25,10 @@ public: u32 GetPC() const override; u32 GetReg(int index) const override; void SetReg(int index, u32 value) override; + u32 GetVFPReg(int index) const override; + void SetVFPReg(int index, u32 value) override; + u32 GetVFPSystemReg(VFPSystemRegister reg) const override; + void SetVFPSystemReg(VFPSystemRegister reg, u32 value) override; u32 GetCPSR() const override; void SetCPSR(u32 cpsr) override; u32 GetCP15Register(CP15Register reg) override; diff --git a/src/core/arm/skyeye_common/arm_regformat.h b/src/core/arm/skyeye_common/arm_regformat.h index d1c721809d..38fa97ab91 100644 --- a/src/core/arm/skyeye_common/arm_regformat.h +++ b/src/core/arm/skyeye_common/arm_regformat.h @@ -55,7 +55,7 @@ enum { }; // VFP system registers -enum { +enum VFPSystemRegister { VFP_FPSID, VFP_FPSCR, VFP_FPEXC,