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