5.1 Native M-Mode Triggers

5.1原生m模式触发器 触发器可用于本机调试。 在一个功能齐全的系统中,触发器将使用u或s来设置,当触发时,它们可能会导致断点异常,从而陷入更特权模式。 也可以将触发器设置为在M模式下触发。 在这种情况下,没有要捕获的更高特权模式。 当这样的触发器在陷阱处理程序中引起断点异常时,系统将无法恢复正常执行。 在功能齐全的系统中,这是一个可能被忽略的偏远角落的情况。 但是,在只实现M模式的系统上,建议对这个问题实现两种解决方案之一。 这样触发器对于M模式代码的本机调试也很有用。 简单的解决方案是让硬件阻止action=0的触发器在M模式和mstatus的MIE为0时触发。 它的限制是,当用户可能想要触发触发器时,中断可能在其他时间被禁用。

一个更复杂的解决方案是在tcontrol中实现mte和mpte。 此解决方案的优点是,它只在陷阱处理程序期间禁用触发器。

设置M模式触发器导致断点异常的用户必须了解他们所使用的特定系统可能出现的任何问题。

5.2触发寄存器 这些寄存器是csr,可以使用RISC-V csr操作码访问,也可以使用抽象的调试命令。 大多数触发器功能是可选的。 所有tdata寄存器遵循write-any-read合法语义。 如果调试器写入不受支持的配置,寄存器将回读一个受支持的值(可能只是一个禁用的触发器)。 这意味着调试器必须总是回读它写入tdata寄存器的值,除非它已经知道它已经支持什么。 写入一个tdata寄存器不能修改其他tdata寄存器的内容,也不能修改当前选择的触发器之外的任何触发器的配置。 触发器寄存器只能在机器和调试模式下访问,以防止不受信任的用户代码在没有操作系统许可的情况下进入调试模式。 在本节中,XLEN在m模式下表示MXLEN,在Debug模式下表示DXLEN。 注意,这使得tdata1中的几个字段根据当前的执行模式移动 和MXLEN的值。

5.2.1触发Select (tselect, at 0x7a0) 这个寄存器决定哪个触发器可以通过其他触发器寄存器访问。 可访问的触发器集合必须从0开始,并且是连续的。 写入大于或等于支持的触发器数量的值可能会在该寄存器中导致与写入的值不同的值。 为了验证他们所写的是一个有效的索引,调试器可以读回该值并检查tselect保存了他们所写的内容。 因为触发器可以被Debug模式和m模式使用,调试器必须恢复这个寄存器如果它修改它。