如何将RISC-V系统指令实现为陷阱?

7
我目前正在学习RISC-V规范2.2版和特权架构1.10版。在RISC-V规范的第2章中提到:“[...]虽然一个简单的实现可能只涵盖8个SCALL/SBREAK/CSRR*指令,但使用始终触发陷阱的单个SYSTEM硬件指令即可[...]”。
然而,在我查看特权规范时,指令MRET也是一个SYSTEM指令,用于从陷阱返回。我现在感到困惑的是:机器级ISA需要多少内容?根据规范,是否可以省略所有M级CSR,并为任何SYSTEM指令使用软件处理程序?如果可以,那么如何传递诸如返回地址和陷阱原因之类的信息?它们是通过常规寄存器x1-x31完成的吗?
或者,如果我只针对具有M级权限的简单嵌入式核心进行实现,那么仅实现以下M级CSR是否足够?
mvendorid
marchid
mimpid
mhartid
misa
mscratch
mepc
mcause

最后,这些CSR中有多少可以省略?

根据我的经验,最好说“我做所有的事情”,而不是向每个客户解释,或更糟糕的是,让竞争对手向您的客户解释您不做什么。但也许了解客户服务代表更多的人可以帮助;这不是我所擅长的。 - Lurker Larry
听起来像是微码的替代方案,将其完全从CPU中分离出来,存储在内存中的指令。 (除非该内存是CPU内部的,否则它基本上是一个微码ROM。) - Peter Cordes
1个回答

4
  1. ECALL/EBREAK指令本身就是陷阱。CSR指令需要仔细解析,以确保它们指定了允许访问的现有寄存器和模式,这听起来需要使用您喜欢的稀疏矩阵(无论是PLA还是if/then)来完成。

  2. 您可以模拟所有SYSTEM指令,但是,正如您所看到的,您需要能够访问硬件内部的信息,这些信息不是正常ISA的一部分。这意味着您需要添加“指令扩展”。

  3. 我还建议使SYSTEM指令具有原子性,这意味着每个模拟指令中的异常应该被屏蔽或避免。

  4. 由于我不是一个很信任的人,所以我会创建一个新模式,该模式将启用指令扩展,以允许您直接从硬件中读取异常地址,并从受保护的内存区域获取指令。中断会自动禁止。通过跳转到epc+4或非法指令处理程序来退出模式。即使在M-mode下,我也不想让任何超出RISC-V规范的内容可用,以确保安全。

  5. 根据我的经验,最好说“我做所有事情”,而不是向每个客户解释,或者更糟的是,让竞争对手向您的客户解释您不做什么。但是也许了解CSR更多的人可以提供帮助;这不是我做的事情。


如果你有多个要说的事情,[编辑]这个答案并添加更多段落。 可以选择使用---水平分隔符和/或###标题来将它们分成一个答案中的部分。 不要将3个相关段落发布为3个单独的答案。 请将它们合并到此处并删除其他帖子。 - Peter Cordes
我已经尽力了,但我的评论仍无法被删除。这只发生在我身上吗? - Lurker Larry
你仍然可以看到自己已删除的帖子。(拥有10k声望值的用户也可以看到) 你所做的正是我推荐的。 (尽管你的一个答案被管理员转换为评论; 这就是为什么它也显示为问题的评论。你是说你不能删除那个吗?) - Peter Cordes
是的,模数魔法超出了我的理解范围。 - Lurker Larry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接