xref: /nrf52832-nimble/rt-thread/libcpu/mips/common/mips_context.h (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero /*
2*10465441SEvalZero  * File      : mips_context_asm.h
3*10465441SEvalZero  * This file is part of RT-Thread RTOS
4*10465441SEvalZero  * COPYRIGHT (C) 2008 - 2012, RT-Thread Development Team
5*10465441SEvalZero  *
6*10465441SEvalZero  *  This program is free software; you can redistribute it and/or modify
7*10465441SEvalZero  *  it under the terms of the GNU General Public License as published by
8*10465441SEvalZero  *  the Free Software Foundation; either version 2 of the License, or
9*10465441SEvalZero  *  (at your option) any later version.
10*10465441SEvalZero  *
11*10465441SEvalZero  *  This program is distributed in the hope that it will be useful,
12*10465441SEvalZero  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13*10465441SEvalZero  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14*10465441SEvalZero  *  GNU General Public License for more details.
15*10465441SEvalZero  *
16*10465441SEvalZero  *  You should have received a copy of the GNU General Public License along
17*10465441SEvalZero  *  with this program; if not, write to the Free Software Foundation, Inc.,
18*10465441SEvalZero  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19*10465441SEvalZero  *
20*10465441SEvalZero  * Change Logs:
21*10465441SEvalZero  * Date           Author       Notes
22*10465441SEvalZero  * 2016��9��7��     Urey         the first version
23*10465441SEvalZero  */
24*10465441SEvalZero 
25*10465441SEvalZero #ifndef _MIPS_CONTEXT_ASM_H_
26*10465441SEvalZero #define _MIPS_CONTEXT_ASM_H_
27*10465441SEvalZero 
28*10465441SEvalZero #define CONTEXT_SIZE	( STK_CTX_SIZE + FPU_ADJ )
29*10465441SEvalZero #ifdef __mips_hard_float
30*10465441SEvalZero #define FPU_ADJ			(32 * 4 + 8)		/* FP0-FP31 + CP1_STATUS */
31*10465441SEvalZero #define FPU_CTX			( CONTEXT_SIZE - FPU_ADJ )
32*10465441SEvalZero #else
33*10465441SEvalZero #define FPU_ADJ			0
34*10465441SEvalZero #endif
35*10465441SEvalZero 
36*10465441SEvalZero 
37*10465441SEvalZero 
38*10465441SEvalZero #ifdef __ASSEMBLY__
39*10465441SEvalZero 
40*10465441SEvalZero #ifdef __mips_hard_float
41*10465441SEvalZero .global _fpctx_save
42*10465441SEvalZero .global _fpctx_load
43*10465441SEvalZero #endif
44*10465441SEvalZero 
45*10465441SEvalZero .macro SAVE_CONTEXT
46*10465441SEvalZero 	.set    push
47*10465441SEvalZero 	.set    noat
48*10465441SEvalZero 	.set    noreorder
49*10465441SEvalZero 	.set    volatile
50*10465441SEvalZero 
51*10465441SEvalZero 	//save SP
52*10465441SEvalZero 	move	k1, 	sp
53*10465441SEvalZero 	move	k0, 	sp
54*10465441SEvalZero 	subu 	sp, 	k1, 	CONTEXT_SIZE
55*10465441SEvalZero 	sw		k0, 	(29 * 4)(sp)
56*10465441SEvalZero 
57*10465441SEvalZero 	//save REG
58*10465441SEvalZero 	sw		$0, 	( 0 * 4)(sp)
59*10465441SEvalZero 	sw		$1, 	( 1 * 4)(sp)
60*10465441SEvalZero 	sw		$2, 	( 2 * 4)(sp)
61*10465441SEvalZero 	sw		$3, 	( 3 * 4)(sp)
62*10465441SEvalZero 	sw		$4, 	( 4 * 4)(sp)
63*10465441SEvalZero 	sw		$5, 	( 5 * 4)(sp)
64*10465441SEvalZero 	sw		$6, 	( 6 * 4)(sp)
65*10465441SEvalZero 	sw		$7, 	( 7 * 4)(sp)
66*10465441SEvalZero 	sw		$8,     ( 8 * 4)(sp)
67*10465441SEvalZero 	sw		$9,     ( 9 * 4)(sp)
68*10465441SEvalZero 	sw		$10,    (10 * 4)(sp)
69*10465441SEvalZero 	sw		$11,    (11 * 4)(sp)
70*10465441SEvalZero 	sw		$12,    (12 * 4)(sp)
71*10465441SEvalZero 	sw		$13,    (13 * 4)(sp)
72*10465441SEvalZero 	sw		$14,    (14 * 4)(sp)
73*10465441SEvalZero 	sw		$15,    (15 * 4)(sp)
74*10465441SEvalZero 	sw		$16,    (16 * 4)(sp)
75*10465441SEvalZero 	sw		$17,    (17 * 4)(sp)
76*10465441SEvalZero 	sw		$18,    (18 * 4)(sp)
77*10465441SEvalZero 	sw		$19,    (19 * 4)(sp)
78*10465441SEvalZero 	sw		$20,    (20 * 4)(sp)
79*10465441SEvalZero 	sw		$21,    (21 * 4)(sp)
80*10465441SEvalZero 	sw		$22,    (22 * 4)(sp)
81*10465441SEvalZero 	sw		$23,    (23 * 4)(sp)
82*10465441SEvalZero 	sw		$24,    (24 * 4)(sp)
83*10465441SEvalZero 	sw		$25, 	(25 * 4)(sp)
84*10465441SEvalZero 	/* K0 K1 */
85*10465441SEvalZero 	sw		$28, 	(28 * 4)(sp)
86*10465441SEvalZero 	/* SP */
87*10465441SEvalZero 	sw		$30,    (30 * 4)(sp)
88*10465441SEvalZero 	sw		$31, 	(31 * 4)(sp)
89*10465441SEvalZero 
90*10465441SEvalZero 	/* STATUS CAUSE EPC.... */
91*10465441SEvalZero 	mfc0	$2, 	CP0_STATUS
92*10465441SEvalZero 	sw		$2, 	STK_OFFSET_SR(sp)
93*10465441SEvalZero 
94*10465441SEvalZero 	mfc0	$2, 	CP0_CAUSE
95*10465441SEvalZero 	sw		$2, 	STK_OFFSET_CAUSE(sp)
96*10465441SEvalZero 
97*10465441SEvalZero 	mfc0	$2, 	CP0_BADVADDR
98*10465441SEvalZero 	sw		$2, 	STK_OFFSET_BADVADDR(sp)
99*10465441SEvalZero 
100*10465441SEvalZero 	MFC0	$2, 	CP0_EPC
101*10465441SEvalZero 	sw		$2, 	STK_OFFSET_EPC(sp)
102*10465441SEvalZero 
103*10465441SEvalZero 	mfhi	$2
104*10465441SEvalZero 	sw		$2,     STK_OFFSET_HI(sp)
105*10465441SEvalZero 
106*10465441SEvalZero 	mflo	$2
107*10465441SEvalZero 	sw		$2,     STK_OFFSET_LO(sp)
108*10465441SEvalZero #ifdef __mips_hard_float
109*10465441SEvalZero 	add		a0,		sp,STK_CTX_SIZE
110*10465441SEvalZero 
111*10465441SEvalZero     mfc0 	t0, 	CP0_STATUS
112*10465441SEvalZero     .set	push
113*10465441SEvalZero     .set	at
114*10465441SEvalZero     or      t0,   	M_StatusCU1
115*10465441SEvalZero     .set 	push
116*10465441SEvalZero     mtc0 	t0, 	CP0_STATUS
117*10465441SEvalZero 
118*10465441SEvalZero     cfc1 	t0,  	CP1_STATUS
119*10465441SEvalZero     sw      t0   ,  0x00(a0)
120*10465441SEvalZero 	swc1    $f0,(0x04 *  1)(a0)
121*10465441SEvalZero 	swc1    $f1,(0x04 *  2)(a0)
122*10465441SEvalZero 	swc1    $f2,(0x04 *  3)(a0)
123*10465441SEvalZero 	swc1    $f3,(0x04 *  4)(a0)
124*10465441SEvalZero 	swc1    $f4,(0x04 *  5)(a0)
125*10465441SEvalZero 	swc1    $f5,(0x04 *  6)(a0)
126*10465441SEvalZero 	swc1    $f6,(0x04 *  7)(a0)
127*10465441SEvalZero 	swc1    $f7,(0x04 *  8)(a0)
128*10465441SEvalZero 	swc1    $f8,(0x04 *  9)(a0)
129*10465441SEvalZero 	swc1    $f9,(0x04 * 10)(a0)
130*10465441SEvalZero 	swc1   $f10,(0x04 * 11)(a0)
131*10465441SEvalZero 	swc1   $f11,(0x04 * 12)(a0)
132*10465441SEvalZero 	swc1   $f12,(0x04 * 13)(a0)
133*10465441SEvalZero 	swc1   $f13,(0x04 * 14)(a0)
134*10465441SEvalZero 	swc1   $f14,(0x04 * 15)(a0)
135*10465441SEvalZero 	swc1   $f15,(0x04 * 16)(a0)
136*10465441SEvalZero 	swc1   $f16,(0x04 * 17)(a0)
137*10465441SEvalZero 	swc1   $f17,(0x04 * 18)(a0)
138*10465441SEvalZero 	swc1   $f18,(0x04 * 19)(a0)
139*10465441SEvalZero 	swc1   $f19,(0x04 * 20)(a0)
140*10465441SEvalZero 	swc1   $f20,(0x04 * 21)(a0)
141*10465441SEvalZero 	swc1   $f21,(0x04 * 22)(a0)
142*10465441SEvalZero 	swc1   $f22,(0x04 * 23)(a0)
143*10465441SEvalZero 	swc1   $f23,(0x04 * 24)(a0)
144*10465441SEvalZero 	swc1   $f24,(0x04 * 25)(a0)
145*10465441SEvalZero 	swc1   $f25,(0x04 * 26)(a0)
146*10465441SEvalZero 	swc1   $f26,(0x04 * 27)(a0)
147*10465441SEvalZero 	swc1   $f27,(0x04 * 28)(a0)
148*10465441SEvalZero 	swc1   $f28,(0x04 * 29)(a0)
149*10465441SEvalZero 	swc1   $f29,(0x04 * 30)(a0)
150*10465441SEvalZero 	swc1   $f30,(0x04 * 31)(a0)
151*10465441SEvalZero 	swc1   $f31,(0x04 * 32)(a0)
152*10465441SEvalZero 
153*10465441SEvalZero 	nop
154*10465441SEvalZero #endif
155*10465441SEvalZero 
156*10465441SEvalZero 	//restore a0
157*10465441SEvalZero 	lw		a0,		(REG_A0 * 4)(sp)
158*10465441SEvalZero 
159*10465441SEvalZero 	.set	pop
160*10465441SEvalZero .endm
161*10465441SEvalZero 
162*10465441SEvalZero 
163*10465441SEvalZero .macro RESTORE_CONTEXT
164*10465441SEvalZero 	.set    push
165*10465441SEvalZero 	.set    noat
166*10465441SEvalZero 	.set    noreorder
167*10465441SEvalZero 	.set    volatile
168*10465441SEvalZero 
169*10465441SEvalZero #ifdef __mips_hard_float
170*10465441SEvalZero 	add		a0,	sp,STK_CTX_SIZE
171*10465441SEvalZero 
172*10465441SEvalZero     mfc0 	t0, CP0_STATUS
173*10465441SEvalZero     .set	push
174*10465441SEvalZero     .set	at
175*10465441SEvalZero     or      t0, M_StatusCU1
176*10465441SEvalZero     .set	noat
177*10465441SEvalZero     mtc0	t0, CP0_STATUS
178*10465441SEvalZero 
179*10465441SEvalZero     lw      t0   ,   0x00(a0)
180*10465441SEvalZero 	lwc1    $f0,(0x04 *  1)(a0)
181*10465441SEvalZero 	lwc1    $f1,(0x04 *  2)(a0)
182*10465441SEvalZero 	lwc1    $f2,(0x04 *  3)(a0)
183*10465441SEvalZero 	lwc1    $f3,(0x04 *  4)(a0)
184*10465441SEvalZero 	lwc1    $f4,(0x04 *  5)(a0)
185*10465441SEvalZero 	lwc1    $f5,(0x04 *  6)(a0)
186*10465441SEvalZero 	lwc1    $f6,(0x04 *  7)(a0)
187*10465441SEvalZero 	lwc1    $f7,(0x04 *  8)(a0)
188*10465441SEvalZero 	lwc1    $f8,(0x04 *  9)(a0)
189*10465441SEvalZero 	lwc1    $f9,(0x04 * 10)(a0)
190*10465441SEvalZero 	lwc1   $f10,(0x04 * 11)(a0)
191*10465441SEvalZero 	lwc1   $f11,(0x04 * 12)(a0)
192*10465441SEvalZero 	lwc1   $f12,(0x04 * 13)(a0)
193*10465441SEvalZero 	lwc1   $f13,(0x04 * 14)(a0)
194*10465441SEvalZero 	lwc1   $f14,(0x04 * 15)(a0)
195*10465441SEvalZero 	lwc1   $f15,(0x04 * 16)(a0)
196*10465441SEvalZero 	lwc1   $f16,(0x04 * 17)(a0)
197*10465441SEvalZero 	lwc1   $f17,(0x04 * 18)(a0)
198*10465441SEvalZero 	lwc1   $f18,(0x04 * 19)(a0)
199*10465441SEvalZero 	lwc1   $f19,(0x04 * 20)(a0)
200*10465441SEvalZero 	lwc1   $f20,(0x04 * 21)(a0)
201*10465441SEvalZero 	lwc1   $f21,(0x04 * 22)(a0)
202*10465441SEvalZero 	lwc1   $f22,(0x04 * 23)(a0)
203*10465441SEvalZero 	lwc1   $f23,(0x04 * 24)(a0)
204*10465441SEvalZero 	lwc1   $f24,(0x04 * 25)(a0)
205*10465441SEvalZero 	lwc1   $f25,(0x04 * 26)(a0)
206*10465441SEvalZero 	lwc1   $f26,(0x04 * 27)(a0)
207*10465441SEvalZero 	lwc1   $f27,(0x04 * 28)(a0)
208*10465441SEvalZero 	lwc1   $f28,(0x04 * 29)(a0)
209*10465441SEvalZero 	lwc1   $f29,(0x04 * 30)(a0)
210*10465441SEvalZero 	lwc1   $f30,(0x04 * 31)(a0)
211*10465441SEvalZero 	lwc1   $f31,(0x04 * 32)(a0)
212*10465441SEvalZero     ctc1 	t0,     CP1_STATUS                                            ;/*  restore fpp status reg      */
213*10465441SEvalZero 
214*10465441SEvalZero 	nop
215*10465441SEvalZero #endif
216*10465441SEvalZero 
217*10465441SEvalZero 	/* ͨ�üĴ��� */
218*10465441SEvalZero 	/* ZERO */
219*10465441SEvalZero 	lw		$1,  	( 1 * 4)(sp)
220*10465441SEvalZero 	/* V0   */
221*10465441SEvalZero 	lw		$3,  	( 3 * 4)(sp)
222*10465441SEvalZero 	lw		$4,  	( 4 * 4)(sp)
223*10465441SEvalZero 	lw		$5,  	( 5 * 4)(sp)
224*10465441SEvalZero 	lw		$6,  	( 6 * 4)(sp)
225*10465441SEvalZero 	lw		$7,  	( 7 * 4)(sp)
226*10465441SEvalZero 	lw		$8, 	( 8 * 4)(sp)
227*10465441SEvalZero 	lw		$9, 	( 9 * 4)(sp)
228*10465441SEvalZero 	lw		$10,    (10 * 4)(sp)
229*10465441SEvalZero 	lw		$11,    (11 * 4)(sp)
230*10465441SEvalZero 	lw		$12,    (12 * 4)(sp)
231*10465441SEvalZero 	lw		$13,    (13 * 4)(sp)
232*10465441SEvalZero 	lw		$14,    (14 * 4)(sp)
233*10465441SEvalZero 	lw		$15,    (15 * 4)(sp)
234*10465441SEvalZero 	lw		$16,    (16 * 4)(sp)
235*10465441SEvalZero 	lw		$17,    (17 * 4)(sp)
236*10465441SEvalZero 	lw		$18,    (18 * 4)(sp)
237*10465441SEvalZero 	lw		$19,    (19 * 4)(sp)
238*10465441SEvalZero 	lw		$20,    (20 * 4)(sp)
239*10465441SEvalZero 	lw		$21,    (21 * 4)(sp)
240*10465441SEvalZero 	lw		$22,    (22 * 4)(sp)
241*10465441SEvalZero 	lw		$23, 	(23 * 4)(sp)
242*10465441SEvalZero 	lw		$24, 	(24 * 4)(sp)
243*10465441SEvalZero 	lw		$25, 	(25 * 4)(sp)
244*10465441SEvalZero 	lw		$26, 	(26 * 4)(sp)
245*10465441SEvalZero 	lw		$27, 	(27 * 4)(sp)
246*10465441SEvalZero 	lw		$28, 	(28 * 4)(sp)
247*10465441SEvalZero 	/* SP */
248*10465441SEvalZero 	lw		$30, 	(30 * 4)(sp)
249*10465441SEvalZero 	lw		$31, 	(31 * 4)(sp)
250*10465441SEvalZero 
251*10465441SEvalZero 
252*10465441SEvalZero 	/* STATUS CAUSE EPC.... */
253*10465441SEvalZero 	lw		$2,    STK_OFFSET_HI(sp)
254*10465441SEvalZero 	mthi	$2
255*10465441SEvalZero 	lw		$2, 	STK_OFFSET_LO(sp)
256*10465441SEvalZero 	mtlo	$2
257*10465441SEvalZero 
258*10465441SEvalZero 	lw		$2, 	STK_OFFSET_SR(sp)
259*10465441SEvalZero 	mtc0	$2, 	CP0_STATUS
260*10465441SEvalZero 
261*10465441SEvalZero 	lw		$2, 	STK_OFFSET_BADVADDR(sp)
262*10465441SEvalZero 	mtc0	$2, 	CP0_BADVADDR
263*10465441SEvalZero 
264*10465441SEvalZero 	lw		$2, 	STK_OFFSET_CAUSE(sp)
265*10465441SEvalZero 	mtc0	$2, 	CP0_CAUSE
266*10465441SEvalZero 
267*10465441SEvalZero 	lw		$2, 	STK_OFFSET_EPC(sp)
268*10465441SEvalZero 	MTC0	$2, 	CP0_EPC
269*10465441SEvalZero 
270*10465441SEvalZero 	//restore $2
271*10465441SEvalZero 	lw		$2,  	( 2 * 4)(sp)
272*10465441SEvalZero 	//restore sp
273*10465441SEvalZero 	lw		$29, 	(29 * 4)(sp)
274*10465441SEvalZero 
275*10465441SEvalZero 	eret
276*10465441SEvalZero 	nop
277*10465441SEvalZero     .set    pop
278*10465441SEvalZero .endm
279*10465441SEvalZero #endif
280*10465441SEvalZero #endif /* _MIPS_CONTEXT_ASM_H_ */
281