source: svn/trunk/newcon3bcm2_21bu/toolchain/mips-linux-uclibc/include/asm/stackframe.h

Last change on this file was 2, checked in by phkim, 11 years ago

1.phkim

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