diff options
author | Atsushi Nemoto <anemo@mba.ocn.ne.jp> | 2007-03-09 11:07:45 -0500 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2007-03-16 21:03:26 -0400 |
commit | 53dc80287da43b75df2fe2658651d3c5160dad8e (patch) | |
tree | 3c4c97534c379709cd2a1dae5b90df626349f21d /arch/mips/kernel/r2300_switch.S | |
parent | c6a2f4679331206ef5d353fc9a6cda2fa4aef8c6 (diff) |
[MIPS] FPU ownership management & preemption fixes
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/r2300_switch.S')
-rw-r--r-- | arch/mips/kernel/r2300_switch.S | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/arch/mips/kernel/r2300_switch.S b/arch/mips/kernel/r2300_switch.S index 656bde2e11b1..28c2e2e6af73 100644 --- a/arch/mips/kernel/r2300_switch.S +++ b/arch/mips/kernel/r2300_switch.S | |||
@@ -49,8 +49,7 @@ LEAF(resume) | |||
49 | #ifndef CONFIG_CPU_HAS_LLSC | 49 | #ifndef CONFIG_CPU_HAS_LLSC |
50 | sw zero, ll_bit | 50 | sw zero, ll_bit |
51 | #endif | 51 | #endif |
52 | mfc0 t1, CP0_STATUS | 52 | mfc0 t2, CP0_STATUS |
53 | sw t1, THREAD_STATUS(a0) | ||
54 | cpu_save_nonscratch a0 | 53 | cpu_save_nonscratch a0 |
55 | sw ra, THREAD_REG31(a0) | 54 | sw ra, THREAD_REG31(a0) |
56 | 55 | ||
@@ -60,8 +59,8 @@ LEAF(resume) | |||
60 | lw t3, TASK_THREAD_INFO(a0) | 59 | lw t3, TASK_THREAD_INFO(a0) |
61 | lw t0, TI_FLAGS(t3) | 60 | lw t0, TI_FLAGS(t3) |
62 | li t1, _TIF_USEDFPU | 61 | li t1, _TIF_USEDFPU |
63 | and t2, t0, t1 | 62 | and t1, t0 |
64 | beqz t2, 1f | 63 | beqz t1, 1f |
65 | nor t1, zero, t1 | 64 | nor t1, zero, t1 |
66 | 65 | ||
67 | and t0, t0, t1 | 66 | and t0, t0, t1 |
@@ -74,10 +73,13 @@ LEAF(resume) | |||
74 | li t1, ~ST0_CU1 | 73 | li t1, ~ST0_CU1 |
75 | and t0, t0, t1 | 74 | and t0, t0, t1 |
76 | sw t0, ST_OFF(t3) | 75 | sw t0, ST_OFF(t3) |
76 | /* clear thread_struct CU1 bit */ | ||
77 | and t2, t1 | ||
77 | 78 | ||
78 | fpu_save_single a0, t0 # clobbers t0 | 79 | fpu_save_single a0, t0 # clobbers t0 |
79 | 80 | ||
80 | 1: | 81 | 1: |
82 | sw t2, THREAD_STATUS(a0) | ||
81 | /* | 83 | /* |
82 | * The order of restoring the registers takes care of the race | 84 | * The order of restoring the registers takes care of the race |
83 | * updating $28, $29 and kernelsp without disabling ints. | 85 | * updating $28, $29 and kernelsp without disabling ints. |