return -ENOENT;
}
-static void clear_atomic_switch_msr(struct vcpu_vmx *vmx, unsigned msr)
+static void vmx_remove_auto_msr(struct vmx_msrs *m, u32 msr,
+ unsigned long vmcs_count_field)
{
int i;
+
+ i = vmx_find_loadstore_msr_slot(m, msr);
+ if (i < 0)
+ return;
+
+ --m->nr;
+ m->val[i] = m->val[m->nr];
+ vmcs_write32(vmcs_count_field, m->nr);
+}
+
+static void clear_atomic_switch_msr(struct vcpu_vmx *vmx, unsigned msr)
+{
struct msr_autoload *m = &vmx->msr_autoload;
switch (msr) {
}
break;
}
- i = vmx_find_loadstore_msr_slot(&m->guest, msr);
- if (i < 0)
- goto skip_guest;
- --m->guest.nr;
- m->guest.val[i] = m->guest.val[m->guest.nr];
- vmcs_write32(VM_ENTRY_MSR_LOAD_COUNT, m->guest.nr);
-
-skip_guest:
- i = vmx_find_loadstore_msr_slot(&m->host, msr);
- if (i < 0)
- return;
- --m->host.nr;
- m->host.val[i] = m->host.val[m->host.nr];
- vmcs_write32(VM_EXIT_MSR_LOAD_COUNT, m->host.nr);
+ vmx_remove_auto_msr(&m->guest, msr, VM_ENTRY_MSR_LOAD_COUNT);
+ vmx_remove_auto_msr(&m->host, msr, VM_EXIT_MSR_LOAD_COUNT);
}
static __always_inline void add_atomic_switch_msr_special(struct vcpu_vmx *vmx,