|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] RE: [PATCH v2] VT-x: extend LBR Broadwell errata coverage
> From: Jan Beulich <jbeulich@xxxxxxxx>
> Sent: Monday, May 25, 2020 11:04 PM
>
> For lbr_tsx_fixup_check() simply name a few more specific erratum
> numbers.
>
> For bdf93_fixup_check(), however, more models are affected. Oddly enough
> despite being the same model and stepping, the erratum is listed for
> Xeon E3 but not its Core counterpart. Apply the workaround uniformly,
> and also for Xeon D, which only has the LBR-from one listed in its spec
> update.
>
> Seeing this broader applicability, rename anything BDF93-related to more
> generic names.
>
> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
Reviewed-by: Kevin Tian <kevin.tian@xxxxxxxxx>
> ---
> v2: Name yet another pair of errata. Speculatively cover Xeon D also
> in the 2nd case. Identifier renaming.
>
> --- a/xen/arch/x86/hvm/vmx/vmx.c
> +++ b/xen/arch/x86/hvm/vmx/vmx.c
> @@ -2380,7 +2380,7 @@ static void pi_notification_interrupt(st
> }
>
> static void __init lbr_tsx_fixup_check(void);
> -static void __init bdf93_fixup_check(void);
> +static void __init ler_to_fixup_check(void);
>
> /*
> * Calculate whether the CPU is vulnerable to Instruction Fetch page
> @@ -2554,7 +2554,7 @@ const struct hvm_function_table * __init
> }
>
> lbr_tsx_fixup_check();
> - bdf93_fixup_check();
> + ler_to_fixup_check();
>
> return &vmx_function_table;
> }
> @@ -2832,11 +2832,11 @@ enum
>
> #define LBR_MSRS_INSERTED (1u << 0)
> #define LBR_FIXUP_TSX (1u << 1)
> -#define LBR_FIXUP_BDF93 (1u << 2)
> -#define LBR_FIXUP_MASK (LBR_FIXUP_TSX | LBR_FIXUP_BDF93)
> +#define LBR_FIXUP_LER_TO (1u << 2)
> +#define LBR_FIXUP_MASK (LBR_FIXUP_TSX | LBR_FIXUP_LER_TO)
>
> static bool __read_mostly lbr_tsx_fixup_needed;
> -static bool __read_mostly bdf93_fixup_needed;
> +static bool __read_mostly ler_to_fixup_needed;
>
> static void __init lbr_tsx_fixup_check(void)
> {
> @@ -2844,7 +2844,7 @@ static void __init lbr_tsx_fixup_check(v
> uint32_t lbr_format;
>
> /*
> - * HSM182, HSD172, HSE117, BDM127, BDD117, BDF85, BDE105:
> + * Haswell erratum HSM182 et al, Broadwell erratum BDM127 et al:
> *
> * On processors that do not support Intel Transactional Synchronization
> * Extensions (Intel TSX) (CPUID.07H.EBX bits 4 and 11 are both zero),
> @@ -2868,8 +2868,11 @@ static void __init lbr_tsx_fixup_check(v
> case 0x45: /* HSM182 - 4th gen Core */
> case 0x46: /* HSM182, HSD172 - 4th gen Core (GT3) */
> case 0x3d: /* BDM127 - 5th gen Core */
> - case 0x47: /* BDD117 - 5th gen Core (GT3) */
> - case 0x4f: /* BDF85 - Xeon E5-2600 v4 */
> + case 0x47: /* BDD117 - 5th gen Core (GT3)
> + BDW117 - Xeon E3-1200 v4 */
> + case 0x4f: /* BDF85 - Xeon E5-2600 v4
> + BDH75 - Core-i7 for LGA2011-v3 Socket
> + BDX88 - Xeon E7-x800 v4 */
> case 0x56: /* BDE105 - Xeon D-1500 */
> break;
> default:
> @@ -2890,18 +2893,31 @@ static void __init lbr_tsx_fixup_check(v
> lbr_tsx_fixup_needed = true;
> }
>
> -static void __init bdf93_fixup_check(void)
> +static void __init ler_to_fixup_check(void)
> {
> /*
> - * Broadwell erratum BDF93:
> + * Broadwell erratum BDF93 et al:
> *
> * Reads from MSR_LER_TO_LIP (MSR 1DEH) may return values for
> bits[63:61]
> * that are not equal to bit[47]. Attempting to context switch this
> value
> * may cause a #GP. Software should sign extend the MSR.
> */
> - if ( boot_cpu_data.x86_vendor == X86_VENDOR_INTEL &&
> - boot_cpu_data.x86 == 6 && boot_cpu_data.x86_model == 0x4f )
> - bdf93_fixup_needed = true;
> + if ( boot_cpu_data.x86_vendor != X86_VENDOR_INTEL ||
> + boot_cpu_data.x86 != 6 )
> + return;
> +
> + switch ( boot_cpu_data.x86_model )
> + {
> + case 0x3d: /* BDM131 - 5th gen Core */
> + case 0x47: /* BDD??? - 5th gen Core (H-Processor line)
> + BDW120 - Xeon E3-1200 v4 */
> + case 0x4f: /* BDF93 - Xeon E5-2600 v4
> + BDH80 - Core-i7 for LGA2011-v3 Socket
> + BDX93 - Xeon E7-x800 v4 */
> + case 0x56: /* BDE??? - Xeon D-1500 */
> + ler_to_fixup_needed = true;
> + break;
> + }
> }
>
> static int is_last_branch_msr(u32 ecx)
> @@ -3276,8 +3292,8 @@ static int vmx_msr_write_intercept(unsig
> v->arch.hvm.vmx.lbr_flags |= LBR_MSRS_INSERTED;
> if ( lbr_tsx_fixup_needed )
> v->arch.hvm.vmx.lbr_flags |= LBR_FIXUP_TSX;
> - if ( bdf93_fixup_needed )
> - v->arch.hvm.vmx.lbr_flags |= LBR_FIXUP_BDF93;
> + if ( ler_to_fixup_needed )
> + v->arch.hvm.vmx.lbr_flags |= LBR_FIXUP_LER_TO;
> }
>
> __vmwrite(GUEST_IA32_DEBUGCTL, msr_content);
> @@ -4338,7 +4354,7 @@ static void sign_extend_msr(struct vcpu
> entry->data = canonicalise_addr(entry->data);
> }
>
> -static void bdf93_fixup(void)
> +static void ler_to_fixup(void)
> {
> struct vcpu *curr = current;
>
> @@ -4351,8 +4367,8 @@ static void lbr_fixup(void)
>
> if ( curr->arch.hvm.vmx.lbr_flags & LBR_FIXUP_TSX )
> lbr_tsx_fixup();
> - if ( curr->arch.hvm.vmx.lbr_flags & LBR_FIXUP_BDF93 )
> - bdf93_fixup();
> + if ( curr->arch.hvm.vmx.lbr_flags & LBR_FIXUP_LER_TO )
> + ler_to_fixup();
> }
>
> /* Returns false if the vmentry has to be restarted */
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |