public inbox for linux-kbuild@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH 4.4 018/107] x86/paravirt: Make native_save_fl() extern inline
       [not found] <20180723122413.003644357@linuxfoundation.org>
@ 2018-07-23 12:41 ` Greg Kroah-Hartman
  2018-08-24 23:08   ` Ben Hutchings
  0 siblings, 1 reply; 3+ messages in thread
From: Greg Kroah-Hartman @ 2018-07-23 12:41 UTC (permalink / raw)
  To: linux-kernel
  Cc: Greg Kroah-Hartman, stable, Arnd Bergmann, H. Peter Anvin,
	Tom Stellar, Sedat Dilek, Nick Desaulniers, Juergen Gross,
	Linus Torvalds, Peter Zijlstra, Thomas Gleixner, acme, akataria,
	akpm, andrea.parri, ard.biesheuvel, aryabinin, astrachan,
	boris.ostrovsky, brijesh.singh, caoj.fnst, geert, ghackmann,
	jan.kiszka, jarkko.sakkinen, joe, jpoimboe, keescook,
	kirill.shutemov, kstewart, linux-efi, linux-kbuild, manojgupta,
	mawilcox, michal.lkml, mjg59, mka, pombredanne, rientjes, rostedt,
	thomas.lendacky, tweek, virtualization, will.deacon,
	yamada.masahiro, Ingo Molnar

4.4-stable review patch.  If anyone has any objections, please let me know.

------------------

From: Nick Desaulniers <ndesaulniers@google.com>

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.

[Backport for 4.4. 4.4 is missing commit 784d5699eddc "x86: move exports to
actual definitions" which doesn't apply cleanly, and not really worth
backporting IMO. It's simpler to change this patch from upstream:
  + #include <asm-generic/export.h>
rather than
  + #include <asm/export.h>]

Debugged-by: Alistair Strachan <astrachan@google.com>
Debugged-by: Matthias Kaehlcke <mka@chromium.org>
Suggested-by: Arnd Bergmann <arnd@arndb.de>
Suggested-by: H. Peter Anvin <hpa@zytor.com>
Suggested-by: Tom Stellar <tstellar@redhat.com>
Reported-by: Sedat Dilek <sedat.dilek@gmail.com>
Tested-by: Sedat Dilek <sedat.dilek@gmail.com>
Signed-off-by: Nick Desaulniers <ndesaulniers@google.com>
Acked-by: Juergen Gross <jgross@suse.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
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 <mingo@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

---
 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
@@ -8,7 +8,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
@@ -41,6 +41,7 @@ obj-y			+= alternative.o i8253.o pci-nom
 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 <asm/asm.h>
+#include <asm-generic/export.h>
+#include <linux/linkage.h>
+
+/*
+ * 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)



^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH 4.4 018/107] x86/paravirt: Make native_save_fl() extern inline
  2018-07-23 12:41 ` [PATCH 4.4 018/107] x86/paravirt: Make native_save_fl() extern inline Greg Kroah-Hartman
@ 2018-08-24 23:08   ` Ben Hutchings
  2018-08-27 21:06     ` Nick Desaulniers
  0 siblings, 1 reply; 3+ messages in thread
From: Ben Hutchings @ 2018-08-24 23:08 UTC (permalink / raw)
  To: Nick Desaulniers
  Cc: stable, Arnd Bergmann, H. Peter Anvin, Tom Stellar, Sedat Dilek,
	Juergen Gross, Linus Torvalds, Peter Zijlstra, Thomas Gleixner,
	acme, akataria, akpm, andrea.parri, ard.biesheuvel, aryabinin,
	astrachan, boris.ostrovsky, brijesh.singh, caoj.fnst, geert,
	ghackmann, jan.kiszka, jarkko.sakkinen, joe, jpoimboe, keescook,
	kirill.shutemov, kstewart, linux-efi, linux-kbuild, manojgupta,
	mawilcox, michal.lkml, mjg59, mka, pombredanne, rientjes, rostedt,
	thomas.lendacky, tweek, virtualization, will.deacon,
	yamada.masahiro, Ingo Molnar, Greg Kroah-Hartman, LKML

On Mon, 2018-07-23 at 14:41 +0200, Greg Kroah-Hartman wrote:
> 4.4-stable review patch.  If anyone has any objections, please let me know.
> 
> ------------------
> 
> From: Nick Desaulniers <ndesaulniers@google.com>
> 
> 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.
[...]

Shouldn't native_restore_fl() be changed similarly?  You added an out-
of-line definition, but it doesn't seem like it will actually be used.

Ben.

-- 
Ben Hutchings, Software Developer                         Codethink Ltd
https://www.codethink.co.uk/                 Dale House, 35 Dale Street
                                     Manchester, M1 2HF, United Kingdom

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH 4.4 018/107] x86/paravirt: Make native_save_fl() extern inline
  2018-08-24 23:08   ` Ben Hutchings
@ 2018-08-27 21:06     ` Nick Desaulniers
  0 siblings, 0 replies; 3+ messages in thread
From: Nick Desaulniers @ 2018-08-27 21:06 UTC (permalink / raw)
  To: ben.hutchings
  Cc: stable, Arnd Bergmann, hpa, tstellar, sedat.dilek, jgross,
	Linus Torvalds, Peter Zijlstra, Thomas Gleixner, acme, akataria,
	Andrew Morton, andrea.parri, Ard Biesheuvel, Andrey Ryabinin,
	Alistair Strachan, boris.ostrovsky, brijesh.singh, Cao jin,
	Geert Uytterhoeven, Greg Hackmann, J. Kiszka, jarkko.sakkinen,
	joe, Josh Poimboeuf, Kees Cook, Kirill A . Shutemov, Kate Stewart,
	linux-efi, Linux Kbuild mailing list, Manoj Gupta, mawilcox,
	Michal Marek, mjg59, Matthias Kaehlcke, Philippe Ombredanne,
	David Rientjes, rostedt, thomas.lendacky, Thiebaud Weksteen,
	virtualization, Will Deacon, Masahiro Yamada, Ingo Molnar,
	Greg KH, LKML

On Fri, Aug 24, 2018 at 4:08 PM Ben Hutchings
<ben.hutchings@codethink.co.uk> wrote:
>
> On Mon, 2018-07-23 at 14:41 +0200, Greg Kroah-Hartman wrote:
> > 4.4-stable review patch.  If anyone has any objections, please let me know.
> >
> > ------------------
> >
> > From: Nick Desaulniers <ndesaulniers@google.com>
> >
> > 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.
> [...]
>
> Shouldn't native_restore_fl() be changed similarly?  You added an out-
> of-line definition, but it doesn't seem like it will actually be used.
>

Good catch, will send a patch with your reported by. Thank you for the report.
-- 
Thanks,
~Nick Desaulniers

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2018-08-28  0:54 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <20180723122413.003644357@linuxfoundation.org>
2018-07-23 12:41 ` [PATCH 4.4 018/107] x86/paravirt: Make native_save_fl() extern inline Greg Kroah-Hartman
2018-08-24 23:08   ` Ben Hutchings
2018-08-27 21:06     ` Nick Desaulniers

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox