1/* SPDX-License-Identifier: GPL-2.0 */ 2/* 3 * Copyright (C) 2020-2022 Loongson Technology Corporation Limited 4 * 5 * Derived from MIPS: 6 * Copyright (C) 1994 - 2000, 2001, 2003 Ralf Baechle 7 * Copyright (C) 1999, 2000 Silicon Graphics, Inc. 8 * Copyright (C) 2002, 2007 Maciej W. Rozycki 9 * Copyright (C) 2001, 2012 MIPS Technologies, Inc. All rights reserved. 10 */ 11#include <asm/asm.h> 12#include <asm/asmmacro.h> 13#include <asm/loongarch.h> 14#include <asm/regdef.h> 15#include <asm/fpregdef.h> 16#include <asm/stackframe.h> 17#include <asm/thread_info.h> 18 19 .align 5 20SYM_FUNC_START(__arch_cpu_idle) 21 /* start of rollback region */ 22 LONG_L t0, tp, TI_FLAGS 23 nop 24 andi t0, t0, _TIF_NEED_RESCHED 25 bnez t0, 1f 26 nop 27 nop 28 nop 29 idle 0 30 /* end of rollback region */ 311: jirl zero, ra, 0 32SYM_FUNC_END(__arch_cpu_idle) 33 34SYM_FUNC_START(handle_vint) 35 BACKUP_T0T1 36 SAVE_ALL 37 la.abs t1, __arch_cpu_idle 38 LONG_L t0, sp, PT_ERA 39 /* 32 byte rollback region */ 40 ori t0, t0, 0x1f 41 xori t0, t0, 0x1f 42 bne t0, t1, 1f 43 LONG_S t0, sp, PT_ERA 441: move a0, sp 45 move a1, sp 46 la.abs t0, do_vint 47 jirl ra, t0, 0 48 RESTORE_ALL_AND_RET 49SYM_FUNC_END(handle_vint) 50 51SYM_FUNC_START(except_vec_cex) 52 b cache_parity_error 53SYM_FUNC_END(except_vec_cex) 54 55 .macro build_prep_badv 56 csrrd t0, LOONGARCH_CSR_BADV 57 PTR_S t0, sp, PT_BVADDR 58 .endm 59 60 .macro build_prep_fcsr 61 movfcsr2gr a1, fcsr0 62 .endm 63 64 .macro build_prep_none 65 .endm 66 67 .macro BUILD_HANDLER exception handler prep 68 .align 5 69 SYM_FUNC_START(handle_\exception) 70 BACKUP_T0T1 71 SAVE_ALL 72 build_prep_\prep 73 move a0, sp 74 la.abs t0, do_\handler 75 jirl ra, t0, 0 76 RESTORE_ALL_AND_RET 77 SYM_FUNC_END(handle_\exception) 78 .endm 79 80 BUILD_HANDLER ade ade badv 81 BUILD_HANDLER ale ale badv 82 BUILD_HANDLER bp bp none 83 BUILD_HANDLER fpe fpe fcsr 84 BUILD_HANDLER fpu fpu none 85 BUILD_HANDLER lsx lsx none 86 BUILD_HANDLER lasx lasx none 87 BUILD_HANDLER lbt lbt none 88 BUILD_HANDLER ri ri none 89 BUILD_HANDLER watch watch none 90 BUILD_HANDLER reserved reserved none /* others */ 91 92SYM_FUNC_START(handle_sys) 93 la.abs t0, handle_syscall 94 jirl zero, t0, 0 95SYM_FUNC_END(handle_sys) 96