xref: /rk3399_rockchip-uboot/arch/arc/lib/ints_low.S (revision 8ee28251d95e237302c7c44929e59a813e147622)
1*8ee28251SAlexey Brodkin/*
2*8ee28251SAlexey Brodkin * Copyright (C) 2013-2015 Synopsys, Inc. All rights reserved.
3*8ee28251SAlexey Brodkin *
4*8ee28251SAlexey Brodkin * SPDX-License-Identifier:	GPL-2.0+
5*8ee28251SAlexey Brodkin */
6*8ee28251SAlexey Brodkin
7*8ee28251SAlexey Brodkin#include <linux/linkage.h>
8*8ee28251SAlexey Brodkin
9*8ee28251SAlexey Brodkin/*
10*8ee28251SAlexey Brodkin * Note on the LD/ST addressing modes with address register write-back
11*8ee28251SAlexey Brodkin *
12*8ee28251SAlexey Brodkin * LD.a same as LD.aw
13*8ee28251SAlexey Brodkin *
14*8ee28251SAlexey Brodkin * LD.a    reg1, [reg2, x]  => Pre Incr
15*8ee28251SAlexey Brodkin *      Eff Addr for load = [reg2 + x]
16*8ee28251SAlexey Brodkin *
17*8ee28251SAlexey Brodkin * LD.ab   reg1, [reg2, x]  => Post Incr
18*8ee28251SAlexey Brodkin *      Eff Addr for load = [reg2]
19*8ee28251SAlexey Brodkin */
20*8ee28251SAlexey Brodkin
21*8ee28251SAlexey Brodkin.macro PUSH reg
22*8ee28251SAlexey Brodkin	st.a	\reg, [%sp, -4]
23*8ee28251SAlexey Brodkin.endm
24*8ee28251SAlexey Brodkin
25*8ee28251SAlexey Brodkin.macro PUSHAX aux
26*8ee28251SAlexey Brodkin	lr	%r9, [\aux]
27*8ee28251SAlexey Brodkin	PUSH	%r9
28*8ee28251SAlexey Brodkin.endm
29*8ee28251SAlexey Brodkin
30*8ee28251SAlexey Brodkin.macro  SAVE_R1_TO_R24
31*8ee28251SAlexey Brodkin	PUSH	%r1
32*8ee28251SAlexey Brodkin	PUSH	%r2
33*8ee28251SAlexey Brodkin	PUSH	%r3
34*8ee28251SAlexey Brodkin	PUSH	%r4
35*8ee28251SAlexey Brodkin	PUSH	%r5
36*8ee28251SAlexey Brodkin	PUSH	%r6
37*8ee28251SAlexey Brodkin	PUSH	%r7
38*8ee28251SAlexey Brodkin	PUSH	%r8
39*8ee28251SAlexey Brodkin	PUSH	%r9
40*8ee28251SAlexey Brodkin	PUSH	%r10
41*8ee28251SAlexey Brodkin	PUSH	%r11
42*8ee28251SAlexey Brodkin	PUSH	%r12
43*8ee28251SAlexey Brodkin	PUSH	%r13
44*8ee28251SAlexey Brodkin	PUSH	%r14
45*8ee28251SAlexey Brodkin	PUSH	%r15
46*8ee28251SAlexey Brodkin	PUSH	%r16
47*8ee28251SAlexey Brodkin	PUSH	%r17
48*8ee28251SAlexey Brodkin	PUSH	%r18
49*8ee28251SAlexey Brodkin	PUSH	%r19
50*8ee28251SAlexey Brodkin	PUSH	%r20
51*8ee28251SAlexey Brodkin	PUSH	%r21
52*8ee28251SAlexey Brodkin	PUSH	%r22
53*8ee28251SAlexey Brodkin	PUSH	%r23
54*8ee28251SAlexey Brodkin	PUSH	%r24
55*8ee28251SAlexey Brodkin.endm
56*8ee28251SAlexey Brodkin
57*8ee28251SAlexey Brodkin.macro SAVE_ALL_SYS
58*8ee28251SAlexey Brodkin	/* saving %r0 to reg->r0 in advance since we read %ecr into it */
59*8ee28251SAlexey Brodkin	st	%r0, [%sp, -8]
60*8ee28251SAlexey Brodkin	lr	%r0, [%ecr]	/* all stack addressing is manual so far */
61*8ee28251SAlexey Brodkin	st	%r0, [%sp]
62*8ee28251SAlexey Brodkin	st	%sp, [%sp, -4]
63*8ee28251SAlexey Brodkin	/* now move %sp to reg->r0 position so we can do "push" automatically */
64*8ee28251SAlexey Brodkin	sub	%sp, %sp, 8
65*8ee28251SAlexey Brodkin
66*8ee28251SAlexey Brodkin	SAVE_R1_TO_R24
67*8ee28251SAlexey Brodkin	PUSH	%r25
68*8ee28251SAlexey Brodkin	PUSH	%gp
69*8ee28251SAlexey Brodkin	PUSH	%fp
70*8ee28251SAlexey Brodkin	PUSH	%blink
71*8ee28251SAlexey Brodkin	PUSHAX	%eret
72*8ee28251SAlexey Brodkin	PUSHAX	%erstatus
73*8ee28251SAlexey Brodkin	PUSH	%lp_count
74*8ee28251SAlexey Brodkin	PUSHAX	%lp_end
75*8ee28251SAlexey Brodkin	PUSHAX	%lp_start
76*8ee28251SAlexey Brodkin	PUSHAX	%erbta
77*8ee28251SAlexey Brodkin.endm
78*8ee28251SAlexey Brodkin
79*8ee28251SAlexey Brodkin.macro SAVE_EXCEPTION_SOURCE
80*8ee28251SAlexey Brodkin#ifdef CONFIG_MMU
81*8ee28251SAlexey Brodkin	/* If MMU exists exception faulting address is loaded in EFA reg */
82*8ee28251SAlexey Brodkin	lr	%r0, [%efa]
83*8ee28251SAlexey Brodkin#else
84*8ee28251SAlexey Brodkin	/* Otherwise in ERET (exception return) reg */
85*8ee28251SAlexey Brodkin	lr	%r0, [%eret]
86*8ee28251SAlexey Brodkin#endif
87*8ee28251SAlexey Brodkin.endm
88*8ee28251SAlexey Brodkin
89*8ee28251SAlexey BrodkinENTRY(memory_error)
90*8ee28251SAlexey Brodkin	SAVE_ALL_SYS
91*8ee28251SAlexey Brodkin	SAVE_EXCEPTION_SOURCE
92*8ee28251SAlexey Brodkin	mov	%r1, %sp
93*8ee28251SAlexey Brodkin	j	do_memory_error
94*8ee28251SAlexey BrodkinENDPROC(memory_error)
95*8ee28251SAlexey Brodkin
96*8ee28251SAlexey BrodkinENTRY(instruction_error)
97*8ee28251SAlexey Brodkin	SAVE_ALL_SYS
98*8ee28251SAlexey Brodkin	SAVE_EXCEPTION_SOURCE
99*8ee28251SAlexey Brodkin	mov	%r1, %sp
100*8ee28251SAlexey Brodkin	j	do_instruction_error
101*8ee28251SAlexey BrodkinENDPROC(instruction_error)
102*8ee28251SAlexey Brodkin
103*8ee28251SAlexey BrodkinENTRY(interrupt_handler)
104*8ee28251SAlexey Brodkin	/* Todo - save and restore CPU context when interrupts will be in use */
105*8ee28251SAlexey Brodkin	bl	do_interrupt_handler
106*8ee28251SAlexey Brodkin	rtie
107*8ee28251SAlexey BrodkinENDPROC(interrupt_handler)
108*8ee28251SAlexey Brodkin
109*8ee28251SAlexey BrodkinENTRY(EV_MachineCheck)
110*8ee28251SAlexey Brodkin	SAVE_ALL_SYS
111*8ee28251SAlexey Brodkin	SAVE_EXCEPTION_SOURCE
112*8ee28251SAlexey Brodkin	mov	%r1, %sp
113*8ee28251SAlexey Brodkin	j	do_machine_check_fault
114*8ee28251SAlexey BrodkinENDPROC(EV_MachineCheck)
115*8ee28251SAlexey Brodkin
116*8ee28251SAlexey BrodkinENTRY(EV_TLBMissI)
117*8ee28251SAlexey Brodkin	SAVE_ALL_SYS
118*8ee28251SAlexey Brodkin	mov	%r0, %sp
119*8ee28251SAlexey Brodkin	j	do_itlb_miss
120*8ee28251SAlexey BrodkinENDPROC(EV_TLBMissI)
121*8ee28251SAlexey Brodkin
122*8ee28251SAlexey BrodkinENTRY(EV_TLBMissD)
123*8ee28251SAlexey Brodkin	SAVE_ALL_SYS
124*8ee28251SAlexey Brodkin	mov	%r0, %sp
125*8ee28251SAlexey Brodkin	j	do_dtlb_miss
126*8ee28251SAlexey BrodkinENDPROC(EV_TLBMissD)
127*8ee28251SAlexey Brodkin
128*8ee28251SAlexey BrodkinENTRY(EV_TLBProtV)
129*8ee28251SAlexey Brodkin	SAVE_ALL_SYS
130*8ee28251SAlexey Brodkin	SAVE_EXCEPTION_SOURCE
131*8ee28251SAlexey Brodkin	mov	%r1, %sp
132*8ee28251SAlexey Brodkin	j	do_tlb_prot_violation
133*8ee28251SAlexey BrodkinENDPROC(EV_TLBProtV)
134*8ee28251SAlexey Brodkin
135*8ee28251SAlexey BrodkinENTRY(EV_PrivilegeV)
136*8ee28251SAlexey Brodkin	SAVE_ALL_SYS
137*8ee28251SAlexey Brodkin	mov	%r0, %sp
138*8ee28251SAlexey Brodkin	j	do_privilege_violation
139*8ee28251SAlexey BrodkinENDPROC(EV_PrivilegeV)
140*8ee28251SAlexey Brodkin
141*8ee28251SAlexey BrodkinENTRY(EV_Trap)
142*8ee28251SAlexey Brodkin	SAVE_ALL_SYS
143*8ee28251SAlexey Brodkin	mov	%r0, %sp
144*8ee28251SAlexey Brodkin	j	do_trap
145*8ee28251SAlexey BrodkinENDPROC(EV_Trap)
146*8ee28251SAlexey Brodkin
147*8ee28251SAlexey BrodkinENTRY(EV_Extension)
148*8ee28251SAlexey Brodkin	SAVE_ALL_SYS
149*8ee28251SAlexey Brodkin	mov	%r0, %sp
150*8ee28251SAlexey Brodkin	j	do_extension
151*8ee28251SAlexey BrodkinENDPROC(EV_Extension)
152