diff options
Diffstat (limited to 'arch/x86/kvm/x86.c')
-rw-r--r-- | arch/x86/kvm/x86.c | 59 |
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 | } |
6524 | EXPORT_SYMBOL_GPL(kvm_emulate_instruction_from_buffer); | 6536 | EXPORT_SYMBOL_GPL(kvm_emulate_instruction_from_buffer); |
6525 | 6537 | ||
6538 | static 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 | |||
6526 | static int kvm_fast_pio_out(struct kvm_vcpu *vcpu, int size, | 6548 | static 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 | ||
6559 | static int kvm_fast_pio_in(struct kvm_vcpu *vcpu, int size, | 6589 | static 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 | ||
6580 | int kvm_fast_pio(struct kvm_vcpu *vcpu, int size, unsigned short port, int in) | 6611 | int 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 | } |
6593 | EXPORT_SYMBOL_GPL(kvm_fast_pio); | 6621 | EXPORT_SYMBOL_GPL(kvm_fast_pio); |
6594 | 6622 | ||
@@ -8733,6 +8761,7 @@ struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm, | |||
8733 | 8761 | ||
8734 | int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu) | 8762 | int 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 |