diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-12-22 18:47:39 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-12-22 18:47:39 -0500 |
commit | e73a31778a98cfbfd433911491d11a2f68fad073 (patch) | |
tree | 0e30a3aa3e9d9577c1115a39ff56e9e78fbe1ece | |
parent | ad3d1abb305459592f9dcf47d3c7d30f5e8dd5b7 (diff) | |
parent | 0185604c2d82c560dab2f2933a18f797e74ab5a8 (diff) |
Merge tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm
Pull kvm fixes from Paolo Bonzini:
- A series of fixes to the MTRR emulation, tested in the BZ by several
users so they should be safe this late
- A fix for a division by zero
- Two very simple ARM and PPC fixes
* tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm:
KVM: x86: Reload pit counters for all channels when restoring state
KVM: MTRR: treat memory as writeback if MTRR is disabled in guest CPUID
KVM: MTRR: observe maxphyaddr from guest CPUID, not host
KVM: MTRR: fix fixed MTRR segment look up
KVM: VMX: Fix host initiated access to guest MSR_TSC_AUX
KVM: arm/arm64: vgic: Fix kvm_vgic_map_is_active's dist check
kvm: x86: move tracepoints outside extended quiescent state
KVM: PPC: Book3S HV: Prohibit setting illegal transaction state in MSR
-rw-r--r-- | arch/powerpc/kvm/book3s_hv.c | 6 | ||||
-rw-r--r-- | arch/x86/kvm/cpuid.h | 8 | ||||
-rw-r--r-- | arch/x86/kvm/mtrr.c | 25 | ||||
-rw-r--r-- | arch/x86/kvm/svm.c | 4 | ||||
-rw-r--r-- | arch/x86/kvm/vmx.c | 7 | ||||
-rw-r--r-- | arch/x86/kvm/x86.c | 12 | ||||
-rw-r--r-- | virt/kvm/arm/vgic.c | 2 |
7 files changed, 48 insertions, 16 deletions
diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c index 54b45b73195f..a7352b59e6f9 100644 --- a/arch/powerpc/kvm/book3s_hv.c +++ b/arch/powerpc/kvm/book3s_hv.c | |||
@@ -224,6 +224,12 @@ static void kvmppc_core_vcpu_put_hv(struct kvm_vcpu *vcpu) | |||
224 | 224 | ||
225 | static void kvmppc_set_msr_hv(struct kvm_vcpu *vcpu, u64 msr) | 225 | static void kvmppc_set_msr_hv(struct kvm_vcpu *vcpu, u64 msr) |
226 | { | 226 | { |
227 | /* | ||
228 | * Check for illegal transactional state bit combination | ||
229 | * and if we find it, force the TS field to a safe state. | ||
230 | */ | ||
231 | if ((msr & MSR_TS_MASK) == MSR_TS_MASK) | ||
232 | msr &= ~MSR_TS_MASK; | ||
227 | vcpu->arch.shregs.msr = msr; | 233 | vcpu->arch.shregs.msr = msr; |
228 | kvmppc_end_cede(vcpu); | 234 | kvmppc_end_cede(vcpu); |
229 | } | 235 | } |
diff --git a/arch/x86/kvm/cpuid.h b/arch/x86/kvm/cpuid.h index 06332cb7e7d1..3f5c48ddba45 100644 --- a/arch/x86/kvm/cpuid.h +++ b/arch/x86/kvm/cpuid.h | |||
@@ -38,6 +38,14 @@ static inline bool guest_cpuid_has_xsave(struct kvm_vcpu *vcpu) | |||
38 | return best && (best->ecx & bit(X86_FEATURE_XSAVE)); | 38 | return best && (best->ecx & bit(X86_FEATURE_XSAVE)); |
39 | } | 39 | } |
40 | 40 | ||
41 | static inline bool guest_cpuid_has_mtrr(struct kvm_vcpu *vcpu) | ||
42 | { | ||
43 | struct kvm_cpuid_entry2 *best; | ||
44 | |||
45 | best = kvm_find_cpuid_entry(vcpu, 1, 0); | ||
46 | return best && (best->edx & bit(X86_FEATURE_MTRR)); | ||
47 | } | ||
48 | |||
41 | static inline bool guest_cpuid_has_tsc_adjust(struct kvm_vcpu *vcpu) | 49 | static inline bool guest_cpuid_has_tsc_adjust(struct kvm_vcpu *vcpu) |
42 | { | 50 | { |
43 | struct kvm_cpuid_entry2 *best; | 51 | struct kvm_cpuid_entry2 *best; |
diff --git a/arch/x86/kvm/mtrr.c b/arch/x86/kvm/mtrr.c index 9e8bf13572e6..3f8c732117ec 100644 --- a/arch/x86/kvm/mtrr.c +++ b/arch/x86/kvm/mtrr.c | |||
@@ -120,14 +120,22 @@ static u8 mtrr_default_type(struct kvm_mtrr *mtrr_state) | |||
120 | return mtrr_state->deftype & IA32_MTRR_DEF_TYPE_TYPE_MASK; | 120 | return mtrr_state->deftype & IA32_MTRR_DEF_TYPE_TYPE_MASK; |
121 | } | 121 | } |
122 | 122 | ||
123 | static u8 mtrr_disabled_type(void) | 123 | static u8 mtrr_disabled_type(struct kvm_vcpu *vcpu) |
124 | { | 124 | { |
125 | /* | 125 | /* |
126 | * Intel SDM 11.11.2.2: all MTRRs are disabled when | 126 | * Intel SDM 11.11.2.2: all MTRRs are disabled when |
127 | * IA32_MTRR_DEF_TYPE.E bit is cleared, and the UC | 127 | * IA32_MTRR_DEF_TYPE.E bit is cleared, and the UC |
128 | * memory type is applied to all of physical memory. | 128 | * memory type is applied to all of physical memory. |
129 | * | ||
130 | * However, virtual machines can be run with CPUID such that | ||
131 | * there are no MTRRs. In that case, the firmware will never | ||
132 | * enable MTRRs and it is obviously undesirable to run the | ||
133 | * guest entirely with UC memory and we use WB. | ||
129 | */ | 134 | */ |
130 | return MTRR_TYPE_UNCACHABLE; | 135 | if (guest_cpuid_has_mtrr(vcpu)) |
136 | return MTRR_TYPE_UNCACHABLE; | ||
137 | else | ||
138 | return MTRR_TYPE_WRBACK; | ||
131 | } | 139 | } |
132 | 140 | ||
133 | /* | 141 | /* |
@@ -267,7 +275,7 @@ static int fixed_mtrr_addr_to_seg(u64 addr) | |||
267 | 275 | ||
268 | for (seg = 0; seg < seg_num; seg++) { | 276 | for (seg = 0; seg < seg_num; seg++) { |
269 | mtrr_seg = &fixed_seg_table[seg]; | 277 | mtrr_seg = &fixed_seg_table[seg]; |
270 | if (mtrr_seg->start >= addr && addr < mtrr_seg->end) | 278 | if (mtrr_seg->start <= addr && addr < mtrr_seg->end) |
271 | return seg; | 279 | return seg; |
272 | } | 280 | } |
273 | 281 | ||
@@ -300,7 +308,6 @@ static void var_mtrr_range(struct kvm_mtrr_range *range, u64 *start, u64 *end) | |||
300 | *start = range->base & PAGE_MASK; | 308 | *start = range->base & PAGE_MASK; |
301 | 309 | ||
302 | mask = range->mask & PAGE_MASK; | 310 | mask = range->mask & PAGE_MASK; |
303 | mask |= ~0ULL << boot_cpu_data.x86_phys_bits; | ||
304 | 311 | ||
305 | /* This cannot overflow because writing to the reserved bits of | 312 | /* This cannot overflow because writing to the reserved bits of |
306 | * variable MTRRs causes a #GP. | 313 | * variable MTRRs causes a #GP. |
@@ -356,10 +363,14 @@ static void set_var_mtrr_msr(struct kvm_vcpu *vcpu, u32 msr, u64 data) | |||
356 | if (var_mtrr_range_is_valid(cur)) | 363 | if (var_mtrr_range_is_valid(cur)) |
357 | list_del(&mtrr_state->var_ranges[index].node); | 364 | list_del(&mtrr_state->var_ranges[index].node); |
358 | 365 | ||
366 | /* Extend the mask with all 1 bits to the left, since those | ||
367 | * bits must implicitly be 0. The bits are then cleared | ||
368 | * when reading them. | ||
369 | */ | ||
359 | if (!is_mtrr_mask) | 370 | if (!is_mtrr_mask) |
360 | cur->base = data; | 371 | cur->base = data; |
361 | else | 372 | else |
362 | cur->mask = data; | 373 | cur->mask = data | (-1LL << cpuid_maxphyaddr(vcpu)); |
363 | 374 | ||
364 | /* add it to the list if it's enabled. */ | 375 | /* add it to the list if it's enabled. */ |
365 | if (var_mtrr_range_is_valid(cur)) { | 376 | if (var_mtrr_range_is_valid(cur)) { |
@@ -426,6 +437,8 @@ int kvm_mtrr_get_msr(struct kvm_vcpu *vcpu, u32 msr, u64 *pdata) | |||
426 | *pdata = vcpu->arch.mtrr_state.var_ranges[index].base; | 437 | *pdata = vcpu->arch.mtrr_state.var_ranges[index].base; |
427 | else | 438 | else |
428 | *pdata = vcpu->arch.mtrr_state.var_ranges[index].mask; | 439 | *pdata = vcpu->arch.mtrr_state.var_ranges[index].mask; |
440 | |||
441 | *pdata &= (1ULL << cpuid_maxphyaddr(vcpu)) - 1; | ||
429 | } | 442 | } |
430 | 443 | ||
431 | return 0; | 444 | return 0; |
@@ -670,7 +683,7 @@ u8 kvm_mtrr_get_guest_memory_type(struct kvm_vcpu *vcpu, gfn_t gfn) | |||
670 | } | 683 | } |
671 | 684 | ||
672 | if (iter.mtrr_disabled) | 685 | if (iter.mtrr_disabled) |
673 | return mtrr_disabled_type(); | 686 | return mtrr_disabled_type(vcpu); |
674 | 687 | ||
675 | /* not contained in any MTRRs. */ | 688 | /* not contained in any MTRRs. */ |
676 | if (type == -1) | 689 | if (type == -1) |
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c index 83a1c643f9a5..899c40f826dd 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c | |||
@@ -3422,6 +3422,8 @@ static int handle_exit(struct kvm_vcpu *vcpu) | |||
3422 | struct kvm_run *kvm_run = vcpu->run; | 3422 | struct kvm_run *kvm_run = vcpu->run; |
3423 | u32 exit_code = svm->vmcb->control.exit_code; | 3423 | u32 exit_code = svm->vmcb->control.exit_code; |
3424 | 3424 | ||
3425 | trace_kvm_exit(exit_code, vcpu, KVM_ISA_SVM); | ||
3426 | |||
3425 | if (!is_cr_intercept(svm, INTERCEPT_CR0_WRITE)) | 3427 | if (!is_cr_intercept(svm, INTERCEPT_CR0_WRITE)) |
3426 | vcpu->arch.cr0 = svm->vmcb->save.cr0; | 3428 | vcpu->arch.cr0 = svm->vmcb->save.cr0; |
3427 | if (npt_enabled) | 3429 | if (npt_enabled) |
@@ -3892,8 +3894,6 @@ static void svm_vcpu_run(struct kvm_vcpu *vcpu) | |||
3892 | vcpu->arch.regs[VCPU_REGS_RSP] = svm->vmcb->save.rsp; | 3894 | vcpu->arch.regs[VCPU_REGS_RSP] = svm->vmcb->save.rsp; |
3893 | vcpu->arch.regs[VCPU_REGS_RIP] = svm->vmcb->save.rip; | 3895 | vcpu->arch.regs[VCPU_REGS_RIP] = svm->vmcb->save.rip; |
3894 | 3896 | ||
3895 | trace_kvm_exit(svm->vmcb->control.exit_code, vcpu, KVM_ISA_SVM); | ||
3896 | |||
3897 | if (unlikely(svm->vmcb->control.exit_code == SVM_EXIT_NMI)) | 3897 | if (unlikely(svm->vmcb->control.exit_code == SVM_EXIT_NMI)) |
3898 | kvm_before_handle_nmi(&svm->vcpu); | 3898 | kvm_before_handle_nmi(&svm->vcpu); |
3899 | 3899 | ||
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index af823a388c19..44976a596fa6 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c | |||
@@ -2803,7 +2803,7 @@ static int vmx_get_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info) | |||
2803 | msr_info->data = vcpu->arch.ia32_xss; | 2803 | msr_info->data = vcpu->arch.ia32_xss; |
2804 | break; | 2804 | break; |
2805 | case MSR_TSC_AUX: | 2805 | case MSR_TSC_AUX: |
2806 | if (!guest_cpuid_has_rdtscp(vcpu)) | 2806 | if (!guest_cpuid_has_rdtscp(vcpu) && !msr_info->host_initiated) |
2807 | return 1; | 2807 | return 1; |
2808 | /* Otherwise falls through */ | 2808 | /* Otherwise falls through */ |
2809 | default: | 2809 | default: |
@@ -2909,7 +2909,7 @@ static int vmx_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info) | |||
2909 | clear_atomic_switch_msr(vmx, MSR_IA32_XSS); | 2909 | clear_atomic_switch_msr(vmx, MSR_IA32_XSS); |
2910 | break; | 2910 | break; |
2911 | case MSR_TSC_AUX: | 2911 | case MSR_TSC_AUX: |
2912 | if (!guest_cpuid_has_rdtscp(vcpu)) | 2912 | if (!guest_cpuid_has_rdtscp(vcpu) && !msr_info->host_initiated) |
2913 | return 1; | 2913 | return 1; |
2914 | /* Check reserved bit, higher 32 bits should be zero */ | 2914 | /* Check reserved bit, higher 32 bits should be zero */ |
2915 | if ((data >> 32) != 0) | 2915 | if ((data >> 32) != 0) |
@@ -8042,6 +8042,8 @@ static int vmx_handle_exit(struct kvm_vcpu *vcpu) | |||
8042 | u32 exit_reason = vmx->exit_reason; | 8042 | u32 exit_reason = vmx->exit_reason; |
8043 | u32 vectoring_info = vmx->idt_vectoring_info; | 8043 | u32 vectoring_info = vmx->idt_vectoring_info; |
8044 | 8044 | ||
8045 | trace_kvm_exit(exit_reason, vcpu, KVM_ISA_VMX); | ||
8046 | |||
8045 | /* | 8047 | /* |
8046 | * Flush logged GPAs PML buffer, this will make dirty_bitmap more | 8048 | * Flush logged GPAs PML buffer, this will make dirty_bitmap more |
8047 | * updated. Another good is, in kvm_vm_ioctl_get_dirty_log, before | 8049 | * updated. Another good is, in kvm_vm_ioctl_get_dirty_log, before |
@@ -8668,7 +8670,6 @@ static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu) | |||
8668 | vmx->loaded_vmcs->launched = 1; | 8670 | vmx->loaded_vmcs->launched = 1; |
8669 | 8671 | ||
8670 | vmx->exit_reason = vmcs_read32(VM_EXIT_REASON); | 8672 | vmx->exit_reason = vmcs_read32(VM_EXIT_REASON); |
8671 | trace_kvm_exit(vmx->exit_reason, vcpu, KVM_ISA_VMX); | ||
8672 | 8673 | ||
8673 | /* | 8674 | /* |
8674 | * the KVM_REQ_EVENT optimization bit is only on for one entry, and if | 8675 | * the KVM_REQ_EVENT optimization bit is only on for one entry, and if |
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index eed32283d22c..7ffc224bbe41 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
@@ -3572,9 +3572,11 @@ static int kvm_vm_ioctl_get_pit(struct kvm *kvm, struct kvm_pit_state *ps) | |||
3572 | 3572 | ||
3573 | static int kvm_vm_ioctl_set_pit(struct kvm *kvm, struct kvm_pit_state *ps) | 3573 | static int kvm_vm_ioctl_set_pit(struct kvm *kvm, struct kvm_pit_state *ps) |
3574 | { | 3574 | { |
3575 | int i; | ||
3575 | mutex_lock(&kvm->arch.vpit->pit_state.lock); | 3576 | mutex_lock(&kvm->arch.vpit->pit_state.lock); |
3576 | memcpy(&kvm->arch.vpit->pit_state, ps, sizeof(struct kvm_pit_state)); | 3577 | memcpy(&kvm->arch.vpit->pit_state, ps, sizeof(struct kvm_pit_state)); |
3577 | kvm_pit_load_count(kvm, 0, ps->channels[0].count, 0); | 3578 | for (i = 0; i < 3; i++) |
3579 | kvm_pit_load_count(kvm, i, ps->channels[i].count, 0); | ||
3578 | mutex_unlock(&kvm->arch.vpit->pit_state.lock); | 3580 | mutex_unlock(&kvm->arch.vpit->pit_state.lock); |
3579 | return 0; | 3581 | return 0; |
3580 | } | 3582 | } |
@@ -3593,6 +3595,7 @@ static int kvm_vm_ioctl_get_pit2(struct kvm *kvm, struct kvm_pit_state2 *ps) | |||
3593 | static int kvm_vm_ioctl_set_pit2(struct kvm *kvm, struct kvm_pit_state2 *ps) | 3595 | static int kvm_vm_ioctl_set_pit2(struct kvm *kvm, struct kvm_pit_state2 *ps) |
3594 | { | 3596 | { |
3595 | int start = 0; | 3597 | int start = 0; |
3598 | int i; | ||
3596 | u32 prev_legacy, cur_legacy; | 3599 | u32 prev_legacy, cur_legacy; |
3597 | mutex_lock(&kvm->arch.vpit->pit_state.lock); | 3600 | mutex_lock(&kvm->arch.vpit->pit_state.lock); |
3598 | prev_legacy = kvm->arch.vpit->pit_state.flags & KVM_PIT_FLAGS_HPET_LEGACY; | 3601 | prev_legacy = kvm->arch.vpit->pit_state.flags & KVM_PIT_FLAGS_HPET_LEGACY; |
@@ -3602,7 +3605,8 @@ static int kvm_vm_ioctl_set_pit2(struct kvm *kvm, struct kvm_pit_state2 *ps) | |||
3602 | memcpy(&kvm->arch.vpit->pit_state.channels, &ps->channels, | 3605 | memcpy(&kvm->arch.vpit->pit_state.channels, &ps->channels, |
3603 | sizeof(kvm->arch.vpit->pit_state.channels)); | 3606 | sizeof(kvm->arch.vpit->pit_state.channels)); |
3604 | kvm->arch.vpit->pit_state.flags = ps->flags; | 3607 | kvm->arch.vpit->pit_state.flags = ps->flags; |
3605 | kvm_pit_load_count(kvm, 0, kvm->arch.vpit->pit_state.channels[0].count, start); | 3608 | for (i = 0; i < 3; i++) |
3609 | kvm_pit_load_count(kvm, i, kvm->arch.vpit->pit_state.channels[i].count, start); | ||
3606 | mutex_unlock(&kvm->arch.vpit->pit_state.lock); | 3610 | mutex_unlock(&kvm->arch.vpit->pit_state.lock); |
3607 | return 0; | 3611 | return 0; |
3608 | } | 3612 | } |
@@ -6515,6 +6519,8 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu) | |||
6515 | if (req_immediate_exit) | 6519 | if (req_immediate_exit) |
6516 | smp_send_reschedule(vcpu->cpu); | 6520 | smp_send_reschedule(vcpu->cpu); |
6517 | 6521 | ||
6522 | trace_kvm_entry(vcpu->vcpu_id); | ||
6523 | wait_lapic_expire(vcpu); | ||
6518 | __kvm_guest_enter(); | 6524 | __kvm_guest_enter(); |
6519 | 6525 | ||
6520 | if (unlikely(vcpu->arch.switch_db_regs)) { | 6526 | if (unlikely(vcpu->arch.switch_db_regs)) { |
@@ -6527,8 +6533,6 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu) | |||
6527 | vcpu->arch.switch_db_regs &= ~KVM_DEBUGREG_RELOAD; | 6533 | vcpu->arch.switch_db_regs &= ~KVM_DEBUGREG_RELOAD; |
6528 | } | 6534 | } |
6529 | 6535 | ||
6530 | trace_kvm_entry(vcpu->vcpu_id); | ||
6531 | wait_lapic_expire(vcpu); | ||
6532 | kvm_x86_ops->run(vcpu); | 6536 | kvm_x86_ops->run(vcpu); |
6533 | 6537 | ||
6534 | /* | 6538 | /* |
diff --git a/virt/kvm/arm/vgic.c b/virt/kvm/arm/vgic.c index 65461f821a75..7a2f449bd85d 100644 --- a/virt/kvm/arm/vgic.c +++ b/virt/kvm/arm/vgic.c | |||
@@ -1114,7 +1114,7 @@ bool kvm_vgic_map_is_active(struct kvm_vcpu *vcpu, struct irq_phys_map *map) | |||
1114 | return true; | 1114 | return true; |
1115 | } | 1115 | } |
1116 | 1116 | ||
1117 | return dist_active_irq(vcpu); | 1117 | return vgic_irq_is_active(vcpu, map->virt_irq); |
1118 | } | 1118 | } |
1119 | 1119 | ||
1120 | /* | 1120 | /* |