diff options
Diffstat (limited to 'arch/x86/kvm/vmx/sgx.c')
| -rw-r--r-- | arch/x86/kvm/vmx/sgx.c | 15 | 
1 files changed, 9 insertions, 6 deletions
diff --git a/arch/x86/kvm/vmx/sgx.c b/arch/x86/kvm/vmx/sgx.c index 2261b684a7d4..3e822e582497 100644 --- a/arch/x86/kvm/vmx/sgx.c +++ b/arch/x86/kvm/vmx/sgx.c @@ -357,11 +357,12 @@ static int handle_encls_einit(struct kvm_vcpu *vcpu)  static inline bool encls_leaf_enabled_in_guest(struct kvm_vcpu *vcpu, u32 leaf)  { -	if (!enable_sgx || !guest_cpuid_has(vcpu, X86_FEATURE_SGX)) -		return false; - +	/* +	 * ENCLS generates a #UD if SGX1 isn't supported, i.e. this point will +	 * be reached if and only if the SGX1 leafs are enabled. +	 */  	if (leaf >= ECREATE && leaf <= ETRACK) -		return guest_cpuid_has(vcpu, X86_FEATURE_SGX1); +		return true;  	if (leaf >= EAUG && leaf <= EMODT)  		return guest_cpuid_has(vcpu, X86_FEATURE_SGX2); @@ -380,9 +381,11 @@ int handle_encls(struct kvm_vcpu *vcpu)  {  	u32 leaf = (u32)kvm_rax_read(vcpu); -	if (!encls_leaf_enabled_in_guest(vcpu, leaf)) { +	if (!enable_sgx || !guest_cpuid_has(vcpu, X86_FEATURE_SGX) || +	    !guest_cpuid_has(vcpu, X86_FEATURE_SGX1)) {  		kvm_queue_exception(vcpu, UD_VECTOR); -	} else if (!sgx_enabled_in_guest_bios(vcpu)) { +	} else if (!encls_leaf_enabled_in_guest(vcpu, leaf) || +		   !sgx_enabled_in_guest_bios(vcpu) || !is_paging(vcpu)) {  		kvm_inject_gp(vcpu, 0);  	} else {  		if (leaf == ECREATE)  | 
