浏览代码

s390/kernel: use test_fp_ctl() to verify the floating-point control word

Use the test_fp_ctl() to test the floating-point control word
for validity and use restore_fp_ctl() to set it in load_sigregs.

Signed-off-by: Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Hendrik Brueckner 10 年之前
父节点
当前提交
4084eb7767
共有 3 个文件被更改,包括 6 次插入7 次删除
  1. 0 1
      arch/s390/include/asm/switch_to.h
  2. 3 3
      arch/s390/kernel/compat_signal.c
  3. 3 3
      arch/s390/kernel/signal.c

+ 0 - 1
arch/s390/include/asm/switch_to.h

@@ -45,7 +45,6 @@ static inline int restore_fp_ctl(u32 *fpc)
 		"	lfpc    %1\n"
 		"0:	la	%0,0\n"
 		"1:\n"
-		EX_TABLE(0b,1b)
 		: "=d" (rc) : "Q" (*fpc), "0" (-EINVAL));
 	return rc;
 }

+ 3 - 3
arch/s390/kernel/compat_signal.c

@@ -172,7 +172,7 @@ static void load_sigregs(void)
 	int i;
 
 	restore_access_regs(current->thread.acrs);
-	/* restore_fp_ctl is done in restore_sigregs */
+	restore_fp_ctl(&current->thread.fp_regs.fpc);
 	if (current->thread.vxrs) {
 		for (i = 0; i < __NUM_FPRS; i++)
 			*(freg_t *)(current->thread.vxrs + i) =
@@ -217,8 +217,8 @@ static int restore_sigregs32(struct pt_regs *regs,_sigregs32 __user *sregs)
 	if (!is_ri_task(current) && (user_sregs.regs.psw.mask & PSW32_MASK_RI))
 		return -EINVAL;
 
-	/* Loading the floating-point-control word can fail. Do that first. */
-	if (restore_fp_ctl(&user_sregs.fpregs.fpc))
+	/* Test the floating-point-control word. */
+	if (test_fp_ctl(user_sregs.fpregs.fpc))
 		return -EINVAL;
 
 	/* Use regs->psw.mask instead of PSW_USER_BITS to preserve PER bit. */

+ 3 - 3
arch/s390/kernel/signal.c

@@ -121,7 +121,7 @@ static void store_sigregs(void)
 static void load_sigregs(void)
 {
 	restore_access_regs(current->thread.acrs);
-	/* restore_fp_ctl is done in restore_sigregs */
+	restore_fp_ctl(&current->thread.fp_regs.fpc);
 	if (current->thread.vxrs) {
 		int i;
 
@@ -166,8 +166,8 @@ static int restore_sigregs(struct pt_regs *regs, _sigregs __user *sregs)
 	if (!is_ri_task(current) && (user_sregs.regs.psw.mask & PSW_MASK_RI))
 		return -EINVAL;
 
-	/* Loading the floating-point-control word can fail. Do that first. */
-	if (restore_fp_ctl(&user_sregs.fpregs.fpc))
+	/* Test the floating-point-control word. */
+	if (test_fp_ctl(user_sregs.fpregs.fpc))
 		return -EINVAL;
 
 	/* Use regs->psw.mask instead of PSW_USER_BITS to preserve PER bit. */