aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kvm/mmu.c
diff options
context:
space:
mode:
authorSheng Yang <sheng@linux.intel.com>2009-04-01 22:28:37 -0400
committerAvi Kivity <avi@redhat.com>2009-06-10 04:48:38 -0400
commit4c26b4cd6ff6c3f7534f2aea9615a561c372ed05 (patch)
tree26d323229110f29b32606a0b093aaa91437430c9 /arch/x86/kvm/mmu.c
parent64a7ec066813443440bfc9f60a9e76a47cfa6b2b (diff)
KVM: MMU: Discard reserved bits checking on PDE bit 7-8
1. It's related to a Linux kernel bug which fixed by Ingo on 07a66d7c53a538e1a9759954a82bb6c07365eff9. The original code exists for quite a long time, and it would convert a PDE for large page into a normal PDE. But it fail to fit normal PDE well. With the code before Ingo's fix, the kernel would fall reserved bit checking with bit 8 - the remaining global bit of PTE. So the kernel would receive a double-fault. 2. After discussion, we decide to discard PDE bit 7-8 reserved checking for now. For this marked as reserved in SDM, but didn't checked by the processor in fact... Signed-off-by: Sheng Yang <sheng@linux.intel.com> Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'arch/x86/kvm/mmu.c')
-rw-r--r--arch/x86/kvm/mmu.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
index da3ad3cf314..b582adde683 100644
--- a/arch/x86/kvm/mmu.c
+++ b/arch/x86/kvm/mmu.c
@@ -2194,7 +2194,7 @@ static void reset_rsvds_bits_mask(struct kvm_vcpu *vcpu, int level)
2194 rsvd_bits(maxphyaddr, 63) | 2194 rsvd_bits(maxphyaddr, 63) |
2195 rsvd_bits(7, 8) | rsvd_bits(1, 2); /* PDPTE */ 2195 rsvd_bits(7, 8) | rsvd_bits(1, 2); /* PDPTE */
2196 context->rsvd_bits_mask[0][1] = exb_bit_rsvd | 2196 context->rsvd_bits_mask[0][1] = exb_bit_rsvd |
2197 rsvd_bits(maxphyaddr, 62); /* PDE */ 2197 rsvd_bits(maxphyaddr, 62); /* PDE */
2198 context->rsvd_bits_mask[0][0] = exb_bit_rsvd | 2198 context->rsvd_bits_mask[0][0] = exb_bit_rsvd |
2199 rsvd_bits(maxphyaddr, 62); /* PTE */ 2199 rsvd_bits(maxphyaddr, 62); /* PTE */
2200 context->rsvd_bits_mask[1][1] = exb_bit_rsvd | 2200 context->rsvd_bits_mask[1][1] = exb_bit_rsvd |
@@ -2208,13 +2208,14 @@ static void reset_rsvds_bits_mask(struct kvm_vcpu *vcpu, int level)
2208 context->rsvd_bits_mask[0][2] = exb_bit_rsvd | 2208 context->rsvd_bits_mask[0][2] = exb_bit_rsvd |
2209 rsvd_bits(maxphyaddr, 51) | rsvd_bits(7, 8); 2209 rsvd_bits(maxphyaddr, 51) | rsvd_bits(7, 8);
2210 context->rsvd_bits_mask[0][1] = exb_bit_rsvd | 2210 context->rsvd_bits_mask[0][1] = exb_bit_rsvd |
2211 rsvd_bits(maxphyaddr, 51) | rsvd_bits(7, 8); 2211 rsvd_bits(maxphyaddr, 51);
2212 context->rsvd_bits_mask[0][0] = exb_bit_rsvd | 2212 context->rsvd_bits_mask[0][0] = exb_bit_rsvd |
2213 rsvd_bits(maxphyaddr, 51); 2213 rsvd_bits(maxphyaddr, 51);
2214 context->rsvd_bits_mask[1][3] = context->rsvd_bits_mask[0][3]; 2214 context->rsvd_bits_mask[1][3] = context->rsvd_bits_mask[0][3];
2215 context->rsvd_bits_mask[1][2] = context->rsvd_bits_mask[0][2]; 2215 context->rsvd_bits_mask[1][2] = context->rsvd_bits_mask[0][2];
2216 context->rsvd_bits_mask[1][1] = exb_bit_rsvd | 2216 context->rsvd_bits_mask[1][1] = exb_bit_rsvd |
2217 rsvd_bits(maxphyaddr, 51) | rsvd_bits(13, 20); 2217 rsvd_bits(maxphyaddr, 51) |
2218 rsvd_bits(13, 20); /* large page */
2218 context->rsvd_bits_mask[1][0] = ~0ull; 2219 context->rsvd_bits_mask[1][0] = ~0ull;
2219 break; 2220 break;
2220 } 2221 }