3#include "libmicroemu/internal/bus/mem_access_results.h"
4#include "libmicroemu/internal/logic/exceptions_ops.h"
5#include "libmicroemu/internal/utils/bit_manip.h"
6#include "libmicroemu/logger.h"
7#include "libmicroemu/types.h"
11enum class SysCtrlBlockAddressMap : me_adr_t {
31template <
typename TCpuAccessor,
typename TLogger = NullLogger>
class SysCtrlBlock {
33 using MapEnum = SysCtrlBlockAddressMap;
35 static constexpr u32 GetBeginPhysicalAddress() {
return 0xED00; }
36 static constexpr u32 GetEndPhysicalAddress() {
return 0xEDFF; }
40 static constexpr auto kAdr = SysCtrlBlockAddressMap::kCcr;
41 static constexpr bool kUseReadModifyWrite =
true;
42 static constexpr bool kReadOnly =
false;
44 static u32 ReadRegister(TCpuAccessor &cpua) {
45 auto read_val = cpua.template ReadSpecialRegister<SpecialRegisterId::kCcr>();
46 LOG_TRACE(TLogger,
"READ CCR: 0x%X", read_val);
50 static void WriteRegister(TCpuAccessor &cpua, u32 value) {
51 LOG_TRACE(TLogger,
"WRITE CCR: 0x%X", value);
52 cpua.template WriteSpecialRegister<SpecialRegisterId::kCcr>(value);
58 static constexpr auto kAdr = SysCtrlBlockAddressMap::kCfsr;
59 static constexpr bool kUseReadModifyWrite =
false;
60 static constexpr bool kReadOnly =
false;
62 static u32 ReadRegister(TCpuAccessor &cpua) {
63 auto read_val = cpua.template ReadSpecialRegister<SpecialRegisterId::kCfsr>();
64 LOG_TRACE(TLogger,
"READ CFSR: 0x%X", read_val);
68 static void WriteRegister(TCpuAccessor &cpua, u32 value) {
69 auto read_val = cpua.template ReadSpecialRegister<SpecialRegisterId::kCfsr>();
70 value = read_val & (~value);
71 LOG_TRACE(TLogger,
"WRITE CFSR: 0x%X", value);
72 cpua.template WriteSpecialRegister<SpecialRegisterId::kCfsr>(value);
78 static constexpr auto kAdr = SysCtrlBlockAddressMap::kBfar;
79 static constexpr bool kUseReadModifyWrite =
true;
80 static constexpr bool kReadOnly =
false;
82 static u32 ReadRegister(TCpuAccessor &cpua) {
83 auto read_val = cpua.template ReadSpecialRegister<SpecialRegisterId::kBfar>();
84 LOG_TRACE(TLogger,
"READ BFAR: 0x%X", read_val);
88 static void WriteRegister(TCpuAccessor &cpua, u32 value) {
89 LOG_TRACE(TLogger,
"WRITE BFAR: 0x%X", value);
90 cpua.template WriteSpecialRegister<SpecialRegisterId::kCfsr>(value);
94 static constexpr auto kRegisters =
104 SysCtrlBlock() =
delete;
105 ~SysCtrlBlock() =
delete;
106 SysCtrlBlock(
const SysCtrlBlock &r_src) =
delete;
107 SysCtrlBlock &operator=(
const SysCtrlBlock &r_src) =
delete;
108 SysCtrlBlock(SysCtrlBlock &&r_src) =
delete;
109 SysCtrlBlock &operator=(SysCtrlBlock &&r_src) =
delete;
Definition sys_ctrl_block.h:76
Definition sys_ctrl_block.h:38
Definition sys_ctrl_block.h:56
The libmicroemu namespace contains all classes and functions of the libmicroemu which are public.
Definition bkpt_flags.h:6
@ kVtor
Vector Table Offset Register, VTOR.
Definition special_register_id.h:29
@ kCfsr
Configurable Fault Status Register, CFSR.
Definition special_register_id.h:31
@ kBfar
Bus Fault Address Register, BFAR.
Definition special_register_id.h:32
@ kCcr
Configuration and Control Register, CCR.
Definition special_register_id.h:30