riscv-csr

Introduce riscv csr.

CSR Field Specifications

WPRI

Reserved writes preserve values, reads ignore value

一些完整的读/写字段被保留,以备将来使用。

软件应该忽略从这些字段读取的值,并在写时保留这些域段的值。

WLRL

write/read only legal values

一些读/写csr字段仅为可能的位编码的子集指定行为,而保留其他位编码。

软件只能对这些域段写合法的值,不能假设读会返回合法的值。

WARL

write any value, read legal value

可以写任意值,但只会返回合法值。

CSR

mstatus

SIE: S-mode global interrupt enable

MIE: M-mode global interrupt enable

当hart在模式x时,xIE=1,中断使能;xIE=0,中断关闭。

低等级w的中断,w<x,中断始终是关闭的,不管wIE为何值。

高等级y的中断,y<x,中断始终是使能的,不管yIE为何值。

为了支持嵌套trap,每个特权模式x都有一个两级堆栈,其中包括interrupt-enable和privilege mode。xPIE保存了前一个特权模式的interrupt-enable,xPP保存了前一个特权模式。xPP域段只可以保存到x的特权模式,所以MPP有2bit,而SPP只有1bit。当从y模式trap到x时,把xPIE设置为xIE,xIE设置为0,xPP设置为y。

MRET或SRET指令是用来返回trap的。假设之前是从y trap到x,那执行xRET指令,就把xIE设置为xPIE, 当前模式设置为y,xPIE设置为1,xPP设置为u-mode(或者M模式如果user-mode不支持的话)。如果xPP!=M, xRET还会设置MPRV=0。

trap是从低等级到高等级,或者同等级trap。假设是s trap到m,就把MIE保存到MPIE,把MIE设置为0,把MPP设置为s-mode。当从m返回s时,把MIE设置为MPIE,当前模式设置s,MPIE设置为1,MPP设置为u,MPRV设置为0。

SXL/UXL是控制S-mode和U-mode的XLEN。和misa里面的MXL一样。WARL。

MPRV:modify privilege。当MPRV=0,load和store行为和正常一样,用当前特权等级做地址转换和保护机制。当MPRV=1时,load和store使用MPP作为当前等级,进行translated和protected。指令地址转换和保护不受MPRV影响。

MRET或者SRET指令改变privilege mode到低于M模式会设置MPRV=0。

MXR:make executable readable。当MXR=0,只有从readable的page load才能成功。当MXR=1,从readable和executable的page load都能成功。当基于page-base virtual memory不起作用时,MXR不起做用。

SUM:permit supervisor user memory access。当SUM=0,S-mode访问U=1的page会产生fault。当SUM=1,访问是允许的。当基于page-base virtual memory不起作用时,SUM不起做用。注意,虽然SUM通常不在S-mode时被忽略,但是在MPRV=1和MPP=S时生效。

MBE/SBE/UBE:控制memory访问的endianness。指令取值都是小端。xBE=0,小端;xBE=1,大端。

TVM:trap virtual memory。当TVM=1,在S-mode读写satp或者执行SFENCE.VMA,将产生illegal instruction exception。当TVM=0,这些操作是允许的。

TVM机制允许guest operating systems以s模式执行,而不是传统的以u模式虚拟化他们,从而提高了虚拟化效率。这种方法避免了trap对大多数s模式csr的访问的需要。trap satp访问和SFENCE.VMA指令提供了延迟填充影子页表所需的钩子。

TW:timeout wait。TW=0,WFI可以在低特权等级运行,如果没有其他原因阻止。TW=1,如果WFI以任何低特权等级执行,并且没有在特定于实现的有限制的时间内完成,则WFI指令会导致illegal instruction exception。时间限制可能总是0,这种情况下,当TW=1,WFI总会在低特权模式下导致非法指令异常。

当S-mode被实现了,在U-mode执行WFI会产生非法指令异常,除非它在特定于实现的有限制的时间内完成。

TSR:trap SRET。TSR=1,在S-mode执行SRET会产生illegal instruction exception。TSR=0,这个操作是允许的。

FS/XS:用于降低上下文保存和恢复的成本,通过设置和跟踪floating-point unit和任何其他user-mode 扩展的当前状态。FS编码了floating-point unit的状态,包括fcsr和f0-f31。XS编码了其他user-mode extension的状态。上下文切换的时候只需要检查这些域,就能快速决定是否需要保存和恢复context。

SD:read-only,总结FS或XS是否存在某个dirty状态,该状态需要将扩展的context保存到memory中。