diff -r 5271608211c5 sys/arch/mips/mips/mipsX_subr.S --- a/sys/arch/mips/mips/mipsX_subr.S Mon Apr 14 02:13:34 2025 +0000 +++ b/sys/arch/mips/mips/mipsX_subr.S Mon Apr 14 21:29:06 2025 +0000 @@ -1316,6 +1316,18 @@ /* If this was in a branch delay slot, take the slow path. */ mfc0 v0, MIPS_COP_0_CAUSE MFC0_HAZARD + ssnop + ssnop + ssnop + ssnop + ssnop + ssnop + ssnop + ssnop + ssnop + ssnop + ssnop + ssnop bltz v0, MIPSX(user_gen_exception_common) nop @@ -1323,8 +1335,23 @@ * Get exception PC and fetch the instruction. We know we can do * this since the instruction actually got read. */ - _MFC0 v0, MIPS_COP_0_EXC_PC + move v1, k0 + _MFC0 k0, MIPS_COP_0_EXC_PC MFC0_HAZARD + ssnop + ssnop + ssnop + ssnop + ssnop + ssnop + ssnop + ssnop + ssnop + ssnop + ssnop + ssnop + move v0, k0 + move k0, v1 INT_L AT, 0(v0) /* @@ -1338,16 +1365,56 @@ /* * Advance the PC (don't want to restart at the rdhwr). */ - _MFC0 v0, MIPS_COP_0_EXC_PC + move v1, k0 + _MFC0 k0, MIPS_COP_0_EXC_PC MFC0_HAZARD + ssnop + ssnop + ssnop + ssnop + ssnop + ssnop + ssnop + ssnop + ssnop + ssnop + ssnop + ssnop + move v0, k0 + move k0, v1 PTR_ADDIU v0, 4 _MTC0 v0, MIPS_COP_0_EXC_PC COP0_SYNC + ssnop + ssnop + ssnop + ssnop + ssnop + ssnop + ssnop + ssnop + ssnop + ssnop + ssnop + ssnop PTR_L v1, L_PRIVATE(k1) # rdhwr $3,$29 updates v1 - REG_L AT, CALLFRAME_SIZ+TF_REG_AST(k0)# restore reg - REG_L v0, CALLFRAME_SIZ+TF_REG_V0(k0) # restore reg + move k0, v0 + REG_L AT, CALLFRAME_SIZ+TF_REG_AST(v0)# restore reg + REG_L v0, CALLFRAME_SIZ+TF_REG_V0(v0) # restore reg + ssnop + ssnop + ssnop + ssnop + ssnop + ssnop + ssnop + ssnop + ssnop + ssnop + ssnop + ssnop eret END(MIPSX(user_reserved_insn))