xref: /rk3399_rockchip-uboot/arch/arc/lib/ints_low.S (revision 699c4e592b32f43d4ba2cc0d53848118a77d590a)
18ee28251SAlexey Brodkin/*
28ee28251SAlexey Brodkin * Copyright (C) 2013-2015 Synopsys, Inc. All rights reserved.
38ee28251SAlexey Brodkin *
48ee28251SAlexey Brodkin * SPDX-License-Identifier:	GPL-2.0+
58ee28251SAlexey Brodkin */
68ee28251SAlexey Brodkin
78ee28251SAlexey Brodkin#include <linux/linkage.h>
88ee28251SAlexey Brodkin
98ee28251SAlexey Brodkin/*
108ee28251SAlexey Brodkin * Note on the LD/ST addressing modes with address register write-back
118ee28251SAlexey Brodkin *
128ee28251SAlexey Brodkin * LD.a same as LD.aw
138ee28251SAlexey Brodkin *
148ee28251SAlexey Brodkin * LD.a    reg1, [reg2, x]  => Pre Incr
158ee28251SAlexey Brodkin *      Eff Addr for load = [reg2 + x]
168ee28251SAlexey Brodkin *
178ee28251SAlexey Brodkin * LD.ab   reg1, [reg2, x]  => Post Incr
188ee28251SAlexey Brodkin *      Eff Addr for load = [reg2]
198ee28251SAlexey Brodkin */
208ee28251SAlexey Brodkin
218ee28251SAlexey Brodkin.macro PUSH reg
228ee28251SAlexey Brodkin	st.a	\reg, [%sp, -4]
238ee28251SAlexey Brodkin.endm
248ee28251SAlexey Brodkin
258ee28251SAlexey Brodkin.macro PUSHAX aux
268ee28251SAlexey Brodkin	lr	%r9, [\aux]
278ee28251SAlexey Brodkin	PUSH	%r9
288ee28251SAlexey Brodkin.endm
298ee28251SAlexey Brodkin
308ee28251SAlexey Brodkin.macro  SAVE_R1_TO_R24
318ee28251SAlexey Brodkin	PUSH	%r1
328ee28251SAlexey Brodkin	PUSH	%r2
338ee28251SAlexey Brodkin	PUSH	%r3
348ee28251SAlexey Brodkin	PUSH	%r4
358ee28251SAlexey Brodkin	PUSH	%r5
368ee28251SAlexey Brodkin	PUSH	%r6
378ee28251SAlexey Brodkin	PUSH	%r7
388ee28251SAlexey Brodkin	PUSH	%r8
398ee28251SAlexey Brodkin	PUSH	%r9
408ee28251SAlexey Brodkin	PUSH	%r10
418ee28251SAlexey Brodkin	PUSH	%r11
428ee28251SAlexey Brodkin	PUSH	%r12
438ee28251SAlexey Brodkin	PUSH	%r13
448ee28251SAlexey Brodkin	PUSH	%r14
458ee28251SAlexey Brodkin	PUSH	%r15
468ee28251SAlexey Brodkin	PUSH	%r16
478ee28251SAlexey Brodkin	PUSH	%r17
488ee28251SAlexey Brodkin	PUSH	%r18
498ee28251SAlexey Brodkin	PUSH	%r19
508ee28251SAlexey Brodkin	PUSH	%r20
518ee28251SAlexey Brodkin	PUSH	%r21
528ee28251SAlexey Brodkin	PUSH	%r22
538ee28251SAlexey Brodkin	PUSH	%r23
548ee28251SAlexey Brodkin	PUSH	%r24
558ee28251SAlexey Brodkin.endm
568ee28251SAlexey Brodkin
578ee28251SAlexey Brodkin.macro SAVE_ALL_SYS
588ee28251SAlexey Brodkin	/* saving %r0 to reg->r0 in advance since we read %ecr into it */
598ee28251SAlexey Brodkin	st	%r0, [%sp, -8]
608ee28251SAlexey Brodkin	lr	%r0, [%ecr]	/* all stack addressing is manual so far */
618ee28251SAlexey Brodkin	st	%r0, [%sp]
628ee28251SAlexey Brodkin	st	%sp, [%sp, -4]
638ee28251SAlexey Brodkin	/* now move %sp to reg->r0 position so we can do "push" automatically */
648ee28251SAlexey Brodkin	sub	%sp, %sp, 8
658ee28251SAlexey Brodkin
668ee28251SAlexey Brodkin	SAVE_R1_TO_R24
678ee28251SAlexey Brodkin	PUSH	%r25
688ee28251SAlexey Brodkin	PUSH	%gp
698ee28251SAlexey Brodkin	PUSH	%fp
708ee28251SAlexey Brodkin	PUSH	%blink
718ee28251SAlexey Brodkin	PUSHAX	%eret
728ee28251SAlexey Brodkin	PUSHAX	%erstatus
738ee28251SAlexey Brodkin	PUSH	%lp_count
748ee28251SAlexey Brodkin	PUSHAX	%lp_end
758ee28251SAlexey Brodkin	PUSHAX	%lp_start
768ee28251SAlexey Brodkin	PUSHAX	%erbta
778ee28251SAlexey Brodkin.endm
788ee28251SAlexey Brodkin
798ee28251SAlexey Brodkin.macro SAVE_EXCEPTION_SOURCE
808ee28251SAlexey Brodkin#ifdef CONFIG_MMU
818ee28251SAlexey Brodkin	/* If MMU exists exception faulting address is loaded in EFA reg */
828ee28251SAlexey Brodkin	lr	%r0, [%efa]
838ee28251SAlexey Brodkin#else
848ee28251SAlexey Brodkin	/* Otherwise in ERET (exception return) reg */
858ee28251SAlexey Brodkin	lr	%r0, [%eret]
868ee28251SAlexey Brodkin#endif
878ee28251SAlexey Brodkin.endm
888ee28251SAlexey Brodkin
898ee28251SAlexey BrodkinENTRY(memory_error)
908ee28251SAlexey Brodkin	SAVE_ALL_SYS
918ee28251SAlexey Brodkin	SAVE_EXCEPTION_SOURCE
928ee28251SAlexey Brodkin	mov	%r1, %sp
938ee28251SAlexey Brodkin	j	do_memory_error
948ee28251SAlexey BrodkinENDPROC(memory_error)
958ee28251SAlexey Brodkin
968ee28251SAlexey BrodkinENTRY(instruction_error)
978ee28251SAlexey Brodkin	SAVE_ALL_SYS
988ee28251SAlexey Brodkin	SAVE_EXCEPTION_SOURCE
998ee28251SAlexey Brodkin	mov	%r1, %sp
1008ee28251SAlexey Brodkin	j	do_instruction_error
1018ee28251SAlexey BrodkinENDPROC(instruction_error)
1028ee28251SAlexey Brodkin
1038ee28251SAlexey BrodkinENTRY(interrupt_handler)
1048ee28251SAlexey Brodkin	/* Todo - save and restore CPU context when interrupts will be in use */
1058ee28251SAlexey Brodkin	bl	do_interrupt_handler
1068ee28251SAlexey Brodkin	rtie
1078ee28251SAlexey BrodkinENDPROC(interrupt_handler)
1088ee28251SAlexey Brodkin
1098ee28251SAlexey BrodkinENTRY(EV_MachineCheck)
1108ee28251SAlexey Brodkin	SAVE_ALL_SYS
1118ee28251SAlexey Brodkin	SAVE_EXCEPTION_SOURCE
1128ee28251SAlexey Brodkin	mov	%r1, %sp
1138ee28251SAlexey Brodkin	j	do_machine_check_fault
1148ee28251SAlexey BrodkinENDPROC(EV_MachineCheck)
1158ee28251SAlexey Brodkin
1168ee28251SAlexey BrodkinENTRY(EV_TLBMissI)
1178ee28251SAlexey Brodkin	SAVE_ALL_SYS
1188ee28251SAlexey Brodkin	mov	%r0, %sp
1198ee28251SAlexey Brodkin	j	do_itlb_miss
1208ee28251SAlexey BrodkinENDPROC(EV_TLBMissI)
1218ee28251SAlexey Brodkin
1228ee28251SAlexey BrodkinENTRY(EV_TLBMissD)
1238ee28251SAlexey Brodkin	SAVE_ALL_SYS
1248ee28251SAlexey Brodkin	mov	%r0, %sp
1258ee28251SAlexey Brodkin	j	do_dtlb_miss
1268ee28251SAlexey BrodkinENDPROC(EV_TLBMissD)
1278ee28251SAlexey Brodkin
1288ee28251SAlexey BrodkinENTRY(EV_TLBProtV)
1298ee28251SAlexey Brodkin	SAVE_ALL_SYS
1308ee28251SAlexey Brodkin	SAVE_EXCEPTION_SOURCE
1318ee28251SAlexey Brodkin	mov	%r1, %sp
1328ee28251SAlexey Brodkin	j	do_tlb_prot_violation
1338ee28251SAlexey BrodkinENDPROC(EV_TLBProtV)
1348ee28251SAlexey Brodkin
1358ee28251SAlexey BrodkinENTRY(EV_PrivilegeV)
1368ee28251SAlexey Brodkin	SAVE_ALL_SYS
1378ee28251SAlexey Brodkin	mov	%r0, %sp
1388ee28251SAlexey Brodkin	j	do_privilege_violation
1398ee28251SAlexey BrodkinENDPROC(EV_PrivilegeV)
1408ee28251SAlexey Brodkin
1418ee28251SAlexey BrodkinENTRY(EV_Trap)
1428ee28251SAlexey Brodkin	SAVE_ALL_SYS
1438ee28251SAlexey Brodkin	mov	%r0, %sp
1448ee28251SAlexey Brodkin	j	do_trap
1458ee28251SAlexey BrodkinENDPROC(EV_Trap)
1468ee28251SAlexey Brodkin
1478ee28251SAlexey BrodkinENTRY(EV_Extension)
1488ee28251SAlexey Brodkin	SAVE_ALL_SYS
1498ee28251SAlexey Brodkin	mov	%r0, %sp
1508ee28251SAlexey Brodkin	j	do_extension
1518ee28251SAlexey BrodkinENDPROC(EV_Extension)
152*699c4e59SAlexey Brodkin
153*699c4e59SAlexey Brodkin#ifdef CONFIG_ISA_ARCV2
154*699c4e59SAlexey BrodkinENTRY(EV_SWI)
155*699c4e59SAlexey Brodkin	SAVE_ALL_SYS
156*699c4e59SAlexey Brodkin	mov	%r0, %sp
157*699c4e59SAlexey Brodkin	j	do_swi
158*699c4e59SAlexey BrodkinENDPROC(EV_SWI)
159*699c4e59SAlexey Brodkin
160*699c4e59SAlexey BrodkinENTRY(EV_DivZero)
161*699c4e59SAlexey Brodkin	SAVE_ALL_SYS
162*699c4e59SAlexey Brodkin	SAVE_EXCEPTION_SOURCE
163*699c4e59SAlexey Brodkin	mov	%r1, %sp
164*699c4e59SAlexey Brodkin	j	do_divzero
165*699c4e59SAlexey BrodkinENDPROC(EV_DivZero)
166*699c4e59SAlexey Brodkin
167*699c4e59SAlexey BrodkinENTRY(EV_DCError)
168*699c4e59SAlexey Brodkin	SAVE_ALL_SYS
169*699c4e59SAlexey Brodkin	mov	%r0, %sp
170*699c4e59SAlexey Brodkin	j	do_dcerror
171*699c4e59SAlexey BrodkinENDPROC(EV_DCError)
172*699c4e59SAlexey Brodkin
173*699c4e59SAlexey BrodkinENTRY(EV_Maligned)
174*699c4e59SAlexey Brodkin	SAVE_ALL_SYS
175*699c4e59SAlexey Brodkin	SAVE_EXCEPTION_SOURCE
176*699c4e59SAlexey Brodkin	mov	%r1, %sp
177*699c4e59SAlexey Brodkin	j	do_maligned
178*699c4e59SAlexey BrodkinENDPROC(EV_Maligned)
179*699c4e59SAlexey Brodkin#endif
180