Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

KVM: LoongArch: selftests: Add system registers save/restore on exception

When system returns from exception with ertn instruction, PC comes from
LOONGARCH_CSR_ERA, and CSR.CRMD comes LOONGARCH_CSR_PRMD.

Here save CSR register CSR.ERA and CSR.PRMD into stack, and then restore
them from stack. So it can be modified by exception handlers in future.

Signed-off-by: Bibo Mao <maobibo@loongson.cn>
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>

authored by

Bibo Mao and committed by
Huacai Chen
985a9698 d3e43a1f

+10 -1
+4 -1
tools/testing/selftests/kvm/include/loongarch/processor.h
··· 124 124 unsigned long pc; 125 125 unsigned long estat; 126 126 unsigned long badv; 127 + unsigned long prmd; 127 128 }; 128 129 129 130 #define PC_OFFSET_EXREGS offsetof(struct ex_regs, pc) 130 131 #define ESTAT_OFFSET_EXREGS offsetof(struct ex_regs, estat) 131 132 #define BADV_OFFSET_EXREGS offsetof(struct ex_regs, badv) 133 + #define PRMD_OFFSET_EXREGS offsetof(struct ex_regs, prmd) 132 134 #define EXREGS_SIZE sizeof(struct ex_regs) 133 135 134 136 #else 135 137 #define PC_OFFSET_EXREGS ((EXREGS_GPRS + 0) * 8) 136 138 #define ESTAT_OFFSET_EXREGS ((EXREGS_GPRS + 1) * 8) 137 139 #define BADV_OFFSET_EXREGS ((EXREGS_GPRS + 2) * 8) 138 - #define EXREGS_SIZE ((EXREGS_GPRS + 3) * 8) 140 + #define PRMD_OFFSET_EXREGS ((EXREGS_GPRS + 3) * 8) 141 + #define EXREGS_SIZE ((EXREGS_GPRS + 4) * 8) 139 142 #endif 140 143 141 144 #endif /* SELFTEST_KVM_PROCESSOR_H */
+6
tools/testing/selftests/kvm/lib/loongarch/exception.S
··· 51 51 st.d t0, sp, ESTAT_OFFSET_EXREGS 52 52 csrrd t0, LOONGARCH_CSR_BADV 53 53 st.d t0, sp, BADV_OFFSET_EXREGS 54 + csrrd t0, LOONGARCH_CSR_PRMD 55 + st.d t0, sp, PRMD_OFFSET_EXREGS 54 56 55 57 or a0, sp, zero 56 58 bl route_exception 59 + ld.d t0, sp, PC_OFFSET_EXREGS 60 + csrwr t0, LOONGARCH_CSR_ERA 61 + ld.d t0, sp, PRMD_OFFSET_EXREGS 62 + csrwr t0, LOONGARCH_CSR_PRMD 57 63 restore_gprs sp 58 64 csrrd sp, LOONGARCH_CSR_KS0 59 65 ertn