Messages in this thread | | | Date | Thu, 04 Nov 2021 17:47:29 +0100 | From | Peter Zijlstra <> | Subject | [RFC][PATCH 00/22] x86: Remove anonymous out-of-line fixups |
| |
Hi,
Direct counterpart to the arm64 series from Mark:
https://lkml.kernel.org/r/20211019160219.5202-1-mark.rutland@arm.com
Since he already put it rather well:
"We recently realised that out-of-line extable fixups cause a number of problems for backtracing (mattering both for developers and for RELIABLE_STACKTRACE and LIVEPATCH). Dmitry spotted a confusing backtrace, which we identified was due to problems with unwinding fixups, as summarized in:
https://lore.kernel.org/linux-arm-kernel/20210927171812.GB9201@C02TD0UTHF1T.local/
The gist is that while backtracing through a fixup, the fixup gets symbolized as an offset from the nearest prior symbol (which happens to be `__entry_tramp_text_end`), and we the backtrace misses the function that was being fixed up (because the fixup handling adjusts the PC, then the fixup does a direct branch back to the original function). We can't reliably map from an arbitrary PC in the fixup text back to the original function.
The way we create fixups is a bit unfortunate: most fixups are generated from common templates, and only differ in register to be poked and the address to branch back to, leading to redundant copies of the same logic that must pollute Since the fixups are all written in assembly, and duplicated for each fixup site, we can only perform very simple fixups, and can't handle any complex triage that we might need for some exceptions (e.g. MTE faults)."
So far these patches have only been compile tested on x86_64 (defconfig,allyesconfig) and boot tested in kvm (defconfig) -- realy early days.
Enjoy..
--- arch/x86/entry/entry_32.S | 28 ++--- arch/x86/entry/entry_64.S | 13 ++- arch/x86/entry/vdso/vdso-layout.lds.S | 1 - arch/x86/include/asm/asm.h | 27 +++++ arch/x86/include/asm/extable_fixup_types.h | 44 ++++++-- arch/x86/include/asm/futex.h | 28 ++--- arch/x86/include/asm/msr.h | 26 ++--- arch/x86/include/asm/segment.h | 9 +- arch/x86/include/asm/sgx.h | 18 ++++ arch/x86/include/asm/uaccess.h | 35 +++--- arch/x86/include/asm/word-at-a-time.h | 29 ++--- arch/x86/include/asm/xen/page.h | 12 +-- arch/x86/kernel/cpu/sgx/encls.h | 36 +------ arch/x86/kernel/fpu/legacy.h | 6 +- arch/x86/kernel/fpu/xstate.h | 6 +- arch/x86/kernel/ftrace.c | 9 +- arch/x86/kernel/vmlinux.lds.S | 1 - arch/x86/kvm/emulate.c | 14 +-- arch/x86/kvm/vmx/vmx_ops.h | 14 ++- arch/x86/lib/checksum_32.S | 19 +--- arch/x86/lib/copy_mc_64.S | 12 +-- arch/x86/lib/copy_user_64.S | 32 ++---- arch/x86/lib/mmx_32.c | 83 +++++---------- arch/x86/lib/usercopy_32.c | 66 +++++------- arch/x86/lib/usercopy_64.c | 8 +- arch/x86/mm/extable.c | 166 ++++++++++++++++++++++++----- include/linux/bitfield.h | 19 +++- 27 files changed, 385 insertions(+), 376 deletions(-)
| |