diff options
author | Sheng Yang <sheng@linux.intel.com> | 2009-04-01 22:28:37 -0400 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2009-06-10 04:48:38 -0400 |
commit | 4c26b4cd6ff6c3f7534f2aea9615a561c372ed05 (patch) | |
tree | 26d323229110f29b32606a0b093aaa91437430c9 /arch/x86/kvm/mmu.c | |
parent | 64a7ec066813443440bfc9f60a9e76a47cfa6b2b (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.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index da3ad3cf3142..b582adde6830 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 | } |