mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
60 lines
1.3 KiB
ArmAsm
60 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
|