Juergen Gross 0e64a5
Patch-mainline: v5.6-rc1
Juergen Gross 0e64a5
Git-commit: ea740059ecb37807ba47b84b33d1447435a8d868
Juergen Gross 0e64a5
From: Marios Pomonis <pomonis@google.com>
Juergen Gross 0e64a5
Date: Wed, 11 Dec 2019 12:47:52 -0800
Juergen Gross 0e64a5
Subject: [PATCH] KVM: x86: Protect DR-based index computations from
Juergen Gross 0e64a5
 Spectre-v1/L1TF attacks
Juergen Gross 0e64a5
References: bsc#1164734
Juergen Gross 0e64a5
Juergen Gross 0e64a5
This fixes a Spectre-v1/L1TF vulnerability in __kvm_set_dr() and
Juergen Gross 0e64a5
kvm_get_dr().
Juergen Gross 0e64a5
Both kvm_get_dr() and kvm_set_dr() (a wrapper of __kvm_set_dr()) are
Juergen Gross 0e64a5
exported symbols so KVM should tream them conservatively from a security
Juergen Gross 0e64a5
perspective.
Juergen Gross 0e64a5
Juergen Gross 0e64a5
Fixes: 020df0794f57 ("KVM: move DR register access handling into generic code")
Juergen Gross 0e64a5
Juergen Gross 0e64a5
Signed-off-by: Nick Finco <nifi@google.com>
Juergen Gross 0e64a5
Signed-off-by: Marios Pomonis <pomonis@google.com>
Juergen Gross 0e64a5
Reviewed-by: Andrew Honig <ahonig@google.com>
Juergen Gross 0e64a5
Cc: stable@vger.kernel.org
Juergen Gross 0e64a5
Reviewed-by: Jim Mattson <jmattson@google.com>
Juergen Gross 0e64a5
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Juergen Gross 0e64a5
Signed-off-by: Juergen Gross <jgross@suse.com>
Juergen Gross 0e64a5
---
Juergen Gross 0e64a5
 arch/x86/kvm/x86.c | 8 ++++++--
Juergen Gross 0e64a5
 1 file changed, 6 insertions(+), 2 deletions(-)
Juergen Gross 0e64a5
Juergen Gross 0e64a5
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
Juergen Gross 0e64a5
index 913e55f6dca3..780224e76723 100644
Juergen Gross 0e64a5
--- a/arch/x86/kvm/x86.c
Juergen Gross 0e64a5
+++ b/arch/x86/kvm/x86.c
Juergen Gross 0e64a5
@@ -917,9 +917,11 @@ static u64 kvm_dr6_fixed(struct kvm_vcpu *vcpu)
Juergen Gross 0e64a5
 
Juergen Gross 0e64a5
 static int __kvm_set_dr(struct kvm_vcpu *vcpu, int dr, unsigned long val)
Juergen Gross 0e64a5
 {
Juergen Gross 0e64a5
+	size_t size = ARRAY_SIZE(vcpu->arch.db);
Juergen Gross 0e64a5
+
Juergen Gross 0e64a5
 	switch (dr) {
Juergen Gross 0e64a5
 	case 0 ... 3:
Juergen Gross 0e64a5
-		vcpu->arch.db[dr] = val;
Juergen Gross 0e64a5
+		vcpu->arch.db[array_index_nospec(dr, size)] = val;
Juergen Gross 0e64a5
 		if (!(vcpu->guest_debug & KVM_GUESTDBG_USE_HW_BP))
Juergen Gross 0e64a5
 			vcpu->arch.eff_db[dr] = val;
Juergen Gross 0e64a5
 		break;
Juergen Gross 0e64a5
@@ -956,9 +958,11 @@ EXPORT_SYMBOL_GPL(kvm_set_dr);
Juergen Gross 0e64a5
 
Juergen Gross 0e64a5
 int kvm_get_dr(struct kvm_vcpu *vcpu, int dr, unsigned long *val)
Juergen Gross 0e64a5
 {
Juergen Gross 0e64a5
+	size_t size = ARRAY_SIZE(vcpu->arch.db);
Juergen Gross 0e64a5
+
Juergen Gross 0e64a5
 	switch (dr) {
Juergen Gross 0e64a5
 	case 0 ... 3:
Juergen Gross 0e64a5
-		*val = vcpu->arch.db[dr];
Juergen Gross 0e64a5
+		*val = vcpu->arch.db[array_index_nospec(dr, size)];
Juergen Gross 0e64a5
 		break;
Juergen Gross 0e64a5
 	case 4:
Juergen Gross 0e64a5
 		/* fall through */
Juergen Gross 0e64a5
-- 
Juergen Gross 0e64a5
2.16.4
Juergen Gross 0e64a5