CSR 位字段

RISC-V mpmpdeleg CSR 寄存器详解

地址 0x316特权级 Machine 模式访问 Machine 读写 / MXLENMachine 物理内存保护 CSR

mpmpdeleg(0x316)是 Frozen Smpmpdeleg 扩展的 MXLEN 位 Machine CSR;其 WARL pmpnum 字段把该索引及更高编号的 PMP entries 委托为 SPMP entries。

字段映射

按 bit 字段理解 mpmpdeleg

2 个关键字段
63:7

Reserved

WPRI

RV64 的高位保留段,保留供未来标准使用;写其他字段时保留,读取时忽略。

这个字段控制什么

  • - RV64 的高位保留段,保留供未来标准使用;写其他字段时保留,读取时忽略。

常见取值

这个字段更适合结合上下文字段解释,不用按固定枚举背诵。

6:0

pmpnum

WARL

委托起始索引。索引 >= pmpnum 的 PMP entries 成为 SPMP entries;超过可写 entry 数量的写入回读为该总数。实现可硬连线该划分;不可写 entries 表现为只读零。

这个字段控制什么

  • - 委托起始索引。索引 >= pmpnum 的 PMP entries 成为 SPMP entries;超过可写 entry 数量的写入回读为该总数。实现可硬连线该划分;不可写 entries 表现为只读零。

常见取值

0委托全部

全部 PMP entries 委托为 SPMP;其中不可写 entries 仍表现为只读零。

N_writable不委托

当 N_writable 表示可写 PMP entry 总数时,没有 entry 委托给 SPMP,Sspmp 实际禁用;SPMP 相关寄存器读零、写入忽略。

官方依据与检索要点

mpmpdeleg.pmpnum 是 PMP/SPMP 分界:低编号 entries 仍为 PMP,从 pmpnum 起的 entries 委托为 SPMP;不可写 entries 保持只读零。

Smpmpdeleg v0.9.2 定义地址 0x316、MXLEN 宽度、WPRI 高位和 WARL pmpnum[6:0]。
pmpnum=0 委托全部可写 entries;等于可写 entry 数量时不委托,Sspmp 实际禁用。
locked PMP entry 限制分界下移;角色改变会继承旧配置。

读这个 CSR 时先看什么

  • - mpmpdeleg 属于 Smpmpdeleg,而不是 Smepmp;v0.9.2 规范处于 Frozen 状态。
  • - Smpmpdeleg 对同时实现 Sspmp 与 Sm1p13 的实现是强制扩展,并依赖 Smcsrind。
  • - 复位时 pmpnum 默认为可写 PMP entry 总数(除非硬连线),即默认不委托。

写入前的风险检查

  • - pmpnum 不能设为小于或等于任何 locked PMP entry 索引的值;此类写入被忽略并保留原值。
  • - 改变 pmpnum 会让 entries 在 PMP/SPMP 角色间继承原配置;写入新值前应把受影响配置初始化为适合新角色的值。

放回真实流程里理解

1

读取 pmpnum 和实现的可写 entry 数量,确定当前 PMP/SPMP 分界。

2

在改分界前初始化将改变角色的配置。

3

写入 pmpnum 并读回 WARL 结果;再通过标准 PMP CSR 或 xiselect 间接接口访问各自范围。

常见问题

mpmpdeleg.pmpnum=0 表示什么?

它把全部 PMP entries 委托为 SPMP;不可写 entries 仍表现为只读零。pmpnum 等于可写 PMP entry 总数时则不委托。