70ca63752cfa74eed2107c87165062ced2f8b993
[linux-2.6-microblaze.git] / arch / mips / kernel / r2300_fpu.S
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) 1996, 1998 by Ralf Baechle
7  *
8  * Multi-arch abstraction and asm macros for easier reading:
9  * Copyright (C) 1996 David S. Miller (davem@davemloft.net)
10  *
11  * Further modifications to make this work:
12  * Copyright (c) 1998 Harald Koerfgen
13  */
14 #include <asm/asm.h>
15 #include <asm/errno.h>
16 #include <asm/fpregdef.h>
17 #include <asm/mipsregs.h>
18 #include <asm/asm-offsets.h>
19 #include <asm/regdef.h>
20
21 #define EX(a,b)                                                 \
22 9:      a,##b;                                                  \
23         .section __ex_table,"a";                                \
24         PTR     9b,fault;                                       \
25         .previous
26
27         .set    noreorder
28         .set    mips1
29
30 /**
31  * _save_fp_context() - save FP context from the FPU
32  * @a0 - pointer to fpregs field of sigcontext
33  * @a1 - pointer to fpc_csr field of sigcontext
34  *
35  * Save FP context, including the 32 FP data registers and the FP
36  * control & status register, from the FPU to signal context.
37  */
38 LEAF(_save_fp_context)
39         .set    push
40         SET_HARDFLOAT
41         li      v0, 0                                   # assume success
42         cfc1    t1, fcr31
43         EX(swc1 $f0, 0(a0))
44         EX(swc1 $f1, 8(a0))
45         EX(swc1 $f2, 16(a0))
46         EX(swc1 $f3, 24(a0))
47         EX(swc1 $f4, 32(a0))
48         EX(swc1 $f5, 40(a0))
49         EX(swc1 $f6, 48(a0))
50         EX(swc1 $f7, 56(a0))
51         EX(swc1 $f8, 64(a0))
52         EX(swc1 $f9, 72(a0))
53         EX(swc1 $f10, 80(a0))
54         EX(swc1 $f11, 88(a0))
55         EX(swc1 $f12, 96(a0))
56         EX(swc1 $f13, 104(a0))
57         EX(swc1 $f14, 112(a0))
58         EX(swc1 $f15, 120(a0))
59         EX(swc1 $f16, 128(a0))
60         EX(swc1 $f17, 136(a0))
61         EX(swc1 $f18, 144(a0))
62         EX(swc1 $f19, 152(a0))
63         EX(swc1 $f20, 160(a0))
64         EX(swc1 $f21, 168(a0))
65         EX(swc1 $f22, 176(a0))
66         EX(swc1 $f23, 184(a0))
67         EX(swc1 $f24, 192(a0))
68         EX(swc1 $f25, 200(a0))
69         EX(swc1 $f26, 208(a0))
70         EX(swc1 $f27, 216(a0))
71         EX(swc1 $f28, 224(a0))
72         EX(swc1 $f29, 232(a0))
73         EX(swc1 $f30, 240(a0))
74         EX(swc1 $f31, 248(a0))
75         jr      ra
76          EX(sw  t1, (a1))
77         .set    pop
78         END(_save_fp_context)
79
80 /**
81  * _restore_fp_context() - restore FP context to the FPU
82  * @a0 - pointer to fpregs field of sigcontext
83  * @a1 - pointer to fpc_csr field of sigcontext
84  *
85  * Restore FP context, including the 32 FP data registers and the FP
86  * control & status register, from signal context to the FPU.
87  */
88 LEAF(_restore_fp_context)
89         .set    push
90         SET_HARDFLOAT
91         li      v0, 0                                   # assume success
92         EX(lw t0, (a1))
93         EX(lwc1 $f0, 0(a0))
94         EX(lwc1 $f1, 8(a0))
95         EX(lwc1 $f2, 16(a0))
96         EX(lwc1 $f3, 24(a0))
97         EX(lwc1 $f4, 32(a0))
98         EX(lwc1 $f5, 40(a0))
99         EX(lwc1 $f6, 48(a0))
100         EX(lwc1 $f7, 56(a0))
101         EX(lwc1 $f8, 64(a0))
102         EX(lwc1 $f9, 72(a0))
103         EX(lwc1 $f10, 80(a0))
104         EX(lwc1 $f11, 88(a0))
105         EX(lwc1 $f12, 96(a0))
106         EX(lwc1 $f13, 104(a0))
107         EX(lwc1 $f14, 112(a0))
108         EX(lwc1 $f15, 120(a0))
109         EX(lwc1 $f16, 128(a0))
110         EX(lwc1 $f17, 136(a0))
111         EX(lwc1 $f18, 144(a0))
112         EX(lwc1 $f19, 152(a0))
113         EX(lwc1 $f20, 160(a0))
114         EX(lwc1 $f21, 168(a0))
115         EX(lwc1 $f22, 176(a0))
116         EX(lwc1 $f23, 184(a0))
117         EX(lwc1 $f24, 192(a0))
118         EX(lwc1 $f25, 200(a0))
119         EX(lwc1 $f26, 208(a0))
120         EX(lwc1 $f27, 216(a0))
121         EX(lwc1 $f28, 224(a0))
122         EX(lwc1 $f29, 232(a0))
123         EX(lwc1 $f30, 240(a0))
124         EX(lwc1 $f31, 248(a0))
125         jr      ra
126          ctc1   t0, fcr31
127         .set    pop
128         END(_restore_fp_context)
129         .set    reorder
130
131         .type   fault, @function
132         .ent    fault
133 fault:  li      v0, -EFAULT
134         jr      ra
135         .end    fault