【问题标题】:RISC-V PMP instruction access fault when jumping to U mode跳转到 U 模式时 RISC-V PMP 指令访问错误
【发布时间】:2022-08-17 03:16:22
【问题描述】:

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

细节:

  • 我的程序以 M 模式启动,并在某些时候使用跳转到 U 模式 先生。我没有为此测试使用虚拟内存。

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

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

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

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

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

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

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

    标签: riscv rocket-chip


    【解决方案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 模式下的所有地址,这解决了这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-22
      • 2023-03-22
      • 2020-01-12
      • 2023-04-01
      • 2021-05-22
      • 2020-02-13
      • 1970-01-01
      • 2018-12-15
      相关资源
      最近更新 更多