* [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