Path: blob/master/tools/testing/selftests/kvm/lib/loongarch/exception.S
49620 views
/* SPDX-License-Identifier: GPL-2.0 */12#include "processor.h"34/* address of refill exception should be 4K aligned */5.balign 40966.global handle_tlb_refill7handle_tlb_refill:8csrwr t0, LOONGARCH_CSR_TLBRSAVE9csrrd t0, LOONGARCH_CSR_PGD10lddir t0, t0, 311lddir t0, t0, 112ldpte t0, 013ldpte t0, 114tlbfill15csrrd t0, LOONGARCH_CSR_TLBRSAVE16ertn1718/*19* save and restore all gprs except base register,20* and default value of base register is sp ($r3).21*/22.macro save_gprs base23.irp n,1,2,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,3124st.d $r\n, \base, 8 * \n25.endr26.endm2728.macro restore_gprs base29.irp n,1,2,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,3130ld.d $r\n, \base, 8 * \n31.endr32.endm3334/* address of general exception should be 4K aligned */35.balign 409636.global handle_exception37handle_exception:38csrwr sp, LOONGARCH_CSR_KS039csrrd sp, LOONGARCH_CSR_KS140addi.d sp, sp, -EXREGS_SIZE4142save_gprs sp43/* save sp register to stack */44csrrd t0, LOONGARCH_CSR_KS045st.d t0, sp, 3 * 84647csrrd t0, LOONGARCH_CSR_ERA48st.d t0, sp, PC_OFFSET_EXREGS49csrrd t0, LOONGARCH_CSR_ESTAT50st.d t0, sp, ESTAT_OFFSET_EXREGS51csrrd t0, LOONGARCH_CSR_BADV52st.d t0, sp, BADV_OFFSET_EXREGS53csrrd t0, LOONGARCH_CSR_PRMD54st.d t0, sp, PRMD_OFFSET_EXREGS5556or a0, sp, zero57bl route_exception58ld.d t0, sp, PC_OFFSET_EXREGS59csrwr t0, LOONGARCH_CSR_ERA60ld.d t0, sp, PRMD_OFFSET_EXREGS61csrwr t0, LOONGARCH_CSR_PRMD62restore_gprs sp63csrrd sp, LOONGARCH_CSR_KS064ertn656667