Skip to content

Commit

Permalink
x86: unify the implementation of FPU traps
Browse files Browse the repository at this point in the history
On 32 bits, we may suffer IRQ 13, or supposedly we might have a buggy
implementation which gives spurious trap 16.  We did not check for
this on 64 bits, but there is no reason we can't make the code the
same in both cases.  Furthermore, this is presumably rare, so do the
spurious check last, instead of first.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
  • Loading branch information
H. Peter Anvin committed Dec 25, 2008
1 parent 1fcccb0 commit a73ad33
Showing 1 changed file with 4 additions and 7 deletions.
11 changes: 4 additions & 7 deletions arch/x86/kernel/traps.c
Original file line number Diff line number Diff line change
Expand Up @@ -689,12 +689,7 @@ void math_error(void __user *ip)
cwd = get_fpu_cwd(task);
swd = get_fpu_swd(task);

err = swd & ~cwd & 0x3f;

#ifdef CONFIG_X86_32
if (!err)
return;
#endif
err = swd & ~cwd;

if (err & 0x001) { /* Invalid op */
/*
Expand All @@ -712,7 +707,9 @@ void math_error(void __user *ip)
} else if (err & 0x020) { /* Precision */
info.si_code = FPE_FLTRES;
} else {
info.si_code = __SI_FAULT|SI_KERNEL; /* WTF? */
/* If we're using IRQ 13, or supposedly even some trap 16
implementations, it's possible we get a spurious trap... */
return; /* Spurious trap, no error */
}
force_sig_info(SIGFPE, &info, task);
}
Expand Down

0 comments on commit a73ad33

Please sign in to comment.