libmicroemu 0.2.0
ARM Microcontroller Emulator Library
Loading...
Searching...
No Matches
sys_ctrl_block.h
1#pragma once
2
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"
8
9namespace libmicroemu ::internal {
10
11enum class SysCtrlBlockAddressMap : me_adr_t {
12 kCpuId = 0xED00, // CPUID Base Register (RO)
13 kIcsr = 0xED04, // Interrupt Control and State Register (RW)
14 kVtor = 0xED08, // Vector Table Offset Register (RW)
15 kAircr = 0xED0C, // Application Interrupt and Reset Control Register (RW)
16 kr = 0xED10, // System Control Register (RW)
17 kCcr = 0xED14, // Configuration and Control Register (RW)
18 kShpr1 = 0xED18, // System Handler Priority Register 1 (RW)
19 kShpr2 = 0xED1C, // System Handler Priority Register 2 (RW)
20 kShpr3 = 0xED20, // System Handler Priority Register 3 (RW)
21 kShcsr = 0xED24, // System Handler Control and State Register (RW)
22 kCfsr = 0xED28, // Configurable Fault Status Register (RW)
23 kHfsr = 0xED2C, // HardFault Status Register (RW)
24 kDfsr = 0xED30, // Debug Fault Status Register (RW)
25 kMmfar = 0xED34, // MemManage Fault Address Register (RW)
26 kBfar = 0xED38, // BusFault Address Register (RW)
27 kAfsr = 0xED3C, // Auxiliary Fault Status Register (RW)
28 kCpacr = 0xED88 // Coprocessor Access Control Register (RW)
29};
30
31template <typename TCpuAccessor, typename TLogger = NullLogger> class SysCtrlBlock {
32public:
33 using MapEnum = SysCtrlBlockAddressMap;
34
35 static constexpr u32 GetBeginPhysicalAddress() { return 0xED00; }
36 static constexpr u32 GetEndPhysicalAddress() { return 0xEDFF; }
37
39 public:
40 static constexpr auto kAdr = SysCtrlBlockAddressMap::kCcr;
41 static constexpr bool kUseReadModifyWrite = true; // Perform read before write
42 static constexpr bool kReadOnly = false; // Disable write operation
43
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);
47 return read_val;
48 }
49
50 static void WriteRegister(TCpuAccessor &cpua, u32 value) {
51 LOG_TRACE(TLogger, "WRITE CCR: 0x%X", value);
52 cpua.template WriteSpecialRegister<SpecialRegisterId::kCcr>(value);
53 }
54 };
55
57 public:
58 static constexpr auto kAdr = SysCtrlBlockAddressMap::kCfsr;
59 static constexpr bool kUseReadModifyWrite = false; // Perform read before write
60 static constexpr bool kReadOnly = false; // Disable write operation
61
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);
65 return read_val;
66 }
67
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);
73 }
74 };
75
77 public:
78 static constexpr auto kAdr = SysCtrlBlockAddressMap::kBfar;
79 static constexpr bool kUseReadModifyWrite = true; // Perform read before write
80 static constexpr bool kReadOnly = false; // Disable write operation
81
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);
85 return read_val;
86 }
87
88 static void WriteRegister(TCpuAccessor &cpua, u32 value) {
89 LOG_TRACE(TLogger, "WRITE BFAR: 0x%X", value);
90 cpua.template WriteSpecialRegister<SpecialRegisterId::kCfsr>(value);
91 }
92 };
93
94 static constexpr auto kRegisters =
95 // clang-format off
96 std::tuple<
100 >();
101 // clang-format on
102
103private:
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;
110};
111
112} // namespace libmicroemu::internal
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