跳转到U模式时RISC-V PMP指令访问错误

问题描述 投票:0回答:2

我尝试在 16 字节区域上使用 PMP 来保护特定的内存区域。但是,当启用 PMP 配置时跳转到 U 模式时,我遇到指令访问错误。

详情:

  • 我的程序以 M 模式启动,并在某个时刻使用以下命令跳转到 U 模式 先生。我没有使用虚拟内存进行此测试。

  • 我要保护的内存区域从0x80020180开始。

  • 我将 pmpaddr0 设置为 0x20008061 (将 0x80020180 右移 2 并 将最后两位数字设置为 0b'01 以标记 16 字节区域)。

  • pmp0cfg 设置为 0b'0001 1000(使用 NAPOT 进行读取、写入、 不允许执行)。

  • 我有一个存储操作,尝试在 U 模式下存储到 0x80020184。 但是代码跳转到U时出现指令访问错误 模式。

  • U模式第一条指令位于PC 0x800004c0, 它不应该与 pmpaddr0 匹配。

我试图找出为什么跳转到 U 模式时会出现指令访问错误。 谁能帮我理解发生了什么?

我在 Spike 上运行我的代码,我在火箭核心模拟中也看到了相同的行为。

riscv rocket-chip
2个回答
1
投票

我找到了自己问题的答案,发布为薄可能对其他人有帮助。

事实证明我错过了规范中关于 PMP 优先级的重要一句话。

If no PMP entry matches an M-mode access, the access succeeds. If no PMP entry matches an
S-mode or U-mode access, but at least one PMP entry is implemented, the access fails.

所以我必须添加第二个 PMP 条目来匹配 U 模式下的所有地址,这解决了问题。


0
投票

请告诉我如何添加第二个 PMP 条目以匹配 U 模式下的所有地址。我厌倦了添加第二个 PMP 条目,它对我不起作用。

© www.soinside.com 2019 - 2024. All rights reserved.