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: jr ra 32SYM_FUNC_END(__arch_cpu_idle) 33 34SYM_CODE_START(handle_vint) 35 UNWIND_HINT_UNDEFINED 36 BACKUP_T0T1 37 SAVE_ALL 38 la_abs t1, __arch_cpu_idle 39 LONG_L t0, sp, PT_ERA 40 /* 32 byte rollback region */ 41 ori t0, t0, 0x1f 42 xori t0, t0, 0x1f 43 bne t0, t1, 1f 44 LONG_S t0, sp, PT_ERA 451: move a0, sp 46 move a1, sp 47 la_abs t0, do_vint 48 jirl ra, t0, 0 49 RESTORE_ALL_AND_RET 50SYM_CODE_END(handle_vint) 51 52SYM_CODE_START(except_vec_cex) 53 UNWIND_HINT_UNDEFINED 54 b cache_parity_error 55SYM_CODE_END(except_vec_cex) 56 57 .macro build_prep_badv 58 csrrd t0, LOONGARCH_CSR_BADV 59 PTR_S t0, sp, PT_BVADDR 60 .endm 61 62 .macro build_prep_fcsr 63 movfcsr2gr a1, fcsr0 64 .endm 65 66 .macro build_prep_none 67 .endm 68 69 .macro BUILD_HANDLER exception handler prep 70 .align 5 71 SYM_CODE_START(handle_\exception) 72 UNWIND_HINT_UNDEFINED 73 666: 74 BACKUP_T0T1 75 SAVE_ALL 76 build_prep_\prep 77 move a0, sp 78 la_abs t0, do_\handler 79 jirl ra, t0, 0 80 668: 81 RESTORE_ALL_AND_RET 82 SYM_CODE_END(handle_\exception) 83 .pushsection ".data", "aw", %progbits 84 SYM_DATA(unwind_hint_\exception, .word 668b - 666b) 85 .popsection 86 .endm 87 88 BUILD_HANDLER ade ade badv 89 BUILD_HANDLER ale ale badv 90 BUILD_HANDLER bce bce none 91 BUILD_HANDLER bp bp none 92 BUILD_HANDLER fpe fpe fcsr 93 BUILD_HANDLER fpu fpu none 94 BUILD_HANDLER lsx lsx none 95 BUILD_HANDLER lasx lasx none 96 BUILD_HANDLER lbt lbt none 97 BUILD_HANDLER ri ri none 98 BUILD_HANDLER watch watch none 99 BUILD_HANDLER reserved reserved none /* others */ 100 101SYM_CODE_START(handle_sys) 102 UNWIND_HINT_UNDEFINED 103 la_abs t0, handle_syscall 104 jr t0 105SYM_CODE_END(handle_sys) 106