diff --git a/src/Targets/RiscV/DebugModule/Registers/ControlRegister.hpp b/src/Targets/RiscV/DebugModule/Registers/ControlRegister.hpp new file mode 100644 index 00000000..fd85e474 --- /dev/null +++ b/src/Targets/RiscV/DebugModule/Registers/ControlRegister.hpp @@ -0,0 +1,68 @@ +#pragma once + +#include + +#include "src/Targets/RiscV/DebugModule/DebugModule.hpp" + +namespace Targets::RiscV::DebugModule::Registers +{ + enum HartSelectionMode: std::uint8_t + { + SINGLE = 0x00, + MULTI = 0x01, + }; + + struct ControlRegister + { + bool debugModuleActive:1 = false; + bool ndmReset:1 = false; + bool clearResetHaltRequest:1 = false; + bool setResetHaltRequest:1 = false; + bool clearKeepAlive:1 = false; + bool setKeepAlive:1 = false; + HartIndex selectedHartIndex:20 = 0; + HartSelectionMode hartSelectionMode:1 = HartSelectionMode::SINGLE; + bool acknowledgeUnavailableHarts:1 = false; + bool acknowledgeHaveReset:1 = false; + bool hartReset:1 = false; + bool resumeRequest:1 = false; + bool haltRequest:1 = false; + + ControlRegister() = default; + + explicit ControlRegister(RegisterValue registerValue) + : debugModuleActive(static_cast(registerValue & 0x01)) + , ndmReset(static_cast(registerValue & (0x01 << 1))) + , clearResetHaltRequest(static_cast(registerValue & (0x01 << 2))) + , setResetHaltRequest(static_cast(registerValue & (0x01 << 3))) + , clearKeepAlive(static_cast(registerValue & (0x01 << 4))) + , setKeepAlive(static_cast(registerValue & (0x01 << 5))) + , selectedHartIndex((((registerValue >> 6) & 0x3FF) << 10) | ((registerValue >> 16) & 0x3FF)) + , hartSelectionMode(static_cast(registerValue & (0x01 << 26))) + , acknowledgeUnavailableHarts(static_cast(registerValue & (0x01 << 27))) + , acknowledgeHaveReset(static_cast(registerValue & (0x01 << 28))) + , hartReset(static_cast(registerValue & (0x01 << 29))) + , resumeRequest(static_cast(registerValue & (0x01 << 30))) + , haltRequest(static_cast(registerValue & static_cast(0x01 << 31))) + {} + + RegisterValue value() const { + return RegisterValue{0} + | static_cast(this->debugModuleActive) + | static_cast(this->ndmReset) << 1 + | static_cast(this->clearResetHaltRequest) << 2 + | static_cast(this->setResetHaltRequest) << 3 + | static_cast(this->clearKeepAlive) << 4 + | static_cast(this->setKeepAlive) << 5 + | static_cast(this->selectedHartIndex >> 10) << 6 + | static_cast(this->selectedHartIndex & 0x3FF) << 16 + | static_cast(this->hartSelectionMode) << 26 + | static_cast(this->acknowledgeUnavailableHarts) << 27 + | static_cast(this->acknowledgeHaveReset) << 28 + | static_cast(this->hartReset) << 29 + | static_cast(this->resumeRequest) << 30 + | static_cast(this->haltRequest) << 31 + ; + } + }; +} diff --git a/src/Targets/RiscV/DebugModule/Registers/StatusRegister.hpp b/src/Targets/RiscV/DebugModule/Registers/StatusRegister.hpp new file mode 100644 index 00000000..8bf0aaeb --- /dev/null +++ b/src/Targets/RiscV/DebugModule/Registers/StatusRegister.hpp @@ -0,0 +1,80 @@ +#pragma once + +#include + +#include "src/Targets/RiscV/DebugModule/DebugModule.hpp" + +namespace Targets::RiscV::DebugModule::Registers +{ + struct StatusRegister + { + std::uint8_t version:4 = 0; + bool validConfigStructurePointer:1 = false; + bool supportsResetHalt:1 = false; + bool authBusy:1 = false; + bool authenticated:1 = false; + bool anyHalted:1 = false; + bool allHalted:1 = false; + bool anyRunning:1 = false; + bool allRunning:1 = false; + bool anyUnavailable:1 = false; + bool allUnavailable:1 = false; + bool anyNonExistent:1 = false; + bool allNonExistent:1 = false; + bool anyResumeAcknowledge:1 = false; + bool allResumeAcknowledge:1 = false; + bool anyHaveReset:1 = false; + bool allHaveReset:1 = false; + bool implicitBreak:1 = false; + bool stickyUnavailableBits:1 = false; + bool ndmResetPending:1 = false; + + explicit StatusRegister(RegisterValue registerValue) + : version(static_cast(registerValue & 0x0F)) + , validConfigStructurePointer(static_cast(registerValue & (0x01 << 4))) + , supportsResetHalt(static_cast(registerValue & (0x01 << 5))) + , authBusy(static_cast(registerValue & (0x01 << 6))) + , authenticated(static_cast(registerValue & (0x01 << 7))) + , anyHalted(static_cast(registerValue & (0x01 << 8))) + , allHalted(static_cast(registerValue & (0x01 << 9))) + , anyRunning(static_cast(registerValue & (0x01 << 10))) + , allRunning(static_cast(registerValue & (0x01 << 11))) + , anyUnavailable(static_cast(registerValue & (0x01 << 12))) + , allUnavailable(static_cast(registerValue & (0x01 << 13))) + , anyNonExistent(static_cast(registerValue & (0x01 << 14))) + , allNonExistent(static_cast(registerValue & (0x01 << 15))) + , anyResumeAcknowledge(static_cast(registerValue & (0x01 << 16))) + , allResumeAcknowledge(static_cast(registerValue & (0x01 << 17))) + , anyHaveReset(static_cast(registerValue & (0x01 << 18))) + , allHaveReset(static_cast(registerValue & (0x01 << 19))) + , implicitBreak(static_cast(registerValue & (0x01 << 22))) + , stickyUnavailableBits(static_cast(registerValue & (0x01 << 23))) + , ndmResetPending(static_cast(registerValue & (0x01 << 24))) + {} + + RegisterValue value() const { + return RegisterValue{0} + | static_cast(this->version) + | static_cast(this->validConfigStructurePointer) << 4 + | static_cast(this->supportsResetHalt) << 5 + | static_cast(this->authBusy) << 6 + | static_cast(this->authenticated) << 7 + | static_cast(this->anyHalted) << 8 + | static_cast(this->allHalted) << 9 + | static_cast(this->anyRunning) << 10 + | static_cast(this->allRunning) << 11 + | static_cast(this->anyUnavailable) << 12 + | static_cast(this->allUnavailable) << 13 + | static_cast(this->anyNonExistent) << 14 + | static_cast(this->allNonExistent) << 15 + | static_cast(this->anyResumeAcknowledge) << 16 + | static_cast(this->allResumeAcknowledge) << 17 + | static_cast(this->anyHaveReset) << 18 + | static_cast(this->allHaveReset) << 19 + | static_cast(this->implicitBreak) << 22 + | static_cast(this->stickyUnavailableBits) << 23 + | static_cast(this->ndmResetPending) << 24 + ; + } + }; +}