OSDN Git Service

s390/kernel: use test_fp_ctl() to verify the floating-point control word
authorHendrik Brueckner <brueckner@linux.vnet.ibm.com>
Tue, 28 Apr 2015 09:30:40 +0000 (11:30 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Wed, 22 Jul 2015 07:57:59 +0000 (09:57 +0200)
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>
arch/s390/include/asm/switch_to.h
arch/s390/kernel/compat_signal.c
arch/s390/kernel/signal.c

index d62e7a6..b304031 100644 (file)
@@ -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;
 }
index fe8d692..b55d206 100644 (file)
@@ -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. */
index c551f22..98520c8 100644 (file)
@@ -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. */