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