事件选择器寄存器为了控制要计数的事件类型,事件选择器 CSR mhpmevent3 和 mhpmevent4
用于对相应的事件计数器进行编程。这些事件选择器 CSR 是 64 位 WARL 寄存器。
事件选择器分为三个字段;低 8 位选择一个事件类别,中间的一组位形成该类别中事件的掩码,高 8 位用于计数器溢出和事件过滤。
如果对应于任何设置掩码位的事件发生,则计数器递增。例如,如果 mhpmevent3 设置为 0x4200,则 mhpmcounter3将在任一加载指令时递增或者条件分支指令退出。事件选择器 0 意味着“什么都不考虑”。
Counter Overflow and Event Filters
mhmpevent 寄存器的高 8 位用于控制计数器溢出中断,以及基于模式的事件过滤。位布局如下图所示:
Performance Counter Overflow Operation
当内核处于特权模式 x 时,五个 xINH 位中的每一个都禁止事件计数。这些字段中的所有零导致所有模式下的事件计数。
当相应的 hpmcounterX 溢出时,OF 位由硬件设置,并保持设置状态,直到被软件写入。由于 hpmcounter值是无符号的,溢出被定义为从全一递增到全零。请注意,溢出后不会丢失信息,因为计数器环绕并继续计数,同时粘性 OF 位保持设置。
如果 hpmcounter 溢出而关联的 OF 位为零,则会生成计数溢出中断请求。如果 hpmcounter 溢出而关联的 OF 位为1,则不会生成中断。因此,OF 位还用作相关 hpmcounter 的计数溢出中断禁用。
写入 mhpmcounterX 或 mhpmeventX 寄存器不会导致计数溢出。仅当事件导致计数器递增时才会发生溢出。
计数器溢出中断是一个标准的本地中断,对应于 mip 和 mie 寄存器中的第 13 位。mip LCOFIP 位是这个中断和 mie的中断挂起位LCOFIE 位是该中断的中断使能位。LCOFI 表示本地计数溢出中断。如果存在 S 模式,则 sip和 sie包括用于管理程序中断控制和状态的相应位。
hpmcounter 生成计数溢出中断请求会设置 mip 寄存器中的 LCOFIP 位并设置相关的 OF 位。如果存在 S 模式,则 mideleg寄存器控制将此中断委托给 S 模式,这会设置 sip 寄存器中的 LCOFIP 位。在处理计数溢出中断后,LCOFIP 位由软件清零。
发往相同特权模式的多个同时中断按以下优先级递减顺序处理:MEI、MSI、MTI、SEI、SSI、STI、LCOFI。
请注意,没有单独的溢出状态和溢出中断使能位。实际上,通过清除 OF 位来启用溢出中断生成是与将计数器初始化为起始值一起完成的。一旦计数器溢出,它和OF 位必须在产生另一个溢出中断之前重新初始化。
软件可以区分尚未被溢出中断处理程序服务的新溢出计数器和已经被服务的溢出计数器(或者通过维护反映哪些计数器处于活动状态和到期的位掩码配置为不在溢出时生成中断的计数器)
最终溢出。
Scountovf 寄存器
scountovf CSR 是一个 32 位只读寄存器,包含 29 个 mhpmevent CSR 中 OF 位的影子副本。scountovf 中的位X 对应于 mhpmeventX 中的 OF 位。该寄存器使主管级溢出中断处理程序软件能够快速确定哪些计数器已经溢出,而无需对 M 模式进行环境调用。 CSR地址为 0xDA0。
对 scountovf 位 X 的读取访问受制于调解 S 模式软件对 hpmcounterX 访问的相同 mcounteren CSR。在 S模式下,当设置 mcounteren 位 X 时,scountovf 位 X 是可读的,否则读为零。
Disabling Counters in Debug Mode
设置后,dcsr.stopcount 位会在调试模式下停止计数器。这对于 mcycle 和 minstret计数器尤其重要,因为在调试模式下,核心在紧密循环中执行 ROM 指令。Freedom Studio Performance Monitor View自动设置dcsr.stopcount 位。
全部0条评论
快来发表一下你的评论吧 !