diff options
author | Atsushi Nemoto <anemo@mba.ocn.ne.jp> | 2006-05-22 11:47:41 -0400 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2006-06-19 12:39:13 -0400 |
commit | c138e12f3a2e0421a4c8edf02587d2d394418679 (patch) | |
tree | 66abbf27cbfc9030958b469aa4d826242417a752 /arch/mips/kernel/r4k_switch.S | |
parent | 734996820fd02b52a3fa0fcc09bdb914934bea4c (diff) |
[MIPS] Fix fpu_save_double on 64-bit.
> Without this fix, _save_fp() in 64-bit kernel is seriously broken.
>
> ffffffff8010bec0 <_save_fp>:
> ffffffff8010bec0: 400d6000 mfc0 t1,c0_status
> ffffffff8010bec4: 000c7140 sll t2,t0,0x5
> ffffffff8010bec8: 05c10011 bgez t2,ffffffff8010bf10 <_save_fp+0x50>
> ffffffff8010becc: 00000000 nop
> ffffffff8010bed0: f4810328 sdc1 $f1,808(a0)
> ...
Fix register usage in fpu_save_double() and make fpu_restore_double()
more symmetric with fpu_save_double().
Signed-off-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'arch/mips/kernel/r4k_switch.S')
-rw-r--r-- | arch/mips/kernel/r4k_switch.S | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/arch/mips/kernel/r4k_switch.S b/arch/mips/kernel/r4k_switch.S index 0b1b54acee9f..db94e556fc97 100644 --- a/arch/mips/kernel/r4k_switch.S +++ b/arch/mips/kernel/r4k_switch.S | |||
@@ -75,8 +75,8 @@ | |||
75 | and t0, t0, t1 | 75 | and t0, t0, t1 |
76 | LONG_S t0, ST_OFF(t3) | 76 | LONG_S t0, ST_OFF(t3) |
77 | 77 | ||
78 | fpu_save_double a0 t1 t0 t2 # c0_status passed in t1 | 78 | fpu_save_double a0 t0 t1 # c0_status passed in t0 |
79 | # clobbers t0 and t2 | 79 | # clobbers t1 |
80 | 1: | 80 | 1: |
81 | 81 | ||
82 | /* | 82 | /* |
@@ -129,9 +129,9 @@ | |||
129 | */ | 129 | */ |
130 | LEAF(_save_fp) | 130 | LEAF(_save_fp) |
131 | #ifdef CONFIG_64BIT | 131 | #ifdef CONFIG_64BIT |
132 | mfc0 t1, CP0_STATUS | 132 | mfc0 t0, CP0_STATUS |
133 | #endif | 133 | #endif |
134 | fpu_save_double a0 t1 t0 t2 # clobbers t1 | 134 | fpu_save_double a0 t0 t1 # clobbers t1 |
135 | jr ra | 135 | jr ra |
136 | END(_save_fp) | 136 | END(_save_fp) |
137 | 137 | ||
@@ -139,7 +139,10 @@ LEAF(_save_fp) | |||
139 | * Restore a thread's fp context. | 139 | * Restore a thread's fp context. |
140 | */ | 140 | */ |
141 | LEAF(_restore_fp) | 141 | LEAF(_restore_fp) |
142 | fpu_restore_double a0, t1 # clobbers t1 | 142 | #ifdef CONFIG_64BIT |
143 | mfc0 t0, CP0_STATUS | ||
144 | #endif | ||
145 | fpu_restore_double a0 t0 t1 # clobbers t1 | ||
143 | jr ra | 146 | jr ra |
144 | END(_restore_fp) | 147 | END(_restore_fp) |
145 | 148 | ||