CSR 位字段

RISC-V pmpaddr37 CSR 寄存器详解

地址 0x3D5特权级 Machine 模式访问 读写 / MXLEN:RV32 编码 PA[33:2];RV64 的 [53:0] 编码 PA[55:2],[63:54] 为 0Machine 物理内存保护 CSR

pmpaddr37(0x3D5)是实现 64 个 PMP entries 时提供的 Machine PMP entry 37 WARL 地址寄存器;RV32 编码物理地址位 33:2,RV64 编码位 55:2。

字段映射

按 bit 字段理解 pmpaddr37

2 个关键字段
63:54

0

WARL/读为零

RV64:标准 pmpaddr 格式的高 10 位为 0;该段属于 WARL 格式。

这个字段控制什么

  • - RV64:标准 pmpaddr 格式的高 10 位为 0;该段属于 WARL 格式。

常见取值

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

打开官方手册
53:0

address[55:2]

WARL/可为只读零

RV64:编码 56 位物理地址的位 55:2。未实现的物理地址位使该字段呈 WARL 行为;所有 PMP CSR 字段均可实现为只读零。

这个字段控制什么

  • - RV64:编码 56 位物理地址的位 55:2。未实现的物理地址位使该字段呈 WARL 行为;所有 PMP CSR 字段均可实现为只读零。

常见取值

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

打开官方手册
官方依据与检索要点

pmpaddr37 是实现 64 个 PMP entries 时提供的 entry 37 MXLEN 位 WARL 地址编码。其含义由 pmp37cfg.A 决定;TOR 使用 pmpaddr36 作为下界。

RV32 pmpaddr 编码 PA[33:2];RV64 的 [53:0] 编码 PA[55:2],[63:54] 为 0。
TOR entry 37 使用 pmpaddr36 作为下界、pmpaddr37 作为上界;NAPOT 用 pmpaddr37 低位编码至少 8 字节的自然对齐 2 的幂区域。
平台 grain 会改变低位读回;pmp37cfg.L 或 locked TOR entry 38 可使 pmpaddr37 写入被忽略。Smepmp MML=1 会改变 L 的权限含义,但相关 L=1 rules 仍锁定,RLB=1 时可临时绕过。

读这个 CSR 时先看什么

  • - PMP 是可选机制;实现可提供 0、16 或 64 个 entries,最低编号 entries 必须优先实现。因此 pmpaddr37 仅在实现 64 个 entries 时存在;所有 PMP CSR 字段均为 WARL 并可为只读零。
  • - pmpaddr37 仅能由 M 模式访问。其读回值受 pmp37cfg.A 和平台统一 PMP grain G 影响。
  • - G>=2 且 A=NAPOT 时,pmpaddr37[G-2:0] 读为全 1;G>=1 且 A=OFF/TOR 时,pmpaddr37[G-1:0] 读为全 0,但这些位不影响 TOR 匹配。改变 pmp37cfg.A[1] 只改变读回值,不改变底层保存值。
  • - 复位规范只规定可写 PMP A/L 字段的默认值(平台可覆盖);pmpaddr37 的复位值未规定,但 WARL 字段不会含非法值。

写入前的风险检查

  • - 若 pmp37cfg.L=1,写 pmpaddr37 被忽略;若 PMP entry 38 已锁定且 pmp38cfg.A=TOR,pmpaddr37 作为其下界也不可写。无 Smepmp 时锁定保持到 hart reset;Smepmp 的 mseccfg.MML=1 会改变 L 的权限含义,但其定义的 L=1 M-mode-only 或 locked Shared-Region rules 仍保持锁定,mseccfg.RLB=1 时可临时绕过。
  • - pmpaddr37 为 WARL;写入后应读回实现采用的值,并按当前 pmp37cfg.A 与 grain 解释读回掩码。
  • - pmp37cfg.A=TOR 时,entry 37 匹配 pmpaddr36 <= y < pmpaddr37;若下界不小于上界,则不匹配任何地址。NA4 在 G>=1 时不可选。

放回真实流程里理解

1

读取 pmp37cfg.A,确定 entry 37 使用 OFF、TOR、NA4 还是 NAPOT。

2

按所选模式写 pmpaddr37;TOR 还需配置下界 pmpaddr36,NAPOT 的低位编码范围大小。

3

读回 pmpaddr37 与对应 pmpcfg CSR,确认 WARL/grain 后的实际编码;仅在最终确认后设置 pmp37cfg.L。

常见问题

pmpaddr37 在 TOR 模式下的上下界来自哪里?

当 pmp37cfg.A=TOR 时,pmpaddr36 提供下界,pmpaddr37 提供上界,entry 37 匹配半开区间 pmpaddr36 <= y < pmpaddr37;下界不小于上界时不匹配任何地址。

为什么写入值可能与 pmpaddr37 读回值不同?

pmpaddr37 是 WARL,且平台 grain 与 pmp37cfg.A[1] 会掩码低位读回:NAPOT 可读为 1,OFF/TOR 可读为 0。改变 A[1] 不改变底层保存值。