diff options
Diffstat (limited to 'arch/mn10300/kernel/fpu-low.S')
-rw-r--r-- | arch/mn10300/kernel/fpu-low.S | 265 |
1 files changed, 163 insertions, 102 deletions
diff --git a/arch/mn10300/kernel/fpu-low.S b/arch/mn10300/kernel/fpu-low.S index 96cfd47e68d5..78df25cfae29 100644 --- a/arch/mn10300/kernel/fpu-low.S +++ b/arch/mn10300/kernel/fpu-low.S | |||
@@ -8,25 +8,14 @@ | |||
8 | * as published by the Free Software Foundation; either version | 8 | * as published by the Free Software Foundation; either version |
9 | * 2 of the Licence, or (at your option) any later version. | 9 | * 2 of the Licence, or (at your option) any later version. |
10 | */ | 10 | */ |
11 | #include <linux/linkage.h> | ||
11 | #include <asm/cpu-regs.h> | 12 | #include <asm/cpu-regs.h> |
13 | #include <asm/smp.h> | ||
14 | #include <asm/thread_info.h> | ||
15 | #include <asm/asm-offsets.h> | ||
16 | #include <asm/frame.inc> | ||
12 | 17 | ||
13 | ############################################################################### | 18 | .macro FPU_INIT_STATE_ALL |
14 | # | ||
15 | # void fpu_init_state(void) | ||
16 | # - initialise the FPU | ||
17 | # | ||
18 | ############################################################################### | ||
19 | .globl fpu_init_state | ||
20 | .type fpu_init_state,@function | ||
21 | fpu_init_state: | ||
22 | mov epsw,d0 | ||
23 | or EPSW_FE,epsw | ||
24 | |||
25 | #ifdef CONFIG_MN10300_PROC_MN103E010 | ||
26 | nop | ||
27 | nop | ||
28 | nop | ||
29 | #endif | ||
30 | fmov 0,fs0 | 19 | fmov 0,fs0 |
31 | fmov fs0,fs1 | 20 | fmov fs0,fs1 |
32 | fmov fs0,fs2 | 21 | fmov fs0,fs2 |
@@ -60,7 +49,100 @@ fpu_init_state: | |||
60 | fmov fs0,fs30 | 49 | fmov fs0,fs30 |
61 | fmov fs0,fs31 | 50 | fmov fs0,fs31 |
62 | fmov FPCR_INIT,fpcr | 51 | fmov FPCR_INIT,fpcr |
52 | .endm | ||
53 | |||
54 | .macro FPU_SAVE_ALL areg,dreg | ||
55 | fmov fs0,(\areg+) | ||
56 | fmov fs1,(\areg+) | ||
57 | fmov fs2,(\areg+) | ||
58 | fmov fs3,(\areg+) | ||
59 | fmov fs4,(\areg+) | ||
60 | fmov fs5,(\areg+) | ||
61 | fmov fs6,(\areg+) | ||
62 | fmov fs7,(\areg+) | ||
63 | fmov fs8,(\areg+) | ||
64 | fmov fs9,(\areg+) | ||
65 | fmov fs10,(\areg+) | ||
66 | fmov fs11,(\areg+) | ||
67 | fmov fs12,(\areg+) | ||
68 | fmov fs13,(\areg+) | ||
69 | fmov fs14,(\areg+) | ||
70 | fmov fs15,(\areg+) | ||
71 | fmov fs16,(\areg+) | ||
72 | fmov fs17,(\areg+) | ||
73 | fmov fs18,(\areg+) | ||
74 | fmov fs19,(\areg+) | ||
75 | fmov fs20,(\areg+) | ||
76 | fmov fs21,(\areg+) | ||
77 | fmov fs22,(\areg+) | ||
78 | fmov fs23,(\areg+) | ||
79 | fmov fs24,(\areg+) | ||
80 | fmov fs25,(\areg+) | ||
81 | fmov fs26,(\areg+) | ||
82 | fmov fs27,(\areg+) | ||
83 | fmov fs28,(\areg+) | ||
84 | fmov fs29,(\areg+) | ||
85 | fmov fs30,(\areg+) | ||
86 | fmov fs31,(\areg+) | ||
87 | fmov fpcr,\dreg | ||
88 | mov \dreg,(\areg) | ||
89 | .endm | ||
90 | |||
91 | .macro FPU_RESTORE_ALL areg,dreg | ||
92 | fmov (\areg+),fs0 | ||
93 | fmov (\areg+),fs1 | ||
94 | fmov (\areg+),fs2 | ||
95 | fmov (\areg+),fs3 | ||
96 | fmov (\areg+),fs4 | ||
97 | fmov (\areg+),fs5 | ||
98 | fmov (\areg+),fs6 | ||
99 | fmov (\areg+),fs7 | ||
100 | fmov (\areg+),fs8 | ||
101 | fmov (\areg+),fs9 | ||
102 | fmov (\areg+),fs10 | ||
103 | fmov (\areg+),fs11 | ||
104 | fmov (\areg+),fs12 | ||
105 | fmov (\areg+),fs13 | ||
106 | fmov (\areg+),fs14 | ||
107 | fmov (\areg+),fs15 | ||
108 | fmov (\areg+),fs16 | ||
109 | fmov (\areg+),fs17 | ||
110 | fmov (\areg+),fs18 | ||
111 | fmov (\areg+),fs19 | ||
112 | fmov (\areg+),fs20 | ||
113 | fmov (\areg+),fs21 | ||
114 | fmov (\areg+),fs22 | ||
115 | fmov (\areg+),fs23 | ||
116 | fmov (\areg+),fs24 | ||
117 | fmov (\areg+),fs25 | ||
118 | fmov (\areg+),fs26 | ||
119 | fmov (\areg+),fs27 | ||
120 | fmov (\areg+),fs28 | ||
121 | fmov (\areg+),fs29 | ||
122 | fmov (\areg+),fs30 | ||
123 | fmov (\areg+),fs31 | ||
124 | mov (\areg),\dreg | ||
125 | fmov \dreg,fpcr | ||
126 | .endm | ||
63 | 127 | ||
128 | ############################################################################### | ||
129 | # | ||
130 | # void fpu_init_state(void) | ||
131 | # - initialise the FPU | ||
132 | # | ||
133 | ############################################################################### | ||
134 | .globl fpu_init_state | ||
135 | .type fpu_init_state,@function | ||
136 | fpu_init_state: | ||
137 | mov epsw,d0 | ||
138 | or EPSW_FE,epsw | ||
139 | |||
140 | #ifdef CONFIG_MN10300_PROC_MN103E010 | ||
141 | nop | ||
142 | nop | ||
143 | nop | ||
144 | #endif | ||
145 | FPU_INIT_STATE_ALL | ||
64 | #ifdef CONFIG_MN10300_PROC_MN103E010 | 146 | #ifdef CONFIG_MN10300_PROC_MN103E010 |
65 | nop | 147 | nop |
66 | nop | 148 | nop |
@@ -89,40 +171,7 @@ fpu_save: | |||
89 | nop | 171 | nop |
90 | #endif | 172 | #endif |
91 | mov d0,a0 | 173 | mov d0,a0 |
92 | fmov fs0,(a0+) | 174 | FPU_SAVE_ALL a0,d0 |
93 | fmov fs1,(a0+) | ||
94 | fmov fs2,(a0+) | ||
95 | fmov fs3,(a0+) | ||
96 | fmov fs4,(a0+) | ||
97 | fmov fs5,(a0+) | ||
98 | fmov fs6,(a0+) | ||
99 | fmov fs7,(a0+) | ||
100 | fmov fs8,(a0+) | ||
101 | fmov fs9,(a0+) | ||
102 | fmov fs10,(a0+) | ||
103 | fmov fs11,(a0+) | ||
104 | fmov fs12,(a0+) | ||
105 | fmov fs13,(a0+) | ||
106 | fmov fs14,(a0+) | ||
107 | fmov fs15,(a0+) | ||
108 | fmov fs16,(a0+) | ||
109 | fmov fs17,(a0+) | ||
110 | fmov fs18,(a0+) | ||
111 | fmov fs19,(a0+) | ||
112 | fmov fs20,(a0+) | ||
113 | fmov fs21,(a0+) | ||
114 | fmov fs22,(a0+) | ||
115 | fmov fs23,(a0+) | ||
116 | fmov fs24,(a0+) | ||
117 | fmov fs25,(a0+) | ||
118 | fmov fs26,(a0+) | ||
119 | fmov fs27,(a0+) | ||
120 | fmov fs28,(a0+) | ||
121 | fmov fs29,(a0+) | ||
122 | fmov fs30,(a0+) | ||
123 | fmov fs31,(a0+) | ||
124 | fmov fpcr,d0 | ||
125 | mov d0,(a0) | ||
126 | #ifdef CONFIG_MN10300_PROC_MN103E010 | 175 | #ifdef CONFIG_MN10300_PROC_MN103E010 |
127 | nop | 176 | nop |
128 | nop | 177 | nop |
@@ -135,63 +184,75 @@ fpu_save: | |||
135 | 184 | ||
136 | ############################################################################### | 185 | ############################################################################### |
137 | # | 186 | # |
138 | # void fpu_restore(struct fpu_state_struct *) | 187 | # void fpu_disabled(void) |
139 | # - restore the fpu state | 188 | # - handle an exception due to the FPU being disabled |
140 | # - note that an FPU Operational exception might occur during this process | 189 | # when CONFIG_FPU is enabled |
141 | # | 190 | # |
142 | ############################################################################### | 191 | ############################################################################### |
143 | .globl fpu_restore | 192 | .type fpu_disabled,@function |
144 | .type fpu_restore,@function | 193 | .globl fpu_disabled |
145 | fpu_restore: | 194 | fpu_disabled: |
146 | mov epsw,d1 | 195 | or EPSW_nAR|EPSW_FE,epsw |
147 | or EPSW_FE,epsw /* enable the FPU so we can access it */ | ||
148 | |||
149 | #ifdef CONFIG_MN10300_PROC_MN103E010 | ||
150 | nop | 196 | nop |
151 | nop | 197 | nop |
152 | #endif | ||
153 | mov d0,a0 | ||
154 | fmov (a0+),fs0 | ||
155 | fmov (a0+),fs1 | ||
156 | fmov (a0+),fs2 | ||
157 | fmov (a0+),fs3 | ||
158 | fmov (a0+),fs4 | ||
159 | fmov (a0+),fs5 | ||
160 | fmov (a0+),fs6 | ||
161 | fmov (a0+),fs7 | ||
162 | fmov (a0+),fs8 | ||
163 | fmov (a0+),fs9 | ||
164 | fmov (a0+),fs10 | ||
165 | fmov (a0+),fs11 | ||
166 | fmov (a0+),fs12 | ||
167 | fmov (a0+),fs13 | ||
168 | fmov (a0+),fs14 | ||
169 | fmov (a0+),fs15 | ||
170 | fmov (a0+),fs16 | ||
171 | fmov (a0+),fs17 | ||
172 | fmov (a0+),fs18 | ||
173 | fmov (a0+),fs19 | ||
174 | fmov (a0+),fs20 | ||
175 | fmov (a0+),fs21 | ||
176 | fmov (a0+),fs22 | ||
177 | fmov (a0+),fs23 | ||
178 | fmov (a0+),fs24 | ||
179 | fmov (a0+),fs25 | ||
180 | fmov (a0+),fs26 | ||
181 | fmov (a0+),fs27 | ||
182 | fmov (a0+),fs28 | ||
183 | fmov (a0+),fs29 | ||
184 | fmov (a0+),fs30 | ||
185 | fmov (a0+),fs31 | ||
186 | mov (a0),d0 | ||
187 | fmov d0,fpcr | ||
188 | #ifdef CONFIG_MN10300_PROC_MN103E010 | ||
189 | nop | 198 | nop |
199 | |||
200 | mov sp,a1 | ||
201 | mov (a1),d1 /* get epsw of user context */ | ||
202 | and ~(THREAD_SIZE-1),a1 /* a1: (thread_info *ti) */ | ||
203 | mov (TI_task,a1),a2 /* a2: (task_struct *tsk) */ | ||
204 | btst EPSW_nSL,d1 | ||
205 | beq fpu_used_in_kernel | ||
206 | |||
207 | or EPSW_FE,d1 | ||
208 | mov d1,(sp) | ||
209 | mov (TASK_THREAD+THREAD_FPU_FLAGS,a2),d1 | ||
210 | #ifndef CONFIG_LAZY_SAVE_FPU | ||
211 | or __THREAD_HAS_FPU,d1 | ||
212 | mov d1,(TASK_THREAD+THREAD_FPU_FLAGS,a2) | ||
213 | #else /* !CONFIG_LAZY_SAVE_FPU */ | ||
214 | mov (fpu_state_owner),a0 | ||
215 | cmp 0,a0 | ||
216 | beq fpu_regs_save_end | ||
217 | |||
218 | mov (TASK_THREAD+THREAD_UREGS,a0),a1 | ||
219 | add TASK_THREAD+THREAD_FPU_STATE,a0 | ||
220 | FPU_SAVE_ALL a0,d0 | ||
221 | |||
222 | mov (REG_EPSW,a1),d0 | ||
223 | and ~EPSW_FE,d0 | ||
224 | mov d0,(REG_EPSW,a1) | ||
225 | |||
226 | fpu_regs_save_end: | ||
227 | mov a2,(fpu_state_owner) | ||
228 | #endif /* !CONFIG_LAZY_SAVE_FPU */ | ||
229 | |||
230 | btst __THREAD_USING_FPU,d1 | ||
231 | beq fpu_regs_init | ||
232 | add TASK_THREAD+THREAD_FPU_STATE,a2 | ||
233 | FPU_RESTORE_ALL a2,d0 | ||
234 | rti | ||
235 | |||
236 | fpu_regs_init: | ||
237 | FPU_INIT_STATE_ALL | ||
238 | add TASK_THREAD+THREAD_FPU_FLAGS,a2 | ||
239 | bset __THREAD_USING_FPU,(0,a2) | ||
240 | rti | ||
241 | |||
242 | fpu_used_in_kernel: | ||
243 | and ~(EPSW_nAR|EPSW_FE),epsw | ||
190 | nop | 244 | nop |
191 | nop | 245 | nop |
192 | #endif | ||
193 | 246 | ||
194 | mov d1,epsw | 247 | add -4,sp |
195 | ret [],0 | 248 | SAVE_ALL |
249 | mov -1,d0 | ||
250 | mov d0,(REG_ORIG_D0,fp) | ||
251 | |||
252 | and ~EPSW_NMID,epsw | ||
253 | |||
254 | mov fp,d0 | ||
255 | call fpu_disabled_in_kernel[],0 | ||
256 | jmp ret_from_exception | ||
196 | 257 | ||
197 | .size fpu_restore,.-fpu_restore | 258 | .size fpu_disabled,.-fpu_disabled |