Software APIs
epmp_state.c
1 // Copyright lowRISC contributors (OpenTitan project).
2 // Licensed under the Apache License, Version 2.0, see LICENSE for details.
3 // SPDX-License-Identifier: Apache-2.0
4 
5 #include "sw/device/silicon_creator/lib/epmp_state.h"
6 
10 
11 // The context is declared as weak so that the ROM and ROM_EXT may
12 // override its location.
14 
15 /**
16  * Extern declarations of inline functions.
17  */
18 extern void epmp_state_configure_tor(uint32_t entry, epmp_region_t region,
19  epmp_perm_t perm);
20 extern void epmp_state_configure_na4(uint32_t entry, epmp_region_t region,
21  epmp_perm_t perm);
22 extern void epmp_state_configure_napot(uint32_t entry, epmp_region_t region,
23  epmp_perm_t perm);
24 
25 rom_error_t epmp_state_check(void) {
26  uint32_t checks = 0;
27  const epmp_state_t *s = &epmp_state;
28 #define CHECK_CSR(reg, value) \
29  do { \
30  uint32_t csr; \
31  CSR_READ(reg, &csr); \
32  checks += csr == (value); \
33  } while (false)
34 
35  // Check address registers.
36  CHECK_CSR(CSR_REG_PMPADDR0, s->pmpaddr[0]);
37  CHECK_CSR(CSR_REG_PMPADDR1, s->pmpaddr[1]);
38  CHECK_CSR(CSR_REG_PMPADDR2, s->pmpaddr[2]);
39  CHECK_CSR(CSR_REG_PMPADDR3, s->pmpaddr[3]);
40  CHECK_CSR(CSR_REG_PMPADDR4, s->pmpaddr[4]);
41  CHECK_CSR(CSR_REG_PMPADDR5, s->pmpaddr[5]);
42  CHECK_CSR(CSR_REG_PMPADDR6, s->pmpaddr[6]);
43  CHECK_CSR(CSR_REG_PMPADDR7, s->pmpaddr[7]);
44  CHECK_CSR(CSR_REG_PMPADDR8, s->pmpaddr[8]);
45  CHECK_CSR(CSR_REG_PMPADDR9, s->pmpaddr[9]);
46  CHECK_CSR(CSR_REG_PMPADDR10, s->pmpaddr[10]);
47  CHECK_CSR(CSR_REG_PMPADDR11, s->pmpaddr[11]);
48  CHECK_CSR(CSR_REG_PMPADDR12, s->pmpaddr[12]);
49  CHECK_CSR(CSR_REG_PMPADDR13, s->pmpaddr[13]);
50  CHECK_CSR(CSR_REG_PMPADDR14, s->pmpaddr[14]);
51  CHECK_CSR(CSR_REG_PMPADDR15, s->pmpaddr[15]);
52 
53  // Check configuration registers.
54  CHECK_CSR(CSR_REG_PMPCFG0, s->pmpcfg[0]);
55  CHECK_CSR(CSR_REG_PMPCFG1, s->pmpcfg[1]);
56  CHECK_CSR(CSR_REG_PMPCFG2, s->pmpcfg[2]);
57  CHECK_CSR(CSR_REG_PMPCFG3, s->pmpcfg[3]);
58 
59  // Check Machine Security Configuration (MSECCFG) register.
60  // High bits are hardcoded to 0.
61  CHECK_CSR(CSR_REG_MSECCFG, s->mseccfg);
62  CHECK_CSR(CSR_REG_MSECCFGH, 0);
63 
64 #undef CHECK_CSR
65 
66  enum { kTotalChecks = 22 };
67  // Hamming distance of 3, error = 0x72f, kErrorOk = 0x739.
68  rom_error_t error = kErrorOk ^ kTotalChecks;
69  if (launder32(checks) == kTotalChecks) {
70  HARDENED_CHECK_EQ(checks, kTotalChecks);
71  error ^= checks;
72  HARDENED_CHECK_EQ(error, kErrorOk);
73  return error;
74  }
75  return kErrorEpmpBadCheck;
76 }