|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 3/3] x86: check feature flags after resume
>>> On 13.04.18 at 20:56, <simon@xxxxxxxxxxxxxxxxxxxxxx> wrote:
> Simon Gaiser:
>> Jan Beulich:
>>> Make sure no previously present features are missing after resume (and
>>> the re-loading of microcode), to avoid later crashes or (likely silent)
>>> hangs / live locks. This doesn't go beyond checking x86_capability[],
>>> but this should be good enough for the immediate need of making sure
>>> that the BIT mitigation MSRs are still available.
>>>
>>> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
>>>
>>> --- a/xen/arch/x86/acpi/power.c
>>> +++ b/xen/arch/x86/acpi/power.c
>>> @@ -254,6 +254,9 @@ static int enter_state(u32 state)
>>>
>>> microcode_resume_cpu(0);
>>>
>>> + if ( !recheck_cpu_features(0) )
>>> + panic("Missing previously available feature(s).");
>>> +
>>> ci->bti_ist_info = default_bti_ist_info;
>>> asm volatile (ALTERNATIVE("", "wrmsr", X86_FEATURE_XEN_IBRS_SET)
>>> :: "a" (SPEC_CTRL_IBRS), "c" (MSR_SPEC_CTRL), "d" (0)
>>> --- a/xen/arch/x86/cpu/common.c
>>> +++ b/xen/arch/x86/cpu/common.c
>>> @@ -501,6 +501,9 @@ void identify_cpu(struct cpuinfo_x86 *c)
>>> printk("\n");
>>> #endif
>>>
>>> + if (system_state == SYS_STATE_resume)
>>> + return;
>>> +
>>> /*
>>> * On SMP, boot_cpu_data holds the common feature set between
>>> * all CPUs; so make sure that we indicate which features are
>>> --- a/xen/arch/x86/cpuid.c
>>> +++ b/xen/arch/x86/cpuid.c
>>> @@ -473,6 +473,28 @@ void __init init_guest_cpuid(void)
>>> calculate_hvm_max_policy();
>>> }
>>>
>>> +bool recheck_cpu_features(unsigned int cpu)
>>> +{
>>> + bool okay = true;
>>> + struct cpuinfo_x86 c;
>>> + const struct cpuinfo_x86 *bsp = &boot_cpu_data;
>>> + unsigned int i;
>>> +
>>> + identify_cpu(&c);
>>
>> This runs into a bug in identify_cpu(). x86_vendor_id does not get
>> zeroed, so the x86_vendor_id is not null terminated and the vendor
>> identification fails.
>>
>> diff --git a/xen/arch/x86/cpu/common.c b/xen/arch/x86/cpu/common.c
>> index 4feaa2ceb6..5750d26216 100644
>> --- a/xen/arch/x86/cpu/common.c
>> +++ b/xen/arch/x86/cpu/common.c
>> @@ -366,8 +366,8 @@ void identify_cpu(struct cpuinfo_x86 *c)
>> c->x86_vendor = X86_VENDOR_UNKNOWN;
>> c->cpuid_level = -1; /* CPUID not detected */
>> c->x86_model = c->x86_mask = 0; /* So far unknown... */
>> - c->x86_vendor_id[0] = '\0'; /* Unset */
>> - c->x86_model_id[0] = '\0'; /* Unset */
>> + memset(&c->x86_vendor_id, 0, sizeof(c->x86_vendor_id));
>> + memset(&c->x86_model_id, 0, sizeof(c->x86_model_id));
>> c->x86_max_cores = 1;
>> c->x86_num_siblings = 1;
>> c->x86_clflush_size = 0;
>>
>> With this patch it works for me.
>
> Meh, also a backport failure from me. Since e34bc403c3c7 this problem
> should not appear since it does not assume a null terminated string.
NP - it's good to be aware of such issues in case we as well decide to
backport this.
Thanks for the feedback,
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |