Re: [kvm-unit-tests PATCH] x86: Set "APIC Software Enable" after APIC reset

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> On May 10, 2019, at 4:52 PM, Nadav Amit <nadav.amit@xxxxxxxxx> wrote:
> 
>> On May 10, 2019, at 4:37 PM, Krish Sadhukhan <krish.sadhukhan@xxxxxxxxxx> wrote:
>> 
>> 
>> 
>> On 05/02/2019 07:08 AM, nadav.amit@xxxxxxxxx wrote:
>>> From: Nadav Amit <nadav.amit@xxxxxxxxx>
>>> 
>>> After the APIC is reset, some of its registers might be reset. As the
>>> SDM says: "When IA32_APIC_BASE[11] is set to 0, prior initialization to
>>> the APIC may be lost and the APIC may return to the state described in
>>> Section 10.4.7.1". The SDM also says that after APIC reset "the
>>> spurious-interrupt vector register is initialized to 000000FFH". This
>>> means that after the APIC is reset it needs to be software-enabled
>>> through the SPIV.
>>> 
>>> This is done one occasion, but there are (at least) two occasions that
>>> do not software-enable the APIC after reset (__test_apic_id() and main()
>>> in vmx.c).
>>> 
>>> Move APIC SPIV reinitialization into reset_apic(). Remove SPIV settings
>>> which are unnecessary after reset_apic() is modified.
>>> 
>>> Cc: Sean Christopherson <sean.j.christopherson@xxxxxxxxx>
>>> Signed-off-by: Nadav Amit <nadav.amit@xxxxxxxxx>
>>> ---
>>> lib/x86/apic.c | 1 +
>>> x86/apic.c     | 1 -
>>> 2 files changed, 1 insertion(+), 1 deletion(-)
>>> 
>>> diff --git a/lib/x86/apic.c b/lib/x86/apic.c
>>> index 2aeffbd..4e7d43c 100644
>>> --- a/lib/x86/apic.c
>>> +++ b/lib/x86/apic.c
>>> @@ -161,6 +161,7 @@ void reset_apic(void)
>>> {
>>>     disable_apic();
>>>     wrmsr(MSR_IA32_APICBASE, rdmsr(MSR_IA32_APICBASE) | APIC_EN);
>>> +    apic_write(APIC_SPIV, 0x1ff);
>>> }
>>>   u32 ioapic_read_reg(unsigned reg)
>>> diff --git a/x86/apic.c b/x86/apic.c
>>> index 3eff588..7ef4a27 100644
>>> --- a/x86/apic.c
>>> +++ b/x86/apic.c
>>> @@ -148,7 +148,6 @@ static void test_apic_disable(void)
>>>     verify_disabled_apic_mmio();
>>>       reset_apic();
>>> -    apic_write(APIC_SPIV, 0x1ff);
>>>     report("Local apic enabled in xAPIC mode",
>>> 	   (rdmsr(MSR_IA32_APICBASE) & (APIC_EN | APIC_EXTD)) == APIC_EN);
>>>     report("CPUID.1H:EDX.APIC[bit 9] is set", cpuid(1).d & (1 << 9));
>> 
>> While you are at it, would you mind replacing "0xf0" with APIC_SPIV in enable_apic() also ?
>> 
>> Reviewed-by: Krish Sadhukhan <krish.sadhukhan@xxxxxxxxxx>
> 
> Will do. Thanks.

Actually, adding write to APIC_SPIV to reset_apic() was wrong. I’ll send a
fixed version later that just modifies the places where APIC_SPIV should be
reset.





[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux