From: Greg Kroah-Hartman Date: Mon, 1 Feb 2021 09:38:26 +0000 (+0100) Subject: 5.10-stable patches X-Git-Tag: v4.4.255~49 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c152a0c82dffbd88e9328939ca4a8cf905329269;p=thirdparty%2Fkernel%2Fstable-queue.git 5.10-stable patches added patches: x86-entry-emit-a-symbol-for-register-restoring-thunk.patch --- diff --git a/queue-5.10/series b/queue-5.10/series index ef5942c7b4c..4dd9a5de65a 100644 --- a/queue-5.10/series +++ b/queue-5.10/series @@ -29,3 +29,4 @@ net-usb-qmi_wwan-added-support-for-thales-cinterion-plsx3-modem-family.patch s390-uv-fix-sysfs-max-number-of-vcpus-reporting.patch s390-vfio-ap-no-need-to-disable-irq-after-queue-reset.patch pm-hibernate-flush-swap-writer-after-marking.patch +x86-entry-emit-a-symbol-for-register-restoring-thunk.patch diff --git a/queue-5.10/x86-entry-emit-a-symbol-for-register-restoring-thunk.patch b/queue-5.10/x86-entry-emit-a-symbol-for-register-restoring-thunk.patch new file mode 100644 index 00000000000..043d4a810f5 --- /dev/null +++ b/queue-5.10/x86-entry-emit-a-symbol-for-register-restoring-thunk.patch @@ -0,0 +1,123 @@ +From 5e6dca82bcaa49348f9e5fcb48df4881f6d6c4ae Mon Sep 17 00:00:00 2001 +From: Nick Desaulniers +Date: Tue, 12 Jan 2021 11:46:24 -0800 +Subject: x86/entry: Emit a symbol for register restoring thunk + +From: Nick Desaulniers + +commit 5e6dca82bcaa49348f9e5fcb48df4881f6d6c4ae upstream. + +Arnd found a randconfig that produces the warning: + + arch/x86/entry/thunk_64.o: warning: objtool: missing symbol for insn at + offset 0x3e + +when building with LLVM_IAS=1 (Clang's integrated assembler). Josh +notes: + + With the LLVM assembler not generating section symbols, objtool has no + way to reference this code when it generates ORC unwinder entries, + because this code is outside of any ELF function. + + The limitation now being imposed by objtool is that all code must be + contained in an ELF symbol. And .L symbols don't create such symbols. + + So basically, you can use an .L symbol *inside* a function or a code + segment, you just can't use the .L symbol to contain the code using a + SYM_*_START/END annotation pair. + +Fangrui notes that this optimization is helpful for reducing image size +when compiling with -ffunction-sections and -fdata-sections. I have +observed on the order of tens of thousands of symbols for the kernel +images built with those flags. + +A patch has been authored against GNU binutils to match this behavior +of not generating unused section symbols ([1]), so this will +also become a problem for users of GNU binutils once they upgrade to 2.36. + +Omit the .L prefix on a label so that the assembler will emit an entry +into the symbol table for the label, with STB_LOCAL binding. This +enables objtool to generate proper unwind info here with LLVM_IAS=1 or +GNU binutils 2.36+. + + [ bp: Massage commit message. ] + +Reported-by: Arnd Bergmann +Suggested-by: Josh Poimboeuf +Suggested-by: Borislav Petkov +Suggested-by: Mark Brown +Signed-off-by: Nick Desaulniers +Signed-off-by: Borislav Petkov +Acked-by: Peter Zijlstra (Intel) +Acked-by: Josh Poimboeuf +Link: https://lkml.kernel.org/r/20210112194625.4181814-1-ndesaulniers@google.com +Link: https://github.com/ClangBuiltLinux/linux/issues/1209 +Link: https://reviews.llvm.org/D93783 +Link: https://sourceware.org/binutils/docs/as/Symbol-Names.html +Link: https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=d1bcae833b32f1408485ce69f844dcd7ded093a8 [1] +Cc: Chris Clayton +Signed-off-by: Greg Kroah-Hartman + +--- + Documentation/asm-annotations.rst | 5 +++++ + arch/x86/entry/thunk_64.S | 8 ++++---- + include/linux/linkage.h | 5 +++++ + 3 files changed, 14 insertions(+), 4 deletions(-) + +--- a/Documentation/asm-annotations.rst ++++ b/Documentation/asm-annotations.rst +@@ -100,6 +100,11 @@ Instruction Macros + ~~~~~~~~~~~~~~~~~~ + This section covers ``SYM_FUNC_*`` and ``SYM_CODE_*`` enumerated above. + ++``objtool`` requires that all code must be contained in an ELF symbol. Symbol ++names that have a ``.L`` prefix do not emit symbol table entries. ``.L`` ++prefixed symbols can be used within a code region, but should be avoided for ++denoting a range of code via ``SYM_*_START/END`` annotations. ++ + * ``SYM_FUNC_START`` and ``SYM_FUNC_START_LOCAL`` are supposed to be **the + most frequent markings**. They are used for functions with standard calling + conventions -- global and local. Like in C, they both align the functions to +--- a/arch/x86/entry/thunk_64.S ++++ b/arch/x86/entry/thunk_64.S +@@ -31,7 +31,7 @@ SYM_FUNC_START_NOALIGN(\name) + .endif + + call \func +- jmp .L_restore ++ jmp __thunk_restore + SYM_FUNC_END(\name) + _ASM_NOKPROBE(\name) + .endm +@@ -44,7 +44,7 @@ SYM_FUNC_END(\name) + #endif + + #ifdef CONFIG_PREEMPTION +-SYM_CODE_START_LOCAL_NOALIGN(.L_restore) ++SYM_CODE_START_LOCAL_NOALIGN(__thunk_restore) + popq %r11 + popq %r10 + popq %r9 +@@ -56,6 +56,6 @@ SYM_CODE_START_LOCAL_NOALIGN(.L_restore) + popq %rdi + popq %rbp + ret +- _ASM_NOKPROBE(.L_restore) +-SYM_CODE_END(.L_restore) ++ _ASM_NOKPROBE(__thunk_restore) ++SYM_CODE_END(__thunk_restore) + #endif +--- a/include/linux/linkage.h ++++ b/include/linux/linkage.h +@@ -178,6 +178,11 @@ + * Objtool generates debug info for both FUNC & CODE, but needs special + * annotations for each CODE's start (to describe the actual stack frame). + * ++ * Objtool requires that all code must be contained in an ELF symbol. Symbol ++ * names that have a .L prefix do not emit symbol table entries. .L ++ * prefixed symbols can be used within a code region, but should be avoided for ++ * denoting a range of code via ``SYM_*_START/END`` annotations. ++ * + * ALIAS -- does not generate debug info -- the aliased function will + */ +