]> Git Repo - linux.git/commitdiff
Merge tag 'x86-urgent-2023-09-01' of git://git.kernel.org/pub/scm/linux/kernel/git...
authorLinus Torvalds <[email protected]>
Fri, 1 Sep 2023 23:40:19 +0000 (16:40 -0700)
committerLinus Torvalds <[email protected]>
Fri, 1 Sep 2023 23:40:19 +0000 (16:40 -0700)
Pull x86 fixes from Dave Hansen:
 "The most important fix here adds a missing CPU model to the recent
  Gather Data Sampling (GDS) mitigation list to ensure that mitigations
  are available on that CPU.

  There are also a pair of warning fixes, and closure of a covert
  channel that pops up when protection keys are disabled.

  Summary:
   - Mark all Skylake CPUs as vulnerable to GDS
   - Fix PKRU covert channel
   - Fix -Wmissing-variable-declarations warning for ia32_xyz_class
   - Fix kernel-doc annotation warning"

* tag 'x86-urgent-2023-09-01' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  x86/fpu/xstate: Fix PKRU covert channel
  x86/irq/i8259: Fix kernel-doc annotation warning
  x86/speculation: Mark all Skylake CPUs as vulnerable to GDS
  x86/audit: Fix -Wmissing-variable-declarations warning for ia32_xyz_class

1  2 
arch/x86/kernel/cpu/common.c
arch/x86/kernel/fpu/xstate.c

index 6d75fab10161bf660065720197d37026b82f7c6d,00f043a094fcde971a33a135c8f82ccf4dd5df96..382d4e6b848d20f1d927f8687d1e8806acf8ea3d
@@@ -59,6 -59,7 +59,6 @@@
  #include <asm/cacheinfo.h>
  #include <asm/memtype.h>
  #include <asm/microcode.h>
 -#include <asm/microcode_intel.h>
  #include <asm/intel-family.h>
  #include <asm/cpu_device_id.h>
  #include <asm/uv/uv.h>
