K3 取指页错误时mepc丢失 bit63(非规范地址被 Sv39 规范化)

在 K3 平台运行测试。测试在 S 模式 + Sv39 下执行 jalr 跳转到非规范(non-canonical)虚拟地址 0x8000000150009000,期望触发指令页错误且 mepc = “跳转目标的完整 64 位虚拟地址”,但 K3 实测 mepc 丢失了 bit63。

Expected value: 0x8000000150009000
Actual value:   0x0000000150009000
XEPC:    0x0000000150009000
XCAUSE:  0x000000000000000c
XTVAL:   0x8000000150009000
XSTATUS: 0x8000000a00006e00

分析:
mcause=12(指令页错误)、mtval=0x8000000150009000(完整故障 VA)均正确,说明 MMU 正确检测到了非规范地址;
但 mepc=0x0000000150009000,恰好等于把 PC 按 Sv39 从 bit38(此时为 0)符号扩展后的"规范化"值。
K3 在取指异常写 mepc 时,写入的不是原始 64 位架构 PC,而是经过 Sv39 规范化(bit38 符号扩展)或截断(39/40 位)的地址。

RISC-V Privileged Architecture
1.mepc 定义:“When a trap is taken into M-mode, mepc is written with the virtual address of the instruction that was interrupted or that encountered the exception.” —— 应写入完整 64 位虚拟地址;
2.mtval 定义:“…page-fault … exception occurs on an instruction fetch … mtval will contain the faulting virtual address” —— K3 的 mtval 已正确保存完整 64 位 VA,mepc 应保持一致。
3.“mepc is a WARL register that must be able to hold all valid virtual addresses. It need not be capable of holding all possible invalid addresses. Prior to writing mepc, implementations may convert an invalid address into some other invalid address that mepc is capable of holding.”
这条 WARL 条款不能豁免 K3 的行为,豁免只允许 “invalid → 另一个 invalid”,而 K3 转出的是"合法形式"地址。
4.官方架构合规套件的SAIL组件要求 mepc = 完整 64 位值

  • model/sys/vmem.sail 中 translate_validate_address():将 VA 截成 39 位、从 bit38 符号扩展后与原值比较,不一致 → PTW_Invalid_Addr() → 页错误;
  • excinfo = zero_extend(bits_of(gva)) → mtval 写入完整 VA;
  • model/sys/sys_control.sail:300 → mepc = pc,写入完整 64 位 PC。

以上是我对spec的理解。请问K3的这个处理是否符合架构规定