loaded_vmcs
vmcs_load(vmx->loaded_vmcs->vmcs);
vmcs_load(vmx->loaded_vmcs->vmcs);
static void prepare_vmcs02_early(struct vcpu_vmx *vmx, struct loaded_vmcs *vmcs01,
vmx->loaded_vmcs->nmi_known_unmasked =
struct loaded_vmcs *prev)
dest = &vmx->loaded_vmcs->host_state;
static void vmx_switch_vmcs(struct kvm_vcpu *vcpu, struct loaded_vmcs *vmcs)
struct loaded_vmcs *prev;
if (WARN_ON_ONCE(vmx->loaded_vmcs == vmcs))
prev = vmx->loaded_vmcs;
vmx->loaded_vmcs = vmcs;
if (WARN_ON_ONCE(vmx->loaded_vmcs != &vmx->vmcs01))
WARN_ON_ONCE(vmx->loaded_vmcs != &vmx->vmcs01);
vmx->loaded_vmcs = &vmx->nested.vmcs02;
vmx->loaded_vmcs = &vmx->vmcs01;
struct loaded_vmcs *loaded_vmcs = vmx->loaded_vmcs;
if (WARN_ON(loaded_vmcs != &vmx->vmcs01 || loaded_vmcs->shadow_vmcs))
return loaded_vmcs->shadow_vmcs;
loaded_vmcs->shadow_vmcs = alloc_vmcs(true);
if (loaded_vmcs->shadow_vmcs)
vmcs_clear(loaded_vmcs->shadow_vmcs);
return loaded_vmcs->shadow_vmcs;
vmcs_load(vmx->loaded_vmcs->vmcs);
return vmx_test_msr_bitmap_write(vmx->loaded_vmcs->msr_bitmap, msr);
if (vmx->loaded_vmcs->launched)
host_state = &vmx->loaded_vmcs->host_state;
host_state = &vmx->loaded_vmcs->host_state;
bool already_loaded = vmx->loaded_vmcs->cpu == cpu;
loaded_vmcs_clear(vmx->loaded_vmcs);
list_add(&vmx->loaded_vmcs->loaded_vmcss_on_cpu_link,
if (prev != vmx->loaded_vmcs->vmcs) {
per_cpu(current_vmcs, cpu) = vmx->loaded_vmcs->vmcs;
vmcs_load(vmx->loaded_vmcs->vmcs);
vmx->loaded_vmcs->cpu = cpu;
struct loaded_vmcs *vmcs)
vmx->loaded_vmcs = vmcs;
WARN_ON_ONCE(vmx->loaded_vmcs != &vmx->vmcs01);
WARN_ON_ONCE(vmx->loaded_vmcs != &vmx->nested.vmcs02);
struct loaded_vmcs *v, *n;
void free_loaded_vmcs(struct loaded_vmcs *loaded_vmcs)
if (!loaded_vmcs->vmcs)
loaded_vmcs_clear(loaded_vmcs);
free_vmcs(loaded_vmcs->vmcs);
loaded_vmcs->vmcs = NULL;
if (loaded_vmcs->msr_bitmap)
free_page((unsigned long)loaded_vmcs->msr_bitmap);
WARN_ON(loaded_vmcs->shadow_vmcs != NULL);
int alloc_loaded_vmcs(struct loaded_vmcs *loaded_vmcs)
loaded_vmcs->vmcs = alloc_vmcs(false);
if (!loaded_vmcs->vmcs)
vmcs_clear(loaded_vmcs->vmcs);
loaded_vmcs->shadow_vmcs = NULL;
loaded_vmcs->hv_timer_soft_disabled = false;
loaded_vmcs->cpu = -1;
loaded_vmcs->launched = 0;
loaded_vmcs->msr_bitmap = (unsigned long *)
if (!loaded_vmcs->msr_bitmap)
memset(loaded_vmcs->msr_bitmap, 0xff, PAGE_SIZE);
memset(&loaded_vmcs->host_state, 0, sizeof(struct vmcs_host_state));
memset(&loaded_vmcs->controls_shadow, 0,
free_loaded_vmcs(loaded_vmcs);
vmx->loaded_vmcs->host_state.cr3 = cr3;
vmx->loaded_vmcs->host_state.cr4 = cr4;
vmx->loaded_vmcs->soft_vnmi_blocked = 1;
vmx->loaded_vmcs->vnmi_blocked_time = 0;
vmx->loaded_vmcs->nmi_known_unmasked = false;
return vmx->loaded_vmcs->soft_vnmi_blocked;
if (vmx->loaded_vmcs->nmi_known_unmasked)
vmx->loaded_vmcs->nmi_known_unmasked = !masked;
if (vmx->loaded_vmcs->soft_vnmi_blocked != masked) {
vmx->loaded_vmcs->soft_vnmi_blocked = masked;
vmx->loaded_vmcs->vnmi_blocked_time = 0;
vmx->loaded_vmcs->nmi_known_unmasked = !masked;
if (!enable_vnmi && to_vmx(vcpu)->loaded_vmcs->soft_vnmi_blocked)
if (unlikely(vmx->loaded_vmcs->hv_timer_soft_disabled))
evmcs = (struct hv_enlightened_vmcs *)to_vmx(vcpu)->loaded_vmcs->vmcs;
vmx->loaded_vmcs->vmcs, vcpu->arch.last_vmentry_cpu);
vmx->loaded_vmcs->soft_vnmi_blocked)) {
vmx->loaded_vmcs->soft_vnmi_blocked = 0;
} else if (vmx->loaded_vmcs->vnmi_blocked_time > 1000000000LL &&
vmx->loaded_vmcs->soft_vnmi_blocked = 0;
if (vmx->loaded_vmcs->nmi_known_unmasked)
vmx->loaded_vmcs->nmi_known_unmasked =
} else if (unlikely(vmx->loaded_vmcs->soft_vnmi_blocked))
vmx->loaded_vmcs->vnmi_blocked_time +=
vmx->loaded_vmcs->entry_time));
vmx->loaded_vmcs->hv_timer_soft_disabled = false;
vmx->loaded_vmcs->hv_timer_soft_disabled = false;
} else if (!vmx->loaded_vmcs->hv_timer_soft_disabled) {
vmx->loaded_vmcs->hv_timer_soft_disabled = true;
if (unlikely(host_rsp != vmx->loaded_vmcs->host_state.rsp)) {
vmx->loaded_vmcs->host_state.rsp = host_rsp;
vmx->loaded_vmcs->soft_vnmi_blocked))
vmx->loaded_vmcs->entry_time = ktime_get();
if (unlikely(cr3 != vmx->loaded_vmcs->host_state.cr3)) {
vmx->loaded_vmcs->host_state.cr3 = cr3;
if (unlikely(cr4 != vmx->loaded_vmcs->host_state.cr4)) {
vmx->loaded_vmcs->host_state.cr4 = cr4;
vmx->loaded_vmcs->launched = 1;
free_loaded_vmcs(vmx->loaded_vmcs);
vmx->loaded_vmcs = &vmx->vmcs01;
free_loaded_vmcs(vmx->loaded_vmcs);
struct loaded_vmcs *v;
struct loaded_vmcs *loaded_vmcs = arg;
if (loaded_vmcs->cpu != cpu)
if (per_cpu(current_vmcs, cpu) == loaded_vmcs->vmcs)
vmcs_clear(loaded_vmcs->vmcs);
if (loaded_vmcs->shadow_vmcs && loaded_vmcs->launched)
vmcs_clear(loaded_vmcs->shadow_vmcs);
list_del(&loaded_vmcs->loaded_vmcss_on_cpu_link);
loaded_vmcs->cpu = -1;
loaded_vmcs->launched = 0;
static void loaded_vmcs_clear(struct loaded_vmcs *loaded_vmcs)
int cpu = loaded_vmcs->cpu;
__loaded_vmcs_clear, loaded_vmcs, 1);
struct loaded_vmcs vmcs02;
struct loaded_vmcs vmcs01;
struct loaded_vmcs *loaded_vmcs;
if (vmx->loaded_vmcs->controls_shadow.lname != val) { \
vmx->loaded_vmcs->controls_shadow.lname = val; \
static inline u##bits __##lname##_controls_get(struct loaded_vmcs *vmcs) \
return __##lname##_controls_get(vmx->loaded_vmcs); \
int alloc_loaded_vmcs(struct loaded_vmcs *loaded_vmcs);
void free_loaded_vmcs(struct loaded_vmcs *loaded_vmcs);