龙芯架构 32 位精简版中处理器核分为 2 个特权等级(Privilege LeVel,简称 PLV),分别是 PLV0 和 PLV3。
处理器核当前处于哪个特权等级由 CSR.CRMD 中 PLV 域的值唯一确定。所有特权等级中,PLV0 是具有最高权限的特权等级,也是唯一可以使用特权指令并访问所有特权资源的特权等级。PLV3 这个特权等级不能执行特权指令访问特权资源。对于 Linux 系统来说,架构中仅 PLV0 级可对应核心态,PLV3 级对应用户态。
所有特权指令仅在 PLV0 特权等级下才能访问。但是可以在 PLV3 特权等级下执行 Hit 类 CACOP 指令。
CSRRD, CSRWR, CSRXCHG
CSRRD、CSRWR 和 CSRXCHG 指令用于软件访问 CSR。CSRRD 指令将指定 CSR 的值写入到通用寄
存器 rd 中。CSRWR 指令将通用寄存器 rd 中的旧值写入到指定 CSR 中,同时将指定 CSR 的旧值更新到通
用寄存器 rd 中。CSRXCHG 指令根据通用寄存器 rj 中存放的写掩码信息,将通用寄存器 rd 中的旧值写入到
指定 CSR 中对应写掩码为 1 的那些比特,该 CSR 中的其余比特保持不变,同时将该 CSR 的旧值更新到通
用寄存器 rd 中。
所有 CSR 寄存器采用独立的寻址空间。上述指令中 CSR 的寻址值来自于指令中的 14 比特立即数
csr_num。CSR 的寻址单位是一个 CSR 寄存器,即 0 号 CSR 的 csr_num 是 0,1 号 CSR 的 csr_num 是 1,以
此类推。
在龙芯架构 32 位精简版中,所有 CSR 寄存器的位宽都是 32 位。
当 CSR 访问指令访问一个架构中未定义或硬件未实现的 CSR 时,读动作返回全 0 值,写动作不修改处
理器的任何软件可见状态。需要提请注意的是,CSRWR 和 CSRXCHG 指令不仅包含更新 CSR 的写动作,
也包含读取 CSR 旧值的读动作。
指令格式: ertn
ERTN 指令用于从例外处理返回。
将例外对应的 PPLV、PIE 等信息更新至 CSR.CRMD 中,同时跳转到例外所对应的 ERA 处开始取指。
例外对应的 PPLV、PIE 信息来自于 CSR.PRMD,例外对应的 ERA 来自于 CSR.ERA。
执行 ERTN 指令时,如果 CSR.LLBCTL 中的 KLO 位不等于 1,则将 LLbit 置 0,否则 LLbit 不修改。
指令格式: syscall code
执行 SYSCALL 指令将立即无条件的触发系统调用例外。
指令码中 code 域携带的信息可供例外处理例程作为所传递的参数使用。