/* SPDX-License-Identifier: GPL-2.0 */
#ifndef __KVM_X86_VMX_HYPERV_H
#define __KVM_X86_VMX_HYPERV_H

#include <linux/kvm_host.h>
#include "vmcs12.h"
#include "vmx.h"

#define EVMPTR_INVALID (-1ULL)
#define EVMPTR_MAP_PENDING (-2ULL)

enum nested_evmptrld_status {
	EVMPTRLD_DISABLED,
	EVMPTRLD_SUCCEEDED,
	EVMPTRLD_VMFAIL,
	EVMPTRLD_ERROR,
};

#ifdef CONFIG_KVM_HYPERV
static inline bool evmptr_is_valid(u64 evmptr)
{
	return evmptr != EVMPTR_INVALID && evmptr != EVMPTR_MAP_PENDING;
}

static inline bool nested_vmx_is_evmptr12_valid(struct vcpu_vmx *vmx)
{
	return evmptr_is_valid(vmx->nested.hv_evmcs_vmptr);
}

static inline bool evmptr_is_set(u64 evmptr)
{
	return evmptr != EVMPTR_INVALID;
}

static inline bool nested_vmx_is_evmptr12_set(struct vcpu_vmx *vmx)
{
	return evmptr_is_set(vmx->nested.hv_evmcs_vmptr);
}

static inline struct hv_enlightened_vmcs *nested_vmx_evmcs(struct vcpu_vmx *vmx)
{
	return vmx->nested.hv_evmcs;
}

static inline bool guest_cpuid_has_evmcs(struct kvm_vcpu *vcpu)
{
	/*
	 * eVMCS is exposed to the guest if Hyper-V is enabled in CPUID and
	 * eVMCS has been explicitly enabled by userspace.
	 */
	return vcpu->arch.hyperv_enabled &&
	       to_vmx(vcpu)->nested.enlightened_vmcs_enabled;
}

u64 nested_get_evmptr(struct kvm_vcpu *vcpu);
uint16_t nested_get_evmcs_version(struct kvm_vcpu *vcpu);
int nested_enable_evmcs(struct kvm_vcpu *vcpu,
			uint16_t *vmcs_version);
void nested_evmcs_filter_control_msr(struct kvm_vcpu *vcpu, u32 msr_index, u64 *pdata);
int nested_evmcs_check_controls(struct vmcs12 *vmcs12);
bool nested_evmcs_l2_tlb_flush_enabled(struct kvm_vcpu *vcpu);
void vmx_hv_inject_synthetic_vmexit_post_tlb_flush(struct kvm_vcpu *vcpu);
#else
static inline bool evmptr_is_valid(u64 evmptr)
{
	return false;
}

static inline bool nested_vmx_is_evmptr12_valid(struct vcpu_vmx *vmx)
{
	return false;
}

static inline bool evmptr_is_set(u64 evmptr)
{
	return false;
}

static inline bool nested_vmx_is_evmptr12_set(struct vcpu_vmx *vmx)
{
	return false;
}

static inline struct hv_enlightened_vmcs *nested_vmx_evmcs(struct vcpu_vmx *vmx)
{
	return NULL;
}
#endif

#endif /* __KVM_X86_VMX_HYPERV_H */
