revert: KVM: x86: Manually calculate reserved bits when loading PDPTRS
Problematic on old Intel CPUs: https://forum.proxmox.com/threads/pve-kernel-5-0-21-4-pve-cause-debian-guests-to-reboot-loop-on-older-intel-cpus.59377/page-3#post-276413 https://bugzilla.kernel.org/show_bug.cgi?id=205441#c1 Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
This commit is contained in:
		
							parent
							
								
									ecfcc52270
								
							
						
					
					
						commit
						bafa9b7ca1
					
				@ -0,0 +1,45 @@
 | 
				
			|||||||
 | 
					From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 | 
				
			||||||
 | 
					From: Thomas Lamprecht <t.lamprecht@proxmox.com>
 | 
				
			||||||
 | 
					Date: Mon, 11 Nov 2019 15:22:38 +0100
 | 
				
			||||||
 | 
					Subject: [PATCH] Revert "KVM: x86: Manually calculate reserved bits when
 | 
				
			||||||
 | 
					 loading PDPTRS"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					breaks Linux guest if the host uses very old Intel CPUs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This reverts commit c5d574d63996442c80e886c60278a790230f4d2b.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					 arch/x86/kvm/x86.c | 11 +++--------
 | 
				
			||||||
 | 
					 1 file changed, 3 insertions(+), 8 deletions(-)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
 | 
				
			||||||
 | 
					index cc9ad1aa4790..2c18946970bf 100644
 | 
				
			||||||
 | 
					--- a/arch/x86/kvm/x86.c
 | 
				
			||||||
 | 
					+++ b/arch/x86/kvm/x86.c
 | 
				
			||||||
 | 
					@@ -566,14 +566,8 @@ static int kvm_read_nested_guest_page(struct kvm_vcpu *vcpu, gfn_t gfn,
 | 
				
			||||||
 | 
					 				       data, offset, len, access);
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-static inline u64 pdptr_rsvd_bits(struct kvm_vcpu *vcpu)
 | 
				
			||||||
 | 
					-{
 | 
				
			||||||
 | 
					-	return rsvd_bits(cpuid_maxphyaddr(vcpu), 63) | rsvd_bits(5, 8) |
 | 
				
			||||||
 | 
					-	       rsvd_bits(1, 2);
 | 
				
			||||||
 | 
					-}
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					 /*
 | 
				
			||||||
 | 
					- * Load the pae pdptrs.  Return 1 if they are all valid, 0 otherwise.
 | 
				
			||||||
 | 
					+ * Load the pae pdptrs.  Return true is they are all valid.
 | 
				
			||||||
 | 
					  */
 | 
				
			||||||
 | 
					 int load_pdptrs(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu, unsigned long cr3)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					@@ -592,7 +586,8 @@ int load_pdptrs(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu, unsigned long cr3)
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					 	for (i = 0; i < ARRAY_SIZE(pdpte); ++i) {
 | 
				
			||||||
 | 
					 		if ((pdpte[i] & PT_PRESENT_MASK) &&
 | 
				
			||||||
 | 
					-		    (pdpte[i] & pdptr_rsvd_bits(vcpu))) {
 | 
				
			||||||
 | 
					+		    (pdpte[i] &
 | 
				
			||||||
 | 
					+		     vcpu->arch.mmu.guest_rsvd_check.rsvd_bits_mask[0][2])) {
 | 
				
			||||||
 | 
					 			ret = 0;
 | 
				
			||||||
 | 
					 			goto out;
 | 
				
			||||||
 | 
					 		}
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user