arch-riscv: fix unintentionally CSR bit overwritten in different mode
authorCui Jin <cuijin7@huawei.com>
Wed, 13 Jan 2021 08:00:50 +0000 (16:00 +0800)
committerCui Jin <cuijin7@huawei.com>
Fri, 29 Jan 2021 14:30:18 +0000 (14:30 +0000)
commitb1d7c8e77b4dda39f2e97e52182ff3f612055b11
tree0fcadc51d8fe762fa3a7cbf7e2a99aacd42c459f
parent5a23207ee90033df176c4efcc1491db91ce01970
arch-riscv: fix unintentionally CSR bit overwritten in different mode

Some CSR register is physically shared between different privilige
level. Current implementation of CSR setting only considers to verify
the bits visable in current privilige level, and directly writes the
masked bits back to register. This leads to other bits invisable
to current mode is overwritten and wrong behavior across the modes.
Thus, CSR updating should always keep the bits value for other modes.
e.g. disabling interrupt in S mode with setting
SSTATUS SIE bit will lead to clear MIE bit as well (the interrupt
is disabled unintentionally).

All CSR register sharing same physical register in different mode
may have similar issue. I only fixed some important ones.

The fix is verified in FS.

Jira Issue: https://gem5.atlassian.net/browse/GEM5-860

Change-Id: I34d4766a4b483b5add2c3bbefd28b21b9abf37f6
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/39036
Tested-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: Ayaz Akram <yazakram@ucdavis.edu>
Maintainer: Jason Lowe-Power <power.jg@gmail.com>
src/arch/riscv/isa/formats/standard.isa