xref: /rk3399_rockchip-uboot/arch/mips/lib/genex.S (revision a2cb31086f68cc0db95d4373e6dbdb612954f445)
1*6c593630SDaniel Schwierzeck/*
2*6c593630SDaniel Schwierzeck * Copyright (C) 1994 - 2000, 2001, 2003 Ralf Baechle
3*6c593630SDaniel Schwierzeck * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
4*6c593630SDaniel Schwierzeck * Copyright (C) 2002, 2007  Maciej W. Rozycki
5*6c593630SDaniel Schwierzeck * Copyright (C) 2001, 2012 MIPS Technologies, Inc.  All rights reserved.
6*6c593630SDaniel Schwierzeck *
7*6c593630SDaniel Schwierzeck * SPDX-License-Identifier:	GPL-2.0+
8*6c593630SDaniel Schwierzeck */
9*6c593630SDaniel Schwierzeck
10*6c593630SDaniel Schwierzeck#include <asm/asm.h>
11*6c593630SDaniel Schwierzeck#include <asm/regdef.h>
12*6c593630SDaniel Schwierzeck#include <asm/mipsregs.h>
13*6c593630SDaniel Schwierzeck#include <asm/asm-offsets.h>
14*6c593630SDaniel Schwierzeck
15*6c593630SDaniel Schwierzeck#define STATMASK 0x1f
16*6c593630SDaniel Schwierzeck
17*6c593630SDaniel Schwierzeck	.set	noreorder
18*6c593630SDaniel Schwierzeck
19*6c593630SDaniel Schwierzeck	/*
20*6c593630SDaniel Schwierzeck	 * Macros copied and adapted from Linux MIPS
21*6c593630SDaniel Schwierzeck	 */
22*6c593630SDaniel Schwierzeck	.macro	SAVE_AT
23*6c593630SDaniel Schwierzeck	.set	push
24*6c593630SDaniel Schwierzeck	.set	noat
25*6c593630SDaniel Schwierzeck	LONG_S	$1, PT_R1(sp)
26*6c593630SDaniel Schwierzeck	.set	pop
27*6c593630SDaniel Schwierzeck	.endm
28*6c593630SDaniel Schwierzeck
29*6c593630SDaniel Schwierzeck	.macro	SAVE_TEMP
30*6c593630SDaniel Schwierzeck#if __mips_isa_rev < 6
31*6c593630SDaniel Schwierzeck	mfhi	v1
32*6c593630SDaniel Schwierzeck#endif
33*6c593630SDaniel Schwierzeck#ifdef CONFIG_32BIT
34*6c593630SDaniel Schwierzeck	LONG_S	$8, PT_R8(sp)
35*6c593630SDaniel Schwierzeck	LONG_S	$9, PT_R9(sp)
36*6c593630SDaniel Schwierzeck#endif
37*6c593630SDaniel Schwierzeck	LONG_S	$10, PT_R10(sp)
38*6c593630SDaniel Schwierzeck	LONG_S	$11, PT_R11(sp)
39*6c593630SDaniel Schwierzeck	LONG_S	$12, PT_R12(sp)
40*6c593630SDaniel Schwierzeck#if __mips_isa_rev < 6
41*6c593630SDaniel Schwierzeck	LONG_S	v1, PT_HI(sp)
42*6c593630SDaniel Schwierzeck	mflo	v1
43*6c593630SDaniel Schwierzeck#endif
44*6c593630SDaniel Schwierzeck	LONG_S	$13, PT_R13(sp)
45*6c593630SDaniel Schwierzeck	LONG_S	$14, PT_R14(sp)
46*6c593630SDaniel Schwierzeck	LONG_S	$15, PT_R15(sp)
47*6c593630SDaniel Schwierzeck	LONG_S	$24, PT_R24(sp)
48*6c593630SDaniel Schwierzeck#if __mips_isa_rev < 6
49*6c593630SDaniel Schwierzeck	LONG_S	v1, PT_LO(sp)
50*6c593630SDaniel Schwierzeck#endif
51*6c593630SDaniel Schwierzeck	.endm
52*6c593630SDaniel Schwierzeck
53*6c593630SDaniel Schwierzeck	.macro	SAVE_STATIC
54*6c593630SDaniel Schwierzeck	LONG_S	$16, PT_R16(sp)
55*6c593630SDaniel Schwierzeck	LONG_S	$17, PT_R17(sp)
56*6c593630SDaniel Schwierzeck	LONG_S	$18, PT_R18(sp)
57*6c593630SDaniel Schwierzeck	LONG_S	$19, PT_R19(sp)
58*6c593630SDaniel Schwierzeck	LONG_S	$20, PT_R20(sp)
59*6c593630SDaniel Schwierzeck	LONG_S	$21, PT_R21(sp)
60*6c593630SDaniel Schwierzeck	LONG_S	$22, PT_R22(sp)
61*6c593630SDaniel Schwierzeck	LONG_S	$23, PT_R23(sp)
62*6c593630SDaniel Schwierzeck	LONG_S	$30, PT_R30(sp)
63*6c593630SDaniel Schwierzeck	.endm
64*6c593630SDaniel Schwierzeck
65*6c593630SDaniel Schwierzeck	.macro	SAVE_SOME
66*6c593630SDaniel Schwierzeck	.set	push
67*6c593630SDaniel Schwierzeck	.set	noat
68*6c593630SDaniel Schwierzeck	PTR_SUBU k1, sp, PT_SIZE
69*6c593630SDaniel Schwierzeck	LONG_S	sp, PT_R29(k1)
70*6c593630SDaniel Schwierzeck	move	sp, k1
71*6c593630SDaniel Schwierzeck
72*6c593630SDaniel Schwierzeck	LONG_S	$3, PT_R3(sp)
73*6c593630SDaniel Schwierzeck	LONG_S	$0, PT_R0(sp)
74*6c593630SDaniel Schwierzeck	mfc0	v1, CP0_STATUS
75*6c593630SDaniel Schwierzeck	LONG_S	$2, PT_R2(sp)
76*6c593630SDaniel Schwierzeck	LONG_S	v1, PT_STATUS(sp)
77*6c593630SDaniel Schwierzeck	LONG_S	$4, PT_R4(sp)
78*6c593630SDaniel Schwierzeck	mfc0	v1, CP0_CAUSE
79*6c593630SDaniel Schwierzeck	LONG_S	$5, PT_R5(sp)
80*6c593630SDaniel Schwierzeck	LONG_S	v1, PT_CAUSE(sp)
81*6c593630SDaniel Schwierzeck	LONG_S	$6, PT_R6(sp)
82*6c593630SDaniel Schwierzeck	MFC0	v1, CP0_EPC
83*6c593630SDaniel Schwierzeck	LONG_S	$7, PT_R7(sp)
84*6c593630SDaniel Schwierzeck#ifdef CONFIG_64BIT
85*6c593630SDaniel Schwierzeck	LONG_S	$8, PT_R8(sp)
86*6c593630SDaniel Schwierzeck	LONG_S	$9, PT_R9(sp)
87*6c593630SDaniel Schwierzeck#endif
88*6c593630SDaniel Schwierzeck	LONG_S	v1, PT_EPC(sp)
89*6c593630SDaniel Schwierzeck	LONG_S	$25, PT_R25(sp)
90*6c593630SDaniel Schwierzeck	LONG_S	$28, PT_R28(sp)
91*6c593630SDaniel Schwierzeck	LONG_S	$31, PT_R31(sp)
92*6c593630SDaniel Schwierzeck	.set	pop
93*6c593630SDaniel Schwierzeck	.endm
94*6c593630SDaniel Schwierzeck
95*6c593630SDaniel Schwierzeck	.macro	RESTORE_AT
96*6c593630SDaniel Schwierzeck	.set	push
97*6c593630SDaniel Schwierzeck	.set	noat
98*6c593630SDaniel Schwierzeck	LONG_L	$1,  PT_R1(sp)
99*6c593630SDaniel Schwierzeck	.set	pop
100*6c593630SDaniel Schwierzeck	.endm
101*6c593630SDaniel Schwierzeck
102*6c593630SDaniel Schwierzeck	.macro	RESTORE_TEMP
103*6c593630SDaniel Schwierzeck#if __mips_isa_rev < 6
104*6c593630SDaniel Schwierzeck	LONG_L	$24, PT_LO(sp)
105*6c593630SDaniel Schwierzeck	mtlo	$24
106*6c593630SDaniel Schwierzeck	LONG_L	$24, PT_HI(sp)
107*6c593630SDaniel Schwierzeck	mthi	$24
108*6c593630SDaniel Schwierzeck#endif
109*6c593630SDaniel Schwierzeck#ifdef CONFIG_32BIT
110*6c593630SDaniel Schwierzeck	LONG_L	$8, PT_R8(sp)
111*6c593630SDaniel Schwierzeck	LONG_L	$9, PT_R9(sp)
112*6c593630SDaniel Schwierzeck#endif
113*6c593630SDaniel Schwierzeck	LONG_L	$10, PT_R10(sp)
114*6c593630SDaniel Schwierzeck	LONG_L	$11, PT_R11(sp)
115*6c593630SDaniel Schwierzeck	LONG_L	$12, PT_R12(sp)
116*6c593630SDaniel Schwierzeck	LONG_L	$13, PT_R13(sp)
117*6c593630SDaniel Schwierzeck	LONG_L	$14, PT_R14(sp)
118*6c593630SDaniel Schwierzeck	LONG_L	$15, PT_R15(sp)
119*6c593630SDaniel Schwierzeck	LONG_L	$24, PT_R24(sp)
120*6c593630SDaniel Schwierzeck	.endm
121*6c593630SDaniel Schwierzeck
122*6c593630SDaniel Schwierzeck	.macro	RESTORE_STATIC
123*6c593630SDaniel Schwierzeck	LONG_L	$16, PT_R16(sp)
124*6c593630SDaniel Schwierzeck	LONG_L	$17, PT_R17(sp)
125*6c593630SDaniel Schwierzeck	LONG_L	$18, PT_R18(sp)
126*6c593630SDaniel Schwierzeck	LONG_L	$19, PT_R19(sp)
127*6c593630SDaniel Schwierzeck	LONG_L	$20, PT_R20(sp)
128*6c593630SDaniel Schwierzeck	LONG_L	$21, PT_R21(sp)
129*6c593630SDaniel Schwierzeck	LONG_L	$22, PT_R22(sp)
130*6c593630SDaniel Schwierzeck	LONG_L	$23, PT_R23(sp)
131*6c593630SDaniel Schwierzeck	LONG_L	$30, PT_R30(sp)
132*6c593630SDaniel Schwierzeck	.endm
133*6c593630SDaniel Schwierzeck
134*6c593630SDaniel Schwierzeck	.macro	RESTORE_SOME
135*6c593630SDaniel Schwierzeck	.set	push
136*6c593630SDaniel Schwierzeck	.set	reorder
137*6c593630SDaniel Schwierzeck	.set	noat
138*6c593630SDaniel Schwierzeck	mfc0	a0, CP0_STATUS
139*6c593630SDaniel Schwierzeck	ori	a0, STATMASK
140*6c593630SDaniel Schwierzeck	xori	a0, STATMASK
141*6c593630SDaniel Schwierzeck	mtc0	a0, CP0_STATUS
142*6c593630SDaniel Schwierzeck	li	v1, ST0_CU1 | ST0_FR | ST0_IM
143*6c593630SDaniel Schwierzeck	and	a0, v1
144*6c593630SDaniel Schwierzeck	LONG_L	v0, PT_STATUS(sp)
145*6c593630SDaniel Schwierzeck	nor	v1, $0, v1
146*6c593630SDaniel Schwierzeck	and	v0, v1
147*6c593630SDaniel Schwierzeck	or	v0, a0
148*6c593630SDaniel Schwierzeck	mtc0	v0, CP0_STATUS
149*6c593630SDaniel Schwierzeck	LONG_L	v1, PT_EPC(sp)
150*6c593630SDaniel Schwierzeck	MTC0	v1, CP0_EPC
151*6c593630SDaniel Schwierzeck	LONG_L	$31, PT_R31(sp)
152*6c593630SDaniel Schwierzeck	LONG_L	$28, PT_R28(sp)
153*6c593630SDaniel Schwierzeck	LONG_L	$25, PT_R25(sp)
154*6c593630SDaniel Schwierzeck#ifdef CONFIG_64BIT
155*6c593630SDaniel Schwierzeck	LONG_L	$8, PT_R8(sp)
156*6c593630SDaniel Schwierzeck	LONG_L	$9, PT_R9(sp)
157*6c593630SDaniel Schwierzeck#endif
158*6c593630SDaniel Schwierzeck	LONG_L	$7,  PT_R7(sp)
159*6c593630SDaniel Schwierzeck	LONG_L	$6,  PT_R6(sp)
160*6c593630SDaniel Schwierzeck	LONG_L	$5,  PT_R5(sp)
161*6c593630SDaniel Schwierzeck	LONG_L	$4,  PT_R4(sp)
162*6c593630SDaniel Schwierzeck	LONG_L	$3,  PT_R3(sp)
163*6c593630SDaniel Schwierzeck	LONG_L	$2,  PT_R2(sp)
164*6c593630SDaniel Schwierzeck	.set	pop
165*6c593630SDaniel Schwierzeck	.endm
166*6c593630SDaniel Schwierzeck
167*6c593630SDaniel Schwierzeck	.macro	RESTORE_SP
168*6c593630SDaniel Schwierzeck	LONG_L	sp, PT_R29(sp)
169*6c593630SDaniel Schwierzeck	.endm
170*6c593630SDaniel Schwierzeck
171*6c593630SDaniel SchwierzeckNESTED(except_vec3_generic, 0, sp)
172*6c593630SDaniel Schwierzeck	PTR_LA	k1, handle_reserved
173*6c593630SDaniel Schwierzeck	jr	k1
174*6c593630SDaniel Schwierzeck	 nop
175*6c593630SDaniel Schwierzeck	END(except_vec3_generic)
176*6c593630SDaniel Schwierzeck
177*6c593630SDaniel SchwierzeckNESTED(except_vec_ejtag_debug, 0, sp)
178*6c593630SDaniel Schwierzeck	PTR_LA	k1, handle_ejtag_debug
179*6c593630SDaniel Schwierzeck	jr	k1
180*6c593630SDaniel Schwierzeck	 nop
181*6c593630SDaniel Schwierzeck	END(except_vec_ejtag_debug)
182*6c593630SDaniel Schwierzeck
183*6c593630SDaniel SchwierzeckNESTED(handle_reserved, PT_SIZE, sp)
184*6c593630SDaniel Schwierzeck	SAVE_SOME
185*6c593630SDaniel Schwierzeck	SAVE_AT
186*6c593630SDaniel Schwierzeck	SAVE_TEMP
187*6c593630SDaniel Schwierzeck	SAVE_STATIC
188*6c593630SDaniel Schwierzeck
189*6c593630SDaniel Schwierzeck	PTR_LA	t9, do_reserved
190*6c593630SDaniel Schwierzeck	jr	t9
191*6c593630SDaniel Schwierzeck	 move	a0, sp
192*6c593630SDaniel Schwierzeck	END(handle_reserved)
193*6c593630SDaniel Schwierzeck
194*6c593630SDaniel SchwierzeckNESTED(handle_ejtag_debug, PT_SIZE, sp)
195*6c593630SDaniel Schwierzeck	.set	push
196*6c593630SDaniel Schwierzeck	.set	noat
197*6c593630SDaniel Schwierzeck	MTC0	k1, CP0_DESAVE
198*6c593630SDaniel Schwierzeck
199*6c593630SDaniel Schwierzeck	/* Check for SDBBP */
200*6c593630SDaniel Schwierzeck	MFC0	k1, CP0_DEBUG
201*6c593630SDaniel Schwierzeck	sll	k1, k1, 30
202*6c593630SDaniel Schwierzeck	bgez	k1, ejtag_return
203*6c593630SDaniel Schwierzeck	 nop
204*6c593630SDaniel Schwierzeck
205*6c593630SDaniel Schwierzeck	SAVE_SOME
206*6c593630SDaniel Schwierzeck	SAVE_AT
207*6c593630SDaniel Schwierzeck	SAVE_TEMP
208*6c593630SDaniel Schwierzeck	SAVE_STATIC
209*6c593630SDaniel Schwierzeck
210*6c593630SDaniel Schwierzeck	PTR_LA	t9, do_ejtag_debug
211*6c593630SDaniel Schwierzeck	jalr	t9
212*6c593630SDaniel Schwierzeck	 move	a0, sp
213*6c593630SDaniel Schwierzeck
214*6c593630SDaniel Schwierzeck	RESTORE_TEMP
215*6c593630SDaniel Schwierzeck	RESTORE_STATIC
216*6c593630SDaniel Schwierzeck	RESTORE_AT
217*6c593630SDaniel Schwierzeck	RESTORE_SOME
218*6c593630SDaniel Schwierzeck	RESTORE_SP
219*6c593630SDaniel Schwierzeck
220*6c593630SDaniel Schwierzeckejtag_return:
221*6c593630SDaniel Schwierzeck	MFC0	k1, CP0_DESAVE
222*6c593630SDaniel Schwierzeck	deret
223*6c593630SDaniel Schwierzeck	.set pop
224*6c593630SDaniel Schwierzeck	END(handle_ejtag_debug)
225