mirror of
https://github.com/xemu-project/xemu.git
synced 2024-11-27 13:30:52 +00:00
target/riscv: Move cpu_get_tb_cpu_state out of line
Move the function to cpu_helper.c, as it is large and growing. Reviewed-by: LIU Zhiwei <zhiwei_liu@c-sky.com> Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20211020031709.359469-2-richard.henderson@linaro.org Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
This commit is contained in:
parent
9d3d60b704
commit
53677acf25
@ -413,51 +413,8 @@ static inline uint32_t vext_get_vlmax(RISCVCPU *cpu, target_ulong vtype)
|
||||
return cpu->cfg.vlen >> (sew + 3 - lmul);
|
||||
}
|
||||
|
||||
static inline void cpu_get_tb_cpu_state(CPURISCVState *env, target_ulong *pc,
|
||||
target_ulong *cs_base, uint32_t *pflags)
|
||||
{
|
||||
uint32_t flags = 0;
|
||||
|
||||
*pc = env->pc;
|
||||
*cs_base = 0;
|
||||
|
||||
if (riscv_has_ext(env, RVV)) {
|
||||
uint32_t vlmax = vext_get_vlmax(env_archcpu(env), env->vtype);
|
||||
bool vl_eq_vlmax = (env->vstart == 0) && (vlmax == env->vl);
|
||||
flags = FIELD_DP32(flags, TB_FLAGS, VILL,
|
||||
FIELD_EX64(env->vtype, VTYPE, VILL));
|
||||
flags = FIELD_DP32(flags, TB_FLAGS, SEW,
|
||||
FIELD_EX64(env->vtype, VTYPE, VSEW));
|
||||
flags = FIELD_DP32(flags, TB_FLAGS, LMUL,
|
||||
FIELD_EX64(env->vtype, VTYPE, VLMUL));
|
||||
flags = FIELD_DP32(flags, TB_FLAGS, VL_EQ_VLMAX, vl_eq_vlmax);
|
||||
} else {
|
||||
flags = FIELD_DP32(flags, TB_FLAGS, VILL, 1);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_USER_ONLY
|
||||
flags |= TB_FLAGS_MSTATUS_FS;
|
||||
#else
|
||||
flags |= cpu_mmu_index(env, 0);
|
||||
if (riscv_cpu_fp_enabled(env)) {
|
||||
flags |= env->mstatus & MSTATUS_FS;
|
||||
}
|
||||
|
||||
if (riscv_has_ext(env, RVH)) {
|
||||
if (env->priv == PRV_M ||
|
||||
(env->priv == PRV_S && !riscv_cpu_virt_enabled(env)) ||
|
||||
(env->priv == PRV_U && !riscv_cpu_virt_enabled(env) &&
|
||||
get_field(env->hstatus, HSTATUS_HU))) {
|
||||
flags = FIELD_DP32(flags, TB_FLAGS, HLSX, 1);
|
||||
}
|
||||
|
||||
flags = FIELD_DP32(flags, TB_FLAGS, MSTATUS_HS_FS,
|
||||
get_field(env->mstatus_hs, MSTATUS_FS));
|
||||
}
|
||||
#endif
|
||||
|
||||
*pflags = flags;
|
||||
}
|
||||
void cpu_get_tb_cpu_state(CPURISCVState *env, target_ulong *pc,
|
||||
target_ulong *cs_base, uint32_t *pflags);
|
||||
|
||||
RISCVException riscv_csrrw(CPURISCVState *env, int csrno,
|
||||
target_ulong *ret_value,
|
||||
|
@ -35,6 +35,52 @@ int riscv_cpu_mmu_index(CPURISCVState *env, bool ifetch)
|
||||
#endif
|
||||
}
|
||||
|
||||
void cpu_get_tb_cpu_state(CPURISCVState *env, target_ulong *pc,
|
||||
target_ulong *cs_base, uint32_t *pflags)
|
||||
{
|
||||
uint32_t flags = 0;
|
||||
|
||||
*pc = env->pc;
|
||||
*cs_base = 0;
|
||||
|
||||
if (riscv_has_ext(env, RVV)) {
|
||||
uint32_t vlmax = vext_get_vlmax(env_archcpu(env), env->vtype);
|
||||
bool vl_eq_vlmax = (env->vstart == 0) && (vlmax == env->vl);
|
||||
flags = FIELD_DP32(flags, TB_FLAGS, VILL,
|
||||
FIELD_EX64(env->vtype, VTYPE, VILL));
|
||||
flags = FIELD_DP32(flags, TB_FLAGS, SEW,
|
||||
FIELD_EX64(env->vtype, VTYPE, VSEW));
|
||||
flags = FIELD_DP32(flags, TB_FLAGS, LMUL,
|
||||
FIELD_EX64(env->vtype, VTYPE, VLMUL));
|
||||
flags = FIELD_DP32(flags, TB_FLAGS, VL_EQ_VLMAX, vl_eq_vlmax);
|
||||
} else {
|
||||
flags = FIELD_DP32(flags, TB_FLAGS, VILL, 1);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_USER_ONLY
|
||||
flags |= TB_FLAGS_MSTATUS_FS;
|
||||
#else
|
||||
flags |= cpu_mmu_index(env, 0);
|
||||
if (riscv_cpu_fp_enabled(env)) {
|
||||
flags |= env->mstatus & MSTATUS_FS;
|
||||
}
|
||||
|
||||
if (riscv_has_ext(env, RVH)) {
|
||||
if (env->priv == PRV_M ||
|
||||
(env->priv == PRV_S && !riscv_cpu_virt_enabled(env)) ||
|
||||
(env->priv == PRV_U && !riscv_cpu_virt_enabled(env) &&
|
||||
get_field(env->hstatus, HSTATUS_HU))) {
|
||||
flags = FIELD_DP32(flags, TB_FLAGS, HLSX, 1);
|
||||
}
|
||||
|
||||
flags = FIELD_DP32(flags, TB_FLAGS, MSTATUS_HS_FS,
|
||||
get_field(env->mstatus_hs, MSTATUS_FS));
|
||||
}
|
||||
#endif
|
||||
|
||||
*pflags = flags;
|
||||
}
|
||||
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
static int riscv_cpu_local_irq_pending(CPURISCVState *env)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user