at 1810b6cb162e0c19e0ecbbacbcfd66f578f335ec 339 lines 6.4 kB view raw
1/* 2 * This file is subject to the terms and conditions of the GNU General Public 3 * License. See the file "COPYING" in the main directory of this archive 4 * for more details. 5 * 6 * Copyright (C) 1994, 95, 96, 99, 2001 Ralf Baechle 7 * Copyright (C) 1994, 1995, 1996 Paul M. Antoine. 8 * Copyright (C) 1999 Silicon Graphics, Inc. 9 */ 10#ifndef _ASM_STACKFRAME_H 11#define _ASM_STACKFRAME_H 12 13#include <linux/config.h> 14#include <linux/threads.h> 15 16#include <asm/asm.h> 17#include <asm/mipsregs.h> 18#include <asm/asm-offsets.h> 19 20 .macro SAVE_AT 21 .set push 22 .set noat 23 LONG_S $1, PT_R1(sp) 24 .set pop 25 .endm 26 27 .macro SAVE_TEMP 28 mfhi v1 29#ifdef CONFIG_32BIT 30 LONG_S $8, PT_R8(sp) 31 LONG_S $9, PT_R9(sp) 32#endif 33 LONG_S v1, PT_HI(sp) 34 mflo v1 35 LONG_S $10, PT_R10(sp) 36 LONG_S $11, PT_R11(sp) 37 LONG_S v1, PT_LO(sp) 38 LONG_S $12, PT_R12(sp) 39 LONG_S $13, PT_R13(sp) 40 LONG_S $14, PT_R14(sp) 41 LONG_S $15, PT_R15(sp) 42 LONG_S $24, PT_R24(sp) 43 .endm 44 45 .macro SAVE_STATIC 46 LONG_S $16, PT_R16(sp) 47 LONG_S $17, PT_R17(sp) 48 LONG_S $18, PT_R18(sp) 49 LONG_S $19, PT_R19(sp) 50 LONG_S $20, PT_R20(sp) 51 LONG_S $21, PT_R21(sp) 52 LONG_S $22, PT_R22(sp) 53 LONG_S $23, PT_R23(sp) 54 LONG_S $30, PT_R30(sp) 55 .endm 56 57#ifdef CONFIG_SMP 58 .macro get_saved_sp /* SMP variation */ 59#ifdef CONFIG_32BIT 60 mfc0 k0, CP0_CONTEXT 61 lui k1, %hi(kernelsp) 62 srl k0, k0, 23 63 addu k1, k0 64 LONG_L k1, %lo(kernelsp)(k1) 65#endif 66#ifdef CONFIG_64BIT 67 MFC0 k1, CP0_CONTEXT 68 lui k0, %highest(kernelsp) 69 dsrl k1, 23 70 daddiu k0, %higher(kernelsp) 71 dsll k0, k0, 16 72 daddiu k0, %hi(kernelsp) 73 dsll k0, k0, 16 74 daddu k1, k1, k0 75 LONG_L k1, %lo(kernelsp)(k1) 76#endif 77 .endm 78 79 .macro set_saved_sp stackp temp temp2 80#ifdef CONFIG_32BIT 81 mfc0 \temp, CP0_CONTEXT 82 srl \temp, 23 83#endif 84#ifdef CONFIG_64BIT 85 MFC0 \temp, CP0_CONTEXT 86 dsrl \temp, 23 87#endif 88 LONG_S \stackp, kernelsp(\temp) 89 .endm 90#else 91 .macro get_saved_sp /* Uniprocessor variation */ 92#ifdef CONFIG_64BIT 93 lui k1, %highest(kernelsp) 94 daddiu k1, %higher(kernelsp) 95 dsll k1, k1, 16 96 daddiu k1, %hi(kernelsp) 97 dsll k1, k1, 16 98#else 99 lui k1, %hi(kernelsp) 100#endif 101 LONG_L k1, %lo(kernelsp)(k1) 102 .endm 103 104 .macro set_saved_sp stackp temp temp2 105 LONG_S \stackp, kernelsp 106 .endm 107#endif 108 109 .macro SAVE_SOME 110 .set push 111 .set noat 112 .set reorder 113 mfc0 k0, CP0_STATUS 114 sll k0, 3 /* extract cu0 bit */ 115 .set noreorder 116 bltz k0, 8f 117 move k1, sp 118 .set reorder 119 /* Called from user mode, new stack. */ 120 get_saved_sp 1218: move k0, sp 122 PTR_SUBU sp, k1, PT_SIZE 123 LONG_S k0, PT_R29(sp) 124 LONG_S $3, PT_R3(sp) 125 LONG_S $0, PT_R0(sp) 126 mfc0 v1, CP0_STATUS 127 LONG_S $2, PT_R2(sp) 128 LONG_S v1, PT_STATUS(sp) 129 LONG_S $4, PT_R4(sp) 130 mfc0 v1, CP0_CAUSE 131 LONG_S $5, PT_R5(sp) 132 LONG_S v1, PT_CAUSE(sp) 133 LONG_S $6, PT_R6(sp) 134 MFC0 v1, CP0_EPC 135 LONG_S $7, PT_R7(sp) 136#ifdef CONFIG_64BIT 137 LONG_S $8, PT_R8(sp) 138 LONG_S $9, PT_R9(sp) 139#endif 140 LONG_S v1, PT_EPC(sp) 141 LONG_S $25, PT_R25(sp) 142 LONG_S $28, PT_R28(sp) 143 LONG_S $31, PT_R31(sp) 144 ori $28, sp, _THREAD_MASK 145 xori $28, _THREAD_MASK 146 .set pop 147 .endm 148 149 .macro SAVE_ALL 150 SAVE_SOME 151 SAVE_AT 152 SAVE_TEMP 153 SAVE_STATIC 154 .endm 155 156 .macro RESTORE_AT 157 .set push 158 .set noat 159 LONG_L $1, PT_R1(sp) 160 .set pop 161 .endm 162 163 .macro RESTORE_TEMP 164 LONG_L $24, PT_LO(sp) 165#ifdef CONFIG_32BIT 166 LONG_L $8, PT_R8(sp) 167 LONG_L $9, PT_R9(sp) 168#endif 169 mtlo $24 170 LONG_L $24, PT_HI(sp) 171 LONG_L $10, PT_R10(sp) 172 LONG_L $11, PT_R11(sp) 173 mthi $24 174 LONG_L $12, PT_R12(sp) 175 LONG_L $13, PT_R13(sp) 176 LONG_L $14, PT_R14(sp) 177 LONG_L $15, PT_R15(sp) 178 LONG_L $24, PT_R24(sp) 179 .endm 180 181 .macro RESTORE_STATIC 182 LONG_L $16, PT_R16(sp) 183 LONG_L $17, PT_R17(sp) 184 LONG_L $18, PT_R18(sp) 185 LONG_L $19, PT_R19(sp) 186 LONG_L $20, PT_R20(sp) 187 LONG_L $21, PT_R21(sp) 188 LONG_L $22, PT_R22(sp) 189 LONG_L $23, PT_R23(sp) 190 LONG_L $30, PT_R30(sp) 191 .endm 192 193#if defined(CONFIG_CPU_R3000) || defined(CONFIG_CPU_TX39XX) 194 195 .macro RESTORE_SOME 196 .set push 197 .set reorder 198 .set noat 199 mfc0 a0, CP0_STATUS 200 ori a0, 0x1f 201 xori a0, 0x1f 202 mtc0 a0, CP0_STATUS 203 li v1, 0xff00 204 and a0, v1 205 LONG_L v0, PT_STATUS(sp) 206 nor v1, $0, v1 207 and v0, v1 208 or v0, a0 209 mtc0 v0, CP0_STATUS 210 LONG_L $31, PT_R31(sp) 211 LONG_L $28, PT_R28(sp) 212 LONG_L $25, PT_R25(sp) 213#ifdef CONFIG_64BIT 214 LONG_L $8, PT_R8(sp) 215 LONG_L $9, PT_R9(sp) 216#endif 217 LONG_L $7, PT_R7(sp) 218 LONG_L $6, PT_R6(sp) 219 LONG_L $5, PT_R5(sp) 220 LONG_L $4, PT_R4(sp) 221 LONG_L $3, PT_R3(sp) 222 LONG_L $2, PT_R2(sp) 223 .set pop 224 .endm 225 226 .macro RESTORE_SP_AND_RET 227 .set push 228 .set noreorder 229 LONG_L k0, PT_EPC(sp) 230 LONG_L sp, PT_R29(sp) 231 jr k0 232 rfe 233 .set pop 234 .endm 235 236#else 237 238 .macro RESTORE_SOME 239 .set push 240 .set reorder 241 .set noat 242 mfc0 a0, CP0_STATUS 243 ori a0, 0x1f 244 xori a0, 0x1f 245 mtc0 a0, CP0_STATUS 246 li v1, 0xff00 247 and a0, v1 248 LONG_L v0, PT_STATUS(sp) 249 nor v1, $0, v1 250 and v0, v1 251 or v0, a0 252 mtc0 v0, CP0_STATUS 253 LONG_L v1, PT_EPC(sp) 254 MTC0 v1, CP0_EPC 255 LONG_L $31, PT_R31(sp) 256 LONG_L $28, PT_R28(sp) 257 LONG_L $25, PT_R25(sp) 258#ifdef CONFIG_64BIT 259 LONG_L $8, PT_R8(sp) 260 LONG_L $9, PT_R9(sp) 261#endif 262 LONG_L $7, PT_R7(sp) 263 LONG_L $6, PT_R6(sp) 264 LONG_L $5, PT_R5(sp) 265 LONG_L $4, PT_R4(sp) 266 LONG_L $3, PT_R3(sp) 267 LONG_L $2, PT_R2(sp) 268 .set pop 269 .endm 270 271 .macro RESTORE_SP_AND_RET 272 LONG_L sp, PT_R29(sp) 273 .set mips3 274 eret 275 .set mips0 276 .endm 277 278#endif 279 280 .macro RESTORE_SP 281 LONG_L sp, PT_R29(sp) 282 .endm 283 284 .macro RESTORE_ALL 285 RESTORE_TEMP 286 RESTORE_STATIC 287 RESTORE_AT 288 RESTORE_SOME 289 RESTORE_SP 290 .endm 291 292 .macro RESTORE_ALL_AND_RET 293 RESTORE_TEMP 294 RESTORE_STATIC 295 RESTORE_AT 296 RESTORE_SOME 297 RESTORE_SP_AND_RET 298 .endm 299 300/* 301 * Move to kernel mode and disable interrupts. 302 * Set cp0 enable bit as sign that we're running on the kernel stack 303 */ 304 .macro CLI 305 mfc0 t0, CP0_STATUS 306 li t1, ST0_CU0 | 0x1f 307 or t0, t1 308 xori t0, 0x1f 309 mtc0 t0, CP0_STATUS 310 irq_disable_hazard 311 .endm 312 313/* 314 * Move to kernel mode and enable interrupts. 315 * Set cp0 enable bit as sign that we're running on the kernel stack 316 */ 317 .macro STI 318 mfc0 t0, CP0_STATUS 319 li t1, ST0_CU0 | 0x1f 320 or t0, t1 321 xori t0, 0x1e 322 mtc0 t0, CP0_STATUS 323 irq_enable_hazard 324 .endm 325 326/* 327 * Just move to kernel mode and leave interrupts as they are. 328 * Set cp0 enable bit as sign that we're running on the kernel stack 329 */ 330 .macro KMODE 331 mfc0 t0, CP0_STATUS 332 li t1, ST0_CU0 | 0x1e 333 or t0, t1 334 xori t0, 0x1e 335 mtc0 t0, CP0_STATUS 336 irq_disable_hazard 337 .endm 338 339#endif /* _ASM_STACKFRAME_H */