KVM: Replace read accesses of vcpu->arch.cr0 by an accessor
Since we'd like to allow the guest to own a few bits of cr0 at times, we need to know when we access those bits. Signed-off-by: Avi Kivity <avi@redhat.com>
This commit is contained in:
committed by
Marcelo Tosatti
parent
a1f83a74fe
commit
4d4ec08745
@@ -430,7 +430,7 @@ void kvm_set_cr0(struct kvm_vcpu *vcpu, unsigned long cr0)
|
||||
{
|
||||
if (cr0 & CR0_RESERVED_BITS) {
|
||||
printk(KERN_DEBUG "set_cr0: 0x%lx #GP, reserved bits 0x%lx\n",
|
||||
cr0, vcpu->arch.cr0);
|
||||
cr0, kvm_read_cr0(vcpu));
|
||||
kvm_inject_gp(vcpu, 0);
|
||||
return;
|
||||
}
|
||||
@@ -488,7 +488,7 @@ EXPORT_SYMBOL_GPL(kvm_set_cr0);
|
||||
|
||||
void kvm_lmsw(struct kvm_vcpu *vcpu, unsigned long msw)
|
||||
{
|
||||
kvm_set_cr0(vcpu, (vcpu->arch.cr0 & ~0x0ful) | (msw & 0x0f));
|
||||
kvm_set_cr0(vcpu, kvm_read_cr0_bits(vcpu, ~0x0ful) | (msw & 0x0f));
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(kvm_lmsw);
|
||||
|
||||
@@ -3095,7 +3095,7 @@ int emulate_invlpg(struct kvm_vcpu *vcpu, gva_t address)
|
||||
|
||||
int emulate_clts(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
kvm_x86_ops->set_cr0(vcpu, vcpu->arch.cr0 & ~X86_CR0_TS);
|
||||
kvm_x86_ops->set_cr0(vcpu, kvm_read_cr0_bits(vcpu, ~X86_CR0_TS));
|
||||
return X86EMUL_CONTINUE;
|
||||
}
|
||||
|
||||
@@ -3714,7 +3714,7 @@ unsigned long realmode_get_cr(struct kvm_vcpu *vcpu, int cr)
|
||||
|
||||
switch (cr) {
|
||||
case 0:
|
||||
value = vcpu->arch.cr0;
|
||||
value = kvm_read_cr0(vcpu);
|
||||
break;
|
||||
case 2:
|
||||
value = vcpu->arch.cr2;
|
||||
@@ -3741,7 +3741,7 @@ void realmode_set_cr(struct kvm_vcpu *vcpu, int cr, unsigned long val,
|
||||
{
|
||||
switch (cr) {
|
||||
case 0:
|
||||
kvm_set_cr0(vcpu, mk_cr_64(vcpu->arch.cr0, val));
|
||||
kvm_set_cr0(vcpu, mk_cr_64(kvm_read_cr0(vcpu), val));
|
||||
*rflags = kvm_get_rflags(vcpu);
|
||||
break;
|
||||
case 2:
|
||||
@@ -4335,7 +4335,7 @@ int kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu,
|
||||
sregs->gdt.limit = dt.limit;
|
||||
sregs->gdt.base = dt.base;
|
||||
|
||||
sregs->cr0 = vcpu->arch.cr0;
|
||||
sregs->cr0 = kvm_read_cr0(vcpu);
|
||||
sregs->cr2 = vcpu->arch.cr2;
|
||||
sregs->cr3 = vcpu->arch.cr3;
|
||||
sregs->cr4 = kvm_read_cr4(vcpu);
|
||||
@@ -4521,7 +4521,7 @@ int kvm_load_segment_descriptor(struct kvm_vcpu *vcpu, u16 selector,
|
||||
{
|
||||
struct kvm_segment kvm_seg;
|
||||
|
||||
if (is_vm86_segment(vcpu, seg) || !(vcpu->arch.cr0 & X86_CR0_PE))
|
||||
if (is_vm86_segment(vcpu, seg) || !(kvm_read_cr0_bits(vcpu, X86_CR0_PE)))
|
||||
return kvm_load_realmode_segment(vcpu, selector, seg);
|
||||
if (load_segment_descriptor_to_kvm_desct(vcpu, selector, &kvm_seg))
|
||||
return 1;
|
||||
@@ -4799,7 +4799,7 @@ int kvm_task_switch(struct kvm_vcpu *vcpu, u16 tss_selector, int reason)
|
||||
&nseg_desc);
|
||||
}
|
||||
|
||||
kvm_x86_ops->set_cr0(vcpu, vcpu->arch.cr0 | X86_CR0_TS);
|
||||
kvm_x86_ops->set_cr0(vcpu, kvm_read_cr0(vcpu) | X86_CR0_TS);
|
||||
seg_desct_to_kvm_desct(&nseg_desc, tss_selector, &tr_seg);
|
||||
tr_seg.type = 11;
|
||||
kvm_set_segment(vcpu, &tr_seg, VCPU_SREG_TR);
|
||||
@@ -4834,7 +4834,7 @@ int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu,
|
||||
kvm_x86_ops->set_efer(vcpu, sregs->efer);
|
||||
kvm_set_apic_base(vcpu, sregs->apic_base);
|
||||
|
||||
mmu_reset_needed |= vcpu->arch.cr0 != sregs->cr0;
|
||||
mmu_reset_needed |= kvm_read_cr0(vcpu) != sregs->cr0;
|
||||
kvm_x86_ops->set_cr0(vcpu, sregs->cr0);
|
||||
vcpu->arch.cr0 = sregs->cr0;
|
||||
|
||||
@@ -4873,7 +4873,7 @@ int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu,
|
||||
/* Older userspace won't unhalt the vcpu on reset. */
|
||||
if (kvm_vcpu_is_bsp(vcpu) && kvm_rip_read(vcpu) == 0xfff0 &&
|
||||
sregs->cs.selector == 0xf000 && sregs->cs.base == 0xffff0000 &&
|
||||
!(vcpu->arch.cr0 & X86_CR0_PE))
|
||||
!(kvm_read_cr0_bits(vcpu, X86_CR0_PE)))
|
||||
vcpu->arch.mp_state = KVM_MP_STATE_RUNNABLE;
|
||||
|
||||
vcpu_put(vcpu);
|
||||
|
Reference in New Issue
Block a user