aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kvm/x86.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86/kvm/x86.c')
-rw-r--r--arch/x86/kvm/x86.c59
1 files changed, 42 insertions, 17 deletions
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 65e4559eef2f..099b851dabaf 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -1125,7 +1125,7 @@ static u32 msrs_to_save[] = {
1125#endif 1125#endif
1126 MSR_IA32_TSC, MSR_IA32_CR_PAT, MSR_VM_HSAVE_PA, 1126 MSR_IA32_TSC, MSR_IA32_CR_PAT, MSR_VM_HSAVE_PA,
1127 MSR_IA32_FEATURE_CONTROL, MSR_IA32_BNDCFGS, MSR_TSC_AUX, 1127 MSR_IA32_FEATURE_CONTROL, MSR_IA32_BNDCFGS, MSR_TSC_AUX,
1128 MSR_IA32_SPEC_CTRL, MSR_IA32_ARCH_CAPABILITIES, 1128 MSR_IA32_SPEC_CTRL,
1129 MSR_IA32_RTIT_CTL, MSR_IA32_RTIT_STATUS, MSR_IA32_RTIT_CR3_MATCH, 1129 MSR_IA32_RTIT_CTL, MSR_IA32_RTIT_STATUS, MSR_IA32_RTIT_CR3_MATCH,
1130 MSR_IA32_RTIT_OUTPUT_BASE, MSR_IA32_RTIT_OUTPUT_MASK, 1130 MSR_IA32_RTIT_OUTPUT_BASE, MSR_IA32_RTIT_OUTPUT_MASK,
1131 MSR_IA32_RTIT_ADDR0_A, MSR_IA32_RTIT_ADDR0_B, 1131 MSR_IA32_RTIT_ADDR0_A, MSR_IA32_RTIT_ADDR0_B,
@@ -1158,6 +1158,7 @@ static u32 emulated_msrs[] = {
1158 1158
1159 MSR_IA32_TSC_ADJUST, 1159 MSR_IA32_TSC_ADJUST,
1160 MSR_IA32_TSCDEADLINE, 1160 MSR_IA32_TSCDEADLINE,
1161 MSR_IA32_ARCH_CAPABILITIES,
1161 MSR_IA32_MISC_ENABLE, 1162 MSR_IA32_MISC_ENABLE,
1162 MSR_IA32_MCG_STATUS, 1163 MSR_IA32_MCG_STATUS,
1163 MSR_IA32_MCG_CTL, 1164 MSR_IA32_MCG_CTL,
@@ -2443,6 +2444,11 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
2443 if (msr_info->host_initiated) 2444 if (msr_info->host_initiated)
2444 vcpu->arch.microcode_version = data; 2445 vcpu->arch.microcode_version = data;
2445 break; 2446 break;
2447 case MSR_IA32_ARCH_CAPABILITIES:
2448 if (!msr_info->host_initiated)
2449 return 1;
2450 vcpu->arch.arch_capabilities = data;
2451 break;
2446 case MSR_EFER: 2452 case MSR_EFER:
2447 return set_efer(vcpu, data); 2453 return set_efer(vcpu, data);
2448 case MSR_K7_HWCR: 2454 case MSR_K7_HWCR:
@@ -2747,6 +2753,12 @@ int kvm_get_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
2747 case MSR_IA32_UCODE_REV: 2753 case MSR_IA32_UCODE_REV:
2748 msr_info->data = vcpu->arch.microcode_version; 2754 msr_info->data = vcpu->arch.microcode_version;
2749 break; 2755 break;
2756 case MSR_IA32_ARCH_CAPABILITIES:
2757 if (!msr_info->host_initiated &&
2758 !guest_cpuid_has(vcpu, X86_FEATURE_ARCH_CAPABILITIES))
2759 return 1;
2760 msr_info->data = vcpu->arch.arch_capabilities;
2761 break;
2750 case MSR_IA32_TSC: 2762 case MSR_IA32_TSC:
2751 msr_info->data = kvm_scale_tsc(vcpu, rdtsc()) + vcpu->arch.tsc_offset; 2763 msr_info->data = kvm_scale_tsc(vcpu, rdtsc()) + vcpu->arch.tsc_offset;
2752 break; 2764 break;
@@ -6523,14 +6535,27 @@ int kvm_emulate_instruction_from_buffer(struct kvm_vcpu *vcpu,
6523} 6535}
6524EXPORT_SYMBOL_GPL(kvm_emulate_instruction_from_buffer); 6536EXPORT_SYMBOL_GPL(kvm_emulate_instruction_from_buffer);
6525 6537
6538static int complete_fast_pio_out(struct kvm_vcpu *vcpu)
6539{
6540 vcpu->arch.pio.count = 0;
6541
6542 if (unlikely(!kvm_is_linear_rip(vcpu, vcpu->arch.pio.linear_rip)))
6543 return 1;
6544
6545 return kvm_skip_emulated_instruction(vcpu);
6546}
6547
6526static int kvm_fast_pio_out(struct kvm_vcpu *vcpu, int size, 6548static int kvm_fast_pio_out(struct kvm_vcpu *vcpu, int size,
6527 unsigned short port) 6549 unsigned short port)
6528{ 6550{
6529 unsigned long val = kvm_register_read(vcpu, VCPU_REGS_RAX); 6551 unsigned long val = kvm_register_read(vcpu, VCPU_REGS_RAX);
6530 int ret = emulator_pio_out_emulated(&vcpu->arch.emulate_ctxt, 6552 int ret = emulator_pio_out_emulated(&vcpu->arch.emulate_ctxt,
6531 size, port, &val, 1); 6553 size, port, &val, 1);
6532 /* do not return to emulator after return from userspace */ 6554
6533 vcpu->arch.pio.count = 0; 6555 if (!ret) {
6556 vcpu->arch.pio.linear_rip = kvm_get_linear_rip(vcpu);
6557 vcpu->arch.complete_userspace_io = complete_fast_pio_out;
6558 }
6534 return ret; 6559 return ret;
6535} 6560}
6536 6561
@@ -6541,6 +6566,11 @@ static int complete_fast_pio_in(struct kvm_vcpu *vcpu)
6541 /* We should only ever be called with arch.pio.count equal to 1 */ 6566 /* We should only ever be called with arch.pio.count equal to 1 */
6542 BUG_ON(vcpu->arch.pio.count != 1); 6567 BUG_ON(vcpu->arch.pio.count != 1);
6543 6568
6569 if (unlikely(!kvm_is_linear_rip(vcpu, vcpu->arch.pio.linear_rip))) {
6570 vcpu->arch.pio.count = 0;
6571 return 1;
6572 }
6573
6544 /* For size less than 4 we merge, else we zero extend */ 6574 /* For size less than 4 we merge, else we zero extend */
6545 val = (vcpu->arch.pio.size < 4) ? kvm_register_read(vcpu, VCPU_REGS_RAX) 6575 val = (vcpu->arch.pio.size < 4) ? kvm_register_read(vcpu, VCPU_REGS_RAX)
6546 : 0; 6576 : 0;
@@ -6553,7 +6583,7 @@ static int complete_fast_pio_in(struct kvm_vcpu *vcpu)
6553 vcpu->arch.pio.port, &val, 1); 6583 vcpu->arch.pio.port, &val, 1);
6554 kvm_register_write(vcpu, VCPU_REGS_RAX, val); 6584 kvm_register_write(vcpu, VCPU_REGS_RAX, val);
6555 6585
6556 return 1; 6586 return kvm_skip_emulated_instruction(vcpu);
6557} 6587}
6558 6588
6559static int kvm_fast_pio_in(struct kvm_vcpu *vcpu, int size, 6589static int kvm_fast_pio_in(struct kvm_vcpu *vcpu, int size,
@@ -6572,6 +6602,7 @@ static int kvm_fast_pio_in(struct kvm_vcpu *vcpu, int size,
6572 return ret; 6602 return ret;
6573 } 6603 }
6574 6604
6605 vcpu->arch.pio.linear_rip = kvm_get_linear_rip(vcpu);
6575 vcpu->arch.complete_userspace_io = complete_fast_pio_in; 6606 vcpu->arch.complete_userspace_io = complete_fast_pio_in;
6576 6607
6577 return 0; 6608 return 0;
@@ -6579,16 +6610,13 @@ static int kvm_fast_pio_in(struct kvm_vcpu *vcpu, int size,
6579 6610
6580int kvm_fast_pio(struct kvm_vcpu *vcpu, int size, unsigned short port, int in) 6611int kvm_fast_pio(struct kvm_vcpu *vcpu, int size, unsigned short port, int in)
6581{ 6612{
6582 int ret = kvm_skip_emulated_instruction(vcpu); 6613 int ret;
6583 6614
6584 /*
6585 * TODO: we might be squashing a KVM_GUESTDBG_SINGLESTEP-triggered
6586 * KVM_EXIT_DEBUG here.
6587 */
6588 if (in) 6615 if (in)
6589 return kvm_fast_pio_in(vcpu, size, port) && ret; 6616 ret = kvm_fast_pio_in(vcpu, size, port);
6590 else 6617 else
6591 return kvm_fast_pio_out(vcpu, size, port) && ret; 6618 ret = kvm_fast_pio_out(vcpu, size, port);
6619 return ret && kvm_skip_emulated_instruction(vcpu);
6592} 6620}
6593EXPORT_SYMBOL_GPL(kvm_fast_pio); 6621EXPORT_SYMBOL_GPL(kvm_fast_pio);
6594 6622
@@ -8733,6 +8761,7 @@ struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm,
8733 8761
8734int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu) 8762int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu)
8735{ 8763{
8764 vcpu->arch.arch_capabilities = kvm_get_arch_capabilities();
8736 vcpu->arch.msr_platform_info = MSR_PLATFORM_INFO_CPUID_FAULT; 8765 vcpu->arch.msr_platform_info = MSR_PLATFORM_INFO_CPUID_FAULT;
8737 kvm_vcpu_mtrr_init(vcpu); 8766 kvm_vcpu_mtrr_init(vcpu);
8738 vcpu_load(vcpu); 8767 vcpu_load(vcpu);
@@ -9429,13 +9458,9 @@ void kvm_arch_commit_memory_region(struct kvm *kvm,
9429 const struct kvm_memory_slot *new, 9458 const struct kvm_memory_slot *new,
9430 enum kvm_mr_change change) 9459 enum kvm_mr_change change)
9431{ 9460{
9432 int nr_mmu_pages = 0;
9433
9434 if (!kvm->arch.n_requested_mmu_pages) 9461 if (!kvm->arch.n_requested_mmu_pages)
9435 nr_mmu_pages = kvm_mmu_calculate_mmu_pages(kvm); 9462 kvm_mmu_change_mmu_pages(kvm,
9436 9463 kvm_mmu_calculate_default_mmu_pages(kvm));
9437 if (nr_mmu_pages)
9438 kvm_mmu_change_mmu_pages(kvm, nr_mmu_pages);
9439 9464
9440 /* 9465 /*
9441 * Dirty logging tracks sptes in 4k granularity, meaning that large 9466 * Dirty logging tracks sptes in 4k granularity, meaning that large