summaryrefslogtreecommitdiffstats
path: root/target
diff options
context:
space:
mode:
authorAlistair Francis2020-02-01 02:02:20 +0100
committerPalmer Dabbelt2020-02-27 22:45:38 +0100
commita2e9f57d06279220b1834eca2494e52adae121b8 (patch)
treeada766632732a1a720009b4b5c3d39dfdc5d235e /target
parenttarget/riscv: Extend the MIE CSR to support virtulisation (diff)
downloadqemu-a2e9f57d06279220b1834eca2494e52adae121b8.tar.gz
qemu-a2e9f57d06279220b1834eca2494e52adae121b8.tar.xz
qemu-a2e9f57d06279220b1834eca2494e52adae121b8.zip
target/riscv: Extend the SIP CSR to support virtulisation
Signed-off-by: Alistair Francis <alistair.francis@wdc.com> Reviewed-by: Palmer Dabbelt <palmerdabbelt@google.com> Signed-off-by: Palmer Dabbelt <palmerdabbelt@google.com>
Diffstat (limited to 'target')
-rw-r--r--target/riscv/csr.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/target/riscv/csr.c b/target/riscv/csr.c
index 918678789a..2e6700bbeb 100644
--- a/target/riscv/csr.c
+++ b/target/riscv/csr.c
@@ -743,8 +743,19 @@ static int write_sbadaddr(CPURISCVState *env, int csrno, target_ulong val)
static int rmw_sip(CPURISCVState *env, int csrno, target_ulong *ret_value,
target_ulong new_value, target_ulong write_mask)
{
- int ret = rmw_mip(env, CSR_MSTATUS, ret_value, new_value,
+ int ret;
+
+ if (riscv_cpu_virt_enabled(env)) {
+ /* Shift the new values to line up with the VS bits */
+ ret = rmw_mip(env, CSR_MSTATUS, ret_value, new_value << 1,
+ (write_mask & sip_writable_mask) << 1 & env->mideleg);
+ ret &= vsip_writable_mask;
+ ret >>= 1;
+ } else {
+ ret = rmw_mip(env, CSR_MSTATUS, ret_value, new_value,
write_mask & env->mideleg & sip_writable_mask);
+ }
+
*ret_value &= env->mideleg;
return ret;
}