]> err.no Git - linux-2.6/blob - include/asm-mips/stackframe.h
Always use ".set mips3" rather than select between "mips2" or "mips3"
[linux-2.6] / include / asm-mips / stackframe.h
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 #if defined(CONFIG_64BIT) && !defined(CONFIG_BUILD_ELF64)
67                 MFC0    k1, CP0_CONTEXT
68                 dsra    k1, 23
69                 lui     k0, %hi(pgd_current)
70                 addiu   k0, %lo(pgd_current)
71                 dsubu   k1, k0
72                 lui     k0, %hi(kernelsp)
73                 daddu   k1, k0
74                 LONG_L  k1, %lo(kernelsp)(k1)
75 #endif
76 #if defined(CONFIG_64BIT) && defined(CONFIG_BUILD_ELF64)
77                 MFC0    k1, CP0_CONTEXT
78                 lui     k0, %highest(kernelsp)
79                 dsrl    k1, 23
80                 daddiu  k0, %higher(kernelsp)
81                 dsll    k0, k0, 16
82                 daddiu  k0, %hi(kernelsp)
83                 dsll    k0, k0, 16
84                 daddu   k1, k1, k0
85                 LONG_L  k1, %lo(kernelsp)(k1)
86 #endif
87                 .endm
88
89                 .macro  set_saved_sp stackp temp temp2
90 #ifdef CONFIG_32BIT
91                 mfc0    \temp, CP0_CONTEXT
92                 srl     \temp, 23
93                 LONG_S  \stackp, kernelsp(\temp)
94 #endif
95 #if defined(CONFIG_64BIT) && !defined(CONFIG_BUILD_ELF64)
96                 lw      \temp, TI_CPU(gp)
97                 dsll    \temp, 3
98                 lui     \temp2, %hi(kernelsp)
99                 daddu   \temp, \temp2
100                 LONG_S  \stackp, %lo(kernelsp)(\temp)
101 #endif
102 #if defined(CONFIG_64BIT) && defined(CONFIG_BUILD_ELF64)
103                 MFC0    \temp, CP0_CONTEXT
104                 dsrl    \temp, 23
105                 LONG_S  \stackp, kernelsp(\temp)
106 #endif
107                 .endm
108 #else
109                 .macro  get_saved_sp    /* Uniprocessor variation */
110                 lui     k1, %hi(kernelsp)
111                 LONG_L  k1, %lo(kernelsp)(k1)
112                 .endm
113
114                 .macro  set_saved_sp stackp temp temp2
115                 LONG_S  \stackp, kernelsp
116                 .endm
117 #endif
118
119                 .macro  SAVE_SOME
120                 .set    push
121                 .set    noat
122                 .set    reorder
123                 mfc0    k0, CP0_STATUS
124                 sll     k0, 3           /* extract cu0 bit */
125                 .set    noreorder
126                 bltz    k0, 8f
127                  move   k1, sp
128                 .set    reorder
129                 /* Called from user mode, new stack. */
130                 get_saved_sp
131 8:              move    k0, sp
132                 PTR_SUBU sp, k1, PT_SIZE
133                 LONG_S  k0, PT_R29(sp)
134                 LONG_S  $3, PT_R3(sp)
135                 LONG_S  $0, PT_R0(sp)
136                 mfc0    v1, CP0_STATUS
137                 LONG_S  $2, PT_R2(sp)
138                 LONG_S  v1, PT_STATUS(sp)
139                 LONG_S  $4, PT_R4(sp)
140                 mfc0    v1, CP0_CAUSE
141                 LONG_S  $5, PT_R5(sp)
142                 LONG_S  v1, PT_CAUSE(sp)
143                 LONG_S  $6, PT_R6(sp)
144                 MFC0    v1, CP0_EPC
145                 LONG_S  $7, PT_R7(sp)
146 #ifdef CONFIG_64BIT
147                 LONG_S  $8, PT_R8(sp)
148                 LONG_S  $9, PT_R9(sp)
149 #endif
150                 LONG_S  v1, PT_EPC(sp)
151                 LONG_S  $25, PT_R25(sp)
152                 LONG_S  $28, PT_R28(sp)
153                 LONG_S  $31, PT_R31(sp)
154                 ori     $28, sp, _THREAD_MASK
155                 xori    $28, _THREAD_MASK
156                 .set    pop
157                 .endm
158
159                 .macro  SAVE_ALL
160                 SAVE_SOME
161                 SAVE_AT
162                 SAVE_TEMP
163                 SAVE_STATIC
164                 .endm
165
166                 .macro  RESTORE_AT
167                 .set    push
168                 .set    noat
169                 LONG_L  $1,  PT_R1(sp)
170                 .set    pop
171                 .endm
172
173                 .macro  RESTORE_TEMP
174                 LONG_L  $24, PT_LO(sp)
175 #ifdef CONFIG_32BIT
176                 LONG_L  $8, PT_R8(sp)
177                 LONG_L  $9, PT_R9(sp)
178 #endif
179                 mtlo    $24
180                 LONG_L  $24, PT_HI(sp)
181                 LONG_L  $10, PT_R10(sp)
182                 LONG_L  $11, PT_R11(sp)
183                 mthi    $24
184                 LONG_L  $12, PT_R12(sp)
185                 LONG_L  $13, PT_R13(sp)
186                 LONG_L  $14, PT_R14(sp)
187                 LONG_L  $15, PT_R15(sp)
188                 LONG_L  $24, PT_R24(sp)
189                 .endm
190
191                 .macro  RESTORE_STATIC
192                 LONG_L  $16, PT_R16(sp)
193                 LONG_L  $17, PT_R17(sp)
194                 LONG_L  $18, PT_R18(sp)
195                 LONG_L  $19, PT_R19(sp)
196                 LONG_L  $20, PT_R20(sp)
197                 LONG_L  $21, PT_R21(sp)
198                 LONG_L  $22, PT_R22(sp)
199                 LONG_L  $23, PT_R23(sp)
200                 LONG_L  $30, PT_R30(sp)
201                 .endm
202
203 #if defined(CONFIG_CPU_R3000) || defined(CONFIG_CPU_TX39XX)
204
205                 .macro  RESTORE_SOME
206                 .set    push
207                 .set    reorder
208                 .set    noat
209                 mfc0    a0, CP0_STATUS
210                 ori     a0, 0x1f
211                 xori    a0, 0x1f
212                 mtc0    a0, CP0_STATUS
213                 li      v1, 0xff00
214                 and     a0, v1
215                 LONG_L  v0, PT_STATUS(sp)
216                 nor     v1, $0, v1
217                 and     v0, v1
218                 or      v0, a0
219                 mtc0    v0, CP0_STATUS
220                 LONG_L  $31, PT_R31(sp)
221                 LONG_L  $28, PT_R28(sp)
222                 LONG_L  $25, PT_R25(sp)
223 #ifdef CONFIG_64BIT
224                 LONG_L  $8, PT_R8(sp)
225                 LONG_L  $9, PT_R9(sp)
226 #endif
227                 LONG_L  $7,  PT_R7(sp)
228                 LONG_L  $6,  PT_R6(sp)
229                 LONG_L  $5,  PT_R5(sp)
230                 LONG_L  $4,  PT_R4(sp)
231                 LONG_L  $3,  PT_R3(sp)
232                 LONG_L  $2,  PT_R2(sp)
233                 .set    pop
234                 .endm
235
236                 .macro  RESTORE_SP_AND_RET
237                 .set    push
238                 .set    noreorder
239                 LONG_L  k0, PT_EPC(sp)
240                 LONG_L  sp, PT_R29(sp)
241                 jr      k0
242                  rfe
243                 .set    pop
244                 .endm
245
246 #else
247
248                 .macro  RESTORE_SOME
249                 .set    push
250                 .set    reorder
251                 .set    noat
252                 mfc0    a0, CP0_STATUS
253                 ori     a0, 0x1f
254                 xori    a0, 0x1f
255                 mtc0    a0, CP0_STATUS
256                 li      v1, 0xff00
257                 and     a0, v1
258                 LONG_L  v0, PT_STATUS(sp)
259                 nor     v1, $0, v1
260                 and     v0, v1
261                 or      v0, a0
262                 mtc0    v0, CP0_STATUS
263                 LONG_L  v1, PT_EPC(sp)
264                 MTC0    v1, CP0_EPC
265                 LONG_L  $31, PT_R31(sp)
266                 LONG_L  $28, PT_R28(sp)
267                 LONG_L  $25, PT_R25(sp)
268 #ifdef CONFIG_64BIT
269                 LONG_L  $8, PT_R8(sp)
270                 LONG_L  $9, PT_R9(sp)
271 #endif
272                 LONG_L  $7,  PT_R7(sp)
273                 LONG_L  $6,  PT_R6(sp)
274                 LONG_L  $5,  PT_R5(sp)
275                 LONG_L  $4,  PT_R4(sp)
276                 LONG_L  $3,  PT_R3(sp)
277                 LONG_L  $2,  PT_R2(sp)
278                 .set    pop
279                 .endm
280
281                 .macro  RESTORE_SP_AND_RET
282                 LONG_L  sp, PT_R29(sp)
283                 .set    mips3
284                 eret
285                 .set    mips0
286                 .endm
287
288 #endif
289
290                 .macro  RESTORE_SP
291                 LONG_L  sp, PT_R29(sp)
292                 .endm
293
294                 .macro  RESTORE_ALL
295                 RESTORE_TEMP
296                 RESTORE_STATIC
297                 RESTORE_AT
298                 RESTORE_SOME
299                 RESTORE_SP
300                 .endm
301
302                 .macro  RESTORE_ALL_AND_RET
303                 RESTORE_TEMP
304                 RESTORE_STATIC
305                 RESTORE_AT
306                 RESTORE_SOME
307                 RESTORE_SP_AND_RET
308                 .endm
309
310 /*
311  * Move to kernel mode and disable interrupts.
312  * Set cp0 enable bit as sign that we're running on the kernel stack
313  */
314                 .macro  CLI
315                 mfc0    t0, CP0_STATUS
316                 li      t1, ST0_CU0 | 0x1f
317                 or      t0, t1
318                 xori    t0, 0x1f
319                 mtc0    t0, CP0_STATUS
320                 irq_disable_hazard
321                 .endm
322
323 /*
324  * Move to kernel mode and enable interrupts.
325  * Set cp0 enable bit as sign that we're running on the kernel stack
326  */
327                 .macro  STI
328                 mfc0    t0, CP0_STATUS
329                 li      t1, ST0_CU0 | 0x1f
330                 or      t0, t1
331                 xori    t0, 0x1e
332                 mtc0    t0, CP0_STATUS
333                 irq_enable_hazard
334                 .endm
335
336 /*
337  * Just move to kernel mode and leave interrupts as they are.
338  * Set cp0 enable bit as sign that we're running on the kernel stack
339  */
340                 .macro  KMODE
341                 mfc0    t0, CP0_STATUS
342                 li      t1, ST0_CU0 | 0x1e
343                 or      t0, t1
344                 xori    t0, 0x1e
345                 mtc0    t0, CP0_STATUS
346                 irq_disable_hazard
347                 .endm
348
349 #endif /* _ASM_STACKFRAME_H */