| From a6bd811f1209fe1c64c9f6fd578101d6436c6b6e Mon Sep 17 00:00:00 2001 |
| From: Boris Ostrovsky <boris.ostrovsky@oracle.com> |
| Date: Fri, 6 Dec 2019 15:36:12 +0000 |
| Subject: x86/KVM: Clean up host's steal time structure |
| |
| From: Boris Ostrovsky <boris.ostrovsky@oracle.com> |
| |
| commit a6bd811f1209fe1c64c9f6fd578101d6436c6b6e upstream. |
| |
| Now that we are mapping kvm_steal_time from the guest directly we |
| don't need keep a copy of it in kvm_vcpu_arch.st. The same is true |
| for the stime field. |
| |
| This is part of CVE-2019-3016. |
| |
| Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com> |
| Reviewed-by: Joao Martins <joao.m.martins@oracle.com> |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/x86/include/asm/kvm_host.h | 3 +-- |
| arch/x86/kvm/x86.c | 11 +++-------- |
| 2 files changed, 4 insertions(+), 10 deletions(-) |
| |
| --- a/arch/x86/include/asm/kvm_host.h |
| +++ b/arch/x86/include/asm/kvm_host.h |
| @@ -685,10 +685,9 @@ struct kvm_vcpu_arch { |
| bool pvclock_set_guest_stopped_request; |
| |
| struct { |
| + u8 preempted; |
| u64 msr_val; |
| u64 last_steal; |
| - struct gfn_to_hva_cache stime; |
| - struct kvm_steal_time steal; |
| struct gfn_to_pfn_cache cache; |
| } st; |
| |
| --- a/arch/x86/kvm/x86.c |
| +++ b/arch/x86/kvm/x86.c |
| @@ -2611,7 +2611,7 @@ static void record_steal_time(struct kvm |
| if (xchg(&st->preempted, 0) & KVM_VCPU_FLUSH_TLB) |
| kvm_vcpu_flush_tlb(vcpu, false); |
| |
| - vcpu->arch.st.steal.preempted = 0; |
| + vcpu->arch.st.preempted = 0; |
| |
| if (st->version & 1) |
| st->version += 1; /* first time write, random junk */ |
| @@ -2795,11 +2795,6 @@ int kvm_set_msr_common(struct kvm_vcpu * |
| if (data & KVM_STEAL_RESERVED_MASK) |
| return 1; |
| |
| - if (kvm_gfn_to_hva_cache_init(vcpu->kvm, &vcpu->arch.st.stime, |
| - data & KVM_STEAL_VALID_BITS, |
| - sizeof(struct kvm_steal_time))) |
| - return 1; |
| - |
| vcpu->arch.st.msr_val = data; |
| |
| if (!(data & KVM_MSR_ENABLED)) |
| @@ -3519,7 +3514,7 @@ static void kvm_steal_time_set_preempted |
| if (!(vcpu->arch.st.msr_val & KVM_MSR_ENABLED)) |
| return; |
| |
| - if (vcpu->arch.st.steal.preempted) |
| + if (vcpu->arch.st.preempted) |
| return; |
| |
| if (kvm_map_gfn(vcpu, vcpu->arch.st.msr_val >> PAGE_SHIFT, &map, |
| @@ -3529,7 +3524,7 @@ static void kvm_steal_time_set_preempted |
| st = map.hva + |
| offset_in_page(vcpu->arch.st.msr_val & KVM_STEAL_VALID_BITS); |
| |
| - st->preempted = vcpu->arch.st.steal.preempted = KVM_VCPU_PREEMPTED; |
| + st->preempted = vcpu->arch.st.preempted = KVM_VCPU_PREEMPTED; |
| |
| kvm_unmap_gfn(vcpu, &map, &vcpu->arch.st.cache, true, true); |
| } |