mirror of
https://github.com/torvalds/linux.git
synced 2024-11-08 05:01:48 +00:00
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>
This commit is contained in:
parent
2e54dc3c7d
commit
4084eb7767
@ -45,7 +45,6 @@ static inline int restore_fp_ctl(u32 *fpc)
|
|||||||
" lfpc %1\n"
|
" lfpc %1\n"
|
||||||
"0: la %0,0\n"
|
"0: la %0,0\n"
|
||||||
"1:\n"
|
"1:\n"
|
||||||
EX_TABLE(0b,1b)
|
|
||||||
: "=d" (rc) : "Q" (*fpc), "0" (-EINVAL));
|
: "=d" (rc) : "Q" (*fpc), "0" (-EINVAL));
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
@ -172,7 +172,7 @@ static void load_sigregs(void)
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
restore_access_regs(current->thread.acrs);
|
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) {
|
if (current->thread.vxrs) {
|
||||||
for (i = 0; i < __NUM_FPRS; i++)
|
for (i = 0; i < __NUM_FPRS; i++)
|
||||||
*(freg_t *)(current->thread.vxrs + 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))
|
if (!is_ri_task(current) && (user_sregs.regs.psw.mask & PSW32_MASK_RI))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
/* Loading the floating-point-control word can fail. Do that first. */
|
/* Test the floating-point-control word. */
|
||||||
if (restore_fp_ctl(&user_sregs.fpregs.fpc))
|
if (test_fp_ctl(user_sregs.fpregs.fpc))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
/* Use regs->psw.mask instead of PSW_USER_BITS to preserve PER bit. */
|
/* Use regs->psw.mask instead of PSW_USER_BITS to preserve PER bit. */
|
||||||
|
@ -121,7 +121,7 @@ static void store_sigregs(void)
|
|||||||
static void load_sigregs(void)
|
static void load_sigregs(void)
|
||||||
{
|
{
|
||||||
restore_access_regs(current->thread.acrs);
|
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) {
|
if (current->thread.vxrs) {
|
||||||
int i;
|
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))
|
if (!is_ri_task(current) && (user_sregs.regs.psw.mask & PSW_MASK_RI))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
/* Loading the floating-point-control word can fail. Do that first. */
|
/* Test the floating-point-control word. */
|
||||||
if (restore_fp_ctl(&user_sregs.fpregs.fpc))
|
if (test_fp_ctl(user_sregs.fpregs.fpc))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
/* Use regs->psw.mask instead of PSW_USER_BITS to preserve PER bit. */
|
/* Use regs->psw.mask instead of PSW_USER_BITS to preserve PER bit. */
|
||||||
|
Loading…
Reference in New Issue
Block a user