38#include "debug/PMP.hh"
41#include "params/PMP.hh"
52 pmpEntries(params.pmp_entries),
67 if (req->hasVaddr()) {
68 DPRINTF(
PMP,
"Checking pmp permissions for va: %#x , pa: %#x\n",
69 req->getVaddr(), req->getPaddr());
72 DPRINTF(
PMP,
"Checking pmp permissions for pa: %#x\n",
84 if (pmp_range.
contains(req->getPaddr()) &&
85 pmp_range.
contains(req->getPaddr() + req->getSize() - 1)) {
92 if ((match_index > -1)
94 uint8_t this_cfg =
pmpTable[match_index].pmpCfg;
109 if (req->hasVaddr()) {
120 }
else if (req->hasVaddr()) {
138 warn(
"pmp access fault.\n");
139 return std::make_shared<AddressFault>(
vaddr, code);
146 uint8_t
a = cfg >> 3;
155 DPRINTF(
PMP,
"Can't update pmp entry config %u"
156 " because the index exceed the size of pmp entries %u",
161 DPRINTF(
PMP,
"Update pmp config with %u for pmp entry: %u \n",
162 (
unsigned)this_cfg, pmp_index);
164 DPRINTF(
PMP,
"Update pmp entry config %u failed because it locked\n",
168 pmpTable[pmp_index].pmpCfg = this_cfg;
183 if (pmp_index >= 1) {
184 prevAddr =
pmpTable[pmp_index - 1].rawAddr;
188 uint8_t this_cfg =
pmpTable[pmp_index].pmpCfg;
199 this_range =
AddrRange(prevAddr << 2, (this_addr << 2));
203 this_range =
AddrRange(this_addr << 2, ((this_addr << 2) + 4));
213 pmpTable[pmp_index].pmpAddr = this_range;
241 DPRINTF(
PMP,
"Can't update pmp entry address %u"
242 " because the index exceed the size of pmp entries %u",
247 DPRINTF(
PMP,
"Update pmp addr %#x for pmp entry %u \n",
248 (this_addr << 2), pmp_index);
251 DPRINTF(
PMP,
"Update pmp entry %u failed because the lock bit set\n",
254 }
else if (pmp_index <
pmpTable.size() - 1 &&
257 DPRINTF(
PMP,
"Update pmp entry %u failed because the entry %u lock bit"
258 " set and A field is TOR\n",
259 pmp_index, pmp_index+1);
266 pmpTable[pmp_index].rawAddr = this_addr;
292 uint64_t range = (1ULL << (
t1+3));
Defines global host-dependent types: Counter, Tick, and (indirectly) {int,uint}{8,...
The AddrRange class encapsulates an address range, and supports a number of tests to check if two ran...
This class helps to implement RISCV's physical memory protection (pmp) primitive.
const uint8_t PMP_EXEC
pmpcfg address range execute permission mask
Fault createAddrfault(Addr vaddr, BaseMMU::Mode mode)
createAddrfault creates an address fault if the pmp checks fail to pass for a given access.
bool pmpUpdateAddr(uint32_t pmp_index, Addr this_addr)
pmpUpdateAddr updates the pmpaddr for a pmp entry and calls pmpUpdateRule to update the rule of corre...
std::vector< PmpEntry > pmpTable
a table of pmp entries
const uint8_t PMP_LOCK
pmpcfg address range locked mask
void pmpReset()
pmpReset reset when reset signal in trigger from CPU.
uint8_t pmpGetAField(uint8_t cfg)
pmpGetAField extracts the A field (address matching mode) from an input pmpcfg register
const uint8_t PMP_READ
pmpcfg address range read permission mask
const uint8_t PMP_A_MASK
pmpcfg A field mask
bool hasLockEntry
variable to keep track of any lock of entry
Fault pmpCheck(const RequestPtr &req, BaseMMU::Mode mode, PrivilegeMode pmode, ThreadContext *tc, Addr vaddr=0)
pmpCheck checks if a particular memory access is allowed based on the pmp rules.
int pmpEntries
maximum number of entries in the pmp table
void pmpUpdateRule(uint32_t pmp_index)
pmpUpdateRule updates the pmp rule for a given pmp entry depending on the value of pmpaddr and pmpcfg...
AddrRange pmpDecodeNapot(Addr pmpaddr)
This function decodes a pmpaddr register value into an address range when A field of pmpcfg register ...
int numRules
variable to keep track of active number of rules any time
const uint8_t PMP_WRITE
pmpcfg address range write permission mask
PMP(const Params ¶ms)
bool pmpUpdateCfg(uint32_t pmp_index, uint8_t this_cfg)
pmpUpdateCfg updates the pmpcfg for a pmp entry and calls pmpUpdateRule to update the rule of corresp...
bool shouldCheckPMP(PrivilegeMode pmode, ThreadContext *tc)
This function is called during a memory access to determine if the pmp table should be consulted for ...
Abstract superclass for simulation objects.
ThreadContext is the external interface to all thread state for anything outside of the CPU.
bool contains(const Addr &a) const
Determine if the range contains an address.
constexpr T mbits(T val, unsigned first, unsigned last)
Mask off the given bits in place like bits() but without shifting.
constexpr int ctz64(uint64_t value)
Count trailing zeros in a 64-bit value.
Copyright (c) 2024 - Pranith Kumar Copyright (c) 2020 Inria All rights reserved.
std::shared_ptr< FaultBase > Fault
std::shared_ptr< Request > RequestPtr
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
constexpr decltype(nullptr) NoFault
Declaration of a request, the overall memory request consisting of the parts of the request that are ...