[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen staging] x86/boot: Don't enable EFER.SCE for !CONFIG_PV builds
commit 8065e1b41688592778de76c731c62f34e71f3129 Author: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> AuthorDate: Mon Apr 20 14:36:53 2020 +0100 Commit: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> CommitDate: Wed Apr 29 21:13:00 2020 +0100 x86/boot: Don't enable EFER.SCE for !CONFIG_PV builds This will cause all SYSCALL/SYSRET instructions to suffer #UD rather than following the MSR_{L,C}STAR pointers, allowing us to drop the star_enter() panic helper, allowing us to clean up the IST stacks in a subsequent patch. Drop the now-dead conditional SYSENTER logic in the middle of subarch_percpu_traps_init(). In addition, vmx_restore_host_msrs() need not restore any host state. (Regarding the asymmetric changes, VT-x automatically restores SYSENTER state on vmexit, and SVM restores both SYSCALL/SYSENTER state with the VMSAVE/VMLOAD instructions.) Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx> Reviewed-by: Kevin Tian <kevin.tian@xxxxxxxxx> --- xen/arch/x86/boot/trampoline.S | 4 ++-- xen/arch/x86/efi/efi-boot.h | 4 +--- xen/arch/x86/hvm/vmx/vmx.c | 4 ++++ xen/arch/x86/x86_64/traps.c | 19 ++++++------------- 4 files changed, 13 insertions(+), 18 deletions(-) diff --git a/xen/arch/x86/boot/trampoline.S b/xen/arch/x86/boot/trampoline.S index 662e6bdd3c..cdecf949b4 100644 --- a/xen/arch/x86/boot/trampoline.S +++ b/xen/arch/x86/boot/trampoline.S @@ -145,9 +145,9 @@ gdt_48: GLOBAL(trampoline_misc_enable_off) .quad 0 -/* EFER OR-mask for boot paths. This gets adjusted with NX when available. */ +/* EFER OR-mask for boot paths. SCE conditional on PV support, NX added when available. */ GLOBAL(trampoline_efer) - .long EFER_LME | EFER_SCE + .long EFER_LME | (EFER_SCE * IS_ENABLED(CONFIG_PV)) GLOBAL(trampoline_xen_phys_start) .long 0 diff --git a/xen/arch/x86/efi/efi-boot.h b/xen/arch/x86/efi/efi-boot.h index 176df20c9c..7188c9a551 100644 --- a/xen/arch/x86/efi/efi-boot.h +++ b/xen/arch/x86/efi/efi-boot.h @@ -238,9 +238,7 @@ static void __init noreturn efi_arch_post_exit_boot(void) /* Set system registers and transfer control. */ asm volatile("pushq $0\n\tpopfq"); rdmsrl(MSR_EFER, efer); - efer |= EFER_SCE; - if ( cpu_has_nx ) - efer |= EFER_NX; + efer |= trampoline_efer; wrmsrl(MSR_EFER, efer); wrmsrl(MSR_IA32_CR_PAT, XEN_MSR_PAT); write_cr0(X86_CR0_PE | X86_CR0_MP | X86_CR0_ET | X86_CR0_NE | X86_CR0_WP | diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c index b4cf2eb4c1..6efa80e422 100644 --- a/xen/arch/x86/hvm/vmx/vmx.c +++ b/xen/arch/x86/hvm/vmx/vmx.c @@ -496,6 +496,10 @@ static void vmx_vcpu_destroy(struct vcpu *v) */ static void vmx_restore_host_msrs(void) { + /* No PV guests? No need to restore host SYSCALL infrastructure. */ + if ( !IS_ENABLED(CONFIG_PV) ) + return; + /* Relies on the SYSCALL trampoline being at the start of the stubs. */ wrmsrl(MSR_STAR, XEN_MSR_STAR); wrmsrl(MSR_LSTAR, this_cpu(stubs.addr)); diff --git a/xen/arch/x86/x86_64/traps.c b/xen/arch/x86/x86_64/traps.c index c3d4faea6b..93af0c5e87 100644 --- a/xen/arch/x86/x86_64/traps.c +++ b/xen/arch/x86/x86_64/traps.c @@ -299,17 +299,8 @@ static unsigned int write_stub_trampoline( DEFINE_PER_CPU(struct stubs, stubs); -#ifdef CONFIG_PV void lstar_enter(void); void cstar_enter(void); -#else -static void __cold star_enter(void) -{ - panic("lstar/cstar\n"); -} -#define lstar_enter star_enter -#define cstar_enter star_enter -#endif /* CONFIG_PV */ void subarch_percpu_traps_init(void) { @@ -321,6 +312,10 @@ void subarch_percpu_traps_init(void) /* IST_MAX IST pages + at least 1 guard page + primary stack. */ BUILD_BUG_ON((IST_MAX + 1) * PAGE_SIZE + PRIMARY_STACK_SIZE > STACK_SIZE); + /* No PV guests? No need to set up SYSCALL/SYSENTER infrastructure. */ + if ( !IS_ENABLED(CONFIG_PV) ) + return; + stub_page = map_domain_page(_mfn(this_cpu(stubs.mfn))); /* @@ -338,10 +333,8 @@ void subarch_percpu_traps_init(void) { /* SYSENTER entry. */ wrmsrl(MSR_IA32_SYSENTER_ESP, stack_bottom); - wrmsrl(MSR_IA32_SYSENTER_EIP, - IS_ENABLED(CONFIG_PV) ? (unsigned long)sysenter_entry : 0); - wrmsr(MSR_IA32_SYSENTER_CS, - IS_ENABLED(CONFIG_PV) ? __HYPERVISOR_CS : 0, 0); + wrmsrl(MSR_IA32_SYSENTER_EIP, (unsigned long)sysenter_entry); + wrmsr(MSR_IA32_SYSENTER_CS, __HYPERVISOR_CS, 0); } /* Trampoline for SYSCALL entry from compatibility mode. */ -- generated by git-patchbot for /home/xen/git/xen.git#staging
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |