38#include "debug/PMP.hh"
41#include "params/PMP.hh"
70 if (req->hasVaddr()) {
71 DPRINTF(
PMP,
"Checking pmp permissions for va: %#x , pa: %#x\n",
72 req->getVaddr(), req->getPaddr());
75 DPRINTF(
PMP,
"Checking pmp permissions for pa: %#x\n",
87 if (pmp_range.
contains(req->getPaddr()) &&
88 pmp_range.
contains(req->getPaddr() + req->getSize() - 1)) {
95 if ((match_index > -1)
97 uint8_t this_cfg =
pmpTable[match_index].pmpCfg;
112 if (req->hasVaddr()) {
134 warn(
"pmp access fault.\n");
135 return std::make_shared<AddressFault>(
vaddr, code);
144 }
else if (req->hasVaddr()) {
155 uint8_t
a = cfg >> 3;
164 DPRINTF(
PMP,
"Can't update pmp entry config %u"
165 " because the index exceed the size of pmp entries %u",
170 DPRINTF(
PMP,
"Update pmp config with %u for pmp entry: %u \n",
171 (
unsigned)this_cfg, pmp_index);
173 DPRINTF(
PMP,
"Update pmp entry config %u failed because it locked\n",
177 pmpTable[pmp_index].pmpCfg = this_cfg;
191 if (pmp_index >= 1) {
192 prevAddr =
pmpTable[pmp_index - 1].rawAddr;
196 uint8_t this_cfg =
pmpTable[pmp_index].pmpCfg;
207 this_range =
AddrRange(prevAddr << 2, (this_addr << 2));
211 this_range =
AddrRange(this_addr << 2, ((this_addr << 2) + 4));
221 pmpTable[pmp_index].pmpAddr = this_range;
244 DPRINTF(
PMP,
"Can't update pmp entry address %u"
245 " because the index exceed the size of pmp entries %u",
250 DPRINTF(
PMP,
"Update pmp addr %#x for pmp entry %u \n",
251 (this_addr << 2), pmp_index);
254 DPRINTF(
PMP,
"Update pmp entry %u failed because the lock bit set\n",
257 }
else if (pmp_index <
pmpTable.size() - 1 &&
260 DPRINTF(
PMP,
"Update pmp entry %u failed because the entry %u lock bit"
261 " set and A field is TOR\n",
262 pmp_index, pmp_index+1);
269 pmpTable[pmp_index].rawAddr = this_addr;
285 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...
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
Fault createDefaultFault(const RequestPtr &req, BaseMMU::Mode mode, PrivilegeMode pmode, Addr vaddr=0)
createDefaultFault creates an address fault when numRules = 0
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
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...
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.
const Params & params() const
SimObject(const Params &p)
Copyright (c) 2024 Arm Limited 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 ...