mirror of
https://github.com/qemu/qemu.git
synced 2024-11-26 21:33:40 +08:00
target/riscv: Enable uxl field write
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Message-id: 20220120122050.41546-23-zhiwei_liu@c-sky.com Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
This commit is contained in:
parent
5a2ae2350e
commit
f310df58bd
@ -449,6 +449,9 @@ typedef enum {
|
||||
#define COUNTEREN_IR (1 << 2)
|
||||
#define COUNTEREN_HPM3 (1 << 3)
|
||||
|
||||
/* vsstatus CSR bits */
|
||||
#define VSSTATUS64_UXL 0x0000000300000000ULL
|
||||
|
||||
/* Privilege modes */
|
||||
#define PRV_U 0
|
||||
#define PRV_S 1
|
||||
|
@ -496,7 +496,7 @@ static const target_ulong vs_delegable_excps = DELEGABLE_EXCPS &
|
||||
(1ULL << (RISCV_EXCP_STORE_GUEST_AMO_ACCESS_FAULT)));
|
||||
static const target_ulong sstatus_v1_10_mask = SSTATUS_SIE | SSTATUS_SPIE |
|
||||
SSTATUS_UIE | SSTATUS_UPIE | SSTATUS_SPP | SSTATUS_FS | SSTATUS_XS |
|
||||
SSTATUS_SUM | SSTATUS_MXR | SSTATUS_VS | (target_ulong)SSTATUS64_UXL;
|
||||
SSTATUS_SUM | SSTATUS_MXR | SSTATUS_VS;
|
||||
static const target_ulong sip_writable_mask = SIP_SSIP | MIP_USIP | MIP_UEIP;
|
||||
static const target_ulong hip_writable_mask = MIP_VSSIP;
|
||||
static const target_ulong hvip_writable_mask = MIP_VSSIP | MIP_VSTIP | MIP_VSEIP;
|
||||
@ -572,6 +572,7 @@ static RISCVException write_mstatus(CPURISCVState *env, int csrno,
|
||||
{
|
||||
uint64_t mstatus = env->mstatus;
|
||||
uint64_t mask = 0;
|
||||
RISCVMXL xl = riscv_cpu_mxl(env);
|
||||
|
||||
/* flush tlb on mstatus fields that affect VM */
|
||||
if ((val ^ mstatus) & (MSTATUS_MXR | MSTATUS_MPP | MSTATUS_MPV |
|
||||
@ -583,21 +584,22 @@ static RISCVException write_mstatus(CPURISCVState *env, int csrno,
|
||||
MSTATUS_MPP | MSTATUS_MXR | MSTATUS_TVM | MSTATUS_TSR |
|
||||
MSTATUS_TW | MSTATUS_VS;
|
||||
|
||||
if (riscv_cpu_mxl(env) != MXL_RV32) {
|
||||
if (xl != MXL_RV32) {
|
||||
/*
|
||||
* RV32: MPV and GVA are not in mstatus. The current plan is to
|
||||
* add them to mstatush. For now, we just don't support it.
|
||||
*/
|
||||
mask |= MSTATUS_MPV | MSTATUS_GVA;
|
||||
if ((val & MSTATUS64_UXL) != 0) {
|
||||
mask |= MSTATUS64_UXL;
|
||||
}
|
||||
}
|
||||
|
||||
mstatus = (mstatus & ~mask) | (val & mask);
|
||||
|
||||
RISCVMXL xl = riscv_cpu_mxl(env);
|
||||
if (xl > MXL_RV32) {
|
||||
/* SXL and UXL fields are for now read only */
|
||||
/* SXL field is for now read only */
|
||||
mstatus = set_field(mstatus, MSTATUS64_SXL, xl);
|
||||
mstatus = set_field(mstatus, MSTATUS64_UXL, xl);
|
||||
}
|
||||
env->mstatus = mstatus;
|
||||
env->xl = cpu_recompute_xl(env);
|
||||
@ -898,6 +900,9 @@ static RISCVException read_sstatus_i128(CPURISCVState *env, int csrno,
|
||||
{
|
||||
uint64_t mask = sstatus_v1_10_mask;
|
||||
uint64_t sstatus = env->mstatus & mask;
|
||||
if (env->xl != MXL_RV32) {
|
||||
mask |= SSTATUS64_UXL;
|
||||
}
|
||||
|
||||
*val = int128_make128(sstatus, add_status_sd(MXL_RV128, sstatus));
|
||||
return RISCV_EXCP_NONE;
|
||||
@ -907,7 +912,9 @@ static RISCVException read_sstatus(CPURISCVState *env, int csrno,
|
||||
target_ulong *val)
|
||||
{
|
||||
target_ulong mask = (sstatus_v1_10_mask);
|
||||
|
||||
if (env->xl != MXL_RV32) {
|
||||
mask |= SSTATUS64_UXL;
|
||||
}
|
||||
/* TODO: Use SXL not MXL. */
|
||||
*val = add_status_sd(riscv_cpu_mxl(env), env->mstatus & mask);
|
||||
return RISCV_EXCP_NONE;
|
||||
@ -917,6 +924,12 @@ static RISCVException write_sstatus(CPURISCVState *env, int csrno,
|
||||
target_ulong val)
|
||||
{
|
||||
target_ulong mask = (sstatus_v1_10_mask);
|
||||
|
||||
if (env->xl != MXL_RV32) {
|
||||
if ((val & SSTATUS64_UXL) != 0) {
|
||||
mask |= SSTATUS64_UXL;
|
||||
}
|
||||
}
|
||||
target_ulong newval = (env->mstatus & ~mask) | (val & mask);
|
||||
return write_mstatus(env, CSR_MSTATUS, newval);
|
||||
}
|
||||
@ -1380,6 +1393,9 @@ static RISCVException write_vsstatus(CPURISCVState *env, int csrno,
|
||||
target_ulong val)
|
||||
{
|
||||
uint64_t mask = (target_ulong)-1;
|
||||
if ((val & VSSTATUS64_UXL) == 0) {
|
||||
mask &= ~VSSTATUS64_UXL;
|
||||
}
|
||||
env->vsstatus = (env->vsstatus & ~mask) | (uint64_t)val;
|
||||
return RISCV_EXCP_NONE;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user