diff options
Diffstat (limited to 'arch/x86/kvm/svm.c')
| -rw-r--r-- | arch/x86/kvm/svm.c | 25 | 
1 files changed, 25 insertions, 0 deletions
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c index 59e13a79c2e3..f40d0da1f1d3 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c @@ -45,6 +45,7 @@  #include <asm/debugreg.h>  #include <asm/kvm_para.h>  #include <asm/irq_remapping.h> +#include <asm/nospec-branch.h>  #include <asm/virtext.h>  #include "trace.h" @@ -2197,6 +2198,8 @@ static int ud_interception(struct vcpu_svm *svm)  	int er;  	er = emulate_instruction(&svm->vcpu, EMULTYPE_TRAP_UD); +	if (er == EMULATE_USER_EXIT) +		return 0;  	if (er != EMULATE_DONE)  		kvm_queue_exception(&svm->vcpu, UD_VECTOR);  	return 1; @@ -4977,6 +4980,25 @@ static void svm_vcpu_run(struct kvm_vcpu *vcpu)  		"mov %%r14, %c[r14](%[svm]) \n\t"  		"mov %%r15, %c[r15](%[svm]) \n\t"  #endif +		/* +		* Clear host registers marked as clobbered to prevent +		* speculative use. +		*/ +		"xor %%" _ASM_BX ", %%" _ASM_BX " \n\t" +		"xor %%" _ASM_CX ", %%" _ASM_CX " \n\t" +		"xor %%" _ASM_DX ", %%" _ASM_DX " \n\t" +		"xor %%" _ASM_SI ", %%" _ASM_SI " \n\t" +		"xor %%" _ASM_DI ", %%" _ASM_DI " \n\t" +#ifdef CONFIG_X86_64 +		"xor %%r8, %%r8 \n\t" +		"xor %%r9, %%r9 \n\t" +		"xor %%r10, %%r10 \n\t" +		"xor %%r11, %%r11 \n\t" +		"xor %%r12, %%r12 \n\t" +		"xor %%r13, %%r13 \n\t" +		"xor %%r14, %%r14 \n\t" +		"xor %%r15, %%r15 \n\t" +#endif  		"pop %%" _ASM_BP  		:  		: [svm]"a"(svm), @@ -5006,6 +5028,9 @@ static void svm_vcpu_run(struct kvm_vcpu *vcpu)  #endif  		); +	/* Eliminate branch target predictions from guest mode */ +	vmexit_fill_RSB(); +  #ifdef CONFIG_X86_64  	wrmsrl(MSR_GS_BASE, svm->host.gs_base);  #else  |