cpu-architectureprivilegesriscvinstruction-set

Why there is different register address for sstatus an mstatus although they are different view of same register?


The sstatus register is a subset of the mstatus register. In a straightforward implementation, reading or writing any field in sstatus is equivalent to reading or writing the homonymous field in mstatus.

This is taken from the riscv-privledeged-20211203.pdf. We have two registers and consume different address spaces for both status for S and M modes. Also, storing information in two different registers seems more comprehensive(I guess). So what is the reason to use sstatus as a subset of mstatus instead of a separate register? Is there any performance optimization on this?

If it is the optimized way, why does the spec allocate different register addresses?


Solution

  • They have different privilege levels.

    In Section 2.2, you can see that sstatus has privilege SRW, meaning it can be read and written from supervisor (S) mode. On the other hand, mstatus is MRW, so it can be read and written from machine mode (M), which apparently is a higher privilege level.

    So effectively, it means that S mode is only allowed access to a subset of the bits in mstatus.

    An alternative way to implement this would have been to make mstatus accessible at both levels, but add extra microcode so that if it is accessed from level S, the more sensitive bits are masked off. But that would be a little more complicated. There must already be a mechanism that checks privilege level on access to any CSR register, so by treating sstatus as its own register with its own address, we can just use this existing mechanism. Once this check is passed, accesses to sstatus can simply be treated as accesses to mstatus with the sensitive bits unconditionally masked.