x86.c (cb84b55f6cde26c7c17beaf87da08645ae6ccbf9) x86.c (fc78f51938e1ea866daa2045851b2e5681371668)
1/*
2 * Kernel-based Virtual Machine driver for Linux
3 *
4 * derived from drivers/kvm/kvm_main.c
5 *
6 * Copyright (C) 2006 Qumranet, Inc.
7 * Copyright (C) 2008 Qumranet, Inc.
8 * Copyright IBM Corporation, 2008

--- 468 unchanged lines hidden (view full) ---

477void kvm_lmsw(struct kvm_vcpu *vcpu, unsigned long msw)
478{
479 kvm_set_cr0(vcpu, (vcpu->arch.cr0 & ~0x0ful) | (msw & 0x0f));
480}
481EXPORT_SYMBOL_GPL(kvm_lmsw);
482
483void kvm_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4)
484{
1/*
2 * Kernel-based Virtual Machine driver for Linux
3 *
4 * derived from drivers/kvm/kvm_main.c
5 *
6 * Copyright (C) 2006 Qumranet, Inc.
7 * Copyright (C) 2008 Qumranet, Inc.
8 * Copyright IBM Corporation, 2008

--- 468 unchanged lines hidden (view full) ---

477void kvm_lmsw(struct kvm_vcpu *vcpu, unsigned long msw)
478{
479 kvm_set_cr0(vcpu, (vcpu->arch.cr0 & ~0x0ful) | (msw & 0x0f));
480}
481EXPORT_SYMBOL_GPL(kvm_lmsw);
482
483void kvm_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4)
484{
485 unsigned long old_cr4 = vcpu->arch.cr4;
485 unsigned long old_cr4 = kvm_read_cr4(vcpu);
486 unsigned long pdptr_bits = X86_CR4_PGE | X86_CR4_PSE | X86_CR4_PAE;
487
488 if (cr4 & CR4_RESERVED_BITS) {
489 printk(KERN_DEBUG "set_cr4: #GP, reserved bits\n");
490 kvm_inject_gp(vcpu, 0);
491 return;
492 }
493

--- 1400 unchanged lines hidden (view full) ---

1894 /*
1895 * if IA32_MCi_CTL is not all 1s, the uncorrected error
1896 * reporting is disabled for the bank
1897 */
1898 if ((mce->status & MCI_STATUS_UC) && banks[0] != ~(u64)0)
1899 return 0;
1900 if (mce->status & MCI_STATUS_UC) {
1901 if ((vcpu->arch.mcg_status & MCG_STATUS_MCIP) ||
486 unsigned long pdptr_bits = X86_CR4_PGE | X86_CR4_PSE | X86_CR4_PAE;
487
488 if (cr4 & CR4_RESERVED_BITS) {
489 printk(KERN_DEBUG "set_cr4: #GP, reserved bits\n");
490 kvm_inject_gp(vcpu, 0);
491 return;
492 }
493

--- 1400 unchanged lines hidden (view full) ---

1894 /*
1895 * if IA32_MCi_CTL is not all 1s, the uncorrected error
1896 * reporting is disabled for the bank
1897 */
1898 if ((mce->status & MCI_STATUS_UC) && banks[0] != ~(u64)0)
1899 return 0;
1900 if (mce->status & MCI_STATUS_UC) {
1901 if ((vcpu->arch.mcg_status & MCG_STATUS_MCIP) ||
1902 !(vcpu->arch.cr4 & X86_CR4_MCE)) {
1902 !kvm_read_cr4_bits(vcpu, X86_CR4_MCE)) {
1903 printk(KERN_DEBUG "kvm: set_mce: "
1904 "injects mce exception while "
1905 "previous one is in progress!\n");
1906 set_bit(KVM_REQ_TRIPLE_FAULT, &vcpu->requests);
1907 return 0;
1908 }
1909 if (banks[1] & MCI_STATUS_VAL)
1910 mce->status |= MCI_STATUS_OVER;

--- 1700 unchanged lines hidden (view full) ---

3611 kvm_lmsw(vcpu, msw);
3612 *rflags = kvm_get_rflags(vcpu);
3613}
3614
3615unsigned long realmode_get_cr(struct kvm_vcpu *vcpu, int cr)
3616{
3617 unsigned long value;
3618
1903 printk(KERN_DEBUG "kvm: set_mce: "
1904 "injects mce exception while "
1905 "previous one is in progress!\n");
1906 set_bit(KVM_REQ_TRIPLE_FAULT, &vcpu->requests);
1907 return 0;
1908 }
1909 if (banks[1] & MCI_STATUS_VAL)
1910 mce->status |= MCI_STATUS_OVER;

--- 1700 unchanged lines hidden (view full) ---

3611 kvm_lmsw(vcpu, msw);
3612 *rflags = kvm_get_rflags(vcpu);
3613}
3614
3615unsigned long realmode_get_cr(struct kvm_vcpu *vcpu, int cr)
3616{
3617 unsigned long value;
3618
3619 kvm_x86_ops->decache_cr4_guest_bits(vcpu);
3620 switch (cr) {
3621 case 0:
3622 value = vcpu->arch.cr0;
3623 break;
3624 case 2:
3625 value = vcpu->arch.cr2;
3626 break;
3627 case 3:
3628 value = vcpu->arch.cr3;
3629 break;
3630 case 4:
3619 switch (cr) {
3620 case 0:
3621 value = vcpu->arch.cr0;
3622 break;
3623 case 2:
3624 value = vcpu->arch.cr2;
3625 break;
3626 case 3:
3627 value = vcpu->arch.cr3;
3628 break;
3629 case 4:
3631 value = vcpu->arch.cr4;
3630 value = kvm_read_cr4(vcpu);
3632 break;
3633 case 8:
3634 value = kvm_get_cr8(vcpu);
3635 break;
3636 default:
3637 vcpu_printf(vcpu, "%s: unexpected cr %u\n", __func__, cr);
3638 return 0;
3639 }

--- 11 unchanged lines hidden (view full) ---

3651 break;
3652 case 2:
3653 vcpu->arch.cr2 = val;
3654 break;
3655 case 3:
3656 kvm_set_cr3(vcpu, val);
3657 break;
3658 case 4:
3631 break;
3632 case 8:
3633 value = kvm_get_cr8(vcpu);
3634 break;
3635 default:
3636 vcpu_printf(vcpu, "%s: unexpected cr %u\n", __func__, cr);
3637 return 0;
3638 }

--- 11 unchanged lines hidden (view full) ---

3650 break;
3651 case 2:
3652 vcpu->arch.cr2 = val;
3653 break;
3654 case 3:
3655 kvm_set_cr3(vcpu, val);
3656 break;
3657 case 4:
3659 kvm_set_cr4(vcpu, mk_cr_64(vcpu->arch.cr4, val));
3658 kvm_set_cr4(vcpu, mk_cr_64(kvm_read_cr4(vcpu), val));
3660 break;
3661 case 8:
3662 kvm_set_cr8(vcpu, val & 0xfUL);
3663 break;
3664 default:
3665 vcpu_printf(vcpu, "%s: unexpected cr %u\n", __func__, cr);
3666 }
3667}

