• Nick Desaulniers's avatar
    x86/paravirt: Make native_save_fl() extern inline · f868639b
    Nick Desaulniers authored
    commit d0a8d937 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 784d5699 "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: default avatarAlistair Strachan <astrachan@google.com>
    Debugged-by: default avatarMatthias Kaehlcke <mka@chromium.org>
    Suggested-by: default avatarArnd Bergmann <arnd@arndb.de>
    Suggested-by: default avatarH. Peter Anvin <hpa@zytor.com>
    Suggested-by: default avatarTom Stellar <tstellar@redhat.com>
    Reported-by: default avatarSedat Dilek <sedat.dilek@gmail.com>
    Tested-by: default avatarSedat Dilek <sedat.dilek@gmail.com>
    Signed-off-by: default avatarNick Desaulniers <ndesaulniers@google.com>
    Acked-by: default avatarJuergen 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.comSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    f868639b
irqflags.h 3.83 KB