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

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

 



On 18/05/19 17:48, Nadav Amit wrote:
> 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 other occasions that do not
> software-enable the APIC after reset (e.g., __test_apic_id() and main()
> in vmx.c). Reenable software-enable APIC in these cases.
> 
> Cc: Sean Christopherson <sean.j.christopherson@xxxxxxxxx>
> Reviewed-by: Krish Sadhukhan <krish.sadhukhan@xxxxxxxxxx>
> Signed-off-by: Nadav Amit <nadav.amit@xxxxxxxxx>
> 
> ---
> 
> v1->v2: Change 0xf0 to APIC_SPIV in one occasion [Krish]
> ---
>  lib/x86/apic.c | 3 ++-
>  x86/apic.c     | 1 -
>  2 files changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/lib/x86/apic.c b/lib/x86/apic.c
> index 2aeffbd..d4528bd 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)
> @@ -219,7 +220,7 @@ void set_irq_line(unsigned line, int val)
>  void enable_apic(void)
>  {
>      printf("enabling apic\n");
> -    xapic_write(0xf0, 0x1ff); /* spurious vector register */
> +    xapic_write(APIC_SPIV, 0x1ff);
>  }
>  
>  void mask_pic_interrupts(void)
> 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));
> 

Queued, thanks.

Paolo



[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