target/riscv: rvv-1.0: add mstatus VS field
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com> Signed-off-by: Frank Chang <frank.chang@sifive.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Message-Id: <20211210075704.23951-4-frank.chang@sifive.com> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
This commit is contained in:
parent
52561f2a80
commit
61b4b69d12
|
@ -352,6 +352,7 @@ int riscv_cpu_write_elf32_note(WriteCoreDumpFunction f, CPUState *cs,
|
||||||
int riscv_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg);
|
int riscv_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg);
|
||||||
int riscv_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
|
int riscv_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
|
||||||
bool riscv_cpu_fp_enabled(CPURISCVState *env);
|
bool riscv_cpu_fp_enabled(CPURISCVState *env);
|
||||||
|
bool riscv_cpu_vector_enabled(CPURISCVState *env);
|
||||||
bool riscv_cpu_virt_enabled(CPURISCVState *env);
|
bool riscv_cpu_virt_enabled(CPURISCVState *env);
|
||||||
void riscv_cpu_set_virt_enabled(CPURISCVState *env, bool enable);
|
void riscv_cpu_set_virt_enabled(CPURISCVState *env, bool enable);
|
||||||
bool riscv_cpu_two_stage_lookup(int mmu_idx);
|
bool riscv_cpu_two_stage_lookup(int mmu_idx);
|
||||||
|
@ -395,6 +396,7 @@ void riscv_cpu_set_fflags(CPURISCVState *env, target_ulong);
|
||||||
#define TB_FLAGS_PRIV_MMU_MASK 3
|
#define TB_FLAGS_PRIV_MMU_MASK 3
|
||||||
#define TB_FLAGS_PRIV_HYP_ACCESS_MASK (1 << 2)
|
#define TB_FLAGS_PRIV_HYP_ACCESS_MASK (1 << 2)
|
||||||
#define TB_FLAGS_MSTATUS_FS MSTATUS_FS
|
#define TB_FLAGS_MSTATUS_FS MSTATUS_FS
|
||||||
|
#define TB_FLAGS_MSTATUS_VS MSTATUS_VS
|
||||||
|
|
||||||
typedef CPURISCVState CPUArchState;
|
typedef CPURISCVState CPUArchState;
|
||||||
typedef RISCVCPU ArchCPU;
|
typedef RISCVCPU ArchCPU;
|
||||||
|
|
|
@ -375,6 +375,7 @@
|
||||||
#define MSTATUS_UBE 0x00000040
|
#define MSTATUS_UBE 0x00000040
|
||||||
#define MSTATUS_MPIE 0x00000080
|
#define MSTATUS_MPIE 0x00000080
|
||||||
#define MSTATUS_SPP 0x00000100
|
#define MSTATUS_SPP 0x00000100
|
||||||
|
#define MSTATUS_VS 0x00000600
|
||||||
#define MSTATUS_MPP 0x00001800
|
#define MSTATUS_MPP 0x00001800
|
||||||
#define MSTATUS_FS 0x00006000
|
#define MSTATUS_FS 0x00006000
|
||||||
#define MSTATUS_XS 0x00018000
|
#define MSTATUS_XS 0x00018000
|
||||||
|
|
|
@ -90,12 +90,17 @@ void cpu_get_tb_cpu_state(CPURISCVState *env, target_ulong *pc,
|
||||||
|
|
||||||
#ifdef CONFIG_USER_ONLY
|
#ifdef CONFIG_USER_ONLY
|
||||||
flags |= TB_FLAGS_MSTATUS_FS;
|
flags |= TB_FLAGS_MSTATUS_FS;
|
||||||
|
flags |= TB_FLAGS_MSTATUS_VS;
|
||||||
#else
|
#else
|
||||||
flags |= cpu_mmu_index(env, 0);
|
flags |= cpu_mmu_index(env, 0);
|
||||||
if (riscv_cpu_fp_enabled(env)) {
|
if (riscv_cpu_fp_enabled(env)) {
|
||||||
flags |= env->mstatus & MSTATUS_FS;
|
flags |= env->mstatus & MSTATUS_FS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (riscv_cpu_vector_enabled(env)) {
|
||||||
|
flags |= env->mstatus & MSTATUS_VS;
|
||||||
|
}
|
||||||
|
|
||||||
if (riscv_has_ext(env, RVH)) {
|
if (riscv_has_ext(env, RVH)) {
|
||||||
if (env->priv == PRV_M ||
|
if (env->priv == PRV_M ||
|
||||||
(env->priv == PRV_S && !riscv_cpu_virt_enabled(env)) ||
|
(env->priv == PRV_S && !riscv_cpu_virt_enabled(env)) ||
|
||||||
|
@ -189,11 +194,24 @@ bool riscv_cpu_fp_enabled(CPURISCVState *env)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Return true is vector support is currently enabled */
|
||||||
|
bool riscv_cpu_vector_enabled(CPURISCVState *env)
|
||||||
|
{
|
||||||
|
if (env->mstatus & MSTATUS_VS) {
|
||||||
|
if (riscv_cpu_virt_enabled(env) && !(env->mstatus_hs & MSTATUS_VS)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void riscv_cpu_swap_hypervisor_regs(CPURISCVState *env)
|
void riscv_cpu_swap_hypervisor_regs(CPURISCVState *env)
|
||||||
{
|
{
|
||||||
uint64_t mstatus_mask = MSTATUS_MXR | MSTATUS_SUM | MSTATUS_FS |
|
uint64_t mstatus_mask = MSTATUS_MXR | MSTATUS_SUM | MSTATUS_FS |
|
||||||
MSTATUS_SPP | MSTATUS_SPIE | MSTATUS_SIE |
|
MSTATUS_SPP | MSTATUS_SPIE | MSTATUS_SIE |
|
||||||
MSTATUS64_UXL;
|
MSTATUS64_UXL | MSTATUS_VS;
|
||||||
bool current_virt = riscv_cpu_virt_enabled(env);
|
bool current_virt = riscv_cpu_virt_enabled(env);
|
||||||
|
|
||||||
g_assert(riscv_has_ext(env, RVH));
|
g_assert(riscv_has_ext(env, RVH));
|
||||||
|
|
|
@ -273,6 +273,7 @@ static RISCVException write_fcsr(CPURISCVState *env, int csrno,
|
||||||
{
|
{
|
||||||
#if !defined(CONFIG_USER_ONLY)
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
env->mstatus |= MSTATUS_FS;
|
env->mstatus |= MSTATUS_FS;
|
||||||
|
env->mstatus |= MSTATUS_VS;
|
||||||
#endif
|
#endif
|
||||||
env->frm = (val & FSR_RD) >> FSR_RD_SHIFT;
|
env->frm = (val & FSR_RD) >> FSR_RD_SHIFT;
|
||||||
if (vs(env, csrno) >= 0) {
|
if (vs(env, csrno) >= 0) {
|
||||||
|
@ -307,6 +308,9 @@ static RISCVException read_vxrm(CPURISCVState *env, int csrno,
|
||||||
static RISCVException write_vxrm(CPURISCVState *env, int csrno,
|
static RISCVException write_vxrm(CPURISCVState *env, int csrno,
|
||||||
target_ulong val)
|
target_ulong val)
|
||||||
{
|
{
|
||||||
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
env->mstatus |= MSTATUS_VS;
|
||||||
|
#endif
|
||||||
env->vxrm = val;
|
env->vxrm = val;
|
||||||
return RISCV_EXCP_NONE;
|
return RISCV_EXCP_NONE;
|
||||||
}
|
}
|
||||||
|
@ -321,6 +325,9 @@ static RISCVException read_vxsat(CPURISCVState *env, int csrno,
|
||||||
static RISCVException write_vxsat(CPURISCVState *env, int csrno,
|
static RISCVException write_vxsat(CPURISCVState *env, int csrno,
|
||||||
target_ulong val)
|
target_ulong val)
|
||||||
{
|
{
|
||||||
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
env->mstatus |= MSTATUS_VS;
|
||||||
|
#endif
|
||||||
env->vxsat = val;
|
env->vxsat = val;
|
||||||
return RISCV_EXCP_NONE;
|
return RISCV_EXCP_NONE;
|
||||||
}
|
}
|
||||||
|
@ -335,6 +342,9 @@ static RISCVException read_vstart(CPURISCVState *env, int csrno,
|
||||||
static RISCVException write_vstart(CPURISCVState *env, int csrno,
|
static RISCVException write_vstart(CPURISCVState *env, int csrno,
|
||||||
target_ulong val)
|
target_ulong val)
|
||||||
{
|
{
|
||||||
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
env->mstatus |= MSTATUS_VS;
|
||||||
|
#endif
|
||||||
env->vstart = val;
|
env->vstart = val;
|
||||||
return RISCV_EXCP_NONE;
|
return RISCV_EXCP_NONE;
|
||||||
}
|
}
|
||||||
|
@ -535,7 +545,7 @@ static RISCVException write_mstatus(CPURISCVState *env, int csrno,
|
||||||
mask = MSTATUS_SIE | MSTATUS_SPIE | MSTATUS_MIE | MSTATUS_MPIE |
|
mask = MSTATUS_SIE | MSTATUS_SPIE | MSTATUS_MIE | MSTATUS_MPIE |
|
||||||
MSTATUS_SPP | MSTATUS_FS | MSTATUS_MPRV | MSTATUS_SUM |
|
MSTATUS_SPP | MSTATUS_FS | MSTATUS_MPRV | MSTATUS_SUM |
|
||||||
MSTATUS_MPP | MSTATUS_MXR | MSTATUS_TVM | MSTATUS_TSR |
|
MSTATUS_MPP | MSTATUS_MXR | MSTATUS_TVM | MSTATUS_TSR |
|
||||||
MSTATUS_TW;
|
MSTATUS_TW | MSTATUS_VS;
|
||||||
|
|
||||||
if (riscv_cpu_mxl(env) != MXL_RV32) {
|
if (riscv_cpu_mxl(env) != MXL_RV32) {
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue