[patch V2 00/20] x86/fpu: Clean up exception fixups and error handling in sigframe related code

From: Thomas Gleixner
Date: Tue Sep 07 2021 - 15:56:21 EST


A recent discussion [1] about hardware poisoning unearthed some short
comings in the error handling of the sigframe related FPU code:

- The error exit for exceptions other than #PF is obfuscated

- The error code return values of the various functions are pointless
because all callers just care about success or failure and the error
codes are never propagated to user space.

- Some of the buffer clearing happens needlessly inside of page fault
disabled regions.

The discussion around V1 of this series which can be found here:

https://lore.kernel.org/r/20210830154702.247681585@xxxxxxxxxxxxx

identified a few more issues especially in the area of exception fixups:

- The MCE aware exception fixup is inconsistent and confusing especially
in copy_mc_64.c. It uses a fixup function which stores the trap number
in regs->ax just to overwrite regs->ax at the callsite specific fixup.

The following series cleans this up. The resulting excecutable code is
slightly smaller with that.

It's also available in git:

git://git.kernel.org/pub/scm/linux/kernel/git/tglx/devel.git x86/fpu

Changes vs. V1:

- Deduplicate the exception table related code

- Change the exception table store to use a fixup type identifier instead
of a function pointer. That allows to use the same fixup function for
different types and avoids adding new global functions and exports to
solve the identified issues. This makes the cleanup of the odd fixup
functions in copy_mc_64 and the fpu code simpler

- Make copy_mc_64 and FPU code use the new fixup type mechanics

- Remove #MC handling from the various *SAVE functions which write the
FPU registers to the user space sigframe as these can't raise #MC
according to Tony.

- Address a few review comments and adjust the patches to the new
exception table mechanism.

Thanks,

tglx

[1] https://lore.kernel.org/r/87r1edgs2w.ffs@tglx

---
arch/x86/ia32/ia32_signal.c | 14 +-
arch/x86/include/asm/asm.h | 49 ++++-----
arch/x86/include/asm/extable.h | 44 +++++---
arch/x86/include/asm/extable_fixup_types.h | 22 ++++
arch/x86/include/asm/fpu/internal.h | 84 ++++++++++------
arch/x86/include/asm/msr.h | 4
arch/x86/include/asm/segment.h | 2
arch/x86/kernel/cpu/mce/core.c | 40 ++------
arch/x86/kernel/cpu/mce/internal.h | 14 --
arch/x86/kernel/cpu/mce/severity.c | 22 ++--
arch/x86/kernel/fpu/signal.c | 145 +++++++++++++++--------------
arch/x86/kernel/signal.c | 18 +--
arch/x86/lib/copy_mc_64.S | 8 -
arch/x86/mm/extable.c | 131 ++++++++++----------------
arch/x86/net/bpf_jit_comp.c | 11 --
scripts/sorttable.c | 4
16 files changed, 302 insertions(+), 310 deletions(-)