Message ID | 20220823094328.8458-1-vkarasulli@suse.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [kvm-unit-tests,v1] x86: efi: set up the IDT before accessing MSRs. | expand |
On Tue, Aug 23, 2022, Vasant Karasulli wrote: > Reading or writing MSR_IA32_APICBASE is typically an intercepted > operation and causes #VC exception when the test is launched as > an SEV-ES guest. > > So calling pre_boot_apic_id() and reset_apic() before the IDT is > set up in setup_idt() and load_idt() might cause problems. > > Hence move percpu data setup and reset_apic() call after > setup_idt() and load_idt(). > > Fixes: 3c50214c97f173f5e0f82c7f248a7c62707d8748 (x86: efi: Provide percpu storage) > Signed-off-by: Vasant Karasulli <vkarasulli@suse.de> > --- Reviewed-by: Sean Christopherson <seanjc@google.com> > lib/x86/setup.c | 20 ++++++++++++-------- > 1 file changed, 12 insertions(+), 8 deletions(-) > > diff --git a/lib/x86/setup.c b/lib/x86/setup.c > index 7df0256..712e292 100644 > --- a/lib/x86/setup.c > +++ b/lib/x86/setup.c > @@ -192,8 +192,6 @@ static void setup_segments64(void) > write_gs(KERNEL_DS); > write_ss(KERNEL_DS); > > - /* Setup percpu base */ > - wrmsr(MSR_GS_BASE, (u64)&__percpu_data[pre_boot_apic_id()]); > > /* > * Update the code segment by putting it on the stack before the return > @@ -322,7 +320,7 @@ efi_status_t setup_efi(efi_bootinfo_t *efi_bootinfo) > } > return status; > } > - > + Huh. This causes a conflict for me. My local repo has a tab here that is presumably being removed, but this patch doesn't have anything. If I manually add back the tab, all is well. I suspect your client may be stripping trailing whitespace.
Hi Sean, > Reviewed-by: Sean Christopherson <seanjc@google.com> > > > lib/x86/setup.c | 20 ++++++++++++-------- > > 1 file changed, 12 insertions(+), 8 deletions(-) > > > > diff --git a/lib/x86/setup.c b/lib/x86/setup.c > > index 7df0256..712e292 100644 > > --- a/lib/x86/setup.c > > +++ b/lib/x86/setup.c > > @@ -192,8 +192,6 @@ static void setup_segments64(void) > > write_gs(KERNEL_DS); > > write_ss(KERNEL_DS); > > > > - /* Setup percpu base */ > > - wrmsr(MSR_GS_BASE, (u64)&__percpu_data[pre_boot_apic_id()]); > > > > /* > > * Update the code segment by putting it on the stack before the return > > @@ -322,7 +320,7 @@ efi_status_t setup_efi(efi_bootinfo_t *efi_bootinfo) > > } > > return status; > > } > > - > > + > > Huh. This causes a conflict for me. My local repo has a tab here that is > presumably being removed, but this patch doesn't have anything. If I manually > add back the tab, all is well. I suspect your client may be stripping trailing > whitespace. Yes, I think my client was stripping trailing whitespaces. Do you want me to send a new version of the patch with that formatting? Thanks, Vasant Karasulli Kernel generalist www.suse.com<http://www.suse.com> [https://www.suse.com/assets/img/social-platforms-suse-logo.png]<http://www.suse.com/> SUSE - Open Source Solutions for Enterprise Servers & Cloud<http://www.suse.com/> Modernize your infrastructure with SUSE Linux Enterprise servers, cloud technology for IaaS, and SUSE's software-defined storage. www.suse.com
On Thu, Oct 13, 2022, Vasant Karasulli wrote: > Hi Sean, > > > Reviewed-by: Sean Christopherson <seanjc@google.com> > > > > > lib/x86/setup.c | 20 ++++++++++++-------- > > > 1 file changed, 12 insertions(+), 8 deletions(-) > > > > > > diff --git a/lib/x86/setup.c b/lib/x86/setup.c > > > index 7df0256..712e292 100644 > > > --- a/lib/x86/setup.c > > > +++ b/lib/x86/setup.c > > > @@ -192,8 +192,6 @@ static void setup_segments64(void) > > > write_gs(KERNEL_DS); > > > write_ss(KERNEL_DS); > > > > > > - /* Setup percpu base */ > > > - wrmsr(MSR_GS_BASE, (u64)&__percpu_data[pre_boot_apic_id()]); > > > > > > /* > > > * Update the code segment by putting it on the stack before the return > > > @@ -322,7 +320,7 @@ efi_status_t setup_efi(efi_bootinfo_t *efi_bootinfo) > > > } > > > return status; > > > } > > > - > > > + > > > > Huh. This causes a conflict for me. My local repo has a tab here that is > > presumably being removed, but this patch doesn't have anything. If I manually > > add back the tab, all is well. I suspect your client may be stripping trailing > > whitespace. > > Yes, I think my client was stripping trailing whitespaces. Do you want me > to send a new version of the patch with that formatting? No need, I'll put together a KUT PULL request next unless Paolo beats me to the punch.
diff --git a/lib/x86/setup.c b/lib/x86/setup.c index 7df0256..712e292 100644 --- a/lib/x86/setup.c +++ b/lib/x86/setup.c @@ -192,8 +192,6 @@ static void setup_segments64(void) write_gs(KERNEL_DS); write_ss(KERNEL_DS); - /* Setup percpu base */ - wrmsr(MSR_GS_BASE, (u64)&__percpu_data[pre_boot_apic_id()]); /* * Update the code segment by putting it on the stack before the return @@ -322,7 +320,7 @@ efi_status_t setup_efi(efi_bootinfo_t *efi_bootinfo) } return status; } - + status = setup_rsdp(efi_bootinfo); if (status != EFI_SUCCESS) { printf("Cannot find RSDP in EFI system table\n"); @@ -344,14 +342,20 @@ efi_status_t setup_efi(efi_bootinfo_t *efi_bootinfo) } setup_gdt_tss(); - /* - * GS.base, which points at the per-vCPU data, must be configured prior - * to resetting the APIC, which sets the per-vCPU APIC ops. - */ setup_segments64(); - reset_apic(); setup_idt(); load_idt(); + /* + * Load GS.base with the per-vCPU data. This must be done after + * loading the IDT as reading the APIC ID may #VC when running + * as an SEV-ES guest + */ + wrmsr(MSR_GS_BASE, (u64)&__percpu_data[pre_boot_apic_id()]); + /* + * Resetting the APIC sets the per-vCPU APIC ops and so must be + * done after loading GS.base with the per-vCPU data. + */ + reset_apic(); mask_pic_interrupts(); setup_page_table(); enable_apic();
Reading or writing MSR_IA32_APICBASE is typically an intercepted operation and causes #VC exception when the test is launched as an SEV-ES guest. So calling pre_boot_apic_id() and reset_apic() before the IDT is set up in setup_idt() and load_idt() might cause problems. Hence move percpu data setup and reset_apic() call after setup_idt() and load_idt(). Fixes: 3c50214c97f173f5e0f82c7f248a7c62707d8748 (x86: efi: Provide percpu storage) Signed-off-by: Vasant Karasulli <vkarasulli@suse.de> --- lib/x86/setup.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) -- 2.34.1