From 4084eb7767418861a81d9e24d222f2536537f58e Mon Sep 17 00:00:00 2001 From: Hendrik Brueckner Date: Tue, 28 Apr 2015 11:30:40 +0200 Subject: 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 Signed-off-by: Martin Schwidefsky diff --git a/arch/s390/include/asm/switch_to.h b/arch/s390/include/asm/switch_to.h index d62e7a6..b304031 100644 --- a/arch/s390/include/asm/switch_to.h +++ b/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; } diff --git a/arch/s390/kernel/compat_signal.c b/arch/s390/kernel/compat_signal.c index fe8d692..b55d206 100644 --- a/arch/s390/kernel/compat_signal.c +++ b/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(¤t->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. */ diff --git a/arch/s390/kernel/signal.c b/arch/s390/kernel/signal.c index c551f22..98520c8 100644 --- a/arch/s390/kernel/signal.c +++ b/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(¤t->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. */ -- cgit v0.10.2