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