]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.9-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 15 Jan 2018 09:06:26 +0000 (10:06 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 15 Jan 2018 09:06:26 +0000 (10:06 +0100)
added patches:
objtool-allow-alternatives-to-be-ignored.patch
objtool-detect-jumps-to-retpoline-thunks.patch
objtool-modules-discard-objtool-annotation-sections-for-modules.patch
selftests-x86-add-test_vsyscall.patch
sysfs-cpu-fix-typos-in-vulnerability-documentation.patch
x86-alternatives-add-missing-n-at-end-of-alternative-inline-asm.patch
x86-alternatives-fix-optimize_nops-checking.patch
x86-asm-use-register-variable-to-get-stack-pointer-value.patch
x86-cpu-amd-make-lfence-a-serializing-instruction.patch
x86-cpu-amd-use-lfence_rdtsc-in-preference-to-mfence_rdtsc.patch
x86-cpu-factor-out-application-of-forced-cpu-caps.patch
x86-cpu-implement-cpu-vulnerabilites-sysfs-functions.patch
x86-cpu-merge-bugs.c-and-bugs_64.c.patch
x86-cpufeatures-add-x86_bug_cpu_insecure.patch
x86-cpufeatures-add-x86_bug_spectre_v.patch
x86-cpufeatures-make-cpu-bugs-sticky.patch
x86-mm-32-move-setup_clear_cpu_cap-x86_feature_pcid-earlier.patch
x86-pti-rename-bug_cpu_insecure-to-bug_cpu_meltdown.patch
x86-retpoline-add-initial-retpoline-support.patch
x86-retpoline-checksum32-convert-assembler-indirect-jumps.patch
x86-retpoline-crypto-convert-crypto-assembler-indirect-jumps.patch
x86-retpoline-entry-convert-entry-assembler-indirect-jumps.patch
x86-retpoline-fill-return-stack-buffer-on-vmexit.patch
x86-retpoline-ftrace-convert-ftrace-assembler-indirect-jumps.patch
x86-retpoline-hyperv-convert-assembler-indirect-jumps.patch
x86-retpoline-irq32-convert-assembler-indirect-jumps.patch
x86-retpoline-remove-compile-time-warning.patch
x86-retpoline-xen-convert-xen-hypercall-indirect-jumps.patch
x86-spectre-add-boot-time-option-to-select-spectre-v2-mitigation.patch

30 files changed:
queue-4.9/objtool-allow-alternatives-to-be-ignored.patch [new file with mode: 0644]
queue-4.9/objtool-detect-jumps-to-retpoline-thunks.patch [new file with mode: 0644]
queue-4.9/objtool-modules-discard-objtool-annotation-sections-for-modules.patch [new file with mode: 0644]
queue-4.9/selftests-x86-add-test_vsyscall.patch [new file with mode: 0644]
queue-4.9/series
queue-4.9/sysfs-cpu-fix-typos-in-vulnerability-documentation.patch [new file with mode: 0644]
queue-4.9/x86-alternatives-add-missing-n-at-end-of-alternative-inline-asm.patch [new file with mode: 0644]
queue-4.9/x86-alternatives-fix-optimize_nops-checking.patch [new file with mode: 0644]
queue-4.9/x86-asm-use-register-variable-to-get-stack-pointer-value.patch [new file with mode: 0644]
queue-4.9/x86-cpu-amd-make-lfence-a-serializing-instruction.patch [new file with mode: 0644]
queue-4.9/x86-cpu-amd-use-lfence_rdtsc-in-preference-to-mfence_rdtsc.patch [new file with mode: 0644]
queue-4.9/x86-cpu-factor-out-application-of-forced-cpu-caps.patch [new file with mode: 0644]
queue-4.9/x86-cpu-implement-cpu-vulnerabilites-sysfs-functions.patch [new file with mode: 0644]
queue-4.9/x86-cpu-merge-bugs.c-and-bugs_64.c.patch [new file with mode: 0644]
queue-4.9/x86-cpufeatures-add-x86_bug_cpu_insecure.patch [new file with mode: 0644]
queue-4.9/x86-cpufeatures-add-x86_bug_spectre_v.patch [new file with mode: 0644]
queue-4.9/x86-cpufeatures-make-cpu-bugs-sticky.patch [new file with mode: 0644]
queue-4.9/x86-mm-32-move-setup_clear_cpu_cap-x86_feature_pcid-earlier.patch [new file with mode: 0644]
queue-4.9/x86-pti-rename-bug_cpu_insecure-to-bug_cpu_meltdown.patch [new file with mode: 0644]
queue-4.9/x86-retpoline-add-initial-retpoline-support.patch [new file with mode: 0644]
queue-4.9/x86-retpoline-checksum32-convert-assembler-indirect-jumps.patch [new file with mode: 0644]
queue-4.9/x86-retpoline-crypto-convert-crypto-assembler-indirect-jumps.patch [new file with mode: 0644]
queue-4.9/x86-retpoline-entry-convert-entry-assembler-indirect-jumps.patch [new file with mode: 0644]
queue-4.9/x86-retpoline-fill-return-stack-buffer-on-vmexit.patch [new file with mode: 0644]
queue-4.9/x86-retpoline-ftrace-convert-ftrace-assembler-indirect-jumps.patch [new file with mode: 0644]
queue-4.9/x86-retpoline-hyperv-convert-assembler-indirect-jumps.patch [new file with mode: 0644]
queue-4.9/x86-retpoline-irq32-convert-assembler-indirect-jumps.patch [new file with mode: 0644]
queue-4.9/x86-retpoline-remove-compile-time-warning.patch [new file with mode: 0644]
queue-4.9/x86-retpoline-xen-convert-xen-hypercall-indirect-jumps.patch [new file with mode: 0644]
queue-4.9/x86-spectre-add-boot-time-option-to-select-spectre-v2-mitigation.patch [new file with mode: 0644]

diff --git a/queue-4.9/objtool-allow-alternatives-to-be-ignored.patch b/queue-4.9/objtool-allow-alternatives-to-be-ignored.patch
new file mode 100644 (file)
index 0000000..db02f25
--- /dev/null
@@ -0,0 +1,163 @@
+From 258c76059cece01bebae098e81bacb1af2edad17 Mon Sep 17 00:00:00 2001
+From: Josh Poimboeuf <jpoimboe@redhat.com>
+Date: Thu, 11 Jan 2018 21:46:24 +0000
+Subject: objtool: Allow alternatives to be ignored
+
+From: Josh Poimboeuf <jpoimboe@redhat.com>
+
+commit 258c76059cece01bebae098e81bacb1af2edad17 upstream.
+
+Getting objtool to understand retpolines is going to be a bit of a
+challenge.  For now, take advantage of the fact that retpolines are
+patched in with alternatives.  Just read the original (sane)
+non-alternative instruction, and ignore the patched-in retpoline.
+
+This allows objtool to understand the control flow *around* the
+retpoline, even if it can't yet follow what's inside.  This means the
+ORC unwinder will fail to unwind from inside a retpoline, but will work
+fine otherwise.
+
+Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
+Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Cc: gnomes@lxorguk.ukuu.org.uk
+Cc: Rik van Riel <riel@redhat.com>
+Cc: Andi Kleen <ak@linux.intel.com>
+Cc: thomas.lendacky@amd.com
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Jiri Kosina <jikos@kernel.org>
+Cc: Andy Lutomirski <luto@amacapital.net>
+Cc: Dave Hansen <dave.hansen@intel.com>
+Cc: Kees Cook <keescook@google.com>
+Cc: Tim Chen <tim.c.chen@linux.intel.com>
+Cc: Greg Kroah-Hartman <gregkh@linux-foundation.org>
+Cc: Paul Turner <pjt@google.com>
+Link: https://lkml.kernel.org/r/1515707194-20531-3-git-send-email-dwmw@amazon.co.uk
+[dwmw2: Applies to tools/objtool/builtin-check.c not check.[ch]]
+Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ tools/objtool/builtin-check.c |   64 +++++++++++++++++++++++++++++++++++++-----
+ 1 file changed, 57 insertions(+), 7 deletions(-)
+
+--- a/tools/objtool/builtin-check.c
++++ b/tools/objtool/builtin-check.c
+@@ -51,7 +51,7 @@ struct instruction {
+       unsigned int len, state;
+       unsigned char type;
+       unsigned long immediate;
+-      bool alt_group, visited;
++      bool alt_group, visited, ignore_alts;
+       struct symbol *call_dest;
+       struct instruction *jump_dest;
+       struct list_head alts;
+@@ -353,6 +353,40 @@ static void add_ignores(struct objtool_f
+ }
+ /*
++ * FIXME: For now, just ignore any alternatives which add retpolines.  This is
++ * a temporary hack, as it doesn't allow ORC to unwind from inside a retpoline.
++ * But it at least allows objtool to understand the control flow *around* the
++ * retpoline.
++ */
++static int add_nospec_ignores(struct objtool_file *file)
++{
++      struct section *sec;
++      struct rela *rela;
++      struct instruction *insn;
++
++      sec = find_section_by_name(file->elf, ".rela.discard.nospec");
++      if (!sec)
++              return 0;
++
++      list_for_each_entry(rela, &sec->rela_list, list) {
++              if (rela->sym->type != STT_SECTION) {
++                      WARN("unexpected relocation symbol type in %s", sec->name);
++                      return -1;
++              }
++
++              insn = find_insn(file, rela->sym->sec, rela->addend);
++              if (!insn) {
++                      WARN("bad .discard.nospec entry");
++                      return -1;
++              }
++
++              insn->ignore_alts = true;
++      }
++
++      return 0;
++}
++
++/*
+  * Find the destination instructions for all jumps.
+  */
+ static int add_jump_destinations(struct objtool_file *file)
+@@ -435,11 +469,18 @@ static int add_call_destinations(struct
+                       dest_off = insn->offset + insn->len + insn->immediate;
+                       insn->call_dest = find_symbol_by_offset(insn->sec,
+                                                               dest_off);
++                      /*
++                       * FIXME: Thanks to retpolines, it's now considered
++                       * normal for a function to call within itself.  So
++                       * disable this warning for now.
++                       */
++#if 0
+                       if (!insn->call_dest) {
+                               WARN_FUNC("can't find call dest symbol at offset 0x%lx",
+                                         insn->sec, insn->offset, dest_off);
+                               return -1;
+                       }
++#endif
+               } else if (rela->sym->type == STT_SECTION) {
+                       insn->call_dest = find_symbol_by_offset(rela->sym->sec,
+                                                               rela->addend+4);
+@@ -601,12 +642,6 @@ static int add_special_section_alts(stru
+               return ret;
+       list_for_each_entry_safe(special_alt, tmp, &special_alts, list) {
+-              alt = malloc(sizeof(*alt));
+-              if (!alt) {
+-                      WARN("malloc failed");
+-                      ret = -1;
+-                      goto out;
+-              }
+               orig_insn = find_insn(file, special_alt->orig_sec,
+                                     special_alt->orig_off);
+@@ -617,6 +652,10 @@ static int add_special_section_alts(stru
+                       goto out;
+               }
++              /* Ignore retpoline alternatives. */
++              if (orig_insn->ignore_alts)
++                      continue;
++
+               new_insn = NULL;
+               if (!special_alt->group || special_alt->new_len) {
+                       new_insn = find_insn(file, special_alt->new_sec,
+@@ -642,6 +681,13 @@ static int add_special_section_alts(stru
+                               goto out;
+               }
++              alt = malloc(sizeof(*alt));
++              if (!alt) {
++                      WARN("malloc failed");
++                      ret = -1;
++                      goto out;
++              }
++
+               alt->insn = new_insn;
+               list_add_tail(&alt->list, &orig_insn->alts);
+@@ -861,6 +907,10 @@ static int decode_sections(struct objtoo
+       add_ignores(file);
++      ret = add_nospec_ignores(file);
++      if (ret)
++              return ret;
++
+       ret = add_jump_destinations(file);
+       if (ret)
+               return ret;
diff --git a/queue-4.9/objtool-detect-jumps-to-retpoline-thunks.patch b/queue-4.9/objtool-detect-jumps-to-retpoline-thunks.patch
new file mode 100644 (file)
index 0000000..0079121
--- /dev/null
@@ -0,0 +1,61 @@
+From 39b735332cb8b33a27c28592d969e4016c86c3ea Mon Sep 17 00:00:00 2001
+From: Josh Poimboeuf <jpoimboe@redhat.com>
+Date: Thu, 11 Jan 2018 21:46:23 +0000
+Subject: objtool: Detect jumps to retpoline thunks
+
+From: Josh Poimboeuf <jpoimboe@redhat.com>
+
+commit 39b735332cb8b33a27c28592d969e4016c86c3ea upstream.
+
+A direct jump to a retpoline thunk is really an indirect jump in
+disguise.  Change the objtool instruction type accordingly.
+
+Objtool needs to know where indirect branches are so it can detect
+switch statement jump tables.
+
+This fixes a bunch of warnings with CONFIG_RETPOLINE like:
+
+  arch/x86/events/intel/uncore_nhmex.o: warning: objtool: nhmex_rbox_msr_enable_event()+0x44: sibling call from callable instruction with modified stack frame
+  kernel/signal.o: warning: objtool: copy_siginfo_to_user()+0x91: sibling call from callable instruction with modified stack frame
+  ...
+
+Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
+Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Cc: gnomes@lxorguk.ukuu.org.uk
+Cc: Rik van Riel <riel@redhat.com>
+Cc: Andi Kleen <ak@linux.intel.com>
+Cc: thomas.lendacky@amd.com
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Jiri Kosina <jikos@kernel.org>
+Cc: Andy Lutomirski <luto@amacapital.net>
+Cc: Dave Hansen <dave.hansen@intel.com>
+Cc: Kees Cook <keescook@google.com>
+Cc: Tim Chen <tim.c.chen@linux.intel.com>
+Cc: Greg Kroah-Hartman <gregkh@linux-foundation.org>
+Cc: Paul Turner <pjt@google.com>
+Link: https://lkml.kernel.org/r/1515707194-20531-2-git-send-email-dwmw@amazon.co.uk
+[dwmw2: Applies to tools/objtool/builtin-check.c not check.c]
+Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ tools/objtool/builtin-check.c |    7 +++++++
+ 1 file changed, 7 insertions(+)
+
+--- a/tools/objtool/builtin-check.c
++++ b/tools/objtool/builtin-check.c
+@@ -382,6 +382,13 @@ static int add_jump_destinations(struct
+               } else if (rela->sym->sec->idx) {
+                       dest_sec = rela->sym->sec;
+                       dest_off = rela->sym->sym.st_value + rela->addend + 4;
++              } else if (strstr(rela->sym->name, "_indirect_thunk_")) {
++                      /*
++                       * Retpoline jumps are really dynamic jumps in
++                       * disguise, so convert them accordingly.
++                       */
++                      insn->type = INSN_JUMP_DYNAMIC;
++                      continue;
+               } else {
+                       /* sibling call */
+                       insn->jump_dest = 0;
diff --git a/queue-4.9/objtool-modules-discard-objtool-annotation-sections-for-modules.patch b/queue-4.9/objtool-modules-discard-objtool-annotation-sections-for-modules.patch
new file mode 100644 (file)
index 0000000..ceb2b5f
--- /dev/null
@@ -0,0 +1,84 @@
+From e390f9a9689a42f477a6073e2e7df530a4c1b740 Mon Sep 17 00:00:00 2001
+From: Josh Poimboeuf <jpoimboe@redhat.com>
+Date: Wed, 1 Mar 2017 12:04:44 -0600
+Subject: objtool, modules: Discard objtool annotation sections for modules
+
+From: Josh Poimboeuf <jpoimboe@redhat.com>
+
+commit e390f9a9689a42f477a6073e2e7df530a4c1b740 upstream.
+
+The '__unreachable' and '__func_stack_frame_non_standard' sections are
+only used at compile time.  They're discarded for vmlinux but they
+should also be discarded for modules.
+
+Since this is a recurring pattern, prefix the section names with
+".discard.".  It's a nice convention and vmlinux.lds.h already discards
+such sections.
+
+Also remove the 'a' (allocatable) flag from the __unreachable section
+since it doesn't make sense for a discarded section.
+
+Suggested-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
+Cc: Jessica Yu <jeyu@redhat.com>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Thomas Gleixner <tglx@linutronix.de>
+Fixes: d1091c7fa3d5 ("objtool: Improve detection of BUG() and other dead ends")
+Link: http://lkml.kernel.org/r/20170301180444.lhd53c5tibc4ns77@treble
+Signed-off-by: Ingo Molnar <mingo@kernel.org>
+[dwmw2: Remove the unreachable part in backporting since it's not here yet]
+Signed-off-by: David Woodhouse <dwmw@amazon.co.ku>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ include/linux/frame.h         |    2 +-
+ scripts/mod/modpost.c         |    1 +
+ scripts/module-common.lds     |    5 ++++-
+ tools/objtool/builtin-check.c |    2 +-
+ 4 files changed, 7 insertions(+), 3 deletions(-)
+
+--- a/include/linux/frame.h
++++ b/include/linux/frame.h
+@@ -11,7 +11,7 @@
+  * For more information, see tools/objtool/Documentation/stack-validation.txt.
+  */
+ #define STACK_FRAME_NON_STANDARD(func) \
+-      static void __used __section(__func_stack_frame_non_standard) \
++      static void __used __section(.discard.func_stack_frame_non_standard) \
+               *__func_stack_frame_non_standard_##func = func
+ #else /* !CONFIG_STACK_VALIDATION */
+--- a/scripts/mod/modpost.c
++++ b/scripts/mod/modpost.c
+@@ -838,6 +838,7 @@ static const char *const section_white_l
+       ".cmem*",                       /* EZchip */
+       ".fmt_slot*",                   /* EZchip */
+       ".gnu.lto*",
++      ".discard.*",
+       NULL
+ };
+--- a/scripts/module-common.lds
++++ b/scripts/module-common.lds
+@@ -4,7 +4,10 @@
+  * combine them automatically.
+  */
+ SECTIONS {
+-      /DISCARD/ : { *(.discard) }
++      /DISCARD/ : {
++              *(.discard)
++              *(.discard.*)
++      }
+       __ksymtab               0 : { *(SORT(___ksymtab+*)) }
+       __ksymtab_gpl           0 : { *(SORT(___ksymtab_gpl+*)) }
+--- a/tools/objtool/builtin-check.c
++++ b/tools/objtool/builtin-check.c
+@@ -1229,7 +1229,7 @@ int cmd_check(int argc, const char **arg
+       INIT_LIST_HEAD(&file.insn_list);
+       hash_init(file.insn_hash);
+-      file.whitelist = find_section_by_name(file.elf, "__func_stack_frame_non_standard");
++      file.whitelist = find_section_by_name(file.elf, ".discard.func_stack_frame_non_standard");
+       file.rodata = find_section_by_name(file.elf, ".rodata");
+       file.ignore_unreachables = false;
+       file.c_file = find_section_by_name(file.elf, ".comment");
diff --git a/queue-4.9/selftests-x86-add-test_vsyscall.patch b/queue-4.9/selftests-x86-add-test_vsyscall.patch
new file mode 100644 (file)
index 0000000..abda650
--- /dev/null
@@ -0,0 +1,556 @@
+From 352909b49ba0d74929b96af6dfbefc854ab6ebb5 Mon Sep 17 00:00:00 2001
+From: Andy Lutomirski <luto@kernel.org>
+Date: Thu, 11 Jan 2018 17:16:51 -0800
+Subject: selftests/x86: Add test_vsyscall
+
+From: Andy Lutomirski <luto@kernel.org>
+
+commit 352909b49ba0d74929b96af6dfbefc854ab6ebb5 upstream.
+
+This tests that the vsyscall entries do what they're expected to do.
+It also confirms that attempts to read the vsyscall page behave as
+expected.
+
+If changes are made to the vsyscall code or its memory map handling,
+running this test in all three of vsyscall=none, vsyscall=emulate,
+and vsyscall=native are helpful.
+
+(Because it's easy, this also compares the vsyscall results to their
+ vDSO equivalents.)
+
+Note to KAISER backporters: please test this under all three
+vsyscall modes.  Also, in the emulate and native modes, make sure
+that test_vsyscall_64 agrees with the command line or config
+option as to which mode you're in.  It's quite easy to mess up
+the kernel such that native mode accidentally emulates
+or vice versa.
+
+Greg, etc: please backport this to all your Meltdown-patched
+kernels.  It'll help make sure the patches didn't regress
+vsyscalls.
+
+CSigned-off-by: Andy Lutomirski <luto@kernel.org>
+Cc: Andy Lutomirski <luto@kernel.org>
+Cc: Borislav Petkov <bp@alien8.de>
+Cc: Dave Hansen <dave.hansen@linux.intel.com>
+Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Cc: H. Peter Anvin <hpa@zytor.com>
+Cc: Hugh Dickins <hughd@google.com>
+Cc: Josh Poimboeuf <jpoimboe@redhat.com>
+Cc: Juergen Gross <jgross@suse.com>
+Cc: Kees Cook <keescook@chromium.org>
+Cc: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Thomas Gleixner <tglx@linutronix.de>
+Cc: stable@vger.kernel.org
+Link: http://lkml.kernel.org/r/2b9c5a174c1d60fd7774461d518aa75598b1d8fd.1515719552.git.luto@kernel.org
+Signed-off-by: Ingo Molnar <mingo@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ tools/testing/selftests/x86/test_vsyscall.c |  500 ++++++++++++++++++++++++++++
+ 1 file changed, 500 insertions(+)
+
+--- /dev/null
++++ b/tools/testing/selftests/x86/test_vsyscall.c
+@@ -0,0 +1,500 @@
++/* SPDX-License-Identifier: GPL-2.0 */
++
++#define _GNU_SOURCE
++
++#include <stdio.h>
++#include <sys/time.h>
++#include <time.h>
++#include <stdlib.h>
++#include <sys/syscall.h>
++#include <unistd.h>
++#include <dlfcn.h>
++#include <string.h>
++#include <inttypes.h>
++#include <signal.h>
++#include <sys/ucontext.h>
++#include <errno.h>
++#include <err.h>
++#include <sched.h>
++#include <stdbool.h>
++#include <setjmp.h>
++
++#ifdef __x86_64__
++# define VSYS(x) (x)
++#else
++# define VSYS(x) 0
++#endif
++
++#ifndef SYS_getcpu
++# ifdef __x86_64__
++#  define SYS_getcpu 309
++# else
++#  define SYS_getcpu 318
++# endif
++#endif
++
++static void sethandler(int sig, void (*handler)(int, siginfo_t *, void *),
++                     int flags)
++{
++      struct sigaction sa;
++      memset(&sa, 0, sizeof(sa));
++      sa.sa_sigaction = handler;
++      sa.sa_flags = SA_SIGINFO | flags;
++      sigemptyset(&sa.sa_mask);
++      if (sigaction(sig, &sa, 0))
++              err(1, "sigaction");
++}
++
++/* vsyscalls and vDSO */
++bool should_read_vsyscall = false;
++
++typedef long (*gtod_t)(struct timeval *tv, struct timezone *tz);
++gtod_t vgtod = (gtod_t)VSYS(0xffffffffff600000);
++gtod_t vdso_gtod;
++
++typedef int (*vgettime_t)(clockid_t, struct timespec *);
++vgettime_t vdso_gettime;
++
++typedef long (*time_func_t)(time_t *t);
++time_func_t vtime = (time_func_t)VSYS(0xffffffffff600400);
++time_func_t vdso_time;
++
++typedef long (*getcpu_t)(unsigned *, unsigned *, void *);
++getcpu_t vgetcpu = (getcpu_t)VSYS(0xffffffffff600800);
++getcpu_t vdso_getcpu;
++
++static void init_vdso(void)
++{
++      void *vdso = dlopen("linux-vdso.so.1", RTLD_LAZY | RTLD_LOCAL | RTLD_NOLOAD);
++      if (!vdso)
++              vdso = dlopen("linux-gate.so.1", RTLD_LAZY | RTLD_LOCAL | RTLD_NOLOAD);
++      if (!vdso) {
++              printf("[WARN]\tfailed to find vDSO\n");
++              return;
++      }
++
++      vdso_gtod = (gtod_t)dlsym(vdso, "__vdso_gettimeofday");
++      if (!vdso_gtod)
++              printf("[WARN]\tfailed to find gettimeofday in vDSO\n");
++
++      vdso_gettime = (vgettime_t)dlsym(vdso, "__vdso_clock_gettime");
++      if (!vdso_gettime)
++              printf("[WARN]\tfailed to find clock_gettime in vDSO\n");
++
++      vdso_time = (time_func_t)dlsym(vdso, "__vdso_time");
++      if (!vdso_time)
++              printf("[WARN]\tfailed to find time in vDSO\n");
++
++      vdso_getcpu = (getcpu_t)dlsym(vdso, "__vdso_getcpu");
++      if (!vdso_getcpu) {
++              /* getcpu() was never wired up in the 32-bit vDSO. */
++              printf("[%s]\tfailed to find getcpu in vDSO\n",
++                     sizeof(long) == 8 ? "WARN" : "NOTE");
++      }
++}
++
++static int init_vsys(void)
++{
++#ifdef __x86_64__
++      int nerrs = 0;
++      FILE *maps;
++      char line[128];
++      bool found = false;
++
++      maps = fopen("/proc/self/maps", "r");
++      if (!maps) {
++              printf("[WARN]\tCould not open /proc/self/maps -- assuming vsyscall is r-x\n");
++              should_read_vsyscall = true;
++              return 0;
++      }
++
++      while (fgets(line, sizeof(line), maps)) {
++              char r, x;
++              void *start, *end;
++              char name[128];
++              if (sscanf(line, "%p-%p %c-%cp %*x %*x:%*x %*u %s",
++                         &start, &end, &r, &x, name) != 5)
++                      continue;
++
++              if (strcmp(name, "[vsyscall]"))
++                      continue;
++
++              printf("\tvsyscall map: %s", line);
++
++              if (start != (void *)0xffffffffff600000 ||
++                  end != (void *)0xffffffffff601000) {
++                      printf("[FAIL]\taddress range is nonsense\n");
++                      nerrs++;
++              }
++
++              printf("\tvsyscall permissions are %c-%c\n", r, x);
++              should_read_vsyscall = (r == 'r');
++              if (x != 'x') {
++                      vgtod = NULL;
++                      vtime = NULL;
++                      vgetcpu = NULL;
++              }
++
++              found = true;
++              break;
++      }
++
++      fclose(maps);
++
++      if (!found) {
++              printf("\tno vsyscall map in /proc/self/maps\n");
++              should_read_vsyscall = false;
++              vgtod = NULL;
++              vtime = NULL;
++              vgetcpu = NULL;
++      }
++
++      return nerrs;
++#else
++      return 0;
++#endif
++}
++
++/* syscalls */
++static inline long sys_gtod(struct timeval *tv, struct timezone *tz)
++{
++      return syscall(SYS_gettimeofday, tv, tz);
++}
++
++static inline int sys_clock_gettime(clockid_t id, struct timespec *ts)
++{
++      return syscall(SYS_clock_gettime, id, ts);
++}
++
++static inline long sys_time(time_t *t)
++{
++      return syscall(SYS_time, t);
++}
++
++static inline long sys_getcpu(unsigned * cpu, unsigned * node,
++                            void* cache)
++{
++      return syscall(SYS_getcpu, cpu, node, cache);
++}
++
++static jmp_buf jmpbuf;
++
++static void sigsegv(int sig, siginfo_t *info, void *ctx_void)
++{
++      siglongjmp(jmpbuf, 1);
++}
++
++static double tv_diff(const struct timeval *a, const struct timeval *b)
++{
++      return (double)(a->tv_sec - b->tv_sec) +
++              (double)((int)a->tv_usec - (int)b->tv_usec) * 1e-6;
++}
++
++static int check_gtod(const struct timeval *tv_sys1,
++                    const struct timeval *tv_sys2,
++                    const struct timezone *tz_sys,
++                    const char *which,
++                    const struct timeval *tv_other,
++                    const struct timezone *tz_other)
++{
++      int nerrs = 0;
++      double d1, d2;
++
++      if (tz_other && (tz_sys->tz_minuteswest != tz_other->tz_minuteswest || tz_sys->tz_dsttime != tz_other->tz_dsttime)) {
++              printf("[FAIL] %s tz mismatch\n", which);
++              nerrs++;
++      }
++
++      d1 = tv_diff(tv_other, tv_sys1);
++      d2 = tv_diff(tv_sys2, tv_other);
++      printf("\t%s time offsets: %lf %lf\n", which, d1, d2);
++
++      if (d1 < 0 || d2 < 0) {
++              printf("[FAIL]\t%s time was inconsistent with the syscall\n", which);
++              nerrs++;
++      } else {
++              printf("[OK]\t%s gettimeofday()'s timeval was okay\n", which);
++      }
++
++      return nerrs;
++}
++
++static int test_gtod(void)
++{
++      struct timeval tv_sys1, tv_sys2, tv_vdso, tv_vsys;
++      struct timezone tz_sys, tz_vdso, tz_vsys;
++      long ret_vdso = -1;
++      long ret_vsys = -1;
++      int nerrs = 0;
++
++      printf("[RUN]\ttest gettimeofday()\n");
++
++      if (sys_gtod(&tv_sys1, &tz_sys) != 0)
++              err(1, "syscall gettimeofday");
++      if (vdso_gtod)
++              ret_vdso = vdso_gtod(&tv_vdso, &tz_vdso);
++      if (vgtod)
++              ret_vsys = vgtod(&tv_vsys, &tz_vsys);
++      if (sys_gtod(&tv_sys2, &tz_sys) != 0)
++              err(1, "syscall gettimeofday");
++
++      if (vdso_gtod) {
++              if (ret_vdso == 0) {
++                      nerrs += check_gtod(&tv_sys1, &tv_sys2, &tz_sys, "vDSO", &tv_vdso, &tz_vdso);
++              } else {
++                      printf("[FAIL]\tvDSO gettimeofday() failed: %ld\n", ret_vdso);
++                      nerrs++;
++              }
++      }
++
++      if (vgtod) {
++              if (ret_vsys == 0) {
++                      nerrs += check_gtod(&tv_sys1, &tv_sys2, &tz_sys, "vsyscall", &tv_vsys, &tz_vsys);
++              } else {
++                      printf("[FAIL]\tvsys gettimeofday() failed: %ld\n", ret_vsys);
++                      nerrs++;
++              }
++      }
++
++      return nerrs;
++}
++
++static int test_time(void) {
++      int nerrs = 0;
++
++      printf("[RUN]\ttest time()\n");
++      long t_sys1, t_sys2, t_vdso = 0, t_vsys = 0;
++      long t2_sys1 = -1, t2_sys2 = -1, t2_vdso = -1, t2_vsys = -1;
++      t_sys1 = sys_time(&t2_sys1);
++      if (vdso_time)
++              t_vdso = vdso_time(&t2_vdso);
++      if (vtime)
++              t_vsys = vtime(&t2_vsys);
++      t_sys2 = sys_time(&t2_sys2);
++      if (t_sys1 < 0 || t_sys1 != t2_sys1 || t_sys2 < 0 || t_sys2 != t2_sys2) {
++              printf("[FAIL]\tsyscall failed (ret1:%ld output1:%ld ret2:%ld output2:%ld)\n", t_sys1, t2_sys1, t_sys2, t2_sys2);
++              nerrs++;
++              return nerrs;
++      }
++
++      if (vdso_time) {
++              if (t_vdso < 0 || t_vdso != t2_vdso) {
++                      printf("[FAIL]\tvDSO failed (ret:%ld output:%ld)\n", t_vdso, t2_vdso);
++                      nerrs++;
++              } else if (t_vdso < t_sys1 || t_vdso > t_sys2) {
++                      printf("[FAIL]\tvDSO returned the wrong time (%ld %ld %ld)\n", t_sys1, t_vdso, t_sys2);
++                      nerrs++;
++              } else {
++                      printf("[OK]\tvDSO time() is okay\n");
++              }
++      }
++
++      if (vtime) {
++              if (t_vsys < 0 || t_vsys != t2_vsys) {
++                      printf("[FAIL]\tvsyscall failed (ret:%ld output:%ld)\n", t_vsys, t2_vsys);
++                      nerrs++;
++              } else if (t_vsys < t_sys1 || t_vsys > t_sys2) {
++                      printf("[FAIL]\tvsyscall returned the wrong time (%ld %ld %ld)\n", t_sys1, t_vsys, t_sys2);
++                      nerrs++;
++              } else {
++                      printf("[OK]\tvsyscall time() is okay\n");
++              }
++      }
++
++      return nerrs;
++}
++
++static int test_getcpu(int cpu)
++{
++      int nerrs = 0;
++      long ret_sys, ret_vdso = -1, ret_vsys = -1;
++
++      printf("[RUN]\tgetcpu() on CPU %d\n", cpu);
++
++      cpu_set_t cpuset;
++      CPU_ZERO(&cpuset);
++      CPU_SET(cpu, &cpuset);
++      if (sched_setaffinity(0, sizeof(cpuset), &cpuset) != 0) {
++              printf("[SKIP]\tfailed to force CPU %d\n", cpu);
++              return nerrs;
++      }
++
++      unsigned cpu_sys, cpu_vdso, cpu_vsys, node_sys, node_vdso, node_vsys;
++      unsigned node = 0;
++      bool have_node = false;
++      ret_sys = sys_getcpu(&cpu_sys, &node_sys, 0);
++      if (vdso_getcpu)
++              ret_vdso = vdso_getcpu(&cpu_vdso, &node_vdso, 0);
++      if (vgetcpu)
++              ret_vsys = vgetcpu(&cpu_vsys, &node_vsys, 0);
++
++      if (ret_sys == 0) {
++              if (cpu_sys != cpu) {
++                      printf("[FAIL]\tsyscall reported CPU %hu but should be %d\n", cpu_sys, cpu);
++                      nerrs++;
++              }
++
++              have_node = true;
++              node = node_sys;
++      }
++
++      if (vdso_getcpu) {
++              if (ret_vdso) {
++                      printf("[FAIL]\tvDSO getcpu() failed\n");
++                      nerrs++;
++              } else {
++                      if (!have_node) {
++                              have_node = true;
++                              node = node_vdso;
++                      }
++
++                      if (cpu_vdso != cpu) {
++                              printf("[FAIL]\tvDSO reported CPU %hu but should be %d\n", cpu_vdso, cpu);
++                              nerrs++;
++                      } else {
++                              printf("[OK]\tvDSO reported correct CPU\n");
++                      }
++
++                      if (node_vdso != node) {
++                              printf("[FAIL]\tvDSO reported node %hu but should be %hu\n", node_vdso, node);
++                              nerrs++;
++                      } else {
++                              printf("[OK]\tvDSO reported correct node\n");
++                      }
++              }
++      }
++
++      if (vgetcpu) {
++              if (ret_vsys) {
++                      printf("[FAIL]\tvsyscall getcpu() failed\n");
++                      nerrs++;
++              } else {
++                      if (!have_node) {
++                              have_node = true;
++                              node = node_vsys;
++                      }
++
++                      if (cpu_vsys != cpu) {
++                              printf("[FAIL]\tvsyscall reported CPU %hu but should be %d\n", cpu_vsys, cpu);
++                              nerrs++;
++                      } else {
++                              printf("[OK]\tvsyscall reported correct CPU\n");
++                      }
++
++                      if (node_vsys != node) {
++                              printf("[FAIL]\tvsyscall reported node %hu but should be %hu\n", node_vsys, node);
++                              nerrs++;
++                      } else {
++                              printf("[OK]\tvsyscall reported correct node\n");
++                      }
++              }
++      }
++
++      return nerrs;
++}
++
++static int test_vsys_r(void)
++{
++#ifdef __x86_64__
++      printf("[RUN]\tChecking read access to the vsyscall page\n");
++      bool can_read;
++      if (sigsetjmp(jmpbuf, 1) == 0) {
++              *(volatile int *)0xffffffffff600000;
++              can_read = true;
++      } else {
++              can_read = false;
++      }
++
++      if (can_read && !should_read_vsyscall) {
++              printf("[FAIL]\tWe have read access, but we shouldn't\n");
++              return 1;
++      } else if (!can_read && should_read_vsyscall) {
++              printf("[FAIL]\tWe don't have read access, but we should\n");
++              return 1;
++      } else {
++              printf("[OK]\tgot expected result\n");
++      }
++#endif
++
++      return 0;
++}
++
++
++#ifdef __x86_64__
++#define X86_EFLAGS_TF (1UL << 8)
++static volatile sig_atomic_t num_vsyscall_traps;
++
++static unsigned long get_eflags(void)
++{
++      unsigned long eflags;
++      asm volatile ("pushfq\n\tpopq %0" : "=rm" (eflags));
++      return eflags;
++}
++
++static void set_eflags(unsigned long eflags)
++{
++      asm volatile ("pushq %0\n\tpopfq" : : "rm" (eflags) : "flags");
++}
++
++static void sigtrap(int sig, siginfo_t *info, void *ctx_void)
++{
++      ucontext_t *ctx = (ucontext_t *)ctx_void;
++      unsigned long ip = ctx->uc_mcontext.gregs[REG_RIP];
++
++      if (((ip ^ 0xffffffffff600000UL) & ~0xfffUL) == 0)
++              num_vsyscall_traps++;
++}
++
++static int test_native_vsyscall(void)
++{
++      time_t tmp;
++      bool is_native;
++
++      if (!vtime)
++              return 0;
++
++      printf("[RUN]\tchecking for native vsyscall\n");
++      sethandler(SIGTRAP, sigtrap, 0);
++      set_eflags(get_eflags() | X86_EFLAGS_TF);
++      vtime(&tmp);
++      set_eflags(get_eflags() & ~X86_EFLAGS_TF);
++
++      /*
++       * If vsyscalls are emulated, we expect a single trap in the
++       * vsyscall page -- the call instruction will trap with RIP
++       * pointing to the entry point before emulation takes over.
++       * In native mode, we expect two traps, since whatever code
++       * the vsyscall page contains will be more than just a ret
++       * instruction.
++       */
++      is_native = (num_vsyscall_traps > 1);
++
++      printf("\tvsyscalls are %s (%d instructions in vsyscall page)\n",
++             (is_native ? "native" : "emulated"),
++             (int)num_vsyscall_traps);
++
++      return 0;
++}
++#endif
++
++int main(int argc, char **argv)
++{
++      int nerrs = 0;
++
++      init_vdso();
++      nerrs += init_vsys();
++
++      nerrs += test_gtod();
++      nerrs += test_time();
++      nerrs += test_getcpu(0);
++      nerrs += test_getcpu(1);
++
++      sethandler(SIGSEGV, sigsegv, 0);
++      nerrs += test_vsys_r();
++
++#ifdef __x86_64__
++      nerrs += test_native_vsyscall();
++#endif
++
++      return nerrs ? 1 : 0;
++}
index 48e2bde762c6196edbabb619f2b63bdaef6dd7ad..698a5075dc2aa1dbfbe73db22e1f441b5c15eb8f 100644 (file)
@@ -65,3 +65,32 @@ uas-ignore-uas-for-norelsys-ns1068-x-chips.patch
 e1000e-fix-e1000_check_for_copper_link_ich8lan-return-value.patch
 x86-documentation-add-pti-description.patch
 sysfs-cpu-add-vulnerability-folder.patch
+x86-cpu-implement-cpu-vulnerabilites-sysfs-functions.patch
+x86-cpu-factor-out-application-of-forced-cpu-caps.patch
+x86-cpufeatures-make-cpu-bugs-sticky.patch
+x86-cpufeatures-add-x86_bug_cpu_insecure.patch
+x86-pti-rename-bug_cpu_insecure-to-bug_cpu_meltdown.patch
+x86-cpu-merge-bugs.c-and-bugs_64.c.patch
+x86-cpufeatures-add-x86_bug_spectre_v.patch
+x86-cpu-amd-make-lfence-a-serializing-instruction.patch
+x86-cpu-amd-use-lfence_rdtsc-in-preference-to-mfence_rdtsc.patch
+sysfs-cpu-fix-typos-in-vulnerability-documentation.patch
+x86-alternatives-fix-optimize_nops-checking.patch
+x86-alternatives-add-missing-n-at-end-of-alternative-inline-asm.patch
+x86-mm-32-move-setup_clear_cpu_cap-x86_feature_pcid-earlier.patch
+objtool-modules-discard-objtool-annotation-sections-for-modules.patch
+objtool-detect-jumps-to-retpoline-thunks.patch
+objtool-allow-alternatives-to-be-ignored.patch
+x86-asm-use-register-variable-to-get-stack-pointer-value.patch
+x86-retpoline-add-initial-retpoline-support.patch
+x86-spectre-add-boot-time-option-to-select-spectre-v2-mitigation.patch
+x86-retpoline-crypto-convert-crypto-assembler-indirect-jumps.patch
+x86-retpoline-entry-convert-entry-assembler-indirect-jumps.patch
+x86-retpoline-ftrace-convert-ftrace-assembler-indirect-jumps.patch
+x86-retpoline-hyperv-convert-assembler-indirect-jumps.patch
+x86-retpoline-xen-convert-xen-hypercall-indirect-jumps.patch
+x86-retpoline-checksum32-convert-assembler-indirect-jumps.patch
+x86-retpoline-irq32-convert-assembler-indirect-jumps.patch
+x86-retpoline-fill-return-stack-buffer-on-vmexit.patch
+selftests-x86-add-test_vsyscall.patch
+x86-retpoline-remove-compile-time-warning.patch
diff --git a/queue-4.9/sysfs-cpu-fix-typos-in-vulnerability-documentation.patch b/queue-4.9/sysfs-cpu-fix-typos-in-vulnerability-documentation.patch
new file mode 100644 (file)
index 0000000..181d38d
--- /dev/null
@@ -0,0 +1,35 @@
+From 9ecccfaa7cb5249bd31bdceb93fcf5bedb8a24d8 Mon Sep 17 00:00:00 2001
+From: David Woodhouse <dwmw@amazon.co.uk>
+Date: Tue, 9 Jan 2018 15:02:51 +0000
+Subject: sysfs/cpu: Fix typos in vulnerability documentation
+
+From: David Woodhouse <dwmw@amazon.co.uk>
+
+commit 9ecccfaa7cb5249bd31bdceb93fcf5bedb8a24d8 upstream.
+
+Fixes: 87590ce6e ("sysfs/cpu: Add vulnerability folder")
+Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ Documentation/ABI/testing/sysfs-devices-system-cpu |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/Documentation/ABI/testing/sysfs-devices-system-cpu
++++ b/Documentation/ABI/testing/sysfs-devices-system-cpu
+@@ -355,7 +355,7 @@ What:              /sys/devices/system/cpu/vulnerabi
+               /sys/devices/system/cpu/vulnerabilities/meltdown
+               /sys/devices/system/cpu/vulnerabilities/spectre_v1
+               /sys/devices/system/cpu/vulnerabilities/spectre_v2
+-Date:         Januar 2018
++Date:         January 2018
+ Contact:      Linux kernel mailing list <linux-kernel@vger.kernel.org>
+ Description:  Information about CPU vulnerabilities
+@@ -365,4 +365,4 @@ Description:       Information about CPU vulne
+               "Not affected"    CPU is not affected by the vulnerability
+               "Vulnerable"      CPU is affected and no mitigation in effect
+-              "Mitigation: $M"  CPU is affetcted and mitigation $M is in effect
++              "Mitigation: $M"  CPU is affected and mitigation $M is in effect
diff --git a/queue-4.9/x86-alternatives-add-missing-n-at-end-of-alternative-inline-asm.patch b/queue-4.9/x86-alternatives-add-missing-n-at-end-of-alternative-inline-asm.patch
new file mode 100644 (file)
index 0000000..483e564
--- /dev/null
@@ -0,0 +1,56 @@
+From b9e705ef7cfaf22db0daab91ad3cd33b0fa32eb9 Mon Sep 17 00:00:00 2001
+From: David Woodhouse <dwmw@amazon.co.uk>
+Date: Thu, 4 Jan 2018 14:37:05 +0000
+Subject: x86/alternatives: Add missing '\n' at end of ALTERNATIVE inline asm
+
+From: David Woodhouse <dwmw@amazon.co.uk>
+
+commit b9e705ef7cfaf22db0daab91ad3cd33b0fa32eb9 upstream.
+
+Where an ALTERNATIVE is used in the middle of an inline asm block, this
+would otherwise lead to the following instruction being appended directly
+to the trailing ".popsection", and a failed compile.
+
+Fixes: 9cebed423c84 ("x86, alternative: Use .pushsection/.popsection")
+Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Cc: gnomes@lxorguk.ukuu.org.uk
+Cc: Rik van Riel <riel@redhat.com>
+Cc: ak@linux.intel.com
+Cc: Tim Chen <tim.c.chen@linux.intel.com>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Paul Turner <pjt@google.com>
+Cc: Jiri Kosina <jikos@kernel.org>
+Cc: Andy Lutomirski <luto@amacapital.net>
+Cc: Dave Hansen <dave.hansen@intel.com>
+Cc: Kees Cook <keescook@google.com>
+Cc: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Greg Kroah-Hartman <gregkh@linux-foundation.org>
+Cc: stable@vger.kernel.org
+Link: https://lkml.kernel.org/r/20180104143710.8961-8-dwmw@amazon.co.uk
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ arch/x86/include/asm/alternative.h |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/arch/x86/include/asm/alternative.h
++++ b/arch/x86/include/asm/alternative.h
+@@ -139,7 +139,7 @@ static inline int alternatives_text_rese
+       ".popsection\n"                                                 \
+       ".pushsection .altinstr_replacement, \"ax\"\n"                  \
+       ALTINSTR_REPLACEMENT(newinstr, feature, 1)                      \
+-      ".popsection"
++      ".popsection\n"
+ #define ALTERNATIVE_2(oldinstr, newinstr1, feature1, newinstr2, feature2)\
+       OLDINSTR_2(oldinstr, 1, 2)                                      \
+@@ -150,7 +150,7 @@ static inline int alternatives_text_rese
+       ".pushsection .altinstr_replacement, \"ax\"\n"                  \
+       ALTINSTR_REPLACEMENT(newinstr1, feature1, 1)                    \
+       ALTINSTR_REPLACEMENT(newinstr2, feature2, 2)                    \
+-      ".popsection"
++      ".popsection\n"
+ /*
+  * Alternative instructions for different CPU types or capabilities.
diff --git a/queue-4.9/x86-alternatives-fix-optimize_nops-checking.patch b/queue-4.9/x86-alternatives-fix-optimize_nops-checking.patch
new file mode 100644 (file)
index 0000000..3574563
--- /dev/null
@@ -0,0 +1,53 @@
+From 612e8e9350fd19cae6900cf36ea0c6892d1a0dca Mon Sep 17 00:00:00 2001
+From: Borislav Petkov <bp@suse.de>
+Date: Wed, 10 Jan 2018 12:28:16 +0100
+Subject: x86/alternatives: Fix optimize_nops() checking
+
+From: Borislav Petkov <bp@suse.de>
+
+commit 612e8e9350fd19cae6900cf36ea0c6892d1a0dca upstream.
+
+The alternatives code checks only the first byte whether it is a NOP, but
+with NOPs in front of the payload and having actual instructions after it
+breaks the "optimized' test.
+
+Make sure to scan all bytes before deciding to optimize the NOPs in there.
+
+Reported-by: David Woodhouse <dwmw2@infradead.org>
+Signed-off-by: Borislav Petkov <bp@suse.de>
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Cc: Tom Lendacky <thomas.lendacky@amd.com>
+Cc: Andi Kleen <ak@linux.intel.com>
+Cc: Tim Chen <tim.c.chen@linux.intel.com>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Jiri Kosina <jikos@kernel.org>
+Cc: Dave Hansen <dave.hansen@intel.com>
+Cc: Andi Kleen <andi@firstfloor.org>
+Cc: Andrew Lutomirski <luto@kernel.org>
+Cc: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Greg Kroah-Hartman <gregkh@linux-foundation.org>
+Cc: Paul Turner <pjt@google.com>
+Link: https://lkml.kernel.org/r/20180110112815.mgciyf5acwacphkq@pd.tnic
+Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ arch/x86/kernel/alternative.c |    7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+--- a/arch/x86/kernel/alternative.c
++++ b/arch/x86/kernel/alternative.c
+@@ -340,9 +340,12 @@ done:
+ static void __init_or_module optimize_nops(struct alt_instr *a, u8 *instr)
+ {
+       unsigned long flags;
++      int i;
+-      if (instr[0] != 0x90)
+-              return;
++      for (i = 0; i < a->padlen; i++) {
++              if (instr[i] != 0x90)
++                      return;
++      }
+       local_irq_save(flags);
+       add_nops(instr + (a->instrlen - a->padlen), a->padlen);
diff --git a/queue-4.9/x86-asm-use-register-variable-to-get-stack-pointer-value.patch b/queue-4.9/x86-asm-use-register-variable-to-get-stack-pointer-value.patch
new file mode 100644 (file)
index 0000000..d1036be
--- /dev/null
@@ -0,0 +1,138 @@
+From 196bd485ee4f03ce4c690bfcf38138abfcd0a4bc Mon Sep 17 00:00:00 2001
+From: Andrey Ryabinin <aryabinin@virtuozzo.com>
+Date: Fri, 29 Sep 2017 17:15:36 +0300
+Subject: x86/asm: Use register variable to get stack pointer value
+
+From: Andrey Ryabinin <aryabinin@virtuozzo.com>
+
+commit 196bd485ee4f03ce4c690bfcf38138abfcd0a4bc upstream.
+
+Currently we use current_stack_pointer() function to get the value
+of the stack pointer register. Since commit:
+
+  f5caf621ee35 ("x86/asm: Fix inline asm call constraints for Clang")
+
+... we have a stack register variable declared. It can be used instead of
+current_stack_pointer() function which allows to optimize away some
+excessive "mov %rsp, %<dst>" instructions:
+
+ -mov    %rsp,%rdx
+ -sub    %rdx,%rax
+ -cmp    $0x3fff,%rax
+ -ja     ffffffff810722fd <ist_begin_non_atomic+0x2d>
+
+ +sub    %rsp,%rax
+ +cmp    $0x3fff,%rax
+ +ja     ffffffff810722fa <ist_begin_non_atomic+0x2a>
+
+Remove current_stack_pointer(), rename __asm_call_sp to current_stack_pointer
+and use it instead of the removed function.
+
+Signed-off-by: Andrey Ryabinin <aryabinin@virtuozzo.com>
+Reviewed-by: Josh Poimboeuf <jpoimboe@redhat.com>
+Cc: Andy Lutomirski <luto@kernel.org>
+Cc: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Thomas Gleixner <tglx@linutronix.de>
+Link: http://lkml.kernel.org/r/20170929141537.29167-1-aryabinin@virtuozzo.com
+Signed-off-by: Ingo Molnar <mingo@kernel.org>
+[dwmw2: We want ASM_CALL_CONSTRAINT for retpoline]
+Signed-off-by: David Woodhouse <dwmw@amazon.co.ku>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ arch/x86/include/asm/asm.h         |   11 +++++++++++
+ arch/x86/include/asm/thread_info.h |   11 -----------
+ arch/x86/kernel/irq_32.c           |    6 +++---
+ arch/x86/kernel/traps.c            |    2 +-
+ arch/x86/mm/tlb.c                  |    2 +-
+ 5 files changed, 16 insertions(+), 16 deletions(-)
+
+--- a/arch/x86/include/asm/asm.h
++++ b/arch/x86/include/asm/asm.h
+@@ -125,4 +125,15 @@
+ /* For C file, we already have NOKPROBE_SYMBOL macro */
+ #endif
++#ifndef __ASSEMBLY__
++/*
++ * This output constraint should be used for any inline asm which has a "call"
++ * instruction.  Otherwise the asm may be inserted before the frame pointer
++ * gets set up by the containing function.  If you forget to do this, objtool
++ * may print a "call without frame pointer save/setup" warning.
++ */
++register unsigned long current_stack_pointer asm(_ASM_SP);
++#define ASM_CALL_CONSTRAINT "+r" (current_stack_pointer)
++#endif
++
+ #endif /* _ASM_X86_ASM_H */
+--- a/arch/x86/include/asm/thread_info.h
++++ b/arch/x86/include/asm/thread_info.h
+@@ -152,17 +152,6 @@ struct thread_info {
+  */
+ #ifndef __ASSEMBLY__
+-static inline unsigned long current_stack_pointer(void)
+-{
+-      unsigned long sp;
+-#ifdef CONFIG_X86_64
+-      asm("mov %%rsp,%0" : "=g" (sp));
+-#else
+-      asm("mov %%esp,%0" : "=g" (sp));
+-#endif
+-      return sp;
+-}
+-
+ /*
+  * Walks up the stack frames to make sure that the specified object is
+  * entirely contained by a single stack frame.
+--- a/arch/x86/kernel/irq_32.c
++++ b/arch/x86/kernel/irq_32.c
+@@ -64,7 +64,7 @@ static void call_on_stack(void *func, vo
+ static inline void *current_stack(void)
+ {
+-      return (void *)(current_stack_pointer() & ~(THREAD_SIZE - 1));
++      return (void *)(current_stack_pointer & ~(THREAD_SIZE - 1));
+ }
+ static inline int execute_on_irq_stack(int overflow, struct irq_desc *desc)
+@@ -88,7 +88,7 @@ static inline int execute_on_irq_stack(i
+       /* Save the next esp at the bottom of the stack */
+       prev_esp = (u32 *)irqstk;
+-      *prev_esp = current_stack_pointer();
++      *prev_esp = current_stack_pointer;
+       if (unlikely(overflow))
+               call_on_stack(print_stack_overflow, isp);
+@@ -139,7 +139,7 @@ void do_softirq_own_stack(void)
+       /* Push the previous esp onto the stack */
+       prev_esp = (u32 *)irqstk;
+-      *prev_esp = current_stack_pointer();
++      *prev_esp = current_stack_pointer;
+       call_on_stack(__do_softirq, isp);
+ }
+--- a/arch/x86/kernel/traps.c
++++ b/arch/x86/kernel/traps.c
+@@ -153,7 +153,7 @@ void ist_begin_non_atomic(struct pt_regs
+        * from double_fault.
+        */
+       BUG_ON((unsigned long)(current_top_of_stack() -
+-                             current_stack_pointer()) >= THREAD_SIZE);
++                             current_stack_pointer) >= THREAD_SIZE);
+       preempt_enable_no_resched();
+ }
+--- a/arch/x86/mm/tlb.c
++++ b/arch/x86/mm/tlb.c
+@@ -110,7 +110,7 @@ void switch_mm_irqs_off(struct mm_struct
+                        * mapped in the new pgd, we'll double-fault.  Forcibly
+                        * map it.
+                        */
+-                      unsigned int stack_pgd_index = pgd_index(current_stack_pointer());
++                      unsigned int stack_pgd_index = pgd_index(current_stack_pointer);
+                       pgd_t *pgd = next->pgd + stack_pgd_index;
diff --git a/queue-4.9/x86-cpu-amd-make-lfence-a-serializing-instruction.patch b/queue-4.9/x86-cpu-amd-make-lfence-a-serializing-instruction.patch
new file mode 100644 (file)
index 0000000..db8ec7a
--- /dev/null
@@ -0,0 +1,66 @@
+From e4d0e84e490790798691aaa0f2e598637f1867ec Mon Sep 17 00:00:00 2001
+From: Tom Lendacky <thomas.lendacky@amd.com>
+Date: Mon, 8 Jan 2018 16:09:21 -0600
+Subject: x86/cpu/AMD: Make LFENCE a serializing instruction
+
+From: Tom Lendacky <thomas.lendacky@amd.com>
+
+commit e4d0e84e490790798691aaa0f2e598637f1867ec upstream.
+
+To aid in speculation control, make LFENCE a serializing instruction
+since it has less overhead than MFENCE.  This is done by setting bit 1
+of MSR 0xc0011029 (DE_CFG).  Some families that support LFENCE do not
+have this MSR.  For these families, the LFENCE instruction is already
+serializing.
+
+Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com>
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Reviewed-by: Reviewed-by: Borislav Petkov <bp@suse.de>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Tim Chen <tim.c.chen@linux.intel.com>
+Cc: Dave Hansen <dave.hansen@intel.com>
+Cc: Borislav Petkov <bp@alien8.de>
+Cc: Dan Williams <dan.j.williams@intel.com>
+Cc: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Greg Kroah-Hartman <gregkh@linux-foundation.org>
+Cc: David Woodhouse <dwmw@amazon.co.uk>
+Cc: Paul Turner <pjt@google.com>
+Link: https://lkml.kernel.org/r/20180108220921.12580.71694.stgit@tlendack-t1.amdoffice.net
+Signed-off-by: Razvan Ghitulete <rga@amazon.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ arch/x86/include/asm/msr-index.h |    2 ++
+ arch/x86/kernel/cpu/amd.c        |   10 ++++++++++
+ 2 files changed, 12 insertions(+)
+
+--- a/arch/x86/include/asm/msr-index.h
++++ b/arch/x86/include/asm/msr-index.h
+@@ -330,6 +330,8 @@
+ #define FAM10H_MMIO_CONF_BASE_MASK    0xfffffffULL
+ #define FAM10H_MMIO_CONF_BASE_SHIFT   20
+ #define MSR_FAM10H_NODE_ID            0xc001100c
++#define MSR_F10H_DECFG                        0xc0011029
++#define MSR_F10H_DECFG_LFENCE_SERIALIZE_BIT   1
+ /* K8 MSRs */
+ #define MSR_K8_TOP_MEM1                       0xc001001a
+--- a/arch/x86/kernel/cpu/amd.c
++++ b/arch/x86/kernel/cpu/amd.c
+@@ -782,6 +782,16 @@ static void init_amd(struct cpuinfo_x86
+               set_cpu_cap(c, X86_FEATURE_K8);
+       if (cpu_has(c, X86_FEATURE_XMM2)) {
++              /*
++               * A serializing LFENCE has less overhead than MFENCE, so
++               * use it for execution serialization.  On families which
++               * don't have that MSR, LFENCE is already serializing.
++               * msr_set_bit() uses the safe accessors, too, even if the MSR
++               * is not present.
++               */
++              msr_set_bit(MSR_F10H_DECFG,
++                          MSR_F10H_DECFG_LFENCE_SERIALIZE_BIT);
++
+               /* MFENCE stops RDTSC speculation */
+               set_cpu_cap(c, X86_FEATURE_MFENCE_RDTSC);
+       }
diff --git a/queue-4.9/x86-cpu-amd-use-lfence_rdtsc-in-preference-to-mfence_rdtsc.patch b/queue-4.9/x86-cpu-amd-use-lfence_rdtsc-in-preference-to-mfence_rdtsc.patch
new file mode 100644 (file)
index 0000000..8c8a0ce
--- /dev/null
@@ -0,0 +1,81 @@
+From 9c6a73c75864ad9fa49e5fa6513e4c4071c0e29f Mon Sep 17 00:00:00 2001
+From: Tom Lendacky <thomas.lendacky@amd.com>
+Date: Mon, 8 Jan 2018 16:09:32 -0600
+Subject: x86/cpu/AMD: Use LFENCE_RDTSC in preference to MFENCE_RDTSC
+
+From: Tom Lendacky <thomas.lendacky@amd.com>
+
+commit 9c6a73c75864ad9fa49e5fa6513e4c4071c0e29f upstream.
+
+With LFENCE now a serializing instruction, use LFENCE_RDTSC in preference
+to MFENCE_RDTSC.  However, since the kernel could be running under a
+hypervisor that does not support writing that MSR, read the MSR back and
+verify that the bit has been set successfully.  If the MSR can be read
+and the bit is set, then set the LFENCE_RDTSC feature, otherwise set the
+MFENCE_RDTSC feature.
+
+Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com>
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Reviewed-by: Reviewed-by: Borislav Petkov <bp@suse.de>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Tim Chen <tim.c.chen@linux.intel.com>
+Cc: Dave Hansen <dave.hansen@intel.com>
+Cc: Borislav Petkov <bp@alien8.de>
+Cc: Dan Williams <dan.j.williams@intel.com>
+Cc: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Greg Kroah-Hartman <gregkh@linux-foundation.org>
+Cc: David Woodhouse <dwmw@amazon.co.uk>
+Cc: Paul Turner <pjt@google.com>
+Link: https://lkml.kernel.org/r/20180108220932.12580.52458.stgit@tlendack-t1.amdoffice.net
+Signed-off-by: Razvan Ghitulete <rga@amazon.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ arch/x86/include/asm/msr-index.h |    1 +
+ arch/x86/kernel/cpu/amd.c        |   18 ++++++++++++++++--
+ 2 files changed, 17 insertions(+), 2 deletions(-)
+
+--- a/arch/x86/include/asm/msr-index.h
++++ b/arch/x86/include/asm/msr-index.h
+@@ -332,6 +332,7 @@
+ #define MSR_FAM10H_NODE_ID            0xc001100c
+ #define MSR_F10H_DECFG                        0xc0011029
+ #define MSR_F10H_DECFG_LFENCE_SERIALIZE_BIT   1
++#define MSR_F10H_DECFG_LFENCE_SERIALIZE               BIT_ULL(MSR_F10H_DECFG_LFENCE_SERIALIZE_BIT)
+ /* K8 MSRs */
+ #define MSR_K8_TOP_MEM1                       0xc001001a
+--- a/arch/x86/kernel/cpu/amd.c
++++ b/arch/x86/kernel/cpu/amd.c
+@@ -782,6 +782,9 @@ static void init_amd(struct cpuinfo_x86
+               set_cpu_cap(c, X86_FEATURE_K8);
+       if (cpu_has(c, X86_FEATURE_XMM2)) {
++              unsigned long long val;
++              int ret;
++
+               /*
+                * A serializing LFENCE has less overhead than MFENCE, so
+                * use it for execution serialization.  On families which
+@@ -792,8 +795,19 @@ static void init_amd(struct cpuinfo_x86
+               msr_set_bit(MSR_F10H_DECFG,
+                           MSR_F10H_DECFG_LFENCE_SERIALIZE_BIT);
+-              /* MFENCE stops RDTSC speculation */
+-              set_cpu_cap(c, X86_FEATURE_MFENCE_RDTSC);
++              /*
++               * Verify that the MSR write was successful (could be running
++               * under a hypervisor) and only then assume that LFENCE is
++               * serializing.
++               */
++              ret = rdmsrl_safe(MSR_F10H_DECFG, &val);
++              if (!ret && (val & MSR_F10H_DECFG_LFENCE_SERIALIZE)) {
++                      /* A serializing LFENCE stops RDTSC speculation */
++                      set_cpu_cap(c, X86_FEATURE_LFENCE_RDTSC);
++              } else {
++                      /* MFENCE stops RDTSC speculation */
++                      set_cpu_cap(c, X86_FEATURE_MFENCE_RDTSC);
++              }
+       }
+       /*
diff --git a/queue-4.9/x86-cpu-factor-out-application-of-forced-cpu-caps.patch b/queue-4.9/x86-cpu-factor-out-application-of-forced-cpu-caps.patch
new file mode 100644 (file)
index 0000000..8c79c8f
--- /dev/null
@@ -0,0 +1,79 @@
+From 8bf1ebca215c262e48c15a4a15f175991776f57f Mon Sep 17 00:00:00 2001
+From: Andy Lutomirski <luto@kernel.org>
+Date: Wed, 18 Jan 2017 11:15:38 -0800
+Subject: x86/cpu: Factor out application of forced CPU caps
+
+From: Andy Lutomirski <luto@kernel.org>
+
+commit 8bf1ebca215c262e48c15a4a15f175991776f57f upstream.
+
+There are multiple call sites that apply forced CPU caps.  Factor
+them into a helper.
+
+Signed-off-by: Andy Lutomirski <luto@kernel.org>
+Reviewed-by: Borislav Petkov <bp@suse.de>
+Cc: Borislav Petkov <bp@alien8.de>
+Cc: Brian Gerst <brgerst@gmail.com>
+Cc: Dave Hansen <dave.hansen@linux.intel.com>
+Cc: Fenghua Yu <fenghua.yu@intel.com>
+Cc: H. Peter Anvin <hpa@zytor.com>
+Cc: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Matthew Whitehead <tedheadster@gmail.com>
+Cc: Oleg Nesterov <oleg@redhat.com>
+Cc: One Thousand Gnomes <gnomes@lxorguk.ukuu.org.uk>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Rik van Riel <riel@redhat.com>
+Cc: Thomas Gleixner <tglx@linutronix.de>
+Cc: Yu-cheng Yu <yu-cheng.yu@intel.com>
+Link: http://lkml.kernel.org/r/623ff7555488122143e4417de09b18be2085ad06.1484705016.git.luto@kernel.org
+Signed-off-by: Ingo Molnar <mingo@kernel.org>
+Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ arch/x86/kernel/cpu/common.c |   20 ++++++++++++--------
+ 1 file changed, 12 insertions(+), 8 deletions(-)
+
+--- a/arch/x86/kernel/cpu/common.c
++++ b/arch/x86/kernel/cpu/common.c
+@@ -706,6 +706,16 @@ void cpu_detect(struct cpuinfo_x86 *c)
+       }
+ }
++static void apply_forced_caps(struct cpuinfo_x86 *c)
++{
++      int i;
++
++      for (i = 0; i < NCAPINTS; i++) {
++              c->x86_capability[i] &= ~cpu_caps_cleared[i];
++              c->x86_capability[i] |= cpu_caps_set[i];
++      }
++}
++
+ void get_cpu_cap(struct cpuinfo_x86 *c)
+ {
+       u32 eax, ebx, ecx, edx;
+@@ -1086,10 +1096,7 @@ static void identify_cpu(struct cpuinfo_
+               this_cpu->c_identify(c);
+       /* Clear/Set all flags overridden by options, after probe */
+-      for (i = 0; i < NCAPINTS; i++) {
+-              c->x86_capability[i] &= ~cpu_caps_cleared[i];
+-              c->x86_capability[i] |= cpu_caps_set[i];
+-      }
++      apply_forced_caps(c);
+ #ifdef CONFIG_X86_64
+       c->apicid = apic->phys_pkg_id(c->initial_apicid, 0);
+@@ -1151,10 +1158,7 @@ static void identify_cpu(struct cpuinfo_
+        * Clear/Set all flags overridden by options, need do it
+        * before following smp all cpus cap AND.
+        */
+-      for (i = 0; i < NCAPINTS; i++) {
+-              c->x86_capability[i] &= ~cpu_caps_cleared[i];
+-              c->x86_capability[i] |= cpu_caps_set[i];
+-      }
++      apply_forced_caps(c);
+       /*
+        * On SMP, boot_cpu_data holds the common feature set between
diff --git a/queue-4.9/x86-cpu-implement-cpu-vulnerabilites-sysfs-functions.patch b/queue-4.9/x86-cpu-implement-cpu-vulnerabilites-sysfs-functions.patch
new file mode 100644 (file)
index 0000000..eedeb41
--- /dev/null
@@ -0,0 +1,81 @@
+From 61dc0f555b5c761cdafb0ba5bd41ecf22d68a4c4 Mon Sep 17 00:00:00 2001
+From: Thomas Gleixner <tglx@linutronix.de>
+Date: Sun, 7 Jan 2018 22:48:01 +0100
+Subject: x86/cpu: Implement CPU vulnerabilites sysfs functions
+
+From: Thomas Gleixner <tglx@linutronix.de>
+
+commit 61dc0f555b5c761cdafb0ba5bd41ecf22d68a4c4 upstream.
+
+Implement the CPU vulnerabilty show functions for meltdown, spectre_v1 and
+spectre_v2.
+
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Will Deacon <will.deacon@arm.com>
+Cc: Dave Hansen <dave.hansen@intel.com>
+Cc: Linus Torvalds <torvalds@linuxfoundation.org>
+Cc: Borislav Petkov <bp@alien8.de>
+Cc: David Woodhouse <dwmw@amazon.co.uk>
+Link: https://lkml.kernel.org/r/20180107214913.177414879@linutronix.de
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ arch/x86/Kconfig           |    1 +
+ arch/x86/kernel/cpu/bugs.c |   29 +++++++++++++++++++++++++++++
+ 2 files changed, 30 insertions(+)
+
+--- a/arch/x86/Kconfig
++++ b/arch/x86/Kconfig
+@@ -64,6 +64,7 @@ config X86
+       select GENERIC_CLOCKEVENTS_MIN_ADJUST
+       select GENERIC_CMOS_UPDATE
+       select GENERIC_CPU_AUTOPROBE
++      select GENERIC_CPU_VULNERABILITIES
+       select GENERIC_EARLY_IOREMAP
+       select GENERIC_FIND_FIRST_BIT
+       select GENERIC_IOMAP
+--- a/arch/x86/kernel/cpu/bugs.c
++++ b/arch/x86/kernel/cpu/bugs.c
+@@ -9,6 +9,7 @@
+  */
+ #include <linux/init.h>
+ #include <linux/utsname.h>
++#include <linux/cpu.h>
+ #include <asm/bugs.h>
+ #include <asm/processor.h>
+ #include <asm/processor-flags.h>
+@@ -49,3 +50,31 @@ void __init check_bugs(void)
+       fpu__init_check_bugs();
+ }
++
++#ifdef CONFIG_SYSFS
++ssize_t cpu_show_meltdown(struct device *dev,
++                        struct device_attribute *attr, char *buf)
++{
++      if (!boot_cpu_has_bug(X86_BUG_CPU_MELTDOWN))
++              return sprintf(buf, "Not affected\n");
++      if (boot_cpu_has(X86_FEATURE_PTI))
++              return sprintf(buf, "Mitigation: PTI\n");
++      return sprintf(buf, "Vulnerable\n");
++}
++
++ssize_t cpu_show_spectre_v1(struct device *dev,
++                          struct device_attribute *attr, char *buf)
++{
++      if (!boot_cpu_has_bug(X86_BUG_SPECTRE_V1))
++              return sprintf(buf, "Not affected\n");
++      return sprintf(buf, "Vulnerable\n");
++}
++
++ssize_t cpu_show_spectre_v2(struct device *dev,
++                          struct device_attribute *attr, char *buf)
++{
++      if (!boot_cpu_has_bug(X86_BUG_SPECTRE_V2))
++              return sprintf(buf, "Not affected\n");
++      return sprintf(buf, "Vulnerable\n");
++}
++#endif
diff --git a/queue-4.9/x86-cpu-merge-bugs.c-and-bugs_64.c.patch b/queue-4.9/x86-cpu-merge-bugs.c-and-bugs_64.c.patch
new file mode 100644 (file)
index 0000000..e90bbce
--- /dev/null
@@ -0,0 +1,138 @@
+From 62a67e123e058a67db58bc6a14354dd037bafd0a Mon Sep 17 00:00:00 2001
+From: Borislav Petkov <bp@suse.de>
+Date: Mon, 24 Oct 2016 19:38:43 +0200
+Subject: x86/cpu: Merge bugs.c and bugs_64.c
+
+From: Borislav Petkov <bp@suse.de>
+
+commit 62a67e123e058a67db58bc6a14354dd037bafd0a upstream.
+
+Should be easier when following boot paths. It probably is a left over
+from the x86 unification eons ago.
+
+No functionality change.
+
+Signed-off-by: Borislav Petkov <bp@suse.de>
+Cc: Andy Lutomirski <luto@kernel.org>
+Cc: Borislav Petkov <bp@alien8.de>
+Cc: Brian Gerst <brgerst@gmail.com>
+Cc: Denys Vlasenko <dvlasenk@redhat.com>
+Cc: H. Peter Anvin <hpa@zytor.com>
+Cc: Josh Poimboeuf <jpoimboe@redhat.com>
+Cc: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Thomas Gleixner <tglx@linutronix.de>
+Link: http://lkml.kernel.org/r/20161024173844.23038-3-bp@alien8.de
+Signed-off-by: Ingo Molnar <mingo@kernel.org>
+Signed-off-by: Razvan Ghitulete <rga@amazon.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ arch/x86/kernel/cpu/Makefile  |    4 +---
+ arch/x86/kernel/cpu/bugs.c    |   26 ++++++++++++++++++++++----
+ arch/x86/kernel/cpu/bugs_64.c |   33 ---------------------------------
+ 3 files changed, 23 insertions(+), 40 deletions(-)
+ delete mode 100644 arch/x86/kernel/cpu/bugs_64.c
+
+--- a/arch/x86/kernel/cpu/Makefile
++++ b/arch/x86/kernel/cpu/Makefile
+@@ -20,13 +20,11 @@ obj-y                      := intel_cacheinfo.o scattered.o
+ obj-y                 += common.o
+ obj-y                 += rdrand.o
+ obj-y                 += match.o
++obj-y                 += bugs.o
+ obj-$(CONFIG_PROC_FS) += proc.o
+ obj-$(CONFIG_X86_FEATURE_NAMES) += capflags.o powerflags.o
+-obj-$(CONFIG_X86_32)  += bugs.o
+-obj-$(CONFIG_X86_64)  += bugs_64.o
+-
+ obj-$(CONFIG_CPU_SUP_INTEL)           += intel.o
+ obj-$(CONFIG_CPU_SUP_AMD)             += amd.o
+ obj-$(CONFIG_CPU_SUP_CYRIX_32)                += cyrix.o
+--- a/arch/x86/kernel/cpu/bugs.c
++++ b/arch/x86/kernel/cpu/bugs.c
+@@ -17,6 +17,8 @@
+ #include <asm/msr.h>
+ #include <asm/paravirt.h>
+ #include <asm/alternative.h>
++#include <asm/pgtable.h>
++#include <asm/cacheflush.h>
+ void __init check_bugs(void)
+ {
+@@ -29,11 +31,13 @@ void __init check_bugs(void)
+ #endif
+       identify_boot_cpu();
+-#ifndef CONFIG_SMP
+-      pr_info("CPU: ");
+-      print_cpu_info(&boot_cpu_data);
+-#endif
++      if (!IS_ENABLED(CONFIG_SMP)) {
++              pr_info("CPU: ");
++              print_cpu_info(&boot_cpu_data);
++      }
++
++#ifdef CONFIG_X86_32
+       /*
+        * Check whether we are able to run this kernel safely on SMP.
+        *
+@@ -49,6 +53,20 @@ void __init check_bugs(void)
+       alternative_instructions();
+       fpu__init_check_bugs();
++#else /* CONFIG_X86_64 */
++      alternative_instructions();
++
++      /*
++       * Make sure the first 2MB area is not mapped by huge pages
++       * There are typically fixed size MTRRs in there and overlapping
++       * MTRRs into large pages causes slow downs.
++       *
++       * Right now we don't do that with gbpages because there seems
++       * very little benefit for that case.
++       */
++      if (!direct_gbpages)
++              set_memory_4k((unsigned long)__va(0), 1);
++#endif
+ }
+ #ifdef CONFIG_SYSFS
+--- a/arch/x86/kernel/cpu/bugs_64.c
++++ /dev/null
+@@ -1,33 +0,0 @@
+-/*
+- *  Copyright (C) 1994  Linus Torvalds
+- *  Copyright (C) 2000  SuSE
+- */
+-
+-#include <linux/kernel.h>
+-#include <linux/init.h>
+-#include <asm/alternative.h>
+-#include <asm/bugs.h>
+-#include <asm/processor.h>
+-#include <asm/mtrr.h>
+-#include <asm/cacheflush.h>
+-
+-void __init check_bugs(void)
+-{
+-      identify_boot_cpu();
+-#if !defined(CONFIG_SMP)
+-      pr_info("CPU: ");
+-      print_cpu_info(&boot_cpu_data);
+-#endif
+-      alternative_instructions();
+-
+-      /*
+-       * Make sure the first 2MB area is not mapped by huge pages
+-       * There are typically fixed size MTRRs in there and overlapping
+-       * MTRRs into large pages causes slow downs.
+-       *
+-       * Right now we don't do that with gbpages because there seems
+-       * very little benefit for that case.
+-       */
+-      if (!direct_gbpages)
+-              set_memory_4k((unsigned long)__va(0), 1);
+-}
diff --git a/queue-4.9/x86-cpufeatures-add-x86_bug_cpu_insecure.patch b/queue-4.9/x86-cpufeatures-add-x86_bug_cpu_insecure.patch
new file mode 100644 (file)
index 0000000..0f6fc2c
--- /dev/null
@@ -0,0 +1,73 @@
+From a89f040fa34ec9cd682aed98b8f04e3c47d998bd Mon Sep 17 00:00:00 2001
+From: Thomas Gleixner <tglx@linutronix.de>
+Date: Mon, 4 Dec 2017 15:07:33 +0100
+Subject: x86/cpufeatures: Add X86_BUG_CPU_INSECURE
+
+From: Thomas Gleixner <tglx@linutronix.de>
+
+commit a89f040fa34ec9cd682aed98b8f04e3c47d998bd upstream.
+
+Many x86 CPUs leak information to user space due to missing isolation of
+user space and kernel space page tables. There are many well documented
+ways to exploit that.
+
+The upcoming software migitation of isolating the user and kernel space
+page tables needs a misfeature flag so code can be made runtime
+conditional.
+
+Add the BUG bits which indicates that the CPU is affected and add a feature
+bit which indicates that the software migitation is enabled.
+
+Assume for now that _ALL_ x86 CPUs are affected by this. Exceptions can be
+made later.
+
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Cc: Andy Lutomirski <luto@kernel.org>
+Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com>
+Cc: Borislav Petkov <bp@alien8.de>
+Cc: Brian Gerst <brgerst@gmail.com>
+Cc: Dave Hansen <dave.hansen@linux.intel.com>
+Cc: David Laight <David.Laight@aculab.com>
+Cc: Denys Vlasenko <dvlasenk@redhat.com>
+Cc: Eduardo Valentin <eduval@amazon.com>
+Cc: Greg KH <gregkh@linuxfoundation.org>
+Cc: H. Peter Anvin <hpa@zytor.com>
+Cc: Josh Poimboeuf <jpoimboe@redhat.com>
+Cc: Juergen Gross <jgross@suse.com>
+Cc: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Will Deacon <will.deacon@arm.com>
+Cc: aliguori@amazon.com
+Cc: daniel.gruss@iaik.tugraz.at
+Cc: hughd@google.com
+Cc: keescook@google.com
+Signed-off-by: Ingo Molnar <mingo@kernel.org>
+Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ arch/x86/include/asm/cpufeatures.h |    1 +
+ arch/x86/kernel/cpu/common.c       |    4 ++++
+ 2 files changed, 5 insertions(+)
+
+--- a/arch/x86/include/asm/cpufeatures.h
++++ b/arch/x86/include/asm/cpufeatures.h
+@@ -316,5 +316,6 @@
+ #define X86_BUG_SWAPGS_FENCE  X86_BUG(11) /* SWAPGS without input dep on GS */
+ #define X86_BUG_MONITOR               X86_BUG(12) /* IPI required to wake up remote CPU */
+ #define X86_BUG_AMD_E400      X86_BUG(13) /* CPU is among the affected by Erratum 400 */
++#define X86_BUG_CPU_INSECURE  X86_BUG(14) /* CPU is insecure and needs kernel page table isolation */
+ #endif /* _ASM_X86_CPUFEATURES_H */
+--- a/arch/x86/kernel/cpu/common.c
++++ b/arch/x86/kernel/cpu/common.c
+@@ -882,6 +882,10 @@ static void __init early_identify_cpu(st
+       }
+       setup_force_cpu_cap(X86_FEATURE_ALWAYS);
++
++      /* Assume for now that ALL x86 CPUs are insecure */
++      setup_force_cpu_bug(X86_BUG_CPU_INSECURE);
++
+       fpu__init_system(c);
+ }
diff --git a/queue-4.9/x86-cpufeatures-add-x86_bug_spectre_v.patch b/queue-4.9/x86-cpufeatures-add-x86_bug_spectre_v.patch
new file mode 100644 (file)
index 0000000..e59cfe5
--- /dev/null
@@ -0,0 +1,58 @@
+From 99c6fa2511d8a683e61468be91b83f85452115fa Mon Sep 17 00:00:00 2001
+From: David Woodhouse <dwmw@amazon.co.uk>
+Date: Sat, 6 Jan 2018 11:49:23 +0000
+Subject: x86/cpufeatures: Add X86_BUG_SPECTRE_V[12]
+
+From: David Woodhouse <dwmw@amazon.co.uk>
+
+commit 99c6fa2511d8a683e61468be91b83f85452115fa upstream.
+
+Add the bug bits for spectre v1/2 and force them unconditionally for all
+cpus.
+
+Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Cc: gnomes@lxorguk.ukuu.org.uk
+Cc: Rik van Riel <riel@redhat.com>
+Cc: Andi Kleen <ak@linux.intel.com>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Jiri Kosina <jikos@kernel.org>
+Cc: Andy Lutomirski <luto@amacapital.net>
+Cc: Dave Hansen <dave.hansen@intel.com>
+Cc: Kees Cook <keescook@google.com>
+Cc: Tim Chen <tim.c.chen@linux.intel.com>
+Cc: Greg Kroah-Hartman <gregkh@linux-foundation.org>
+Cc: Paul Turner <pjt@google.com>
+Cc: stable@vger.kernel.org
+Link: https://lkml.kernel.org/r/1515239374-23361-2-git-send-email-dwmw@amazon.co.uk
+Signed-off-by: Razvan Ghitulete <rga@amazon.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ arch/x86/include/asm/cpufeatures.h |    2 ++
+ arch/x86/kernel/cpu/common.c       |    3 +++
+ 2 files changed, 5 insertions(+)
+
+--- a/arch/x86/include/asm/cpufeatures.h
++++ b/arch/x86/include/asm/cpufeatures.h
+@@ -317,5 +317,7 @@
+ #define X86_BUG_MONITOR               X86_BUG(12) /* IPI required to wake up remote CPU */
+ #define X86_BUG_AMD_E400      X86_BUG(13) /* CPU is among the affected by Erratum 400 */
+ #define X86_BUG_CPU_MELTDOWN  X86_BUG(14) /* CPU is affected by meltdown attack and needs kernel page table isolation */
++#define X86_BUG_SPECTRE_V1    X86_BUG(15) /* CPU is affected by Spectre variant 1 attack with conditional branches */
++#define X86_BUG_SPECTRE_V2    X86_BUG(16) /* CPU is affected by Spectre variant 2 attack with indirect branches */
+ #endif /* _ASM_X86_CPUFEATURES_H */
+--- a/arch/x86/kernel/cpu/common.c
++++ b/arch/x86/kernel/cpu/common.c
+@@ -886,6 +886,9 @@ static void __init early_identify_cpu(st
+       /* Assume for now that ALL x86 CPUs are insecure */
+       setup_force_cpu_bug(X86_BUG_CPU_MELTDOWN);
++      setup_force_cpu_bug(X86_BUG_SPECTRE_V1);
++      setup_force_cpu_bug(X86_BUG_SPECTRE_V2);
++
+       fpu__init_system(c);
+ }
diff --git a/queue-4.9/x86-cpufeatures-make-cpu-bugs-sticky.patch b/queue-4.9/x86-cpufeatures-make-cpu-bugs-sticky.patch
new file mode 100644 (file)
index 0000000..aa4b9e0
--- /dev/null
@@ -0,0 +1,96 @@
+From 6cbd2171e89b13377261d15e64384df60ecb530e Mon Sep 17 00:00:00 2001
+From: Thomas Gleixner <tglx@linutronix.de>
+Date: Mon, 4 Dec 2017 15:07:32 +0100
+Subject: x86/cpufeatures: Make CPU bugs sticky
+
+From: Thomas Gleixner <tglx@linutronix.de>
+
+commit 6cbd2171e89b13377261d15e64384df60ecb530e upstream.
+
+There is currently no way to force CPU bug bits like CPU feature bits. That
+makes it impossible to set a bug bit once at boot and have it stick for all
+upcoming CPUs.
+
+Extend the force set/clear arrays to handle bug bits as well.
+
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Reviewed-by: Borislav Petkov <bp@suse.de>
+Cc: Andy Lutomirski <luto@kernel.org>
+Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com>
+Cc: Borislav Petkov <bp@alien8.de>
+Cc: Borislav Petkov <bpetkov@suse.de>
+Cc: Brian Gerst <brgerst@gmail.com>
+Cc: Dave Hansen <dave.hansen@intel.com>
+Cc: Dave Hansen <dave.hansen@linux.intel.com>
+Cc: David Laight <David.Laight@aculab.com>
+Cc: Denys Vlasenko <dvlasenk@redhat.com>
+Cc: Eduardo Valentin <eduval@amazon.com>
+Cc: Greg KH <gregkh@linuxfoundation.org>
+Cc: H. Peter Anvin <hpa@zytor.com>
+Cc: Josh Poimboeuf <jpoimboe@redhat.com>
+Cc: Juergen Gross <jgross@suse.com>
+Cc: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Rik van Riel <riel@redhat.com>
+Cc: Will Deacon <will.deacon@arm.com>
+Cc: aliguori@amazon.com
+Cc: daniel.gruss@iaik.tugraz.at
+Cc: hughd@google.com
+Cc: keescook@google.com
+Link: https://lkml.kernel.org/r/20171204150606.992156574@linutronix.de
+Signed-off-by: Ingo Molnar <mingo@kernel.org>
+Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ arch/x86/include/asm/cpufeature.h |    2 ++
+ arch/x86/include/asm/processor.h  |    4 ++--
+ arch/x86/kernel/cpu/common.c      |    6 +++---
+ 3 files changed, 7 insertions(+), 5 deletions(-)
+
+--- a/arch/x86/include/asm/cpufeature.h
++++ b/arch/x86/include/asm/cpufeature.h
+@@ -135,6 +135,8 @@ extern const char * const x86_bug_flags[
+       set_bit(bit, (unsigned long *)cpu_caps_set);    \
+ } while (0)
++#define setup_force_cpu_bug(bit) setup_force_cpu_cap(bit)
++
+ #if defined(CC_HAVE_ASM_GOTO) && defined(CONFIG_X86_FAST_FEATURE_TESTS)
+ /*
+  * Static testing of CPU features.  Used the same as boot_cpu_has().
+--- a/arch/x86/include/asm/processor.h
++++ b/arch/x86/include/asm/processor.h
+@@ -156,8 +156,8 @@ extern struct cpuinfo_x86  boot_cpu_data;
+ extern struct cpuinfo_x86     new_cpu_data;
+ extern struct tss_struct      doublefault_tss;
+-extern __u32                  cpu_caps_cleared[NCAPINTS];
+-extern __u32                  cpu_caps_set[NCAPINTS];
++extern __u32                  cpu_caps_cleared[NCAPINTS + NBUGINTS];
++extern __u32                  cpu_caps_set[NCAPINTS + NBUGINTS];
+ #ifdef CONFIG_SMP
+ DECLARE_PER_CPU_READ_MOSTLY(struct cpuinfo_x86, cpu_info);
+--- a/arch/x86/kernel/cpu/common.c
++++ b/arch/x86/kernel/cpu/common.c
+@@ -480,8 +480,8 @@ static const char *table_lookup_model(st
+       return NULL;            /* Not found */
+ }
+-__u32 cpu_caps_cleared[NCAPINTS];
+-__u32 cpu_caps_set[NCAPINTS];
++__u32 cpu_caps_cleared[NCAPINTS + NBUGINTS];
++__u32 cpu_caps_set[NCAPINTS + NBUGINTS];
+ void load_percpu_segment(int cpu)
+ {
+@@ -710,7 +710,7 @@ static void apply_forced_caps(struct cpu
+ {
+       int i;
+-      for (i = 0; i < NCAPINTS; i++) {
++      for (i = 0; i < NCAPINTS + NBUGINTS; i++) {
+               c->x86_capability[i] &= ~cpu_caps_cleared[i];
+               c->x86_capability[i] |= cpu_caps_set[i];
+       }
diff --git a/queue-4.9/x86-mm-32-move-setup_clear_cpu_cap-x86_feature_pcid-earlier.patch b/queue-4.9/x86-mm-32-move-setup_clear_cpu_cap-x86_feature_pcid-earlier.patch
new file mode 100644 (file)
index 0000000..f7b9b05
--- /dev/null
@@ -0,0 +1,62 @@
+From b8b7abaed7a49b350f8ba659ddc264b04931d581 Mon Sep 17 00:00:00 2001
+From: Andy Lutomirski <luto@kernel.org>
+Date: Sun, 17 Sep 2017 09:03:50 -0700
+Subject: x86/mm/32: Move setup_clear_cpu_cap(X86_FEATURE_PCID) earlier
+
+From: Andy Lutomirski <luto@kernel.org>
+
+commit b8b7abaed7a49b350f8ba659ddc264b04931d581 upstream.
+
+Otherwise we might have the PCID feature bit set during cpu_init().
+
+This is just for robustness.  I haven't seen any actual bugs here.
+
+Signed-off-by: Andy Lutomirski <luto@kernel.org>
+Cc: Borislav Petkov <bpetkov@suse.de>
+Cc: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Thomas Gleixner <tglx@linutronix.de>
+Fixes: cba4671af755 ("x86/mm: Disable PCID on 32-bit kernels")
+Link: http://lkml.kernel.org/r/b16dae9d6b0db5d9801ddbebbfd83384097c61f3.1505663533.git.luto@kernel.org
+Signed-off-by: Ingo Molnar <mingo@kernel.org>
+Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ arch/x86/kernel/cpu/bugs.c   |    8 --------
+ arch/x86/kernel/cpu/common.c |    8 ++++++++
+ 2 files changed, 8 insertions(+), 8 deletions(-)
+
+--- a/arch/x86/kernel/cpu/bugs.c
++++ b/arch/x86/kernel/cpu/bugs.c
+@@ -22,14 +22,6 @@
+ void __init check_bugs(void)
+ {
+-#ifdef CONFIG_X86_32
+-      /*
+-       * Regardless of whether PCID is enumerated, the SDM says
+-       * that it can't be enabled in 32-bit mode.
+-       */
+-      setup_clear_cpu_cap(X86_FEATURE_PCID);
+-#endif
+-
+       identify_boot_cpu();
+       if (!IS_ENABLED(CONFIG_SMP)) {
+--- a/arch/x86/kernel/cpu/common.c
++++ b/arch/x86/kernel/cpu/common.c
+@@ -890,6 +890,14 @@ static void __init early_identify_cpu(st
+       setup_force_cpu_bug(X86_BUG_SPECTRE_V2);
+       fpu__init_system(c);
++
++#ifdef CONFIG_X86_32
++      /*
++       * Regardless of whether PCID is enumerated, the SDM says
++       * that it can't be enabled in 32-bit mode.
++       */
++      setup_clear_cpu_cap(X86_FEATURE_PCID);
++#endif
+ }
+ void __init early_cpu_init(void)
diff --git a/queue-4.9/x86-pti-rename-bug_cpu_insecure-to-bug_cpu_meltdown.patch b/queue-4.9/x86-pti-rename-bug_cpu_insecure-to-bug_cpu_meltdown.patch
new file mode 100644 (file)
index 0000000..5dce2f6
--- /dev/null
@@ -0,0 +1,56 @@
+From de791821c295cc61419a06fe5562288417d1bc58 Mon Sep 17 00:00:00 2001
+From: Thomas Gleixner <tglx@linutronix.de>
+Date: Fri, 5 Jan 2018 15:27:34 +0100
+Subject: x86/pti: Rename BUG_CPU_INSECURE to BUG_CPU_MELTDOWN
+
+From: Thomas Gleixner <tglx@linutronix.de>
+
+commit de791821c295cc61419a06fe5562288417d1bc58 upstream.
+
+Use the name associated with the particular attack which needs page table
+isolation for mitigation.
+
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Acked-by: David Woodhouse <dwmw@amazon.co.uk>
+Cc: Alan Cox <gnomes@lxorguk.ukuu.org.uk>
+Cc: Jiri Koshina <jikos@kernel.org>
+Cc: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Tim Chen <tim.c.chen@linux.intel.com>
+Cc: Andi Lutomirski  <luto@amacapital.net>
+Cc: Andi Kleen <ak@linux.intel.com>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Paul Turner <pjt@google.com>
+Cc: Tom Lendacky <thomas.lendacky@amd.com>
+Cc: Greg KH <gregkh@linux-foundation.org>
+Cc: Dave Hansen <dave.hansen@intel.com>
+Cc: Kees Cook <keescook@google.com>
+Cc: stable@vger.kernel.org
+Link: https://lkml.kernel.org/r/alpine.DEB.2.20.1801051525300.1724@nanos
+Signed-off-by: Razvan Ghitulete <rga@amazon.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ arch/x86/include/asm/cpufeatures.h |    2 +-
+ arch/x86/kernel/cpu/common.c       |    2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+--- a/arch/x86/include/asm/cpufeatures.h
++++ b/arch/x86/include/asm/cpufeatures.h
+@@ -316,6 +316,6 @@
+ #define X86_BUG_SWAPGS_FENCE  X86_BUG(11) /* SWAPGS without input dep on GS */
+ #define X86_BUG_MONITOR               X86_BUG(12) /* IPI required to wake up remote CPU */
+ #define X86_BUG_AMD_E400      X86_BUG(13) /* CPU is among the affected by Erratum 400 */
+-#define X86_BUG_CPU_INSECURE  X86_BUG(14) /* CPU is insecure and needs kernel page table isolation */
++#define X86_BUG_CPU_MELTDOWN  X86_BUG(14) /* CPU is affected by meltdown attack and needs kernel page table isolation */
+ #endif /* _ASM_X86_CPUFEATURES_H */
+--- a/arch/x86/kernel/cpu/common.c
++++ b/arch/x86/kernel/cpu/common.c
+@@ -884,7 +884,7 @@ static void __init early_identify_cpu(st
+       setup_force_cpu_cap(X86_FEATURE_ALWAYS);
+       /* Assume for now that ALL x86 CPUs are insecure */
+-      setup_force_cpu_bug(X86_BUG_CPU_INSECURE);
++      setup_force_cpu_bug(X86_BUG_CPU_MELTDOWN);
+       fpu__init_system(c);
+ }
diff --git a/queue-4.9/x86-retpoline-add-initial-retpoline-support.patch b/queue-4.9/x86-retpoline-add-initial-retpoline-support.patch
new file mode 100644 (file)
index 0000000..7ea928b
--- /dev/null
@@ -0,0 +1,359 @@
+From 76b043848fd22dbf7f8bf3a1452f8c70d557b860 Mon Sep 17 00:00:00 2001
+From: David Woodhouse <dwmw@amazon.co.uk>
+Date: Thu, 11 Jan 2018 21:46:25 +0000
+Subject: x86/retpoline: Add initial retpoline support
+
+From: David Woodhouse <dwmw@amazon.co.uk>
+
+commit 76b043848fd22dbf7f8bf3a1452f8c70d557b860 upstream.
+
+Enable the use of -mindirect-branch=thunk-extern in newer GCC, and provide
+the corresponding thunks. Provide assembler macros for invoking the thunks
+in the same way that GCC does, from native and inline assembler.
+
+This adds X86_FEATURE_RETPOLINE and sets it by default on all CPUs. In
+some circumstances, IBRS microcode features may be used instead, and the
+retpoline can be disabled.
+
+On AMD CPUs if lfence is serialising, the retpoline can be dramatically
+simplified to a simple "lfence; jmp *\reg". A future patch, after it has
+been verified that lfence really is serialising in all circumstances, can
+enable this by setting the X86_FEATURE_RETPOLINE_AMD feature bit in addition
+to X86_FEATURE_RETPOLINE.
+
+Do not align the retpoline in the altinstr section, because there is no
+guarantee that it stays aligned when it's copied over the oldinstr during
+alternative patching.
+
+[ Andi Kleen: Rename the macros, add CONFIG_RETPOLINE option, export thunks]
+[ tglx: Put actual function CALL/JMP in front of the macros, convert to
+       symbolic labels ]
+[ dwmw2: Convert back to numeric labels, merge objtool fixes ]
+
+Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Acked-by: Arjan van de Ven <arjan@linux.intel.com>
+Acked-by: Ingo Molnar <mingo@kernel.org>
+Cc: gnomes@lxorguk.ukuu.org.uk
+Cc: Rik van Riel <riel@redhat.com>
+Cc: Andi Kleen <ak@linux.intel.com>
+Cc: Josh Poimboeuf <jpoimboe@redhat.com>
+Cc: thomas.lendacky@amd.com
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Jiri Kosina <jikos@kernel.org>
+Cc: Andy Lutomirski <luto@amacapital.net>
+Cc: Dave Hansen <dave.hansen@intel.com>
+Cc: Kees Cook <keescook@google.com>
+Cc: Tim Chen <tim.c.chen@linux.intel.com>
+Cc: Greg Kroah-Hartman <gregkh@linux-foundation.org>
+Cc: Paul Turner <pjt@google.com>
+Link: https://lkml.kernel.org/r/1515707194-20531-4-git-send-email-dwmw@amazon.co.uk
+Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ arch/x86/Kconfig                      |   13 +++
+ arch/x86/Makefile                     |   10 ++
+ arch/x86/include/asm/asm-prototypes.h |   25 ++++++
+ arch/x86/include/asm/cpufeatures.h    |    3 
+ arch/x86/include/asm/nospec-branch.h  |  128 ++++++++++++++++++++++++++++++++++
+ arch/x86/kernel/cpu/common.c          |    4 +
+ arch/x86/lib/Makefile                 |    1 
+ arch/x86/lib/retpoline.S              |   48 ++++++++++++
+ 8 files changed, 232 insertions(+)
+ create mode 100644 arch/x86/include/asm/nospec-branch.h
+ create mode 100644 arch/x86/lib/retpoline.S
+
+--- a/arch/x86/Kconfig
++++ b/arch/x86/Kconfig
+@@ -408,6 +408,19 @@ config GOLDFISH
+        def_bool y
+        depends on X86_GOLDFISH
++config RETPOLINE
++      bool "Avoid speculative indirect branches in kernel"
++      default y
++      ---help---
++        Compile kernel with the retpoline compiler options to guard against
++        kernel-to-user data leaks by avoiding speculative indirect
++        branches. Requires a compiler with -mindirect-branch=thunk-extern
++        support for full protection. The kernel may run slower.
++
++        Without compiler support, at least indirect branches in assembler
++        code are eliminated. Since this includes the syscall entry path,
++        it is not entirely pointless.
++
+ if X86_32
+ config X86_EXTENDED_PLATFORM
+       bool "Support for extended (non-PC) x86 platforms"
+--- a/arch/x86/Makefile
++++ b/arch/x86/Makefile
+@@ -182,6 +182,16 @@ KBUILD_CFLAGS += -fno-asynchronous-unwin
+ KBUILD_CFLAGS += $(mflags-y)
+ KBUILD_AFLAGS += $(mflags-y)
++# Avoid indirect branches in kernel to deal with Spectre
++ifdef CONFIG_RETPOLINE
++    RETPOLINE_CFLAGS += $(call cc-option,-mindirect-branch=thunk-extern -mindirect-branch-register)
++    ifneq ($(RETPOLINE_CFLAGS),)
++        KBUILD_CFLAGS += $(RETPOLINE_CFLAGS) -DRETPOLINE
++    else
++        $(warning CONFIG_RETPOLINE=y, but not supported by the compiler. Toolchain update recommended.)
++    endif
++endif
++
+ archscripts: scripts_basic
+       $(Q)$(MAKE) $(build)=arch/x86/tools relocs
+--- a/arch/x86/include/asm/asm-prototypes.h
++++ b/arch/x86/include/asm/asm-prototypes.h
+@@ -10,7 +10,32 @@
+ #include <asm/pgtable.h>
+ #include <asm/special_insns.h>
+ #include <asm/preempt.h>
++#include <asm/asm.h>
+ #ifndef CONFIG_X86_CMPXCHG64
+ extern void cmpxchg8b_emu(void);
+ #endif
++
++#ifdef CONFIG_RETPOLINE
++#ifdef CONFIG_X86_32
++#define INDIRECT_THUNK(reg) extern asmlinkage void __x86_indirect_thunk_e ## reg(void);
++#else
++#define INDIRECT_THUNK(reg) extern asmlinkage void __x86_indirect_thunk_r ## reg(void);
++INDIRECT_THUNK(8)
++INDIRECT_THUNK(9)
++INDIRECT_THUNK(10)
++INDIRECT_THUNK(11)
++INDIRECT_THUNK(12)
++INDIRECT_THUNK(13)
++INDIRECT_THUNK(14)
++INDIRECT_THUNK(15)
++#endif
++INDIRECT_THUNK(ax)
++INDIRECT_THUNK(bx)
++INDIRECT_THUNK(cx)
++INDIRECT_THUNK(dx)
++INDIRECT_THUNK(si)
++INDIRECT_THUNK(di)
++INDIRECT_THUNK(bp)
++INDIRECT_THUNK(sp)
++#endif /* CONFIG_RETPOLINE */
+--- a/arch/x86/include/asm/cpufeatures.h
++++ b/arch/x86/include/asm/cpufeatures.h
+@@ -194,6 +194,9 @@
+ #define X86_FEATURE_HW_PSTATE ( 7*32+ 8) /* AMD HW-PState */
+ #define X86_FEATURE_PROC_FEEDBACK ( 7*32+ 9) /* AMD ProcFeedbackInterface */
++#define X86_FEATURE_RETPOLINE ( 7*32+12) /* Generic Retpoline mitigation for Spectre variant 2 */
++#define X86_FEATURE_RETPOLINE_AMD ( 7*32+13) /* AMD Retpoline mitigation for Spectre variant 2 */
++
+ #define X86_FEATURE_INTEL_PT  ( 7*32+15) /* Intel Processor Trace */
+ #define X86_FEATURE_AVX512_4VNNIW (7*32+16) /* AVX-512 Neural Network Instructions */
+ #define X86_FEATURE_AVX512_4FMAPS (7*32+17) /* AVX-512 Multiply Accumulation Single precision */
+--- /dev/null
++++ b/arch/x86/include/asm/nospec-branch.h
+@@ -0,0 +1,128 @@
++/* SPDX-License-Identifier: GPL-2.0 */
++
++#ifndef __NOSPEC_BRANCH_H__
++#define __NOSPEC_BRANCH_H__
++
++#include <asm/alternative.h>
++#include <asm/alternative-asm.h>
++#include <asm/cpufeatures.h>
++
++#ifdef __ASSEMBLY__
++
++/*
++ * This should be used immediately before a retpoline alternative.  It tells
++ * objtool where the retpolines are so that it can make sense of the control
++ * flow by just reading the original instruction(s) and ignoring the
++ * alternatives.
++ */
++.macro ANNOTATE_NOSPEC_ALTERNATIVE
++      .Lannotate_\@:
++      .pushsection .discard.nospec
++      .long .Lannotate_\@ - .
++      .popsection
++.endm
++
++/*
++ * These are the bare retpoline primitives for indirect jmp and call.
++ * Do not use these directly; they only exist to make the ALTERNATIVE
++ * invocation below less ugly.
++ */
++.macro RETPOLINE_JMP reg:req
++      call    .Ldo_rop_\@
++.Lspec_trap_\@:
++      pause
++      jmp     .Lspec_trap_\@
++.Ldo_rop_\@:
++      mov     \reg, (%_ASM_SP)
++      ret
++.endm
++
++/*
++ * This is a wrapper around RETPOLINE_JMP so the called function in reg
++ * returns to the instruction after the macro.
++ */
++.macro RETPOLINE_CALL reg:req
++      jmp     .Ldo_call_\@
++.Ldo_retpoline_jmp_\@:
++      RETPOLINE_JMP \reg
++.Ldo_call_\@:
++      call    .Ldo_retpoline_jmp_\@
++.endm
++
++/*
++ * JMP_NOSPEC and CALL_NOSPEC macros can be used instead of a simple
++ * indirect jmp/call which may be susceptible to the Spectre variant 2
++ * attack.
++ */
++.macro JMP_NOSPEC reg:req
++#ifdef CONFIG_RETPOLINE
++      ANNOTATE_NOSPEC_ALTERNATIVE
++      ALTERNATIVE_2 __stringify(jmp *\reg),                           \
++              __stringify(RETPOLINE_JMP \reg), X86_FEATURE_RETPOLINE, \
++              __stringify(lfence; jmp *\reg), X86_FEATURE_RETPOLINE_AMD
++#else
++      jmp     *\reg
++#endif
++.endm
++
++.macro CALL_NOSPEC reg:req
++#ifdef CONFIG_RETPOLINE
++      ANNOTATE_NOSPEC_ALTERNATIVE
++      ALTERNATIVE_2 __stringify(call *\reg),                          \
++              __stringify(RETPOLINE_CALL \reg), X86_FEATURE_RETPOLINE,\
++              __stringify(lfence; call *\reg), X86_FEATURE_RETPOLINE_AMD
++#else
++      call    *\reg
++#endif
++.endm
++
++#else /* __ASSEMBLY__ */
++
++#define ANNOTATE_NOSPEC_ALTERNATIVE                           \
++      "999:\n\t"                                              \
++      ".pushsection .discard.nospec\n\t"                      \
++      ".long 999b - .\n\t"                                    \
++      ".popsection\n\t"
++
++#if defined(CONFIG_X86_64) && defined(RETPOLINE)
++
++/*
++ * Since the inline asm uses the %V modifier which is only in newer GCC,
++ * the 64-bit one is dependent on RETPOLINE not CONFIG_RETPOLINE.
++ */
++# define CALL_NOSPEC                                          \
++      ANNOTATE_NOSPEC_ALTERNATIVE                             \
++      ALTERNATIVE(                                            \
++      "call *%[thunk_target]\n",                              \
++      "call __x86_indirect_thunk_%V[thunk_target]\n",         \
++      X86_FEATURE_RETPOLINE)
++# define THUNK_TARGET(addr) [thunk_target] "r" (addr)
++
++#elif defined(CONFIG_X86_32) && defined(CONFIG_RETPOLINE)
++/*
++ * For i386 we use the original ret-equivalent retpoline, because
++ * otherwise we'll run out of registers. We don't care about CET
++ * here, anyway.
++ */
++# define CALL_NOSPEC ALTERNATIVE("call *%[thunk_target]\n",   \
++      "       jmp    904f;\n"                                 \
++      "       .align 16\n"                                    \
++      "901:   call   903f;\n"                                 \
++      "902:   pause;\n"                                       \
++      "       jmp    902b;\n"                                 \
++      "       .align 16\n"                                    \
++      "903:   addl   $4, %%esp;\n"                            \
++      "       pushl  %[thunk_target];\n"                      \
++      "       ret;\n"                                         \
++      "       .align 16\n"                                    \
++      "904:   call   901b;\n",                                \
++      X86_FEATURE_RETPOLINE)
++
++# define THUNK_TARGET(addr) [thunk_target] "rm" (addr)
++#else /* No retpoline */
++# define CALL_NOSPEC "call *%[thunk_target]\n"
++# define THUNK_TARGET(addr) [thunk_target] "rm" (addr)
++#endif
++
++#endif /* __ASSEMBLY__ */
++#endif /* __NOSPEC_BRANCH_H__ */
+--- a/arch/x86/kernel/cpu/common.c
++++ b/arch/x86/kernel/cpu/common.c
+@@ -889,6 +889,10 @@ static void __init early_identify_cpu(st
+       setup_force_cpu_bug(X86_BUG_SPECTRE_V1);
+       setup_force_cpu_bug(X86_BUG_SPECTRE_V2);
++#ifdef CONFIG_RETPOLINE
++      setup_force_cpu_cap(X86_FEATURE_RETPOLINE);
++#endif
++
+       fpu__init_system(c);
+ #ifdef CONFIG_X86_32
+--- a/arch/x86/lib/Makefile
++++ b/arch/x86/lib/Makefile
+@@ -25,6 +25,7 @@ lib-y += memcpy_$(BITS).o
+ lib-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += rwsem.o
+ lib-$(CONFIG_INSTRUCTION_DECODER) += insn.o inat.o
+ lib-$(CONFIG_RANDOMIZE_BASE) += kaslr.o
++lib-$(CONFIG_RETPOLINE) += retpoline.o
+ obj-y += msr.o msr-reg.o msr-reg-export.o hweight.o
+--- /dev/null
++++ b/arch/x86/lib/retpoline.S
+@@ -0,0 +1,48 @@
++/* SPDX-License-Identifier: GPL-2.0 */
++
++#include <linux/stringify.h>
++#include <linux/linkage.h>
++#include <asm/dwarf2.h>
++#include <asm/cpufeatures.h>
++#include <asm/alternative-asm.h>
++#include <asm/export.h>
++#include <asm/nospec-branch.h>
++
++.macro THUNK reg
++      .section .text.__x86.indirect_thunk.\reg
++
++ENTRY(__x86_indirect_thunk_\reg)
++      CFI_STARTPROC
++      JMP_NOSPEC %\reg
++      CFI_ENDPROC
++ENDPROC(__x86_indirect_thunk_\reg)
++.endm
++
++/*
++ * Despite being an assembler file we can't just use .irp here
++ * because __KSYM_DEPS__ only uses the C preprocessor and would
++ * only see one instance of "__x86_indirect_thunk_\reg" rather
++ * than one per register with the correct names. So we do it
++ * the simple and nasty way...
++ */
++#define EXPORT_THUNK(reg) EXPORT_SYMBOL(__x86_indirect_thunk_ ## reg)
++#define GENERATE_THUNK(reg) THUNK reg ; EXPORT_THUNK(reg)
++
++GENERATE_THUNK(_ASM_AX)
++GENERATE_THUNK(_ASM_BX)
++GENERATE_THUNK(_ASM_CX)
++GENERATE_THUNK(_ASM_DX)
++GENERATE_THUNK(_ASM_SI)
++GENERATE_THUNK(_ASM_DI)
++GENERATE_THUNK(_ASM_BP)
++GENERATE_THUNK(_ASM_SP)
++#ifdef CONFIG_64BIT
++GENERATE_THUNK(r8)
++GENERATE_THUNK(r9)
++GENERATE_THUNK(r10)
++GENERATE_THUNK(r11)
++GENERATE_THUNK(r12)
++GENERATE_THUNK(r13)
++GENERATE_THUNK(r14)
++GENERATE_THUNK(r15)
++#endif
diff --git a/queue-4.9/x86-retpoline-checksum32-convert-assembler-indirect-jumps.patch b/queue-4.9/x86-retpoline-checksum32-convert-assembler-indirect-jumps.patch
new file mode 100644 (file)
index 0000000..c40ee9e
--- /dev/null
@@ -0,0 +1,67 @@
+From 5096732f6f695001fa2d6f1335a2680b37912c69 Mon Sep 17 00:00:00 2001
+From: David Woodhouse <dwmw@amazon.co.uk>
+Date: Thu, 11 Jan 2018 21:46:32 +0000
+Subject: x86/retpoline/checksum32: Convert assembler indirect jumps
+
+From: David Woodhouse <dwmw@amazon.co.uk>
+
+commit 5096732f6f695001fa2d6f1335a2680b37912c69 upstream.
+
+Convert all indirect jumps in 32bit checksum assembler code to use
+non-speculative sequences when CONFIG_RETPOLINE is enabled.
+
+Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Acked-by: Arjan van de Ven <arjan@linux.intel.com>
+Acked-by: Ingo Molnar <mingo@kernel.org>
+Cc: gnomes@lxorguk.ukuu.org.uk
+Cc: Rik van Riel <riel@redhat.com>
+Cc: Andi Kleen <ak@linux.intel.com>
+Cc: Josh Poimboeuf <jpoimboe@redhat.com>
+Cc: thomas.lendacky@amd.com
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Jiri Kosina <jikos@kernel.org>
+Cc: Andy Lutomirski <luto@amacapital.net>
+Cc: Dave Hansen <dave.hansen@intel.com>
+Cc: Kees Cook <keescook@google.com>
+Cc: Tim Chen <tim.c.chen@linux.intel.com>
+Cc: Greg Kroah-Hartman <gregkh@linux-foundation.org>
+Cc: Paul Turner <pjt@google.com>
+Link: https://lkml.kernel.org/r/1515707194-20531-11-git-send-email-dwmw@amazon.co.uk
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ arch/x86/lib/checksum_32.S |    7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+--- a/arch/x86/lib/checksum_32.S
++++ b/arch/x86/lib/checksum_32.S
+@@ -29,7 +29,8 @@
+ #include <asm/errno.h>
+ #include <asm/asm.h>
+ #include <asm/export.h>
+-                              
++#include <asm/nospec-branch.h>
++
+ /*
+  * computes a partial checksum, e.g. for TCP/UDP fragments
+  */
+@@ -156,7 +157,7 @@ ENTRY(csum_partial)
+       negl %ebx
+       lea 45f(%ebx,%ebx,2), %ebx
+       testl %esi, %esi
+-      jmp *%ebx
++      JMP_NOSPEC %ebx
+       # Handle 2-byte-aligned regions
+ 20:   addw (%esi), %ax
+@@ -439,7 +440,7 @@ ENTRY(csum_partial_copy_generic)
+       andl $-32,%edx
+       lea 3f(%ebx,%ebx), %ebx
+       testl %esi, %esi 
+-      jmp *%ebx
++      JMP_NOSPEC %ebx
+ 1:    addl $64,%esi
+       addl $64,%edi 
+       SRC(movb -32(%edx),%bl) ; SRC(movb (%edx),%bl)
diff --git a/queue-4.9/x86-retpoline-crypto-convert-crypto-assembler-indirect-jumps.patch b/queue-4.9/x86-retpoline-crypto-convert-crypto-assembler-indirect-jumps.patch
new file mode 100644 (file)
index 0000000..e9b7176
--- /dev/null
@@ -0,0 +1,125 @@
+From 9697fa39efd3fc3692f2949d4045f393ec58450b Mon Sep 17 00:00:00 2001
+From: David Woodhouse <dwmw@amazon.co.uk>
+Date: Thu, 11 Jan 2018 21:46:27 +0000
+Subject: x86/retpoline/crypto: Convert crypto assembler indirect jumps
+
+From: David Woodhouse <dwmw@amazon.co.uk>
+
+commit 9697fa39efd3fc3692f2949d4045f393ec58450b upstream.
+
+Convert all indirect jumps in crypto assembler code to use non-speculative
+sequences when CONFIG_RETPOLINE is enabled.
+
+Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Acked-by: Arjan van de Ven <arjan@linux.intel.com>
+Acked-by: Ingo Molnar <mingo@kernel.org>
+Cc: gnomes@lxorguk.ukuu.org.uk
+Cc: Rik van Riel <riel@redhat.com>
+Cc: Andi Kleen <ak@linux.intel.com>
+Cc: Josh Poimboeuf <jpoimboe@redhat.com>
+Cc: thomas.lendacky@amd.com
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Jiri Kosina <jikos@kernel.org>
+Cc: Andy Lutomirski <luto@amacapital.net>
+Cc: Dave Hansen <dave.hansen@intel.com>
+Cc: Kees Cook <keescook@google.com>
+Cc: Tim Chen <tim.c.chen@linux.intel.com>
+Cc: Greg Kroah-Hartman <gregkh@linux-foundation.org>
+Cc: Paul Turner <pjt@google.com>
+Link: https://lkml.kernel.org/r/1515707194-20531-6-git-send-email-dwmw@amazon.co.uk
+Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ arch/x86/crypto/aesni-intel_asm.S            |    5 +++--
+ arch/x86/crypto/camellia-aesni-avx-asm_64.S  |    3 ++-
+ arch/x86/crypto/camellia-aesni-avx2-asm_64.S |    3 ++-
+ arch/x86/crypto/crc32c-pcl-intel-asm_64.S    |    3 ++-
+ 4 files changed, 9 insertions(+), 5 deletions(-)
+
+--- a/arch/x86/crypto/aesni-intel_asm.S
++++ b/arch/x86/crypto/aesni-intel_asm.S
+@@ -32,6 +32,7 @@
+ #include <linux/linkage.h>
+ #include <asm/inst.h>
+ #include <asm/frame.h>
++#include <asm/nospec-branch.h>
+ /*
+  * The following macros are used to move an (un)aligned 16 byte value to/from
+@@ -2734,7 +2735,7 @@ ENTRY(aesni_xts_crypt8)
+       pxor INC, STATE4
+       movdqu IV, 0x30(OUTP)
+-      call *%r11
++      CALL_NOSPEC %r11
+       movdqu 0x00(OUTP), INC
+       pxor INC, STATE1
+@@ -2779,7 +2780,7 @@ ENTRY(aesni_xts_crypt8)
+       _aesni_gf128mul_x_ble()
+       movups IV, (IVP)
+-      call *%r11
++      CALL_NOSPEC %r11
+       movdqu 0x40(OUTP), INC
+       pxor INC, STATE1
+--- a/arch/x86/crypto/camellia-aesni-avx-asm_64.S
++++ b/arch/x86/crypto/camellia-aesni-avx-asm_64.S
+@@ -17,6 +17,7 @@
+ #include <linux/linkage.h>
+ #include <asm/frame.h>
++#include <asm/nospec-branch.h>
+ #define CAMELLIA_TABLE_BYTE_LEN 272
+@@ -1224,7 +1225,7 @@ camellia_xts_crypt_16way:
+       vpxor 14 * 16(%rax), %xmm15, %xmm14;
+       vpxor 15 * 16(%rax), %xmm15, %xmm15;
+-      call *%r9;
++      CALL_NOSPEC %r9;
+       addq $(16 * 16), %rsp;
+--- a/arch/x86/crypto/camellia-aesni-avx2-asm_64.S
++++ b/arch/x86/crypto/camellia-aesni-avx2-asm_64.S
+@@ -12,6 +12,7 @@
+ #include <linux/linkage.h>
+ #include <asm/frame.h>
++#include <asm/nospec-branch.h>
+ #define CAMELLIA_TABLE_BYTE_LEN 272
+@@ -1337,7 +1338,7 @@ camellia_xts_crypt_32way:
+       vpxor 14 * 32(%rax), %ymm15, %ymm14;
+       vpxor 15 * 32(%rax), %ymm15, %ymm15;
+-      call *%r9;
++      CALL_NOSPEC %r9;
+       addq $(16 * 32), %rsp;
+--- a/arch/x86/crypto/crc32c-pcl-intel-asm_64.S
++++ b/arch/x86/crypto/crc32c-pcl-intel-asm_64.S
+@@ -45,6 +45,7 @@
+ #include <asm/inst.h>
+ #include <linux/linkage.h>
++#include <asm/nospec-branch.h>
+ ## ISCSI CRC 32 Implementation with crc32 and pclmulqdq Instruction
+@@ -172,7 +173,7 @@ continue_block:
+       movzxw  (bufp, %rax, 2), len
+       lea     crc_array(%rip), bufp
+       lea     (bufp, len, 1), bufp
+-      jmp     *bufp
++      JMP_NOSPEC bufp
+       ################################################################
+       ## 2a) PROCESS FULL BLOCKS:
diff --git a/queue-4.9/x86-retpoline-entry-convert-entry-assembler-indirect-jumps.patch b/queue-4.9/x86-retpoline-entry-convert-entry-assembler-indirect-jumps.patch
new file mode 100644 (file)
index 0000000..ea6e7ec
--- /dev/null
@@ -0,0 +1,117 @@
+From 2641f08bb7fc63a636a2b18173221d7040a3512e Mon Sep 17 00:00:00 2001
+From: David Woodhouse <dwmw@amazon.co.uk>
+Date: Thu, 11 Jan 2018 21:46:28 +0000
+Subject: x86/retpoline/entry: Convert entry assembler indirect jumps
+
+From: David Woodhouse <dwmw@amazon.co.uk>
+
+commit 2641f08bb7fc63a636a2b18173221d7040a3512e upstream.
+
+Convert indirect jumps in core 32/64bit entry assembler code to use
+non-speculative sequences when CONFIG_RETPOLINE is enabled.
+
+Don't use CALL_NOSPEC in entry_SYSCALL_64_fastpath because the return
+address after the 'call' instruction must be *precisely* at the
+.Lentry_SYSCALL_64_after_fastpath label for stub_ptregs_64 to work,
+and the use of alternatives will mess that up unless we play horrid
+games to prepend with NOPs and make the variants the same length. It's
+not worth it; in the case where we ALTERNATIVE out the retpoline, the
+first instruction at __x86.indirect_thunk.rax is going to be a bare
+jmp *%rax anyway.
+
+Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Acked-by: Ingo Molnar <mingo@kernel.org>
+Acked-by: Arjan van de Ven <arjan@linux.intel.com>
+Cc: gnomes@lxorguk.ukuu.org.uk
+Cc: Rik van Riel <riel@redhat.com>
+Cc: Andi Kleen <ak@linux.intel.com>
+Cc: Josh Poimboeuf <jpoimboe@redhat.com>
+Cc: thomas.lendacky@amd.com
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Jiri Kosina <jikos@kernel.org>
+Cc: Andy Lutomirski <luto@amacapital.net>
+Cc: Dave Hansen <dave.hansen@intel.com>
+Cc: Kees Cook <keescook@google.com>
+Cc: Tim Chen <tim.c.chen@linux.intel.com>
+Cc: Greg Kroah-Hartman <gregkh@linux-foundation.org>
+Cc: Paul Turner <pjt@google.com>
+Link: https://lkml.kernel.org/r/1515707194-20531-7-git-send-email-dwmw@amazon.co.uk
+Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ arch/x86/entry/entry_32.S |    5 +++--
+ arch/x86/entry/entry_64.S |   10 ++++++++--
+ 2 files changed, 11 insertions(+), 4 deletions(-)
+
+--- a/arch/x86/entry/entry_32.S
++++ b/arch/x86/entry/entry_32.S
+@@ -45,6 +45,7 @@
+ #include <asm/asm.h>
+ #include <asm/smap.h>
+ #include <asm/export.h>
++#include <asm/nospec-branch.h>
+       .section .entry.text, "ax"
+@@ -260,7 +261,7 @@ ENTRY(ret_from_fork)
+       /* kernel thread */
+ 1:    movl    %edi, %eax
+-      call    *%ebx
++      CALL_NOSPEC %ebx
+       /*
+        * A kernel thread is allowed to return here after successfully
+        * calling do_execve().  Exit to userspace to complete the execve()
+@@ -1062,7 +1063,7 @@ error_code:
+       movl    %ecx, %es
+       TRACE_IRQS_OFF
+       movl    %esp, %eax                      # pt_regs pointer
+-      call    *%edi
++      CALL_NOSPEC %edi
+       jmp     ret_from_exception
+ END(page_fault)
+--- a/arch/x86/entry/entry_64.S
++++ b/arch/x86/entry/entry_64.S
+@@ -37,6 +37,7 @@
+ #include <asm/pgtable_types.h>
+ #include <asm/export.h>
+ #include <asm/kaiser.h>
++#include <asm/nospec-branch.h>
+ #include <linux/err.h>
+ /* Avoid __ASSEMBLER__'ifying <linux/audit.h> just for this.  */
+@@ -208,7 +209,12 @@ entry_SYSCALL_64_fastpath:
+        * It might end up jumping to the slow path.  If it jumps, RAX
+        * and all argument registers are clobbered.
+        */
++#ifdef CONFIG_RETPOLINE
++      movq    sys_call_table(, %rax, 8), %rax
++      call    __x86_indirect_thunk_rax
++#else
+       call    *sys_call_table(, %rax, 8)
++#endif
+ .Lentry_SYSCALL_64_after_fastpath_call:
+       movq    %rax, RAX(%rsp)
+@@ -380,7 +386,7 @@ ENTRY(stub_ptregs_64)
+       jmp     entry_SYSCALL64_slow_path
+ 1:
+-      jmp     *%rax                           /* Called from C */
++      JMP_NOSPEC %rax                         /* Called from C */
+ END(stub_ptregs_64)
+ .macro ptregs_stub func
+@@ -457,7 +463,7 @@ ENTRY(ret_from_fork)
+ 1:
+       /* kernel thread */
+       movq    %r12, %rdi
+-      call    *%rbx
++      CALL_NOSPEC %rbx
+       /*
+        * A kernel thread is allowed to return here after successfully
+        * calling do_execve().  Exit to userspace to complete the execve()
diff --git a/queue-4.9/x86-retpoline-fill-return-stack-buffer-on-vmexit.patch b/queue-4.9/x86-retpoline-fill-return-stack-buffer-on-vmexit.patch
new file mode 100644 (file)
index 0000000..07c950e
--- /dev/null
@@ -0,0 +1,188 @@
+From 117cc7a908c83697b0b737d15ae1eb5943afe35b Mon Sep 17 00:00:00 2001
+From: David Woodhouse <dwmw@amazon.co.uk>
+Date: Fri, 12 Jan 2018 11:11:27 +0000
+Subject: x86/retpoline: Fill return stack buffer on vmexit
+
+From: David Woodhouse <dwmw@amazon.co.uk>
+
+commit 117cc7a908c83697b0b737d15ae1eb5943afe35b upstream.
+
+In accordance with the Intel and AMD documentation, we need to overwrite
+all entries in the RSB on exiting a guest, to prevent malicious branch
+target predictions from affecting the host kernel. This is needed both
+for retpoline and for IBRS.
+
+[ak: numbers again for the RSB stuffing labels]
+
+Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Tested-by: Peter Zijlstra (Intel) <peterz@infradead.org>
+Cc: gnomes@lxorguk.ukuu.org.uk
+Cc: Rik van Riel <riel@redhat.com>
+Cc: Andi Kleen <ak@linux.intel.com>
+Cc: Josh Poimboeuf <jpoimboe@redhat.com>
+Cc: thomas.lendacky@amd.com
+Cc: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Jiri Kosina <jikos@kernel.org>
+Cc: Andy Lutomirski <luto@amacapital.net>
+Cc: Dave Hansen <dave.hansen@intel.com>
+Cc: Kees Cook <keescook@google.com>
+Cc: Tim Chen <tim.c.chen@linux.intel.com>
+Cc: Greg Kroah-Hartman <gregkh@linux-foundation.org>
+Cc: Paul Turner <pjt@google.com>
+Link: https://lkml.kernel.org/r/1515755487-8524-1-git-send-email-dwmw@amazon.co.uk
+Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ arch/x86/include/asm/nospec-branch.h |   78 ++++++++++++++++++++++++++++++++++-
+ arch/x86/kvm/svm.c                   |    4 +
+ arch/x86/kvm/vmx.c                   |    4 +
+ 3 files changed, 85 insertions(+), 1 deletion(-)
+
+--- a/arch/x86/include/asm/nospec-branch.h
++++ b/arch/x86/include/asm/nospec-branch.h
+@@ -7,6 +7,48 @@
+ #include <asm/alternative-asm.h>
+ #include <asm/cpufeatures.h>
++/*
++ * Fill the CPU return stack buffer.
++ *
++ * Each entry in the RSB, if used for a speculative 'ret', contains an
++ * infinite 'pause; jmp' loop to capture speculative execution.
++ *
++ * This is required in various cases for retpoline and IBRS-based
++ * mitigations for the Spectre variant 2 vulnerability. Sometimes to
++ * eliminate potentially bogus entries from the RSB, and sometimes
++ * purely to ensure that it doesn't get empty, which on some CPUs would
++ * allow predictions from other (unwanted!) sources to be used.
++ *
++ * We define a CPP macro such that it can be used from both .S files and
++ * inline assembly. It's possible to do a .macro and then include that
++ * from C via asm(".include <asm/nospec-branch.h>") but let's not go there.
++ */
++
++#define RSB_CLEAR_LOOPS               32      /* To forcibly overwrite all entries */
++#define RSB_FILL_LOOPS                16      /* To avoid underflow */
++
++/*
++ * Google experimented with loop-unrolling and this turned out to be
++ * the optimal version â€” two calls, each with their own speculation
++ * trap should their return address end up getting used, in a loop.
++ */
++#define __FILL_RETURN_BUFFER(reg, nr, sp)     \
++      mov     $(nr/2), reg;                   \
++771:                                          \
++      call    772f;                           \
++773:  /* speculation trap */                  \
++      pause;                                  \
++      jmp     773b;                           \
++772:                                          \
++      call    774f;                           \
++775:  /* speculation trap */                  \
++      pause;                                  \
++      jmp     775b;                           \
++774:                                          \
++      dec     reg;                            \
++      jnz     771b;                           \
++      add     $(BITS_PER_LONG/8) * nr, sp;
++
+ #ifdef __ASSEMBLY__
+ /*
+@@ -76,6 +118,20 @@
+ #endif
+ .endm
++ /*
++  * A simpler FILL_RETURN_BUFFER macro. Don't make people use the CPP
++  * monstrosity above, manually.
++  */
++.macro FILL_RETURN_BUFFER reg:req nr:req ftr:req
++#ifdef CONFIG_RETPOLINE
++      ANNOTATE_NOSPEC_ALTERNATIVE
++      ALTERNATIVE "jmp .Lskip_rsb_\@",                                \
++              __stringify(__FILL_RETURN_BUFFER(\reg,\nr,%_ASM_SP))    \
++              \ftr
++.Lskip_rsb_\@:
++#endif
++.endm
++
+ #else /* __ASSEMBLY__ */
+ #define ANNOTATE_NOSPEC_ALTERNATIVE                           \
+@@ -119,7 +175,7 @@
+       X86_FEATURE_RETPOLINE)
+ # define THUNK_TARGET(addr) [thunk_target] "rm" (addr)
+-#else /* No retpoline */
++#else /* No retpoline for C / inline asm */
+ # define CALL_NOSPEC "call *%[thunk_target]\n"
+ # define THUNK_TARGET(addr) [thunk_target] "rm" (addr)
+ #endif
+@@ -134,5 +190,25 @@ enum spectre_v2_mitigation {
+       SPECTRE_V2_IBRS,
+ };
++/*
++ * On VMEXIT we must ensure that no RSB predictions learned in the guest
++ * can be followed in the host, by overwriting the RSB completely. Both
++ * retpoline and IBRS mitigations for Spectre v2 need this; only on future
++ * CPUs with IBRS_ATT *might* it be avoided.
++ */
++static inline void vmexit_fill_RSB(void)
++{
++#ifdef CONFIG_RETPOLINE
++      unsigned long loops = RSB_CLEAR_LOOPS / 2;
++
++      asm volatile (ANNOTATE_NOSPEC_ALTERNATIVE
++                    ALTERNATIVE("jmp 910f",
++                                __stringify(__FILL_RETURN_BUFFER(%0, RSB_CLEAR_LOOPS, %1)),
++                                X86_FEATURE_RETPOLINE)
++                    "910:"
++                    : "=&r" (loops), ASM_CALL_CONSTRAINT
++                    : "r" (loops) : "memory" );
++#endif
++}
+ #endif /* __ASSEMBLY__ */
+ #endif /* __NOSPEC_BRANCH_H__ */
+--- a/arch/x86/kvm/svm.c
++++ b/arch/x86/kvm/svm.c
+@@ -44,6 +44,7 @@
+ #include <asm/debugreg.h>
+ #include <asm/kvm_para.h>
+ #include <asm/irq_remapping.h>
++#include <asm/nospec-branch.h>
+ #include <asm/virtext.h>
+ #include "trace.h"
+@@ -4917,6 +4918,9 @@ static void svm_vcpu_run(struct kvm_vcpu
+ #endif
+               );
++      /* Eliminate branch target predictions from guest mode */
++      vmexit_fill_RSB();
++
+ #ifdef CONFIG_X86_64
+       wrmsrl(MSR_GS_BASE, svm->host.gs_base);
+ #else
+--- a/arch/x86/kvm/vmx.c
++++ b/arch/x86/kvm/vmx.c
+@@ -48,6 +48,7 @@
+ #include <asm/kexec.h>
+ #include <asm/apic.h>
+ #include <asm/irq_remapping.h>
++#include <asm/nospec-branch.h>
+ #include "trace.h"
+ #include "pmu.h"
+@@ -9026,6 +9027,9 @@ static void __noclone vmx_vcpu_run(struc
+ #endif
+             );
++      /* Eliminate branch target predictions from guest mode */
++      vmexit_fill_RSB();
++
+       /* MSR_IA32_DEBUGCTLMSR is zeroed on vmexit. Restore it if needed */
+       if (debugctlmsr)
+               update_debugctlmsr(debugctlmsr);
diff --git a/queue-4.9/x86-retpoline-ftrace-convert-ftrace-assembler-indirect-jumps.patch b/queue-4.9/x86-retpoline-ftrace-convert-ftrace-assembler-indirect-jumps.patch
new file mode 100644 (file)
index 0000000..17aeb29
--- /dev/null
@@ -0,0 +1,88 @@
+From 9351803bd803cdbeb9b5a7850b7b6f464806e3db Mon Sep 17 00:00:00 2001
+From: David Woodhouse <dwmw@amazon.co.uk>
+Date: Thu, 11 Jan 2018 21:46:29 +0000
+Subject: x86/retpoline/ftrace: Convert ftrace assembler indirect jumps
+
+From: David Woodhouse <dwmw@amazon.co.uk>
+
+commit 9351803bd803cdbeb9b5a7850b7b6f464806e3db upstream.
+
+Convert all indirect jumps in ftrace assembler code to use non-speculative
+sequences when CONFIG_RETPOLINE is enabled.
+
+Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Acked-by: Arjan van de Ven <arjan@linux.intel.com>
+Acked-by: Ingo Molnar <mingo@kernel.org>
+Cc: gnomes@lxorguk.ukuu.org.uk
+Cc: Rik van Riel <riel@redhat.com>
+Cc: Andi Kleen <ak@linux.intel.com>
+Cc: Josh Poimboeuf <jpoimboe@redhat.com>
+Cc: thomas.lendacky@amd.com
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Jiri Kosina <jikos@kernel.org>
+Cc: Andy Lutomirski <luto@amacapital.net>
+Cc: Dave Hansen <dave.hansen@intel.com>
+Cc: Kees Cook <keescook@google.com>
+Cc: Tim Chen <tim.c.chen@linux.intel.com>
+Cc: Greg Kroah-Hartman <gregkh@linux-foundation.org>
+Cc: Paul Turner <pjt@google.com>
+Link: https://lkml.kernel.org/r/1515707194-20531-8-git-send-email-dwmw@amazon.co.uk
+Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ arch/x86/entry/entry_32.S   |    5 +++--
+ arch/x86/kernel/mcount_64.S |    7 ++++---
+ 2 files changed, 7 insertions(+), 5 deletions(-)
+
+--- a/arch/x86/entry/entry_32.S
++++ b/arch/x86/entry/entry_32.S
+@@ -985,7 +985,8 @@ trace:
+       movl    0x4(%ebp), %edx
+       subl    $MCOUNT_INSN_SIZE, %eax
+-      call    *ftrace_trace_function
++      movl    ftrace_trace_function, %ecx
++      CALL_NOSPEC %ecx
+       popl    %edx
+       popl    %ecx
+@@ -1021,7 +1022,7 @@ return_to_handler:
+       movl    %eax, %ecx
+       popl    %edx
+       popl    %eax
+-      jmp     *%ecx
++      JMP_NOSPEC %ecx
+ #endif
+ #ifdef CONFIG_TRACING
+--- a/arch/x86/kernel/mcount_64.S
++++ b/arch/x86/kernel/mcount_64.S
+@@ -8,7 +8,7 @@
+ #include <asm/ptrace.h>
+ #include <asm/ftrace.h>
+ #include <asm/export.h>
+-
++#include <asm/nospec-branch.h>
+       .code64
+       .section .entry.text, "ax"
+@@ -290,8 +290,9 @@ trace:
+        * ip and parent ip are used and the list function is called when
+        * function tracing is enabled.
+        */
+-      call   *ftrace_trace_function
++      movq ftrace_trace_function, %r8
++      CALL_NOSPEC %r8
+       restore_mcount_regs
+       jmp fgraph_trace
+@@ -334,5 +335,5 @@ GLOBAL(return_to_handler)
+       movq 8(%rsp), %rdx
+       movq (%rsp), %rax
+       addq $24, %rsp
+-      jmp *%rdi
++      JMP_NOSPEC %rdi
+ #endif
diff --git a/queue-4.9/x86-retpoline-hyperv-convert-assembler-indirect-jumps.patch b/queue-4.9/x86-retpoline-hyperv-convert-assembler-indirect-jumps.patch
new file mode 100644 (file)
index 0000000..4114df9
--- /dev/null
@@ -0,0 +1,76 @@
+From e70e5892b28c18f517f29ab6e83bd57705104b31 Mon Sep 17 00:00:00 2001
+From: David Woodhouse <dwmw@amazon.co.uk>
+Date: Thu, 11 Jan 2018 21:46:30 +0000
+Subject: x86/retpoline/hyperv: Convert assembler indirect jumps
+
+From: David Woodhouse <dwmw@amazon.co.uk>
+
+commit e70e5892b28c18f517f29ab6e83bd57705104b31 upstream.
+
+Convert all indirect jumps in hyperv inline asm code to use non-speculative
+sequences when CONFIG_RETPOLINE is enabled.
+
+Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Acked-by: Arjan van de Ven <arjan@linux.intel.com>
+Acked-by: Ingo Molnar <mingo@kernel.org>
+Cc: gnomes@lxorguk.ukuu.org.uk
+Cc: Rik van Riel <riel@redhat.com>
+Cc: Andi Kleen <ak@linux.intel.com>
+Cc: Josh Poimboeuf <jpoimboe@redhat.com>
+Cc: thomas.lendacky@amd.com
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Jiri Kosina <jikos@kernel.org>
+Cc: Andy Lutomirski <luto@amacapital.net>
+Cc: Dave Hansen <dave.hansen@intel.com>
+Cc: Kees Cook <keescook@google.com>
+Cc: Tim Chen <tim.c.chen@linux.intel.com>
+Cc: Greg Kroah-Hartman <gregkh@linux-foundation.org>
+Cc: Paul Turner <pjt@google.com>
+Link: https://lkml.kernel.org/r/1515707194-20531-9-git-send-email-dwmw@amazon.co.uk
+[ backport to 4.9, hopefully correct, not tested... - gregkh ]
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/hv/hv.c |   11 +++++++----
+ 1 file changed, 7 insertions(+), 4 deletions(-)
+
+--- a/drivers/hv/hv.c
++++ b/drivers/hv/hv.c
+@@ -31,6 +31,7 @@
+ #include <linux/clockchips.h>
+ #include <asm/hyperv.h>
+ #include <asm/mshyperv.h>
++#include <asm/nospec-branch.h>
+ #include "hyperv_vmbus.h"
+ /* The one and only */
+@@ -103,9 +104,10 @@ u64 hv_do_hypercall(u64 control, void *i
+               return (u64)ULLONG_MAX;
+       __asm__ __volatile__("mov %0, %%r8" : : "r" (output_address) : "r8");
+-      __asm__ __volatile__("call *%3" : "=a" (hv_status) :
++      __asm__ __volatile__(CALL_NOSPEC :
++                           "=a" (hv_status) :
+                            "c" (control), "d" (input_address),
+-                           "m" (hypercall_page));
++                           THUNK_TARGET(hypercall_page));
+       return hv_status;
+@@ -123,11 +125,12 @@ u64 hv_do_hypercall(u64 control, void *i
+       if (!hypercall_page)
+               return (u64)ULLONG_MAX;
+-      __asm__ __volatile__ ("call *%8" : "=d"(hv_status_hi),
++      __asm__ __volatile__ (CALL_NOSPEC : "=d"(hv_status_hi),
+                             "=a"(hv_status_lo) : "d" (control_hi),
+                             "a" (control_lo), "b" (input_address_hi),
+                             "c" (input_address_lo), "D"(output_address_hi),
+-                            "S"(output_address_lo), "m" (hypercall_page));
++                            "S"(output_address_lo),
++                            THUNK_TARGET(hypercall_page));
+       return hv_status_lo | ((u64)hv_status_hi << 32);
+ #endif /* !x86_64 */
diff --git a/queue-4.9/x86-retpoline-irq32-convert-assembler-indirect-jumps.patch b/queue-4.9/x86-retpoline-irq32-convert-assembler-indirect-jumps.patch
new file mode 100644 (file)
index 0000000..029afab
--- /dev/null
@@ -0,0 +1,74 @@
+From 7614e913db1f40fff819b36216484dc3808995d4 Mon Sep 17 00:00:00 2001
+From: Andi Kleen <ak@linux.intel.com>
+Date: Thu, 11 Jan 2018 21:46:33 +0000
+Subject: x86/retpoline/irq32: Convert assembler indirect jumps
+
+From: Andi Kleen <ak@linux.intel.com>
+
+commit 7614e913db1f40fff819b36216484dc3808995d4 upstream.
+
+Convert all indirect jumps in 32bit irq inline asm code to use non
+speculative sequences.
+
+Signed-off-by: Andi Kleen <ak@linux.intel.com>
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Acked-by: Arjan van de Ven <arjan@linux.intel.com>
+Acked-by: Ingo Molnar <mingo@kernel.org>
+Cc: gnomes@lxorguk.ukuu.org.uk
+Cc: Rik van Riel <riel@redhat.com>
+Cc: Josh Poimboeuf <jpoimboe@redhat.com>
+Cc: thomas.lendacky@amd.com
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Jiri Kosina <jikos@kernel.org>
+Cc: Andy Lutomirski <luto@amacapital.net>
+Cc: Dave Hansen <dave.hansen@intel.com>
+Cc: Kees Cook <keescook@google.com>
+Cc: Tim Chen <tim.c.chen@linux.intel.com>
+Cc: Greg Kroah-Hartman <gregkh@linux-foundation.org>
+Cc: Paul Turner <pjt@google.com>
+Link: https://lkml.kernel.org/r/1515707194-20531-12-git-send-email-dwmw@amazon.co.uk
+Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ arch/x86/kernel/irq_32.c |    9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+--- a/arch/x86/kernel/irq_32.c
++++ b/arch/x86/kernel/irq_32.c
+@@ -19,6 +19,7 @@
+ #include <linux/mm.h>
+ #include <asm/apic.h>
++#include <asm/nospec-branch.h>
+ #ifdef CONFIG_DEBUG_STACKOVERFLOW
+@@ -54,11 +55,11 @@ DEFINE_PER_CPU(struct irq_stack *, softi
+ static void call_on_stack(void *func, void *stack)
+ {
+       asm volatile("xchgl     %%ebx,%%esp     \n"
+-                   "call      *%%edi          \n"
++                   CALL_NOSPEC
+                    "movl      %%ebx,%%esp     \n"
+                    : "=b" (stack)
+                    : "0" (stack),
+-                     "D"(func)
++                     [thunk_target] "D"(func)
+                    : "memory", "cc", "edx", "ecx", "eax");
+ }
+@@ -94,11 +95,11 @@ static inline int execute_on_irq_stack(i
+               call_on_stack(print_stack_overflow, isp);
+       asm volatile("xchgl     %%ebx,%%esp     \n"
+-                   "call      *%%edi          \n"
++                   CALL_NOSPEC
+                    "movl      %%ebx,%%esp     \n"
+                    : "=a" (arg1), "=b" (isp)
+                    :  "0" (desc),   "1" (isp),
+-                      "D" (desc->handle_irq)
++                      [thunk_target] "D" (desc->handle_irq)
+                    : "memory", "cc", "ecx");
+       return 1;
+ }
diff --git a/queue-4.9/x86-retpoline-remove-compile-time-warning.patch b/queue-4.9/x86-retpoline-remove-compile-time-warning.patch
new file mode 100644 (file)
index 0000000..24dd1c7
--- /dev/null
@@ -0,0 +1,60 @@
+From b8b9ce4b5aec8de9e23cabb0a26b78641f9ab1d6 Mon Sep 17 00:00:00 2001
+From: Thomas Gleixner <tglx@linutronix.de>
+Date: Sun, 14 Jan 2018 22:13:29 +0100
+Subject: x86/retpoline: Remove compile time warning
+
+From: Thomas Gleixner <tglx@linutronix.de>
+
+commit b8b9ce4b5aec8de9e23cabb0a26b78641f9ab1d6 upstream.
+
+Remove the compile time warning when CONFIG_RETPOLINE=y and the compiler
+does not have retpoline support. Linus rationale for this is:
+
+  It's wrong because it will just make people turn off RETPOLINE, and the
+  asm updates - and return stack clearing - that are independent of the
+  compiler are likely the most important parts because they are likely the
+  ones easiest to target.
+
+  And it's annoying because most people won't be able to do anything about
+  it. The number of people building their own compiler? Very small. So if
+  their distro hasn't got a compiler yet (and pretty much nobody does), the
+  warning is just annoying crap.
+
+  It is already properly reported as part of the sysfs interface. The
+  compile-time warning only encourages bad things.
+
+Fixes: 76b043848fd2 ("x86/retpoline: Add initial retpoline support")
+Requested-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Cc: David Woodhouse <dwmw@amazon.co.uk>
+Cc: Peter Zijlstra (Intel) <peterz@infradead.org>
+Cc: gnomes@lxorguk.ukuu.org.uk
+Cc: Rik van Riel <riel@redhat.com>
+Cc: Andi Kleen <ak@linux.intel.com>
+Cc: Josh Poimboeuf <jpoimboe@redhat.com>
+Cc: thomas.lendacky@amd.com
+Cc: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Jiri Kosina <jikos@kernel.org>
+Cc: Andy Lutomirski <luto@amacapital.net>
+Cc: Dave Hansen <dave.hansen@intel.com>
+Cc: Kees Cook <keescook@google.com>
+Cc: Tim Chen <tim.c.chen@linux.intel.com>
+Cc: Greg Kroah-Hartman <gregkh@linux-foundation.org>
+Link: https://lkml.kernel.org/r/CA+55aFzWgquv4i6Mab6bASqYXg3ErV3XDFEYf=GEcCDQg5uAtw@mail.gmail.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ arch/x86/Makefile |    2 --
+ 1 file changed, 2 deletions(-)
+
+--- a/arch/x86/Makefile
++++ b/arch/x86/Makefile
+@@ -187,8 +187,6 @@ ifdef CONFIG_RETPOLINE
+     RETPOLINE_CFLAGS += $(call cc-option,-mindirect-branch=thunk-extern -mindirect-branch-register)
+     ifneq ($(RETPOLINE_CFLAGS),)
+         KBUILD_CFLAGS += $(RETPOLINE_CFLAGS) -DRETPOLINE
+-    else
+-        $(warning CONFIG_RETPOLINE=y, but not supported by the compiler. Toolchain update recommended.)
+     endif
+ endif
diff --git a/queue-4.9/x86-retpoline-xen-convert-xen-hypercall-indirect-jumps.patch b/queue-4.9/x86-retpoline-xen-convert-xen-hypercall-indirect-jumps.patch
new file mode 100644 (file)
index 0000000..55da2ce
--- /dev/null
@@ -0,0 +1,60 @@
+From ea08816d5b185ab3d09e95e393f265af54560350 Mon Sep 17 00:00:00 2001
+From: David Woodhouse <dwmw@amazon.co.uk>
+Date: Thu, 11 Jan 2018 21:46:31 +0000
+Subject: x86/retpoline/xen: Convert Xen hypercall indirect jumps
+
+From: David Woodhouse <dwmw@amazon.co.uk>
+
+commit ea08816d5b185ab3d09e95e393f265af54560350 upstream.
+
+Convert indirect call in Xen hypercall to use non-speculative sequence,
+when CONFIG_RETPOLINE is enabled.
+
+Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Acked-by: Arjan van de Ven <arjan@linux.intel.com>
+Acked-by: Ingo Molnar <mingo@kernel.org>
+Reviewed-by: Juergen Gross <jgross@suse.com>
+Cc: gnomes@lxorguk.ukuu.org.uk
+Cc: Rik van Riel <riel@redhat.com>
+Cc: Andi Kleen <ak@linux.intel.com>
+Cc: Josh Poimboeuf <jpoimboe@redhat.com>
+Cc: thomas.lendacky@amd.com
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Jiri Kosina <jikos@kernel.org>
+Cc: Andy Lutomirski <luto@amacapital.net>
+Cc: Dave Hansen <dave.hansen@intel.com>
+Cc: Kees Cook <keescook@google.com>
+Cc: Tim Chen <tim.c.chen@linux.intel.com>
+Cc: Greg Kroah-Hartman <gregkh@linux-foundation.org>
+Cc: Paul Turner <pjt@google.com>
+Link: https://lkml.kernel.org/r/1515707194-20531-10-git-send-email-dwmw@amazon.co.uk
+Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ arch/x86/include/asm/xen/hypercall.h |    5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+--- a/arch/x86/include/asm/xen/hypercall.h
++++ b/arch/x86/include/asm/xen/hypercall.h
+@@ -44,6 +44,7 @@
+ #include <asm/page.h>
+ #include <asm/pgtable.h>
+ #include <asm/smap.h>
++#include <asm/nospec-branch.h>
+ #include <xen/interface/xen.h>
+ #include <xen/interface/sched.h>
+@@ -216,9 +217,9 @@ privcmd_call(unsigned call,
+       __HYPERCALL_5ARG(a1, a2, a3, a4, a5);
+       stac();
+-      asm volatile("call *%[call]"
++      asm volatile(CALL_NOSPEC
+                    : __HYPERCALL_5PARAM
+-                   : [call] "a" (&hypercall_page[call])
++                   : [thunk_target] "a" (&hypercall_page[call])
+                    : __HYPERCALL_CLOBBER5);
+       clac();
diff --git a/queue-4.9/x86-spectre-add-boot-time-option-to-select-spectre-v2-mitigation.patch b/queue-4.9/x86-spectre-add-boot-time-option-to-select-spectre-v2-mitigation.patch
new file mode 100644 (file)
index 0000000..475414c
--- /dev/null
@@ -0,0 +1,317 @@
+From da285121560e769cc31797bba6422eea71d473e0 Mon Sep 17 00:00:00 2001
+From: David Woodhouse <dwmw@amazon.co.uk>
+Date: Thu, 11 Jan 2018 21:46:26 +0000
+Subject: x86/spectre: Add boot time option to select Spectre v2 mitigation
+
+From: David Woodhouse <dwmw@amazon.co.uk>
+
+commit da285121560e769cc31797bba6422eea71d473e0 upstream.
+
+Add a spectre_v2= option to select the mitigation used for the indirect
+branch speculation vulnerability.
+
+Currently, the only option available is retpoline, in its various forms.
+This will be expanded to cover the new IBRS/IBPB microcode features.
+
+The RETPOLINE_AMD feature relies on a serializing LFENCE for speculation
+control. For AMD hardware, only set RETPOLINE_AMD if LFENCE is a
+serializing instruction, which is indicated by the LFENCE_RDTSC feature.
+
+[ tglx: Folded back the LFENCE/AMD fixes and reworked it so IBRS
+       integration becomes simple ]
+
+Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Cc: gnomes@lxorguk.ukuu.org.uk
+Cc: Rik van Riel <riel@redhat.com>
+Cc: Andi Kleen <ak@linux.intel.com>
+Cc: Josh Poimboeuf <jpoimboe@redhat.com>
+Cc: thomas.lendacky@amd.com
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Jiri Kosina <jikos@kernel.org>
+Cc: Andy Lutomirski <luto@amacapital.net>
+Cc: Dave Hansen <dave.hansen@intel.com>
+Cc: Kees Cook <keescook@google.com>
+Cc: Tim Chen <tim.c.chen@linux.intel.com>
+Cc: Greg Kroah-Hartman <gregkh@linux-foundation.org>
+Cc: Paul Turner <pjt@google.com>
+Link: https://lkml.kernel.org/r/1515707194-20531-5-git-send-email-dwmw@amazon.co.uk
+Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ Documentation/kernel-parameters.txt  |   28 ++++++
+ arch/x86/include/asm/nospec-branch.h |   10 ++
+ arch/x86/kernel/cpu/bugs.c           |  158 ++++++++++++++++++++++++++++++++++-
+ arch/x86/kernel/cpu/common.c         |    4 
+ 4 files changed, 195 insertions(+), 5 deletions(-)
+
+--- a/Documentation/kernel-parameters.txt
++++ b/Documentation/kernel-parameters.txt
+@@ -2691,6 +2691,11 @@ bytes respectively. Such letter suffixes
+       nosmt           [KNL,S390] Disable symmetric multithreading (SMT).
+                       Equivalent to smt=1.
++      nospectre_v2    [X86] Disable all mitigations for the Spectre variant 2
++                      (indirect branch prediction) vulnerability. System may
++                      allow data leaks with this option, which is equivalent
++                      to spectre_v2=off.
++
+       noxsave         [BUGS=X86] Disables x86 extended register state save
+                       and restore using xsave. The kernel will fallback to
+                       enabling legacy floating-point and sse state.
+@@ -3944,6 +3949,29 @@ bytes respectively. Such letter suffixes
+       sonypi.*=       [HW] Sony Programmable I/O Control Device driver
+                       See Documentation/laptops/sonypi.txt
++      spectre_v2=     [X86] Control mitigation of Spectre variant 2
++                      (indirect branch speculation) vulnerability.
++
++                      on   - unconditionally enable
++                      off  - unconditionally disable
++                      auto - kernel detects whether your CPU model is
++                             vulnerable
++
++                      Selecting 'on' will, and 'auto' may, choose a
++                      mitigation method at run time according to the
++                      CPU, the available microcode, the setting of the
++                      CONFIG_RETPOLINE configuration option, and the
++                      compiler with which the kernel was built.
++
++                      Specific mitigations can also be selected manually:
++
++                      retpoline         - replace indirect branches
++                      retpoline,generic - google's original retpoline
++                      retpoline,amd     - AMD-specific minimal thunk
++
++                      Not specifying this option is equivalent to
++                      spectre_v2=auto.
++
+       spia_io_base=   [HW,MTD]
+       spia_fio_base=
+       spia_pedr=
+--- a/arch/x86/include/asm/nospec-branch.h
++++ b/arch/x86/include/asm/nospec-branch.h
+@@ -124,5 +124,15 @@
+ # define THUNK_TARGET(addr) [thunk_target] "rm" (addr)
+ #endif
++/* The Spectre V2 mitigation variants */
++enum spectre_v2_mitigation {
++      SPECTRE_V2_NONE,
++      SPECTRE_V2_RETPOLINE_MINIMAL,
++      SPECTRE_V2_RETPOLINE_MINIMAL_AMD,
++      SPECTRE_V2_RETPOLINE_GENERIC,
++      SPECTRE_V2_RETPOLINE_AMD,
++      SPECTRE_V2_IBRS,
++};
++
+ #endif /* __ASSEMBLY__ */
+ #endif /* __NOSPEC_BRANCH_H__ */
+--- a/arch/x86/kernel/cpu/bugs.c
++++ b/arch/x86/kernel/cpu/bugs.c
+@@ -10,6 +10,9 @@
+ #include <linux/init.h>
+ #include <linux/utsname.h>
+ #include <linux/cpu.h>
++
++#include <asm/nospec-branch.h>
++#include <asm/cmdline.h>
+ #include <asm/bugs.h>
+ #include <asm/processor.h>
+ #include <asm/processor-flags.h>
+@@ -20,6 +23,8 @@
+ #include <asm/pgtable.h>
+ #include <asm/cacheflush.h>
++static void __init spectre_v2_select_mitigation(void);
++
+ void __init check_bugs(void)
+ {
+       identify_boot_cpu();
+@@ -29,6 +34,9 @@ void __init check_bugs(void)
+               print_cpu_info(&boot_cpu_data);
+       }
++      /* Select the proper spectre mitigation before patching alternatives */
++      spectre_v2_select_mitigation();
++
+ #ifdef CONFIG_X86_32
+       /*
+        * Check whether we are able to run this kernel safely on SMP.
+@@ -61,6 +69,153 @@ void __init check_bugs(void)
+ #endif
+ }
++/* The kernel command line selection */
++enum spectre_v2_mitigation_cmd {
++      SPECTRE_V2_CMD_NONE,
++      SPECTRE_V2_CMD_AUTO,
++      SPECTRE_V2_CMD_FORCE,
++      SPECTRE_V2_CMD_RETPOLINE,
++      SPECTRE_V2_CMD_RETPOLINE_GENERIC,
++      SPECTRE_V2_CMD_RETPOLINE_AMD,
++};
++
++static const char *spectre_v2_strings[] = {
++      [SPECTRE_V2_NONE]                       = "Vulnerable",
++      [SPECTRE_V2_RETPOLINE_MINIMAL]          = "Vulnerable: Minimal generic ASM retpoline",
++      [SPECTRE_V2_RETPOLINE_MINIMAL_AMD]      = "Vulnerable: Minimal AMD ASM retpoline",
++      [SPECTRE_V2_RETPOLINE_GENERIC]          = "Mitigation: Full generic retpoline",
++      [SPECTRE_V2_RETPOLINE_AMD]              = "Mitigation: Full AMD retpoline",
++};
++
++#undef pr_fmt
++#define pr_fmt(fmt)     "Spectre V2 mitigation: " fmt
++
++static enum spectre_v2_mitigation spectre_v2_enabled = SPECTRE_V2_NONE;
++
++static void __init spec2_print_if_insecure(const char *reason)
++{
++      if (boot_cpu_has_bug(X86_BUG_SPECTRE_V2))
++              pr_info("%s\n", reason);
++}
++
++static void __init spec2_print_if_secure(const char *reason)
++{
++      if (!boot_cpu_has_bug(X86_BUG_SPECTRE_V2))
++              pr_info("%s\n", reason);
++}
++
++static inline bool retp_compiler(void)
++{
++      return __is_defined(RETPOLINE);
++}
++
++static inline bool match_option(const char *arg, int arglen, const char *opt)
++{
++      int len = strlen(opt);
++
++      return len == arglen && !strncmp(arg, opt, len);
++}
++
++static enum spectre_v2_mitigation_cmd __init spectre_v2_parse_cmdline(void)
++{
++      char arg[20];
++      int ret;
++
++      ret = cmdline_find_option(boot_command_line, "spectre_v2", arg,
++                                sizeof(arg));
++      if (ret > 0)  {
++              if (match_option(arg, ret, "off")) {
++                      goto disable;
++              } else if (match_option(arg, ret, "on")) {
++                      spec2_print_if_secure("force enabled on command line.");
++                      return SPECTRE_V2_CMD_FORCE;
++              } else if (match_option(arg, ret, "retpoline")) {
++                      spec2_print_if_insecure("retpoline selected on command line.");
++                      return SPECTRE_V2_CMD_RETPOLINE;
++              } else if (match_option(arg, ret, "retpoline,amd")) {
++                      if (boot_cpu_data.x86_vendor != X86_VENDOR_AMD) {
++                              pr_err("retpoline,amd selected but CPU is not AMD. Switching to AUTO select\n");
++                              return SPECTRE_V2_CMD_AUTO;
++                      }
++                      spec2_print_if_insecure("AMD retpoline selected on command line.");
++                      return SPECTRE_V2_CMD_RETPOLINE_AMD;
++              } else if (match_option(arg, ret, "retpoline,generic")) {
++                      spec2_print_if_insecure("generic retpoline selected on command line.");
++                      return SPECTRE_V2_CMD_RETPOLINE_GENERIC;
++              } else if (match_option(arg, ret, "auto")) {
++                      return SPECTRE_V2_CMD_AUTO;
++              }
++      }
++
++      if (!cmdline_find_option_bool(boot_command_line, "nospectre_v2"))
++              return SPECTRE_V2_CMD_AUTO;
++disable:
++      spec2_print_if_insecure("disabled on command line.");
++      return SPECTRE_V2_CMD_NONE;
++}
++
++static void __init spectre_v2_select_mitigation(void)
++{
++      enum spectre_v2_mitigation_cmd cmd = spectre_v2_parse_cmdline();
++      enum spectre_v2_mitigation mode = SPECTRE_V2_NONE;
++
++      /*
++       * If the CPU is not affected and the command line mode is NONE or AUTO
++       * then nothing to do.
++       */
++      if (!boot_cpu_has_bug(X86_BUG_SPECTRE_V2) &&
++          (cmd == SPECTRE_V2_CMD_NONE || cmd == SPECTRE_V2_CMD_AUTO))
++              return;
++
++      switch (cmd) {
++      case SPECTRE_V2_CMD_NONE:
++              return;
++
++      case SPECTRE_V2_CMD_FORCE:
++              /* FALLTRHU */
++      case SPECTRE_V2_CMD_AUTO:
++              goto retpoline_auto;
++
++      case SPECTRE_V2_CMD_RETPOLINE_AMD:
++              if (IS_ENABLED(CONFIG_RETPOLINE))
++                      goto retpoline_amd;
++              break;
++      case SPECTRE_V2_CMD_RETPOLINE_GENERIC:
++              if (IS_ENABLED(CONFIG_RETPOLINE))
++                      goto retpoline_generic;
++              break;
++      case SPECTRE_V2_CMD_RETPOLINE:
++              if (IS_ENABLED(CONFIG_RETPOLINE))
++                      goto retpoline_auto;
++              break;
++      }
++      pr_err("kernel not compiled with retpoline; no mitigation available!");
++      return;
++
++retpoline_auto:
++      if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD) {
++      retpoline_amd:
++              if (!boot_cpu_has(X86_FEATURE_LFENCE_RDTSC)) {
++                      pr_err("LFENCE not serializing. Switching to generic retpoline\n");
++                      goto retpoline_generic;
++              }
++              mode = retp_compiler() ? SPECTRE_V2_RETPOLINE_AMD :
++                                       SPECTRE_V2_RETPOLINE_MINIMAL_AMD;
++              setup_force_cpu_cap(X86_FEATURE_RETPOLINE_AMD);
++              setup_force_cpu_cap(X86_FEATURE_RETPOLINE);
++      } else {
++      retpoline_generic:
++              mode = retp_compiler() ? SPECTRE_V2_RETPOLINE_GENERIC :
++                                       SPECTRE_V2_RETPOLINE_MINIMAL;
++              setup_force_cpu_cap(X86_FEATURE_RETPOLINE);
++      }
++
++      spectre_v2_enabled = mode;
++      pr_info("%s\n", spectre_v2_strings[mode]);
++}
++
++#undef pr_fmt
++
+ #ifdef CONFIG_SYSFS
+ ssize_t cpu_show_meltdown(struct device *dev,
+                         struct device_attribute *attr, char *buf)
+@@ -85,6 +240,7 @@ ssize_t cpu_show_spectre_v2(struct devic
+ {
+       if (!boot_cpu_has_bug(X86_BUG_SPECTRE_V2))
+               return sprintf(buf, "Not affected\n");
+-      return sprintf(buf, "Vulnerable\n");
++
++      return sprintf(buf, "%s\n", spectre_v2_strings[spectre_v2_enabled]);
+ }
+ #endif
+--- a/arch/x86/kernel/cpu/common.c
++++ b/arch/x86/kernel/cpu/common.c
+@@ -889,10 +889,6 @@ static void __init early_identify_cpu(st
+       setup_force_cpu_bug(X86_BUG_SPECTRE_V1);
+       setup_force_cpu_bug(X86_BUG_SPECTRE_V2);
+-#ifdef CONFIG_RETPOLINE
+-      setup_force_cpu_cap(X86_FEATURE_RETPOLINE);
+-#endif
+-
+       fpu__init_system(c);
+ #ifdef CONFIG_X86_32