mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00

Add core KVM selftests support for LoongArch, it includes exception handler, mmu page table setup and vCPU startup entry support. Signed-off-by: Bibo Mao <maobibo@loongson.cn> Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
59 lines
1.3 KiB
ArmAsm
59 lines
1.3 KiB
ArmAsm
/* SPDX-License-Identifier: GPL-2.0 */
|
|
|
|
#include "processor.h"
|
|
|
|
/* address of refill exception should be 4K aligned */
|
|
.balign 4096
|
|
.global handle_tlb_refill
|
|
handle_tlb_refill:
|
|
csrwr t0, LOONGARCH_CSR_TLBRSAVE
|
|
csrrd t0, LOONGARCH_CSR_PGD
|
|
lddir t0, t0, 3
|
|
lddir t0, t0, 1
|
|
ldpte t0, 0
|
|
ldpte t0, 1
|
|
tlbfill
|
|
csrrd t0, LOONGARCH_CSR_TLBRSAVE
|
|
ertn
|
|
|
|
/*
|
|
* save and restore all gprs except base register,
|
|
* and default value of base register is sp ($r3).
|
|
*/
|
|
.macro save_gprs base
|
|
.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,31
|
|
st.d $r\n, \base, 8 * \n
|
|
.endr
|
|
.endm
|
|
|
|
.macro restore_gprs base
|
|
.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,31
|
|
ld.d $r\n, \base, 8 * \n
|
|
.endr
|
|
.endm
|
|
|
|
/* address of general exception should be 4K aligned */
|
|
.balign 4096
|
|
.global handle_exception
|
|
handle_exception:
|
|
csrwr sp, LOONGARCH_CSR_KS0
|
|
csrrd sp, LOONGARCH_CSR_KS1
|
|
addi.d sp, sp, -EXREGS_SIZE
|
|
|
|
save_gprs sp
|
|
/* save sp register to stack */
|
|
csrrd t0, LOONGARCH_CSR_KS0
|
|
st.d t0, sp, 3 * 8
|
|
|
|
csrrd t0, LOONGARCH_CSR_ERA
|
|
st.d t0, sp, PC_OFFSET_EXREGS
|
|
csrrd t0, LOONGARCH_CSR_ESTAT
|
|
st.d t0, sp, ESTAT_OFFSET_EXREGS
|
|
csrrd t0, LOONGARCH_CSR_BADV
|
|
st.d t0, sp, BADV_OFFSET_EXREGS
|
|
|
|
or a0, sp, zero
|
|
bl route_exception
|
|
restore_gprs sp
|
|
csrrd sp, LOONGARCH_CSR_KS0
|
|
ertn
|