@@@ -587,43 -588,27 +587,43 @@@ __noendbr void ibt_restore(u64 save
  
  static __always_inline void setup_cet(struct cpuinfo_x86 *c)
  {
 -      u64 msr = CET_ENDBR_EN;
 +      bool user_shstk, kernel_ibt;
  
 -      if (!HAS_KERNEL_IBT ||
 -          !cpu_feature_enabled(X86_FEATURE_IBT))
 +      if (!IS_ENABLED(CONFIG_X86_CET))
                return;
  
 -      wrmsrl(MSR_IA32_S_CET, msr);
 +      kernel_ibt = HAS_KERNEL_IBT && cpu_feature_enabled(X86_FEATURE_IBT);
 +      user_shstk = cpu_feature_enabled(X86_FEATURE_SHSTK) &&
 +                   IS_ENABLED(CONFIG_X86_USER_SHADOW_STACK);
 +
 +      if (!kernel_ibt && !user_shstk)
 +              return;
 +
 +      if (user_shstk)
 +              set_cpu_cap(c, X86_FEATURE_USER_SHSTK);
 +
 +      if (kernel_ibt)
 +              wrmsrl(MSR_IA32_S_CET, CET_ENDBR_EN);
 +      else
 +              wrmsrl(MSR_IA32_S_CET, 0);
 +
        cr4_set_bits(X86_CR4_CET);
  
 -      if (!ibt_selftest()) {
 +      if (kernel_ibt && ibt_selftest()) {
                pr_err("IBT selftest: Failed!\n");
                wrmsrl(MSR_IA32_S_CET, 0);
                setup_clear_cpu_cap(X86_FEATURE_IBT);
 -              return;
        }
  }
  
  __noendbr void cet_disable(void)
  {
 -      if (cpu_feature_enabled(X86_FEATURE_IBT))
 -              wrmsrl(MSR_IA32_S_CET, 0);
 +      if (!(cpu_feature_enabled(X86_FEATURE_IBT) ||
 +            cpu_feature_enabled(X86_FEATURE_SHSTK)))
 +              return;
 +
 +      wrmsrl(MSR_IA32_S_CET, 0);
 +      wrmsrl(MSR_IA32_U_CET, 0);
  }
  
  /*
@@@ -1280,11 -1265,11 +1280,11 @@@ static const struct x86_cpu_id cpu_vuln
        VULNBL_INTEL_STEPPINGS(BROADWELL_G,     X86_STEPPING_ANY,               SRBDS),
        VULNBL_INTEL_STEPPINGS(BROADWELL_X,     X86_STEPPING_ANY,               MMIO),
        VULNBL_INTEL_STEPPINGS(BROADWELL,       X86_STEPPING_ANY,               SRBDS),
-       VULNBL_INTEL_STEPPINGS(SKYLAKE_L,       X86_STEPPING_ANY,               SRBDS | MMIO | RETBLEED),
        VULNBL_INTEL_STEPPINGS(SKYLAKE_X,       X86_STEPPING_ANY,               MMIO | RETBLEED | GDS),
-       VULNBL_INTEL_STEPPINGS(SKYLAKE,         X86_STEPPING_ANY,               SRBDS | MMIO | RETBLEED),
-       VULNBL_INTEL_STEPPINGS(KABYLAKE_L,      X86_STEPPING_ANY,               SRBDS | MMIO | RETBLEED | GDS),
-       VULNBL_INTEL_STEPPINGS(KABYLAKE,        X86_STEPPING_ANY,               SRBDS | MMIO | RETBLEED | GDS),
+       VULNBL_INTEL_STEPPINGS(SKYLAKE_L,       X86_STEPPING_ANY,               MMIO | RETBLEED | GDS | SRBDS),
+       VULNBL_INTEL_STEPPINGS(SKYLAKE,         X86_STEPPING_ANY,               MMIO | RETBLEED | GDS | SRBDS),
+       VULNBL_INTEL_STEPPINGS(KABYLAKE_L,      X86_STEPPING_ANY,               MMIO | RETBLEED | GDS | SRBDS),
+       VULNBL_INTEL_STEPPINGS(KABYLAKE,        X86_STEPPING_ANY,               MMIO | RETBLEED | GDS | SRBDS),
        VULNBL_INTEL_STEPPINGS(CANNONLAKE_L,    X86_STEPPING_ANY,               RETBLEED),
        VULNBL_INTEL_STEPPINGS(ICELAKE_L,       X86_STEPPING_ANY,               MMIO | MMIO_SBDS | RETBLEED | GDS),
        VULNBL_INTEL_STEPPINGS(ICELAKE_D,       X86_STEPPING_ANY,               MMIO | GDS),
@@@ -1507,9 -1492,6 +1507,9 @@@ static void __init cpu_parse_early_para
        if (cmdline_find_option_bool(boot_command_line, "noxsaves"))
                setup_clear_cpu_cap(X86_FEATURE_XSAVES);
  
 +      if (cmdline_find_option_bool(boot_command_line, "nousershstk"))
 +              setup_clear_cpu_cap(X86_FEATURE_USER_SHSTK);
 +
        arglen = cmdline_find_option(boot_command_line, "clearcpuid", arg, sizeof(arg));
        if (arglen <= 0)
                return;
@@@ -1977,7 -1959,7 +1977,7 @@@ void enable_sep_cpu(void
  }
  #endif
  
 -void __init identify_boot_cpu(void)
 +static __init void identify_boot_cpu(void)
  {
        identify_cpu(&boot_cpu_data);
        if (HAS_KERNEL_IBT && cpu_feature_enabled(X86_FEATURE_IBT))
@@@ -2318,7 -2300,8 +2318,7 @@@ void store_cpu_caps(struct cpuinfo_x86 
   * @prev_info:        CPU capabilities stored before an update.
   *
   * The microcode loader calls this upon late microcode load to recheck features,
 - * only when microcode has been updated. Caller holds microcode_mutex and CPU
 - * hotplug lock.
 + * only when microcode has been updated. Caller holds and CPU hotplug lock.
   *
   * Return: None
   */
@@@ -2360,7 -2343,7 +2360,7 @@@ void __init arch_cpu_finalize_init(void
         * identify_boot_cpu() initialized SMT support information, let the
         * core code know.
         */
 -      cpu_smt_check_topology();
 +      cpu_smt_set_num_threads(smp_num_siblings, smp_num_siblings);
  
        if (!IS_ENABLED(CONFIG_SMP)) {
                pr_info("CPU: ");
index 41dac93b8ea4e30f75e65cc1408b253dfa4f78c5,a27b4f7b93651d84dae76c4ef9478381d0460c0c..cadf68737e6bc78f12c1c3a444528895d1eba2f9
   */
  static const char *xfeature_names[] =
  {
 -      "x87 floating point registers"  ,
 -      "SSE registers"                 ,
 -      "AVX registers"                 ,
 -      "MPX bounds registers"          ,
 -      "MPX CSR"                       ,
 -      "AVX-512 opmask"                ,
 -      "AVX-512 Hi256"                 ,
 -      "AVX-512 ZMM_Hi256"             ,
 -      "Processor Trace (unused)"      ,
 +      "x87 floating point registers",
 +      "SSE registers",
 +      "AVX registers",
 +      "MPX bounds registers",
 +      "MPX CSR",
 +      "AVX-512 opmask",
 +      "AVX-512 Hi256",
 +      "AVX-512 ZMM_Hi256",
 +      "Processor Trace (unused)",
        "Protection Keys User registers",
        "PASID state",
 -      "unknown xstate feature"        ,
 -      "unknown xstate feature"        ,
 -      "unknown xstate feature"        ,
 -      "unknown xstate feature"        ,
 -      "unknown xstate feature"        ,
 -      "unknown xstate feature"        ,
 -      "AMX Tile config"               ,
 -      "AMX Tile data"                 ,
 -      "unknown xstate feature"        ,
 +      "Control-flow User registers",
 +      "Control-flow Kernel registers (unused)",
 +      "unknown xstate feature",
 +      "unknown xstate feature",
 +      "unknown xstate feature",
 +      "unknown xstate feature",
 +      "AMX Tile config",
 +      "AMX Tile data",
 +      "unknown xstate feature",
  };
  
  static unsigned short xsave_cpuid_features[] __initdata = {
@@@ -71,9 -71,8 +71,9 @@@
        [XFEATURE_ZMM_Hi256]                    = X86_FEATURE_AVX512F,
        [XFEATURE_Hi16_ZMM]                     = X86_FEATURE_AVX512F,
        [XFEATURE_PT_UNIMPLEMENTED_SO_FAR]      = X86_FEATURE_INTEL_PT,
-       [XFEATURE_PKRU]                         = X86_FEATURE_PKU,
+       [XFEATURE_PKRU]                         = X86_FEATURE_OSPKE,
        [XFEATURE_PASID]                        = X86_FEATURE_ENQCMD,
 +      [XFEATURE_CET_USER]                     = X86_FEATURE_SHSTK,
        [XFEATURE_XTILE_CFG]                    = X86_FEATURE_AMX_TILE,
        [XFEATURE_XTILE_DATA]                   = X86_FEATURE_AMX_TILE,
  };
@@@ -277,7 -276,6 +277,7 @@@ static void __init print_xstate_feature
        print_xstate_feature(XFEATURE_MASK_Hi16_ZMM);
        print_xstate_feature(XFEATURE_MASK_PKRU);
        print_xstate_feature(XFEATURE_MASK_PASID);
 +      print_xstate_feature(XFEATURE_MASK_CET_USER);
        print_xstate_feature(XFEATURE_MASK_XTILE_CFG);
        print_xstate_feature(XFEATURE_MASK_XTILE_DATA);
  }
@@@ -346,7 -344,6 +346,7 @@@ static __init void os_xrstor_booting(st
         XFEATURE_MASK_BNDREGS |                \
         XFEATURE_MASK_BNDCSR |                 \
         XFEATURE_MASK_PASID |                  \
 +       XFEATURE_MASK_CET_USER |               \
         XFEATURE_MASK_XTILE)
  
  /*
@@@ -449,15 -446,14 +449,15 @@@ static void __init __xstate_dump_leaves
        }                                                                       \
  } while (0)
  
 -#define XCHECK_SZ(sz, nr, nr_macro, __struct) do {                    \
 -      if ((nr == nr_macro) &&                                         \
 -          WARN_ONCE(sz != sizeof(__struct),                           \
 -              "%s: struct is %zu bytes, cpu state %d bytes\n",        \
 -              __stringify(nr_macro), sizeof(__struct), sz)) {         \
 +#define XCHECK_SZ(sz, nr, __struct) ({                                        \
 +      if (WARN_ONCE(sz != sizeof(__struct),                           \
 +          "[%s]: struct is %zu bytes, cpu state %d bytes\n",          \
 +          xfeature_names[nr], sizeof(__struct), sz)) {                \
                __xstate_dump_leaves();                                 \
        }                                                               \
 -} while (0)
 +      true;                                                           \
 +})
 +
  
  /**
   * check_xtile_data_against_struct - Check tile data state size.
@@@ -531,28 -527,36 +531,28 @@@ static bool __init check_xstate_against
         * Ask the CPU for the size of the state.
         */
        int sz = xfeature_size(nr);
 +
        /*
         * Match each CPU state with the corresponding software
         * structure.
         */
 -      XCHECK_SZ(sz, nr, XFEATURE_YMM,       struct ymmh_struct);
 -      XCHECK_SZ(sz, nr, XFEATURE_BNDREGS,   struct mpx_bndreg_state);
 -      XCHECK_SZ(sz, nr, XFEATURE_BNDCSR,    struct mpx_bndcsr_state);
 -      XCHECK_SZ(sz, nr, XFEATURE_OPMASK,    struct avx_512_opmask_state);
 -      XCHECK_SZ(sz, nr, XFEATURE_ZMM_Hi256, struct avx_512_zmm_uppers_state);
 -      XCHECK_SZ(sz, nr, XFEATURE_Hi16_ZMM,  struct avx_512_hi16_state);
 -      XCHECK_SZ(sz, nr, XFEATURE_PKRU,      struct pkru_state);
 -      XCHECK_SZ(sz, nr, XFEATURE_PASID,     struct ia32_pasid_state);
 -      XCHECK_SZ(sz, nr, XFEATURE_XTILE_CFG, struct xtile_cfg);
 -
 -      /* The tile data size varies between implementations. */
 -      if (nr == XFEATURE_XTILE_DATA)
 -              check_xtile_data_against_struct(sz);
 -
 -      /*
 -       * Make *SURE* to add any feature numbers in below if
 -       * there are "holes" in the xsave state component
 -       * numbers.
 -       */
 -      if ((nr < XFEATURE_YMM) ||
 -          (nr >= XFEATURE_MAX) ||
 -          (nr == XFEATURE_PT_UNIMPLEMENTED_SO_FAR) ||
 -          ((nr >= XFEATURE_RSRVD_COMP_11) && (nr <= XFEATURE_RSRVD_COMP_16))) {
 +      switch (nr) {
 +      case XFEATURE_YMM:        return XCHECK_SZ(sz, nr, struct ymmh_struct);
 +      case XFEATURE_BNDREGS:    return XCHECK_SZ(sz, nr, struct mpx_bndreg_state);
 +      case XFEATURE_BNDCSR:     return XCHECK_SZ(sz, nr, struct mpx_bndcsr_state);
 +      case XFEATURE_OPMASK:     return XCHECK_SZ(sz, nr, struct avx_512_opmask_state);
 +      case XFEATURE_ZMM_Hi256:  return XCHECK_SZ(sz, nr, struct avx_512_zmm_uppers_state);
 +      case XFEATURE_Hi16_ZMM:   return XCHECK_SZ(sz, nr, struct avx_512_hi16_state);
 +      case XFEATURE_PKRU:       return XCHECK_SZ(sz, nr, struct pkru_state);
 +      case XFEATURE_PASID:      return XCHECK_SZ(sz, nr, struct ia32_pasid_state);
 +      case XFEATURE_XTILE_CFG:  return XCHECK_SZ(sz, nr, struct xtile_cfg);
 +      case XFEATURE_CET_USER:   return XCHECK_SZ(sz, nr, struct cet_user_state);
 +      case XFEATURE_XTILE_DATA: check_xtile_data_against_struct(sz); return true;
 +      default:
                XSTATE_WARN_ON(1, "No structure for xstate: %d\n", nr);
                return false;
        }
 +
        return true;
  }
  
This page took 0.081608 seconds and 4 git commands to generate.