target/loongarch: Extract set_pc() helper
Signed-off-by: Jiajie Chen <c@jia.je> Co-authored-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Song Gao <gaosong@loongson.cn> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Message-ID: <20230822032724.1353391-6-gaosong@loongson.cn> [PMD: Extract helper from bigger patch] Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> Message-Id: <20230822071405.35386-9-philmd@linaro.org>
This commit is contained in:
parent
5a7ce25d0d
commit
2f6478ffad
@ -81,7 +81,7 @@ static void loongarch_cpu_set_pc(CPUState *cs, vaddr value)
|
||||
LoongArchCPU *cpu = LOONGARCH_CPU(cs);
|
||||
CPULoongArchState *env = &cpu->env;
|
||||
|
||||
env->pc = value;
|
||||
set_pc(env, value);
|
||||
}
|
||||
|
||||
static vaddr loongarch_cpu_get_pc(CPUState *cs)
|
||||
@ -168,7 +168,7 @@ static void loongarch_cpu_do_interrupt(CPUState *cs)
|
||||
set_DERA:
|
||||
env->CSR_DERA = env->pc;
|
||||
env->CSR_DBG = FIELD_DP64(env->CSR_DBG, CSR_DBG, DST, 1);
|
||||
env->pc = env->CSR_EENTRY + 0x480;
|
||||
set_pc(env, env->CSR_EENTRY + 0x480);
|
||||
break;
|
||||
case EXCCODE_INT:
|
||||
if (FIELD_EX64(env->CSR_DBG, CSR_DBG, DST)) {
|
||||
@ -249,7 +249,8 @@ static void loongarch_cpu_do_interrupt(CPUState *cs)
|
||||
|
||||
/* Find the highest-priority interrupt. */
|
||||
vector = 31 - clz32(pending);
|
||||
env->pc = env->CSR_EENTRY + (EXCCODE_EXTERNAL_INT + vector) * vec_size;
|
||||
set_pc(env, env->CSR_EENTRY + \
|
||||
(EXCCODE_EXTERNAL_INT + vector) * vec_size);
|
||||
qemu_log_mask(CPU_LOG_INT,
|
||||
"%s: PC " TARGET_FMT_lx " ERA " TARGET_FMT_lx
|
||||
" cause %d\n" " A " TARGET_FMT_lx " D "
|
||||
@ -260,10 +261,9 @@ static void loongarch_cpu_do_interrupt(CPUState *cs)
|
||||
env->CSR_ECFG, env->CSR_ESTAT);
|
||||
} else {
|
||||
if (tlbfill) {
|
||||
env->pc = env->CSR_TLBRENTRY;
|
||||
set_pc(env, env->CSR_TLBRENTRY);
|
||||
} else {
|
||||
env->pc = env->CSR_EENTRY;
|
||||
env->pc += EXCODE_MCODE(cause) * vec_size;
|
||||
set_pc(env, env->CSR_EENTRY + EXCODE_MCODE(cause) * vec_size);
|
||||
}
|
||||
qemu_log_mask(CPU_LOG_INT,
|
||||
"%s: PC " TARGET_FMT_lx " ERA " TARGET_FMT_lx
|
||||
@ -324,7 +324,7 @@ static void loongarch_cpu_synchronize_from_tb(CPUState *cs,
|
||||
CPULoongArchState *env = &cpu->env;
|
||||
|
||||
tcg_debug_assert(!(cs->tcg_cflags & CF_PCREL));
|
||||
env->pc = tb->pc;
|
||||
set_pc(env, tb->pc);
|
||||
}
|
||||
|
||||
static void loongarch_restore_state_to_opc(CPUState *cs,
|
||||
@ -334,7 +334,7 @@ static void loongarch_restore_state_to_opc(CPUState *cs,
|
||||
LoongArchCPU *cpu = LOONGARCH_CPU(cs);
|
||||
CPULoongArchState *env = &cpu->env;
|
||||
|
||||
env->pc = data[0];
|
||||
set_pc(env, data[0]);
|
||||
}
|
||||
#endif /* CONFIG_TCG */
|
||||
|
||||
|
@ -443,6 +443,11 @@ static inline bool is_va32(CPULoongArchState *env)
|
||||
return va32;
|
||||
}
|
||||
|
||||
static inline void set_pc(CPULoongArchState *env, uint64_t value)
|
||||
{
|
||||
env->pc = value;
|
||||
}
|
||||
|
||||
/*
|
||||
* LoongArch CPUs hardware flags.
|
||||
*/
|
||||
|
@ -77,7 +77,7 @@ int loongarch_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
|
||||
env->gpr[n] = tmp;
|
||||
length = read_length;
|
||||
} else if (n == 33) {
|
||||
env->pc = tmp;
|
||||
set_pc(env, tmp);
|
||||
length = read_length;
|
||||
}
|
||||
return length;
|
||||
|
@ -114,14 +114,14 @@ void helper_ertn(CPULoongArchState *env)
|
||||
env->CSR_TLBRERA = FIELD_DP64(env->CSR_TLBRERA, CSR_TLBRERA, ISTLBR, 0);
|
||||
env->CSR_CRMD = FIELD_DP64(env->CSR_CRMD, CSR_CRMD, DA, 0);
|
||||
env->CSR_CRMD = FIELD_DP64(env->CSR_CRMD, CSR_CRMD, PG, 1);
|
||||
env->pc = env->CSR_TLBRERA;
|
||||
set_pc(env, env->CSR_TLBRERA);
|
||||
qemu_log_mask(CPU_LOG_INT, "%s: TLBRERA " TARGET_FMT_lx "\n",
|
||||
__func__, env->CSR_TLBRERA);
|
||||
} else {
|
||||
csr_pplv = FIELD_EX64(env->CSR_PRMD, CSR_PRMD, PPLV);
|
||||
csr_pie = FIELD_EX64(env->CSR_PRMD, CSR_PRMD, PIE);
|
||||
|
||||
env->pc = env->CSR_ERA;
|
||||
set_pc(env, env->CSR_ERA);
|
||||
qemu_log_mask(CPU_LOG_INT, "%s: ERA " TARGET_FMT_lx "\n",
|
||||
__func__, env->CSR_ERA);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user