浏览代码

MIPS: Avoid an FPE exception in FCSR mask probing

Use the default FCSR value in mask probing, avoiding an FPE exception
where reset has left any exception enable and their corresponding cause
bits set and the register is then rewritten with these bits active.

Signed-off-by: Maciej W. Rozycki <macro@linux-mips.org>
Cc: Joshua Kinard <kumba@gentoo.org>
Cc: linux-mips@linux-mips.org
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Maciej W. Rozycki 10 年之前
父节点
当前提交
90b712ddab
共有 1 个文件被更改,包括 1 次插入2 次删除
  1. 1 2
      arch/mips/kernel/cpu-probe.c

+ 1 - 2
arch/mips/kernel/cpu-probe.c

@@ -74,13 +74,12 @@ static inline void cpu_set_fpu_fcsr_mask(struct cpuinfo_mips *c)
 {
 {
 	unsigned long sr, mask, fcsr, fcsr0, fcsr1;
 	unsigned long sr, mask, fcsr, fcsr0, fcsr1;
 
 
+	fcsr = c->fpu_csr31;
 	mask = FPU_CSR_ALL_X | FPU_CSR_ALL_E | FPU_CSR_ALL_S | FPU_CSR_RM;
 	mask = FPU_CSR_ALL_X | FPU_CSR_ALL_E | FPU_CSR_ALL_S | FPU_CSR_RM;
 
 
 	sr = read_c0_status();
 	sr = read_c0_status();
 	__enable_fpu(FPU_AS_IS);
 	__enable_fpu(FPU_AS_IS);
 
 
-	fcsr = read_32bit_cp1_register(CP1_STATUS);
-
 	fcsr0 = fcsr & mask;
 	fcsr0 = fcsr & mask;
 	write_32bit_cp1_register(CP1_STATUS, fcsr0);
 	write_32bit_cp1_register(CP1_STATUS, fcsr0);
 	fcsr0 = read_32bit_cp1_register(CP1_STATUS);
 	fcsr0 = read_32bit_cp1_register(CP1_STATUS);