Commit 332fd57b92d26e2ac6112340b98e92bb76117a41
1 parent
b6d7b66609
Exists in
master
and in
7 other branches
sh: Bring the SH-5 FPU in line with the SH-4 FPU API.
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Showing 9 changed files with 59 additions and 59 deletions Side-by-side Diff
arch/sh/kernel/cpu/sh5/fpu.c
... | ... | @@ -30,12 +30,12 @@ |
30 | 30 | |
31 | 31 | static union sh_fpu_union init_fpuregs = { |
32 | 32 | .hard = { |
33 | - .fp_regs = { [0 ... 63] = sNAN32 }, | |
34 | - .fpscr = FPSCR_INIT | |
33 | + .fp_regs = { [0 ... 63] = sNAN32 }, | |
34 | + .fpscr = FPSCR_INIT | |
35 | 35 | } |
36 | 36 | }; |
37 | 37 | |
38 | -inline void fpsave(struct sh_fpu_hard_struct *fpregs) | |
38 | +void save_fpu(struct task_struct *tsk, struct pt_regs *regs) | |
39 | 39 | { |
40 | 40 | asm volatile("fst.p %0, (0*8), fp0\n\t" |
41 | 41 | "fst.p %0, (1*8), fp2\n\t" |
42 | 42 | |
... | ... | @@ -73,11 +73,10 @@ |
73 | 73 | "fgetscr fr63\n\t" |
74 | 74 | "fst.s %0, (32*8), fr63\n\t" |
75 | 75 | : /* no output */ |
76 | - : "r" (fpregs) | |
76 | + : "r" (&tsk->thread.fpu.hard) | |
77 | 77 | : "memory"); |
78 | 78 | } |
79 | 79 | |
80 | - | |
81 | 80 | static inline void |
82 | 81 | fpload(struct sh_fpu_hard_struct *fpregs) |
83 | 82 | { |
84 | 83 | |
... | ... | @@ -153,10 +152,10 @@ |
153 | 152 | return; |
154 | 153 | |
155 | 154 | enable_fpu(); |
156 | - if (last_task_used_math != NULL) { | |
155 | + if (last_task_used_math != NULL) | |
157 | 156 | /* Other processes fpu state, save away */ |
158 | - fpsave(&last_task_used_math->thread.fpu.hard); | |
159 | - } | |
157 | + save_fpu(last_task_used_math, regs); | |
158 | + | |
160 | 159 | last_task_used_math = current; |
161 | 160 | if (used_math()) { |
162 | 161 | fpload(¤t->thread.fpu.hard); |
arch/sh/kernel/process_64.c
... | ... | @@ -480,7 +480,7 @@ |
480 | 480 | if (fpvalid) { |
481 | 481 | if (current == last_task_used_math) { |
482 | 482 | enable_fpu(); |
483 | - fpsave(&tsk->thread.fpu.hard); | |
483 | + save_fpu(tsk, regs); | |
484 | 484 | disable_fpu(); |
485 | 485 | last_task_used_math = 0; |
486 | 486 | regs->sr |= SR_FD; |
... | ... | @@ -507,7 +507,7 @@ |
507 | 507 | #ifdef CONFIG_SH_FPU |
508 | 508 | if(last_task_used_math == current) { |
509 | 509 | enable_fpu(); |
510 | - fpsave(¤t->thread.fpu.hard); | |
510 | + save_fpu(current, regs); | |
511 | 511 | disable_fpu(); |
512 | 512 | last_task_used_math = NULL; |
513 | 513 | regs->sr |= SR_FD; |
arch/sh/kernel/ptrace_64.c
... | ... | @@ -75,7 +75,7 @@ |
75 | 75 | |
76 | 76 | if (last_task_used_math == task) { |
77 | 77 | enable_fpu(); |
78 | - fpsave(&task->thread.fpu.hard); | |
78 | + save_fpu(task, regs); | |
79 | 79 | disable_fpu(); |
80 | 80 | last_task_used_math = 0; |
81 | 81 | regs->sr |= SR_FD; |
... | ... | @@ -111,7 +111,7 @@ |
111 | 111 | set_stopped_child_used_math(task); |
112 | 112 | } else if (last_task_used_math == task) { |
113 | 113 | enable_fpu(); |
114 | - fpsave(&task->thread.fpu.hard); | |
114 | + save_fpu(task, regs); | |
115 | 115 | disable_fpu(); |
116 | 116 | last_task_used_math = 0; |
117 | 117 | regs->sr |= SR_FD; |
arch/sh/kernel/signal_64.c
arch/sh/kernel/traps_64.c
... | ... | @@ -618,7 +618,7 @@ |
618 | 618 | indexed by register number. */ |
619 | 619 | if (last_task_used_math == current) { |
620 | 620 | enable_fpu(); |
621 | - fpsave(¤t->thread.fpu.hard); | |
621 | + save_fpu(current, regs); | |
622 | 622 | disable_fpu(); |
623 | 623 | last_task_used_math = NULL; |
624 | 624 | regs->sr |= SR_FD; |
... | ... | @@ -691,7 +691,7 @@ |
691 | 691 | indexed by register number. */ |
692 | 692 | if (last_task_used_math == current) { |
693 | 693 | enable_fpu(); |
694 | - fpsave(¤t->thread.fpu.hard); | |
694 | + save_fpu(current, regs); | |
695 | 695 | disable_fpu(); |
696 | 696 | last_task_used_math = NULL; |
697 | 697 | regs->sr |= SR_FD; |
include/asm-sh/fpu.h
1 | +#ifndef __ASM_SH_FPU_H | |
2 | +#define __ASM_SH_FPU_H | |
3 | + | |
4 | +#define SR_FD 0x00008000 | |
5 | + | |
6 | +#ifndef __ASSEMBLY__ | |
7 | +#include <asm/ptrace.h> | |
8 | + | |
9 | +#ifdef CONFIG_SH_FPU | |
10 | +static inline void release_fpu(struct pt_regs *regs) | |
11 | +{ | |
12 | + regs->sr |= SR_FD; | |
13 | +} | |
14 | + | |
15 | +static inline void grab_fpu(struct pt_regs *regs) | |
16 | +{ | |
17 | + regs->sr &= ~SR_FD; | |
18 | +} | |
19 | + | |
20 | +struct task_struct; | |
21 | + | |
22 | +extern void save_fpu(struct task_struct *__tsk, struct pt_regs *regs); | |
23 | +#else | |
24 | +#define release_fpu(regs) do { } while (0) | |
25 | +#define grab_fpu(regs) do { } while (0) | |
26 | +#define save_fpu(tsk, regs) do { } while (0) | |
27 | +#endif | |
28 | + | |
29 | +#define unlazy_fpu(tsk, regs) do { \ | |
30 | + if (test_tsk_thread_flag(tsk, TIF_USEDFPU)) { \ | |
31 | + save_fpu(tsk, regs); \ | |
32 | + } \ | |
33 | +} while (0) | |
34 | + | |
35 | +#define clear_fpu(tsk, regs) do { \ | |
36 | + if (test_tsk_thread_flag(tsk, TIF_USEDFPU)) { \ | |
37 | + clear_tsk_thread_flag(tsk, TIF_USEDFPU); \ | |
38 | + release_fpu(regs); \ | |
39 | + } \ | |
40 | +} while (0) | |
41 | + | |
42 | +#endif /* __ASSEMBLY__ */ | |
43 | + | |
44 | +#endif /* __ASM_SH_FPU_H */ |
include/asm-sh/processor.h
include/asm-sh/processor_32.h
... | ... | @@ -65,7 +65,6 @@ |
65 | 65 | * IMASK-bit: |
66 | 66 | * Interrupt level mask |
67 | 67 | */ |
68 | -#define SR_FD 0x00008000 | |
69 | 68 | #define SR_DSP 0x00001000 |
70 | 69 | #define SR_IMASK 0x000000f0 |
71 | 70 | |
... | ... | @@ -177,31 +176,6 @@ |
177 | 176 | : "=&r" (__dummy) |
178 | 177 | : "r" (~SR_FD)); |
179 | 178 | } |
180 | - | |
181 | -static __inline__ void release_fpu(struct pt_regs *regs) | |
182 | -{ | |
183 | - regs->sr |= SR_FD; | |
184 | -} | |
185 | - | |
186 | -static __inline__ void grab_fpu(struct pt_regs *regs) | |
187 | -{ | |
188 | - regs->sr &= ~SR_FD; | |
189 | -} | |
190 | - | |
191 | -extern void save_fpu(struct task_struct *__tsk, struct pt_regs *regs); | |
192 | - | |
193 | -#define unlazy_fpu(tsk, regs) do { \ | |
194 | - if (test_tsk_thread_flag(tsk, TIF_USEDFPU)) { \ | |
195 | - save_fpu(tsk, regs); \ | |
196 | - } \ | |
197 | -} while (0) | |
198 | - | |
199 | -#define clear_fpu(tsk, regs) do { \ | |
200 | - if (test_tsk_thread_flag(tsk, TIF_USEDFPU)) { \ | |
201 | - clear_tsk_thread_flag(tsk, TIF_USEDFPU); \ | |
202 | - release_fpu(regs); \ | |
203 | - } \ | |
204 | -} while (0) | |
205 | 179 | |
206 | 180 | /* Double presision, NANS as NANS, rounding to nearest, no exceptions */ |
207 | 181 | #define FPSCR_INIT 0x00080000 |
include/asm-sh/processor_64.h
... | ... | @@ -102,8 +102,6 @@ |
102 | 102 | * Single step bit |
103 | 103 | * |
104 | 104 | */ |
105 | -#define SR_FD 0x00008000 | |
106 | - | |
107 | 105 | #if defined(CONFIG_SH64_SR_WATCH) |
108 | 106 | #define SR_MMU 0x84000000 |
109 | 107 | #else |
... | ... | @@ -243,16 +241,6 @@ |
243 | 241 | : "r" (~SR_FD)); |
244 | 242 | } |
245 | 243 | |
246 | -static inline void release_fpu(struct pt_regs *regs) | |
247 | -{ | |
248 | - regs->sr |= SR_FD; | |
249 | -} | |
250 | - | |
251 | -static inline void grab_fpu(struct pt_regs *regs) | |
252 | -{ | |
253 | - regs->sr &= ~SR_FD; | |
254 | -} | |
255 | - | |
256 | 244 | /* Round to nearest, no exceptions on inexact, overflow, underflow, |
257 | 245 | zero-divide, invalid. Configure option for whether to flush denorms to |
258 | 246 | zero, or except if a denorm is encountered. */ |
259 | 247 | |
... | ... | @@ -263,13 +251,9 @@ |
263 | 251 | #endif |
264 | 252 | |
265 | 253 | #ifdef CONFIG_SH_FPU |
266 | -/* Save the current FP regs */ | |
267 | -void fpsave(struct sh_fpu_hard_struct *fpregs); | |
268 | - | |
269 | 254 | /* Initialise the FP state of a task */ |
270 | 255 | void fpinit(struct sh_fpu_hard_struct *fpregs); |
271 | 256 | #else |
272 | -#define fpsave(fpregs) do { } while (0) | |
273 | 257 | #define fpinit(fpregs) do { } while (0) |
274 | 258 | #endif |
275 | 259 |