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