vmx_capability
__u32 vmx_capability[NVMXINTS];
memset(&c->vmx_capability, 0, sizeof(c->vmx_capability));
if (c->vmx_capability[MISC_FEATURES] & VMX_F(VPID))
c->vmx_capability[PRIMARY_CTLS] = supported;
c->vmx_capability[SECONDARY_CTLS] = supported;
c->vmx_capability[TERTIARY_CTLS_LOW] = low;
c->vmx_capability[TERTIARY_CTLS_HIGH] = high;
c->vmx_capability[MISC_FEATURES] = (supported & 0xffff) |
c->vmx_capability[MISC_FEATURES] |= VMX_F(EPT_EXECUTE_ONLY);
c->vmx_capability[MISC_FEATURES] |= VMX_F(EPT_AD);
c->vmx_capability[MISC_FEATURES] |= VMX_F(EPT_1GB);
c->vmx_capability[MISC_FEATURES] |= VMX_F(EPT_5LEVEL);
if ((c->vmx_capability[PRIMARY_CTLS] & VMX_F(VIRTUAL_TPR)) &&
(c->vmx_capability[SECONDARY_CTLS] & VMX_F(VIRT_APIC_ACCESSES)))
c->vmx_capability[MISC_FEATURES] |= VMX_F(FLEXPRIORITY);
if ((c->vmx_capability[PRIMARY_CTLS] & VMX_F(VIRTUAL_TPR)) &&
(c->vmx_capability[SECONDARY_CTLS] & VMX_F(APIC_REGISTER_VIRT)) &&
(c->vmx_capability[SECONDARY_CTLS] & VMX_F(VIRT_INTR_DELIVERY)) &&
(c->vmx_capability[MISC_FEATURES] & VMX_F(POSTED_INTR)))
c->vmx_capability[MISC_FEATURES] |= VMX_F(APICV);
if (c->vmx_capability[PRIMARY_CTLS] & VMX_F(VIRTUAL_TPR))
if (c->vmx_capability[MISC_FEATURES] & VMX_F(FLEXPRIORITY))
if (c->vmx_capability[MISC_FEATURES] & VMX_F(VIRTUAL_NMIS))
if (c->vmx_capability[SECONDARY_CTLS] & VMX_F(EPT))
if (c->vmx_capability[MISC_FEATURES] & VMX_F(EPT_AD))
if (cpu_has(c, X86_FEATURE_VMX) && c->vmx_capability[0]) {
if (test_bit(i, (unsigned long *)c->vmx_capability) &&
return vmx_capability.ept & VMX_EPT_EXECUTE_ONLY_BIT;
return vmx_capability.ept & VMX_EPT_PAGE_WALK_4_BIT;
return vmx_capability.ept & VMX_EPT_PAGE_WALK_5_BIT;
return vmx_capability.ept & VMX_EPTP_WB_BIT;
return vmx_capability.ept & VMX_EPT_2MB_PAGE_BIT;
return vmx_capability.ept & VMX_EPT_1GB_PAGE_BIT;
return vmx_capability.ept & VMX_EPT_AD_BIT;
return vmx_capability.ept & VMX_EPT_EXTENT_CONTEXT_BIT;
return vmx_capability.ept & VMX_EPT_EXTENT_GLOBAL_BIT;
return vmx_capability.vpid & VMX_VPID_INVVPID_BIT;
return vmx_capability.vpid & VMX_VPID_EXTENT_INDIVIDUAL_ADDR_BIT;
return vmx_capability.vpid & VMX_VPID_EXTENT_SINGLE_CONTEXT_BIT;
return vmx_capability.vpid & VMX_VPID_EXTENT_GLOBAL_CONTEXT_BIT;
extern struct vmx_capability vmx_capability __ro_after_init;
nested_vmx_setup_ctls_msrs(&vmcs_config, vmx_capability.ept);
struct vmx_capability *vmx_cap)
struct vmx_capability vmx_cap;
struct vmx_capability vmx_capability __ro_after_init;
ept_caps_to_lpage_level(vmx_capability.ept));
if (setup_vmcs_config(&vmcs_config, &vmx_capability) < 0)