9 #include "gtest/gtest.h"
12 #include "sw/device/silicon_creator/lib/base/mock_csr.h"
13 #include "sw/device/silicon_creator/lib/epmp_state.h"
14 #include "sw/device/silicon_creator/testing/rom_test.h"
16 namespace epmp_unittest {
27 std::array<uint8_t, kEpmpNumRegions> pmpcfg = {};
32 std::array<uint32_t, kEpmpNumRegions> pmpaddr = {};
45 std::array<uint32_t, kEpmpNumRegions / 4> PackCfg()
const {
48 std::array<uint32_t, kEpmpNumRegions / 4> packed;
61 .
mseccfg =
static_cast<uint32_t
>(mseccfg),
83 CSR_REG_PMPADDR0, CSR_REG_PMPADDR1, CSR_REG_PMPADDR2, CSR_REG_PMPADDR3,
84 CSR_REG_PMPADDR4, CSR_REG_PMPADDR5, CSR_REG_PMPADDR6, CSR_REG_PMPADDR7,
85 CSR_REG_PMPADDR8, CSR_REG_PMPADDR9, CSR_REG_PMPADDR10, CSR_REG_PMPADDR11,
86 CSR_REG_PMPADDR12, CSR_REG_PMPADDR13, CSR_REG_PMPADDR14, CSR_REG_PMPADDR15,
95 for (
size_t i = 0; i < packed.size(); ++i) {
96 EXPECT_CSR_READ(
kPmpcfgMap.at(i), packed.at(i));
105 for (
size_t i = 0; i < expect.
pmpaddr.size(); ++i) {
115 EXPECT_CSR_READ(CSR_REG_MSECCFG,
static_cast<uint32_t
>(expect.
mseccfg));
116 EXPECT_CSR_READ(CSR_REG_MSECCFGH,
117 static_cast<uint32_t
>(expect.
mseccfg >> 32));
130 TEST(EpmpCheckTest, Default) {
131 mock_csr::MockCsr csr;
135 EXPECT_EQ(epmp_state_check(), kErrorOk);
138 TEST(EpmpCheckTest, ErrorPmpaddr) {
139 mock_csr::MockCsr csr;
142 bad.pmpaddr[15] ^= 1 << 31;
146 EXPECT_EQ(epmp_state_check(), kErrorEpmpBadCheck);
149 TEST(EpmpCheckTest, ErrorPmpcfg) {
150 mock_csr::MockCsr csr;
157 EXPECT_EQ(epmp_state_check(), kErrorEpmpBadCheck);
160 TEST(EpmpCheckTest, ErrorMseccfg) {
161 mock_csr::MockCsr csr;
168 EXPECT_EQ(epmp_state_check(), kErrorEpmpBadCheck);
171 TEST(EpmpTorTest, Entry0) {
172 mock_csr::MockCsr csr;
180 csrs.pmpcfg[0] = EPMP_CFG_L | EPMP_CFG_A_TOR | EPMP_CFG_R;
181 csrs.pmpaddr[0] = region.end >> 2;
183 epmp_state_configure_tor(0, region, kEpmpPermLockedReadOnly);
186 EXPECT_EQ(epmp_state_check(), kErrorOk);
189 TEST(EpmpTorTest, Entry1) {
190 mock_csr::MockCsr csr;
198 csrs.pmpaddr[0] = region.start >> 2;
199 csrs.pmpcfg[1] = EPMP_CFG_L | EPMP_CFG_A_TOR | EPMP_CFG_R;
200 csrs.pmpaddr[1] = region.end >> 2;
202 epmp_state_configure_tor(1, region, kEpmpPermLockedReadOnly);
205 EXPECT_EQ(epmp_state_check(), kErrorOk);
208 TEST(EpmpTorTest, Entry15) {
209 mock_csr::MockCsr csr;
217 csrs.pmpaddr[14] = region.start >> 2;
218 csrs.pmpcfg[15] = EPMP_CFG_L | EPMP_CFG_A_TOR | EPMP_CFG_R;
219 csrs.pmpaddr[15] = region.end >> 2;
222 epmp_state_configure_tor(15, region, kEpmpPermLockedReadOnly);
225 EXPECT_EQ(epmp_state_check(), kErrorOk);
228 TEST(EpmpTorTest, SharedAddress) {
229 mock_csr::MockCsr csr;
243 csrs.pmpaddr[0] = region1.start >> 2;
244 csrs.pmpcfg[1] = EPMP_CFG_L | EPMP_CFG_A_TOR | EPMP_CFG_R | EPMP_CFG_X;
245 csrs.pmpaddr[1] = region1.end >> 2;
246 csrs.pmpcfg[2] = EPMP_CFG_L | EPMP_CFG_A_TOR | EPMP_CFG_R;
247 csrs.pmpaddr[2] = region2.end >> 2;
250 epmp_state_configure_tor(1, region1, kEpmpPermLockedReadExecute);
251 epmp_state_configure_tor(2, region2, kEpmpPermLockedReadOnly);
254 EXPECT_EQ(epmp_state_check(), kErrorOk);
257 TEST(EpmpNa4Test, Entry0) {
258 mock_csr::MockCsr csr;
266 csrs.pmpcfg[0] = EPMP_CFG_L | EPMP_CFG_A_NA4 | EPMP_CFG_R | EPMP_CFG_X;
267 csrs.pmpaddr[0] = region.start >> 2;
270 epmp_state_configure_na4(0, region, kEpmpPermLockedReadExecute);
273 EXPECT_EQ(epmp_state_check(), kErrorOk);
276 TEST(EpmpNa4Test, Entry15) {
277 mock_csr::MockCsr csr;
285 csrs.pmpcfg[15] = EPMP_CFG_L | EPMP_CFG_A_NA4 | EPMP_CFG_R | EPMP_CFG_W;
286 csrs.pmpaddr[15] = region.start >> 2;
289 epmp_state_configure_na4(15, region, kEpmpPermLockedReadWrite);
292 EXPECT_EQ(epmp_state_check(), kErrorOk);
303 return (region.start >> 2) | ((region.end - region.start - 1) >> 3);
306 TEST(EpmpNapotTest, Entry0) {
307 mock_csr::MockCsr csr;
315 csrs.pmpcfg[0] = EPMP_CFG_L | EPMP_CFG_A_NAPOT | EPMP_CFG_R | EPMP_CFG_X;
316 csrs.pmpaddr[0] = Napot(region);
319 epmp_state_configure_napot(0, region, kEpmpPermLockedReadExecute);
321 ExpectReadState(csrs);
322 EXPECT_EQ(epmp_state_check(), kErrorOk);
325 TEST(EpmpNapotTest, Entry15) {
326 mock_csr::MockCsr csr;
334 csrs.pmpcfg[15] = EPMP_CFG_L | EPMP_CFG_A_NAPOT | EPMP_CFG_R | EPMP_CFG_W;
335 csrs.pmpaddr[15] =
Napot(region);
338 epmp_state_configure_napot(15, region, kEpmpPermLockedReadWrite);
341 EXPECT_EQ(epmp_state_check(), kErrorOk);