blob: b2881cdda6e74a702836ddfedefcb1e77556bb04 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
semantic: 0.781
device: 0.768
performance: 0.721
other: 0.672
network: 0.629
graphic: 0.625
permissions: 0.623
socket: 0.600
files: 0.512
vnc: 0.479
debug: 0.421
boot: 0.380
KVM: 0.350
PID: 0.342
RISC-V mstatus TSR bit not correctly implemented
Hi,
since qemu 4.1.0 the TSR bit in mstatus register is supported. But it does not allow for executing sret in m-mode.
From the RISC-V specifications:
"When TSR=1, attempts to execute SRET while executing in S-mode will raise an illegal instruction
exception. When TSR=0, this operation is permitted in S-mode."
This means an exception should only be raised when executing in S-mode, but not in M-mode, hence you should change the condition in helper_sret (target/riscv/op_helper.c) from:
if (env->priv_ver >= PRIV_VERSION_1_10_0 &&
get_field(env->mstatus, MSTATUS_TSR))
to:
if (env->priv_ver >= PRIV_VERSION_1_10_0 &&
get_field(env->mstatus, MSTATUS_TSR) && !(env->priv >= PRV_M))
Fixed here:
https://git.qemu.org/?p=qemu.git;a=commitdiff;h=ed5abf46b3c4
|