#pragma once #include #include "src/DebugToolDrivers/Protocols/RiscVDebug/Common.hpp" namespace DebugToolDrivers::Protocols::RiscVDebug::Registers { struct DebugControlStatusRegister { enum class DebugModeCause: std::uint8_t { BREAK = 0x01, TRIGGER = 0x02, HALT_REQUEST = 0x03, STEP = 0x04, RESET_HALT_REQUEST = 0x05, GROUP = 0x06, }; PrivilegeMode privilegeMode = PrivilegeMode::USER; bool step = false; bool nmiPending = false; bool mprvEnabled = false; DebugModeCause debugModeCause = DebugModeCause::BREAK; bool stopTime = false; bool stopCount = false; bool stepInterruptsEnabled = false; bool breakUMode = false; bool breakSMode = false; bool breakMMode = false; bool breakVUMode = false; bool breakVSMode = false; std::uint8_t debugVersion = 0; static constexpr auto fromValue(RegisterValue value) { return DebugControlStatusRegister{ .privilegeMode = static_cast(value & 0x03), .step = static_cast(value & (0x01 << 2)), .nmiPending = static_cast(value & (0x01 << 3)), .mprvEnabled = static_cast(value & (0x01 << 4)), .debugModeCause = static_cast((value >> 6) & 0x07), .stopTime = static_cast(value & (0x01 << 9)), .stopCount = static_cast(value & (0x01 << 10)), .stepInterruptsEnabled = static_cast(value & (0x01 << 11)), .breakUMode = static_cast(value & (0x01 << 12)), .breakSMode = static_cast(value & (0x01 << 13)), .breakMMode = static_cast(value & (0x01 << 15)), .breakVUMode = static_cast(value & (0x01 << 16)), .breakVSMode = static_cast(value & (0x01 << 17)), .debugVersion = static_cast((value >> 28) & 0x0F) }; } [[nodiscard]] constexpr RegisterValue value() const { return RegisterValue{0} | static_cast(this->privilegeMode) | static_cast(this->step) << 2 | static_cast(this->nmiPending) << 3 | static_cast(this->mprvEnabled) << 4 | static_cast(this->debugModeCause) << 6 | static_cast(this->stopTime) << 9 | static_cast(this->stopCount) << 10 | static_cast(this->stepInterruptsEnabled) << 11 | static_cast(this->breakUMode) << 12 | static_cast(this->breakSMode) << 13 | static_cast(this->breakMMode) << 15 | static_cast(this->breakVUMode) << 16 | static_cast(this->breakVSMode) << 17 | static_cast(this->debugVersion & 0x0F) << 28 ; } }; }