X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=arch%2Fx86%2Fkvm%2Fvmx.c;h=7a7bd88b2e14e01c4fd127d09dfa78d329d61e37;hb=fe17061207ee371f0cd0f60162947deb9fd16d4a;hp=097f3daae03707762e40b97cb71c378b82962413;hpb=fa440c011c8b0cfbf2a527cfbf8cd7457d0b7864;p=mirror_ubuntu-artful-kernel.git diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index 097f3daae037..7a7bd88b2e14 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c @@ -1082,6 +1082,13 @@ static inline bool is_machine_check(u32 intr_info) (INTR_TYPE_HARD_EXCEPTION | MC_VECTOR | INTR_INFO_VALID_MASK); } +/* Undocumented: icebp/int1 */ +static inline bool is_icebp(u32 intr_info) +{ + return (intr_info & (INTR_INFO_INTR_TYPE_MASK | INTR_INFO_VALID_MASK)) + == (INTR_TYPE_PRIV_SW_EXCEPTION | INTR_INFO_VALID_MASK); +} + static inline bool cpu_has_vmx_msr_bitmap(void) { return vmcs_config.cpu_based_exec_ctrl & CPU_BASED_USE_MSR_BITMAPS; @@ -5844,7 +5851,7 @@ static int handle_exception(struct kvm_vcpu *vcpu) (KVM_GUESTDBG_SINGLESTEP | KVM_GUESTDBG_USE_HW_BP))) { vcpu->arch.dr6 &= ~15; vcpu->arch.dr6 |= dr6 | DR6_RTM; - if (!(dr6 & ~DR6_RESERVED)) /* icebp */ + if (is_icebp(intr_info)) skip_emulated_instruction(vcpu); kvm_queue_exception(vcpu, DB_VECTOR); @@ -8856,14 +8863,14 @@ static void vmx_handle_external_intr(struct kvm_vcpu *vcpu) #endif "pushf\n\t" __ASM_SIZE(push) " $%c[cs]\n\t" - "call *%[entry]\n\t" + CALL_NOSPEC : #ifdef CONFIG_X86_64 [sp]"=&r"(tmp), #endif ASM_CALL_CONSTRAINT : - [entry]"r"(entry), + THUNK_TARGET(entry), [ss]"i"(__KERNEL_DS), [cs]"i"(__KERNEL_CS) ); @@ -9097,9 +9104,8 @@ static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu) atomic_switch_perf_msrs(vmx); - if (ibrs_inuse) - add_atomic_switch_msr(vmx, MSR_IA32_SPEC_CTRL, - vcpu->arch.spec_ctrl, FEATURE_ENABLE_IBRS); + /* SMB: Ignore ibrs_inuse but rely on vcpu value */ + x86_spec_ctrl_set_guest(vcpu->arch.spec_ctrl); debugctlmsr = get_debugctlmsr(); @@ -9223,6 +9229,8 @@ static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu) #endif ); + x86_spec_ctrl_restore_host(vcpu->arch.spec_ctrl); + /* Eliminate branch target predictions from guest mode */ vmexit_fill_RSB();