diff --git a/target/loongarch/cpu.c b/target/loongarch/cpu.c
index fb03424ffa..aa6ecd9da2 100644
--- a/target/loongarch/cpu.c
+++ b/target/loongarch/cpu.c
@@ -623,44 +623,39 @@ static void loongarch_cpu_reset_hold(Object
*obj, ResetType type)
env->fcsr0 = 0x0;
int n;
- /* Set csr registers value after reset, see the manual 6.4. */
- sys->CSR_CRMD = FIELD_DP64(sys->CSR_CRMD, CSR_CRMD, PLV, 0);
- sys->CSR_CRMD = FIELD_DP64(sys->CSR_CRMD, CSR_CRMD, IE, 0);
- sys->CSR_CRMD = FIELD_DP64(sys->CSR_CRMD, CSR_CRMD, DA, 1);
- sys->CSR_CRMD = FIELD_DP64(sys->CSR_CRMD, CSR_CRMD, PG, 0);
- sys->CSR_CRMD = FIELD_DP64(sys->CSR_CRMD, CSR_CRMD, DATF, 0);
- sys->CSR_CRMD = FIELD_DP64(sys->CSR_CRMD, CSR_CRMD, DATM, 0);
- sys->CSR_EUEN = FIELD_DP64(sys->CSR_EUEN, CSR_EUEN, FPE, 0);
- sys->CSR_EUEN = FIELD_DP64(sys->CSR_EUEN, CSR_EUEN, SXE, 0);
- sys->CSR_EUEN = FIELD_DP64(sys->CSR_EUEN, CSR_EUEN, ASXE, 0);
- sys->CSR_EUEN = FIELD_DP64(sys->CSR_EUEN, CSR_EUEN, BTE, 0);
+ memset(sys, 0, offsetof(CPUSysState, end_reset_fields));
- sys->CSR_MISC = 0;
-
- sys->CSR_ECFG = FIELD_DP64(sys->CSR_ECFG, CSR_ECFG, VS, 0);
- sys->CSR_ECFG = FIELD_DP64(sys->CSR_ECFG, CSR_ECFG, LIE, 0);
+ /* Set csr registers value after reset, see the manual 6.4. */
+ sys->CSR_CRMD = FIELD_DP64(sys->CSR_CRMD, CSR_CRMD, DA, 1);
- sys->CSR_ESTAT = sys->CSR_ESTAT & (~MAKE_64BIT_MASK(0, 2));
- sys->CSR_RVACFG = FIELD_DP64(sys->CSR_RVACFG, CSR_RVACFG, RBITS,
0);
sys->CSR_CPUID = cs->cpu_index;
sys->CSR_TCFG = FIELD_DP64(sys->CSR_TCFG, CSR_TCFG, EN, 0);
sys->CSR_LLBCTL = FIELD_DP64(sys->CSR_LLBCTL, CSR_LLBCTL, KLO, 0);
sys->CSR_TLBRERA = FIELD_DP64(sys->CSR_TLBRERA, CSR_TLBRERA,
ISTLBR, 0);
sys->CSR_MERRCTL = FIELD_DP64(sys->CSR_MERRCTL, CSR_MERRCTL,
ISMERR, 0);
sys->CSR_TID = cs->cpu_index;
+
+ sys->CSR_DBG = FIELD_DP64(sys->CSR_DBG, CSR_DBG, DST, 0);
+ for (n = 0; n < env->perf_event_num; n++) {
+ sys->CSR_PERFCTRL[n] = FIELD_DP64(sys->CSR_PERFCTRL[n],
CSR_PERFCTRL,
+ PLV0, 0);
+ sys->CSR_PERFCTRL[n] = FIELD_DP64(sys->CSR_PERFCTRL[n],
CSR_PERFCTRL,
+ PLV1, 0);
+ sys->CSR_PERFCTRL[n] = FIELD_DP64(sys->CSR_PERFCTRL[n],
CSR_PERFCTRL,
+ PLV2, 0);
+ sys->CSR_PERFCTRL[n] = FIELD_DP64(sys->CSR_PERFCTRL[n],
CSR_PERFCTRL,
+ PLV3, 0);
+ sys->CSR_PERFCTRL[n] = FIELD_DP64(sys->CSR_PERFCTRL[n],
CSR_PERFCTRL,
+ PMIE, 0);
+ }
+
/*
* Workaround for edk2-stable202408, CSR PGD register is set
only if
* its value is equal to zero for boot cpu, it causes reboot
issue.