#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 ; } }; }