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