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