From 4ed4fd29c1d3470c5d011d7a55eee1876c794e8c Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Tue, 5 Apr 2022 07:31:31 +0200 Subject: [PATCH] 5.4-stable patches added patches: kvm-x86-forbid-vmm-to-set-synic-stimer-msrs-when-synic-wasn-t-activated.patch --- ...mer-msrs-when-synic-wasn-t-activated.patch | 73 +++++++++++++++++++ queue-5.4/series | 1 + 2 files changed, 74 insertions(+) create mode 100644 queue-5.4/kvm-x86-forbid-vmm-to-set-synic-stimer-msrs-when-synic-wasn-t-activated.patch diff --git a/queue-5.4/kvm-x86-forbid-vmm-to-set-synic-stimer-msrs-when-synic-wasn-t-activated.patch b/queue-5.4/kvm-x86-forbid-vmm-to-set-synic-stimer-msrs-when-synic-wasn-t-activated.patch new file mode 100644 index 00000000000..d51122c6e29 --- /dev/null +++ b/queue-5.4/kvm-x86-forbid-vmm-to-set-synic-stimer-msrs-when-synic-wasn-t-activated.patch @@ -0,0 +1,73 @@ +From b1e34d325397a33d97d845e312d7cf2a8b646b44 Mon Sep 17 00:00:00 2001 +From: Vitaly Kuznetsov +Date: Fri, 25 Mar 2022 14:21:40 +0100 +Subject: KVM: x86: Forbid VMM to set SYNIC/STIMER MSRs when SynIC wasn't activated + +From: Vitaly Kuznetsov + +commit b1e34d325397a33d97d845e312d7cf2a8b646b44 upstream. + +Setting non-zero values to SYNIC/STIMER MSRs activates certain features, +this should not happen when KVM_CAP_HYPERV_SYNIC{,2} was not activated. + +Note, it would've been better to forbid writing anything to SYNIC/STIMER +MSRs, including zeroes, however, at least QEMU tries clearing +HV_X64_MSR_STIMER0_CONFIG without SynIC. HV_X64_MSR_EOM MSR is somewhat +'special' as writing zero there triggers an action, this also should not +happen when SynIC wasn't activated. + +Signed-off-by: Vitaly Kuznetsov +Message-Id: <20220325132140.25650-4-vkuznets@redhat.com> +Cc: stable@vger.kernel.org +Signed-off-by: Paolo Bonzini +Signed-off-by: Greg Kroah-Hartman +--- + arch/x86/kvm/hyperv.c | 16 +++++++++++++++- + 1 file changed, 15 insertions(+), 1 deletion(-) + +--- a/arch/x86/kvm/hyperv.c ++++ b/arch/x86/kvm/hyperv.c +@@ -205,7 +205,7 @@ static int synic_set_msr(struct kvm_vcpu + struct kvm_vcpu *vcpu = synic_to_vcpu(synic); + int ret; + +- if (!synic->active && !host) ++ if (!synic->active && (!host || data)) + return 1; + + trace_kvm_hv_synic_set_msr(vcpu->vcpu_id, msr, data, host); +@@ -251,6 +251,9 @@ static int synic_set_msr(struct kvm_vcpu + case HV_X64_MSR_EOM: { + int i; + ++ if (!synic->active) ++ break; ++ + for (i = 0; i < ARRAY_SIZE(synic->sint); i++) + kvm_hv_notify_acked_sint(vcpu, i); + break; +@@ -514,6 +517,11 @@ static int stimer_set_config(struct kvm_ + { + union hv_stimer_config new_config = {.as_uint64 = config}, + old_config = {.as_uint64 = stimer->config.as_uint64}; ++ struct kvm_vcpu *vcpu = stimer_to_vcpu(stimer); ++ struct kvm_vcpu_hv_synic *synic = vcpu_to_synic(vcpu); ++ ++ if (!synic->active && (!host || config)) ++ return 1; + + trace_kvm_hv_stimer_set_config(stimer_to_vcpu(stimer)->vcpu_id, + stimer->index, config, host); +@@ -533,6 +541,12 @@ static int stimer_set_config(struct kvm_ + static int stimer_set_count(struct kvm_vcpu_hv_stimer *stimer, u64 count, + bool host) + { ++ struct kvm_vcpu *vcpu = stimer_to_vcpu(stimer); ++ struct kvm_vcpu_hv_synic *synic = vcpu_to_synic(vcpu); ++ ++ if (!synic->active && (!host || count)) ++ return 1; ++ + trace_kvm_hv_stimer_set_count(stimer_to_vcpu(stimer)->vcpu_id, + stimer->index, count, host); + diff --git a/queue-5.4/series b/queue-5.4/series index 937ae802bd7..a3a7ca4bbbc 100644 --- a/queue-5.4/series +++ b/queue-5.4/series @@ -367,3 +367,4 @@ arm-dts-spear13xx-update-spi-dma-properties.patch um-fix-uml_mconsole-stop-go.patch openvswitch-fixed-nd-target-mask-field-in-the-flow-dump.patch kvm-x86-mmu-do-compare-and-exchange-of-gpte-via-the-user-address.patch +kvm-x86-forbid-vmm-to-set-synic-stimer-msrs-when-synic-wasn-t-activated.patch -- 2.47.3