--- 564 unchanged lines hidden (view full) ---

4232
4233 kvm_x86_ops->get_idt(vcpu, &dt);
4234 sregs->idt.limit = dt.limit;
4235 sregs->idt.base = dt.base;
4236 kvm_x86_ops->get_gdt(vcpu, &dt);
4237 sregs->gdt.limit = dt.limit;
4238 sregs->gdt.base = dt.base;
4239
3659 break;
3660 case 8:
3661 kvm_set_cr8(vcpu, val & 0xfUL);
3662 break;
3663 default:
3664 vcpu_printf(vcpu, "%s: unexpected cr %u\n", __func__, cr);
3665 }
3666}

--- 564 unchanged lines hidden (view full) ---

4231
4232 kvm_x86_ops->get_idt(vcpu, &dt);
4233 sregs->idt.limit = dt.limit;
4234 sregs->idt.base = dt.base;
4235 kvm_x86_ops->get_gdt(vcpu, &dt);
4236 sregs->gdt.limit = dt.limit;
4237 sregs->gdt.base = dt.base;
4238
4240 kvm_x86_ops->decache_cr4_guest_bits(vcpu);
4241 sregs->cr0 = vcpu->arch.cr0;
4242 sregs->cr2 = vcpu->arch.cr2;
4243 sregs->cr3 = vcpu->arch.cr3;
4239 sregs->cr0 = vcpu->arch.cr0;
4240 sregs->cr2 = vcpu->arch.cr2;
4241 sregs->cr3 = vcpu->arch.cr3;
4244 sregs->cr4 = vcpu->arch.cr4;
4242 sregs->cr4 = kvm_read_cr4(vcpu);
4245 sregs->cr8 = kvm_get_cr8(vcpu);
4246 sregs->efer = vcpu->arch.shadow_efer;
4247 sregs->apic_base = kvm_get_apic_base(vcpu);
4248
4249 memset(sregs->interrupt_bitmap, 0, sizeof sregs->interrupt_bitmap);
4250
4251 if (vcpu->arch.interrupt.pending && !vcpu->arch.interrupt.soft)
4252 set_bit(vcpu->arch.interrupt.nr,

--- 479 unchanged lines hidden (view full) ---

4732 vcpu->arch.cr3 = sregs->cr3;
4733
4734 kvm_set_cr8(vcpu, sregs->cr8);
4735
4736 mmu_reset_needed |= vcpu->arch.shadow_efer != sregs->efer;
4737 kvm_x86_ops->set_efer(vcpu, sregs->efer);
4738 kvm_set_apic_base(vcpu, sregs->apic_base);
4739
4243 sregs->cr8 = kvm_get_cr8(vcpu);
4244 sregs->efer = vcpu->arch.shadow_efer;
4245 sregs->apic_base = kvm_get_apic_base(vcpu);
4246
4247 memset(sregs->interrupt_bitmap, 0, sizeof sregs->interrupt_bitmap);
4248
4249 if (vcpu->arch.interrupt.pending && !vcpu->arch.interrupt.soft)
4250 set_bit(vcpu->arch.interrupt.nr,

--- 479 unchanged lines hidden (view full) ---

4730 vcpu->arch.cr3 = sregs->cr3;
4731
4732 kvm_set_cr8(vcpu, sregs->cr8);
4733
4734 mmu_reset_needed |= vcpu->arch.shadow_efer != sregs->efer;
4735 kvm_x86_ops->set_efer(vcpu, sregs->efer);
4736 kvm_set_apic_base(vcpu, sregs->apic_base);
4737
4740 kvm_x86_ops->decache_cr4_guest_bits(vcpu);
4741
4742 mmu_reset_needed |= vcpu->arch.cr0 != sregs->cr0;
4743 kvm_x86_ops->set_cr0(vcpu, sregs->cr0);
4744 vcpu->arch.cr0 = sregs->cr0;
4745
4738 mmu_reset_needed |= vcpu->arch.cr0 != sregs->cr0;
4739 kvm_x86_ops->set_cr0(vcpu, sregs->cr0);
4740 vcpu->arch.cr0 = sregs->cr0;
4741
4746 mmu_reset_needed |= vcpu->arch.cr4 != sregs->cr4;
4742 mmu_reset_needed |= kvm_read_cr4(vcpu) != sregs->cr4;
4747 kvm_x86_ops->set_cr4(vcpu, sregs->cr4);
4748 if (!is_long_mode(vcpu) && is_pae(vcpu)) {
4749 load_pdptrs(vcpu, vcpu->arch.cr3);
4750 mmu_reset_needed = 1;
4751 }
4752
4753 if (mmu_reset_needed)
4754 kvm_mmu_reset_context(vcpu);

--- 582 unchanged lines hidden ---
4743 kvm_x86_ops->set_cr4(vcpu, sregs->cr4);
4744 if (!is_long_mode(vcpu) && is_pae(vcpu)) {
4745 load_pdptrs(vcpu, vcpu->arch.cr3);
4746 mmu_reset_needed = 1;
4747 }
4748
4749 if (mmu_reset_needed)
4750 kvm_mmu_reset_context(vcpu);

--- 582 unchanged lines hidden ---