From cf7a132aac241e89a25c82c0f877b0b073d57c59 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Wed, 18 Jul 2018 11:34:00 +0200 Subject: [PATCH] 4.17-stable patches added patches: compiler-gcc.h-add-__attribute__-gnu_inline-to-all-inline-declarations.patch pinctrl-sh-pfc-r8a77970-remove-sh_pfc_pin_cfg_drive_strength-flag.patch x86-asm-add-_asm_arg-constants-for-argument-registers-to-asm-asm.h.patch x86-paravirt-make-native_save_fl-extern-inline.patch --- ...nu_inline-to-all-inline-declarations.patch | 121 ++++++++++++++ ...e-sh_pfc_pin_cfg_drive_strength-flag.patch | 59 +++++++ queue-4.17/series | 1 + ...-for-argument-registers-to-asm-asm.h.patch | 134 ++++++++++++++++ ...rt-make-native_save_fl-extern-inline.patch | 149 ++++++++++++++++++ 5 files changed, 464 insertions(+) create mode 100644 queue-4.17/compiler-gcc.h-add-__attribute__-gnu_inline-to-all-inline-declarations.patch create mode 100644 queue-4.17/pinctrl-sh-pfc-r8a77970-remove-sh_pfc_pin_cfg_drive_strength-flag.patch create mode 100644 queue-4.17/x86-asm-add-_asm_arg-constants-for-argument-registers-to-asm-asm.h.patch create mode 100644 queue-4.17/x86-paravirt-make-native_save_fl-extern-inline.patch diff --git a/queue-4.17/compiler-gcc.h-add-__attribute__-gnu_inline-to-all-inline-declarations.patch b/queue-4.17/compiler-gcc.h-add-__attribute__-gnu_inline-to-all-inline-declarations.patch new file mode 100644 index 00000000000..ff0270280d2 --- /dev/null +++ b/queue-4.17/compiler-gcc.h-add-__attribute__-gnu_inline-to-all-inline-declarations.patch @@ -0,0 +1,121 @@ +From d03db2bc26f0e4a6849ad649a09c9c73fccdc656 Mon Sep 17 00:00:00 2001 +From: Nick Desaulniers +Date: Thu, 21 Jun 2018 09:23:22 -0700 +Subject: compiler-gcc.h: Add __attribute__((gnu_inline)) to all inline declarations + +From: Nick Desaulniers + +commit d03db2bc26f0e4a6849ad649a09c9c73fccdc656 upstream. + +Functions marked extern inline do not emit an externally visible +function when the gnu89 C standard is used. Some KBUILD Makefiles +overwrite KBUILD_CFLAGS. This is an issue for GCC 5.1+ users as without +an explicit C standard specified, the default is gnu11. Since c99, the +semantics of extern inline have changed such that an externally visible +function is always emitted. This can lead to multiple definition errors +of extern inline functions at link time of compilation units whose build +files have removed an explicit C standard compiler flag for users of GCC +5.1+ or Clang. + +Suggested-by: Arnd Bergmann +Suggested-by: H. Peter Anvin +Suggested-by: Joe Perches +Signed-off-by: Nick Desaulniers +Acked-by: Juergen Gross +Cc: Linus Torvalds +Cc: Peter Zijlstra +Cc: Thomas Gleixner +Cc: acme@redhat.com +Cc: akataria@vmware.com +Cc: akpm@linux-foundation.org +Cc: andrea.parri@amarulasolutions.com +Cc: ard.biesheuvel@linaro.org +Cc: aryabinin@virtuozzo.com +Cc: astrachan@google.com +Cc: boris.ostrovsky@oracle.com +Cc: brijesh.singh@amd.com +Cc: caoj.fnst@cn.fujitsu.com +Cc: geert@linux-m68k.org +Cc: ghackmann@google.com +Cc: gregkh@linuxfoundation.org +Cc: jan.kiszka@siemens.com +Cc: jarkko.sakkinen@linux.intel.com +Cc: jpoimboe@redhat.com +Cc: keescook@google.com +Cc: kirill.shutemov@linux.intel.com +Cc: kstewart@linuxfoundation.org +Cc: linux-efi@vger.kernel.org +Cc: linux-kbuild@vger.kernel.org +Cc: manojgupta@google.com +Cc: mawilcox@microsoft.com +Cc: michal.lkml@markovi.net +Cc: mjg59@google.com +Cc: mka@chromium.org +Cc: pombredanne@nexb.com +Cc: rientjes@google.com +Cc: rostedt@goodmis.org +Cc: sedat.dilek@gmail.com +Cc: thomas.lendacky@amd.com +Cc: tstellar@redhat.com +Cc: tweek@google.com +Cc: virtualization@lists.linux-foundation.org +Cc: will.deacon@arm.com +Cc: yamada.masahiro@socionext.com +Link: http://lkml.kernel.org/r/20180621162324.36656-2-ndesaulniers@google.com +Signed-off-by: Ingo Molnar +Signed-off-by: Greg Kroah-Hartman + +--- + include/linux/compiler-gcc.h | 29 ++++++++++++++++++++++------- + 1 file changed, 22 insertions(+), 7 deletions(-) + +--- a/include/linux/compiler-gcc.h ++++ b/include/linux/compiler-gcc.h +@@ -66,25 +66,40 @@ + #endif + + /* ++ * Feature detection for gnu_inline (gnu89 extern inline semantics). Either ++ * __GNUC_STDC_INLINE__ is defined (not using gnu89 extern inline semantics, ++ * and we opt in to the gnu89 semantics), or __GNUC_STDC_INLINE__ is not ++ * defined so the gnu89 semantics are the default. ++ */ ++#ifdef __GNUC_STDC_INLINE__ ++# define __gnu_inline __attribute__((gnu_inline)) ++#else ++# define __gnu_inline ++#endif ++ ++/* + * Force always-inline if the user requests it so via the .config, + * or if gcc is too old. + * GCC does not warn about unused static inline functions for + * -Wunused-function. This turns out to avoid the need for complex #ifdef + * directives. Suppress the warning in clang as well by using "unused" + * function attribute, which is redundant but not harmful for gcc. ++ * Prefer gnu_inline, so that extern inline functions do not emit an ++ * externally visible function. This makes extern inline behave as per gnu89 ++ * semantics rather than c99. This prevents multiple symbol definition errors ++ * of extern inline functions at link time. ++ * A lot of inline functions can cause havoc with function tracing. + */ + #if !defined(CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING) || \ + !defined(CONFIG_OPTIMIZE_INLINING) || (__GNUC__ < 4) +-#define inline inline __attribute__((always_inline,unused)) notrace +-#define __inline__ __inline__ __attribute__((always_inline,unused)) notrace +-#define __inline __inline __attribute__((always_inline,unused)) notrace ++#define inline \ ++ inline __attribute__((always_inline, unused)) notrace __gnu_inline + #else +-/* A lot of inline functions can cause havoc with function tracing */ +-#define inline inline __attribute__((unused)) notrace +-#define __inline__ __inline__ __attribute__((unused)) notrace +-#define __inline __inline __attribute__((unused)) notrace ++#define inline inline __attribute__((unused)) notrace __gnu_inline + #endif + ++#define __inline__ inline ++#define __inline inline + #define __always_inline inline __attribute__((always_inline)) + #define noinline __attribute__((noinline)) + diff --git a/queue-4.17/pinctrl-sh-pfc-r8a77970-remove-sh_pfc_pin_cfg_drive_strength-flag.patch b/queue-4.17/pinctrl-sh-pfc-r8a77970-remove-sh_pfc_pin_cfg_drive_strength-flag.patch new file mode 100644 index 00000000000..88a935f71ad --- /dev/null +++ b/queue-4.17/pinctrl-sh-pfc-r8a77970-remove-sh_pfc_pin_cfg_drive_strength-flag.patch @@ -0,0 +1,59 @@ +From 550b6f7e8cf93fc2753aa01e655ed5471012ab5a Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Niklas=20S=C3=B6derlund?= + +Date: Tue, 3 Jul 2018 17:18:42 +0200 +Subject: pinctrl: sh-pfc: r8a77970: remove SH_PFC_PIN_CFG_DRIVE_STRENGTH flag +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Niklas Söderlund + +commit 550b6f7e8cf93fc2753aa01e655ed5471012ab5a upstream. + +The datasheet does not document any registers to control drive strength, +and no drive strength registers are for this reason described for this +SoC. The flags indicating that drive strength can be controlled are +however set for some pins in the driver. + +This leads to a NULL pointer dereference when the sh-pfc core tries to +access the struct describing the drive strength registers, for example +when reading the sysfs file pinconf-pins. + +Fix this by removing the SH_PFC_PIN_CFG_DRIVE_STRENGTH from all pins. + +Fixes: b92ac66a1819602b ("pinctrl: sh-pfc: Add R8A77970 PFC support") +Signed-off-by: Niklas Söderlund +Reviewed-by: Simon Horman +Reviewed-by: Sergei Shtylyov +Reviewed-by: Geert Uytterhoeven +Signed-off-by: Linus Walleij +Signed-off-by: Niklas Söderlund +Signed-off-by: Greg Kroah-Hartman + + +--- + drivers/pinctrl/sh-pfc/pfc-r8a77970.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +--- a/drivers/pinctrl/sh-pfc/pfc-r8a77970.c ++++ b/drivers/pinctrl/sh-pfc/pfc-r8a77970.c +@@ -22,12 +22,12 @@ + #include "sh_pfc.h" + + #define CPU_ALL_PORT(fn, sfx) \ +- PORT_GP_CFG_22(0, fn, sfx, SH_PFC_PIN_CFG_DRIVE_STRENGTH), \ +- PORT_GP_CFG_28(1, fn, sfx, SH_PFC_PIN_CFG_DRIVE_STRENGTH), \ +- PORT_GP_CFG_17(2, fn, sfx, SH_PFC_PIN_CFG_DRIVE_STRENGTH), \ +- PORT_GP_CFG_17(3, fn, sfx, SH_PFC_PIN_CFG_DRIVE_STRENGTH), \ +- PORT_GP_CFG_6(4, fn, sfx, SH_PFC_PIN_CFG_DRIVE_STRENGTH), \ +- PORT_GP_CFG_15(5, fn, sfx, SH_PFC_PIN_CFG_DRIVE_STRENGTH) ++ PORT_GP_22(0, fn, sfx), \ ++ PORT_GP_28(1, fn, sfx), \ ++ PORT_GP_17(2, fn, sfx), \ ++ PORT_GP_17(3, fn, sfx), \ ++ PORT_GP_6(4, fn, sfx), \ ++ PORT_GP_15(5, fn, sfx) + /* + * F_() : just information + * FM() : macro for FN_xxx / xxx_MARK diff --git a/queue-4.17/series b/queue-4.17/series index 8c904802856..6bd0ac02b75 100644 --- a/queue-4.17/series +++ b/queue-4.17/series @@ -1,3 +1,4 @@ compiler-gcc.h-add-__attribute__-gnu_inline-to-all-inline-declarations.patch x86-asm-add-_asm_arg-constants-for-argument-registers-to-asm-asm.h.patch x86-paravirt-make-native_save_fl-extern-inline.patch +pinctrl-sh-pfc-r8a77970-remove-sh_pfc_pin_cfg_drive_strength-flag.patch diff --git a/queue-4.17/x86-asm-add-_asm_arg-constants-for-argument-registers-to-asm-asm.h.patch b/queue-4.17/x86-asm-add-_asm_arg-constants-for-argument-registers-to-asm-asm.h.patch new file mode 100644 index 00000000000..f951ce64848 --- /dev/null +++ b/queue-4.17/x86-asm-add-_asm_arg-constants-for-argument-registers-to-asm-asm.h.patch @@ -0,0 +1,134 @@ +From 0e2e160033283e20f688d8bad5b89460cc5bfcc4 Mon Sep 17 00:00:00 2001 +From: "H. Peter Anvin" +Date: Thu, 21 Jun 2018 09:23:23 -0700 +Subject: x86/asm: Add _ASM_ARG* constants for argument registers to + +From: H. Peter Anvin + +commit 0e2e160033283e20f688d8bad5b89460cc5bfcc4 upstream. + +i386 and x86-64 uses different registers for arguments; make them +available so we don't have to #ifdef in the actual code. + +Native size and specified size (q, l, w, b) versions are provided. + +Signed-off-by: H. Peter Anvin +Signed-off-by: Nick Desaulniers +Reviewed-by: Sedat Dilek +Acked-by: Juergen Gross +Cc: Linus Torvalds +Cc: Peter Zijlstra +Cc: Thomas Gleixner +Cc: acme@redhat.com +Cc: akataria@vmware.com +Cc: akpm@linux-foundation.org +Cc: andrea.parri@amarulasolutions.com +Cc: ard.biesheuvel@linaro.org +Cc: arnd@arndb.de +Cc: aryabinin@virtuozzo.com +Cc: astrachan@google.com +Cc: boris.ostrovsky@oracle.com +Cc: brijesh.singh@amd.com +Cc: caoj.fnst@cn.fujitsu.com +Cc: geert@linux-m68k.org +Cc: ghackmann@google.com +Cc: gregkh@linuxfoundation.org +Cc: jan.kiszka@siemens.com +Cc: jarkko.sakkinen@linux.intel.com +Cc: joe@perches.com +Cc: jpoimboe@redhat.com +Cc: keescook@google.com +Cc: kirill.shutemov@linux.intel.com +Cc: kstewart@linuxfoundation.org +Cc: linux-efi@vger.kernel.org +Cc: linux-kbuild@vger.kernel.org +Cc: manojgupta@google.com +Cc: mawilcox@microsoft.com +Cc: michal.lkml@markovi.net +Cc: mjg59@google.com +Cc: mka@chromium.org +Cc: pombredanne@nexb.com +Cc: rientjes@google.com +Cc: rostedt@goodmis.org +Cc: thomas.lendacky@amd.com +Cc: tstellar@redhat.com +Cc: tweek@google.com +Cc: virtualization@lists.linux-foundation.org +Cc: will.deacon@arm.com +Cc: yamada.masahiro@socionext.com +Link: http://lkml.kernel.org/r/20180621162324.36656-3-ndesaulniers@google.com +Signed-off-by: Ingo Molnar +Signed-off-by: Greg Kroah-Hartman + +--- + arch/x86/include/asm/asm.h | 59 +++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 59 insertions(+) + +--- a/arch/x86/include/asm/asm.h ++++ b/arch/x86/include/asm/asm.h +@@ -46,6 +46,65 @@ + #define _ASM_SI __ASM_REG(si) + #define _ASM_DI __ASM_REG(di) + ++#ifndef __x86_64__ ++/* 32 bit */ ++ ++#define _ASM_ARG1 _ASM_AX ++#define _ASM_ARG2 _ASM_DX ++#define _ASM_ARG3 _ASM_CX ++ ++#define _ASM_ARG1L eax ++#define _ASM_ARG2L edx ++#define _ASM_ARG3L ecx ++ ++#define _ASM_ARG1W ax ++#define _ASM_ARG2W dx ++#define _ASM_ARG3W cx ++ ++#define _ASM_ARG1B al ++#define _ASM_ARG2B dl ++#define _ASM_ARG3B cl ++ ++#else ++/* 64 bit */ ++ ++#define _ASM_ARG1 _ASM_DI ++#define _ASM_ARG2 _ASM_SI ++#define _ASM_ARG3 _ASM_DX ++#define _ASM_ARG4 _ASM_CX ++#define _ASM_ARG5 r8 ++#define _ASM_ARG6 r9 ++ ++#define _ASM_ARG1Q rdi ++#define _ASM_ARG2Q rsi ++#define _ASM_ARG3Q rdx ++#define _ASM_ARG4Q rcx ++#define _ASM_ARG5Q r8 ++#define _ASM_ARG6Q r9 ++ ++#define _ASM_ARG1L edi ++#define _ASM_ARG2L esi ++#define _ASM_ARG3L edx ++#define _ASM_ARG4L ecx ++#define _ASM_ARG5L r8d ++#define _ASM_ARG6L r9d ++ ++#define _ASM_ARG1W di ++#define _ASM_ARG2W si ++#define _ASM_ARG3W dx ++#define _ASM_ARG4W cx ++#define _ASM_ARG5W r8w ++#define _ASM_ARG6W r9w ++ ++#define _ASM_ARG1B dil ++#define _ASM_ARG2B sil ++#define _ASM_ARG3B dl ++#define _ASM_ARG4B cl ++#define _ASM_ARG5B r8b ++#define _ASM_ARG6B r9b ++ ++#endif ++ + /* + * Macros to generate condition code outputs from inline assembly, + * The output operand must be type "bool". diff --git a/queue-4.17/x86-paravirt-make-native_save_fl-extern-inline.patch b/queue-4.17/x86-paravirt-make-native_save_fl-extern-inline.patch new file mode 100644 index 00000000000..61557c77dc4 --- /dev/null +++ b/queue-4.17/x86-paravirt-make-native_save_fl-extern-inline.patch @@ -0,0 +1,149 @@ +From d0a8d9378d16eb3c69bd8e6d23779fbdbee3a8c7 Mon Sep 17 00:00:00 2001 +From: Nick Desaulniers +Date: Thu, 21 Jun 2018 09:23:24 -0700 +Subject: x86/paravirt: Make native_save_fl() extern inline + +From: Nick Desaulniers + +commit d0a8d9378d16eb3c69bd8e6d23779fbdbee3a8c7 upstream. + +native_save_fl() is marked static inline, but by using it as +a function pointer in arch/x86/kernel/paravirt.c, it MUST be outlined. + +paravirt's use of native_save_fl() also requires that no GPRs other than +%rax are clobbered. + +Compilers have different heuristics which they use to emit stack guard +code, the emittance of which can break paravirt's callee saved assumption +by clobbering %rcx. + +Marking a function definition extern inline means that if this version +cannot be inlined, then the out-of-line version will be preferred. By +having the out-of-line version be implemented in assembly, it cannot be +instrumented with a stack protector, which might violate custom calling +conventions that code like paravirt rely on. + +The semantics of extern inline has changed since gnu89. This means that +folks using GCC versions >= 5.1 may see symbol redefinition errors at +link time for subdirs that override KBUILD_CFLAGS (making the C standard +used implicit) regardless of this patch. This has been cleaned up +earlier in the patch set, but is left as a note in the commit message +for future travelers. + +Reports: + https://lkml.org/lkml/2018/5/7/534 + https://github.com/ClangBuiltLinux/linux/issues/16 + +Discussion: + https://bugs.llvm.org/show_bug.cgi?id=37512 + https://lkml.org/lkml/2018/5/24/1371 + +Thanks to the many folks that participated in the discussion. + +Debugged-by: Alistair Strachan +Debugged-by: Matthias Kaehlcke +Suggested-by: Arnd Bergmann +Suggested-by: H. Peter Anvin +Suggested-by: Tom Stellar +Reported-by: Sedat Dilek +Tested-by: Sedat Dilek +Signed-off-by: Nick Desaulniers +Acked-by: Juergen Gross +Cc: Linus Torvalds +Cc: Peter Zijlstra +Cc: Thomas Gleixner +Cc: acme@redhat.com +Cc: akataria@vmware.com +Cc: akpm@linux-foundation.org +Cc: andrea.parri@amarulasolutions.com +Cc: ard.biesheuvel@linaro.org +Cc: aryabinin@virtuozzo.com +Cc: astrachan@google.com +Cc: boris.ostrovsky@oracle.com +Cc: brijesh.singh@amd.com +Cc: caoj.fnst@cn.fujitsu.com +Cc: geert@linux-m68k.org +Cc: ghackmann@google.com +Cc: gregkh@linuxfoundation.org +Cc: jan.kiszka@siemens.com +Cc: jarkko.sakkinen@linux.intel.com +Cc: joe@perches.com +Cc: jpoimboe@redhat.com +Cc: keescook@google.com +Cc: kirill.shutemov@linux.intel.com +Cc: kstewart@linuxfoundation.org +Cc: linux-efi@vger.kernel.org +Cc: linux-kbuild@vger.kernel.org +Cc: manojgupta@google.com +Cc: mawilcox@microsoft.com +Cc: michal.lkml@markovi.net +Cc: mjg59@google.com +Cc: mka@chromium.org +Cc: pombredanne@nexb.com +Cc: rientjes@google.com +Cc: rostedt@goodmis.org +Cc: thomas.lendacky@amd.com +Cc: tweek@google.com +Cc: virtualization@lists.linux-foundation.org +Cc: will.deacon@arm.com +Cc: yamada.masahiro@socionext.com +Link: http://lkml.kernel.org/r/20180621162324.36656-4-ndesaulniers@google.com +Signed-off-by: Ingo Molnar +Signed-off-by: Greg Kroah-Hartman + +--- + arch/x86/include/asm/irqflags.h | 2 +- + arch/x86/kernel/Makefile | 1 + + arch/x86/kernel/irqflags.S | 26 ++++++++++++++++++++++++++ + 3 files changed, 28 insertions(+), 1 deletion(-) + +--- a/arch/x86/include/asm/irqflags.h ++++ b/arch/x86/include/asm/irqflags.h +@@ -13,7 +13,7 @@ + * Interrupt control: + */ + +-static inline unsigned long native_save_fl(void) ++extern inline unsigned long native_save_fl(void) + { + unsigned long flags; + +--- a/arch/x86/kernel/Makefile ++++ b/arch/x86/kernel/Makefile +@@ -61,6 +61,7 @@ obj-y += alternative.o i8253.o hw_brea + obj-y += tsc.o tsc_msr.o io_delay.o rtc.o + obj-y += pci-iommu_table.o + obj-y += resource.o ++obj-y += irqflags.o + + obj-y += process.o + obj-y += fpu/ +--- /dev/null ++++ b/arch/x86/kernel/irqflags.S +@@ -0,0 +1,26 @@ ++/* SPDX-License-Identifier: GPL-2.0 */ ++ ++#include ++#include ++#include ++ ++/* ++ * unsigned long native_save_fl(void) ++ */ ++ENTRY(native_save_fl) ++ pushf ++ pop %_ASM_AX ++ ret ++ENDPROC(native_save_fl) ++EXPORT_SYMBOL(native_save_fl) ++ ++/* ++ * void native_restore_fl(unsigned long flags) ++ * %eax/%rdi: flags ++ */ ++ENTRY(native_restore_fl) ++ push %_ASM_ARG1 ++ popf ++ ret ++ENDPROC(native_restore_fl) ++EXPORT_SYMBOL(native_restore_fl) -- 2.47.3