KVM: Discard reserved bits checking on PDE bit 7-8
PATCH 1/1 KVM: 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...
--- arch/x86/kvm/mmu.c | 7 ++++--- 1 files changed, 4 insertions(+), 3 deletions(-)
arch/x86/kvm/mmu.c +4 -3
@@ -2196,7 +2196,7 @@ static void reset_rsvds_bits_mask(struct kvm_vcpu *vcpu, int level)break ;case PT32E_ROOT_LEVEL : context->rsvd_bits_mask[0 ][1 ] = exb_bit_rsvd | -rsvd_bits (maxphyaddr,62 );/* PDE */ +rsvd_bits (maxphyaddr,62 );/* PDE */ context->rsvd_bits_mask[0 ][0 ] = exb_bit_rsvd |rsvd_bits (maxphyaddr,62 );/* PTE */ context->rsvd_bits_mask[1][1] = exb_bit_rsvd |
@@ -2210,13 +2210,14 @@ static void reset_rsvds_bits_mask(struct kvm_vcpu *vcpu, int level) context->rsvd_bits_mask[0 ][2 ] = exb_bit_rsvd |rsvd_bits (maxphyaddr,51 ) |rsvd_bits (7 ,8 ); context->rsvd_bits_mask[0 ][1 ] = exb_bit_rsvd | -rsvd_bits (maxphyaddr,51 ) |rsvd_bits (7 ,8 ); +rsvd_bits (maxphyaddr,51 ); context->rsvd_bits_mask[0 ][0 ] = exb_bit_rsvd |rsvd_bits (maxphyaddr,51 ); context->rsvd_bits_mask[1 ][3 ] = context->rsvd_bits_mask[0 ][3 ]; context->rsvd_bits_mask[1 ][2 ] = context->rsvd_bits_mask[0 ][2 ]; context->rsvd_bits_mask[1 ][1 ] = exb_bit_rsvd | -rsvd_bits (maxphyaddr,51 ) |rsvd_bits (13 ,20 ); +rsvd_bits (maxphyaddr,51 ) | +rsvd_bits (13 ,20 );/* large page */ context->rsvd_bits_mask[1 ][0 ] = ~0ull ;break ; }
Signature · 1 line
1.5.4.5
Avi Kivity
AppliedQuoted 11 lines · Sheng Yang
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...
Applied, thanks.
Signature · 1 line
error compiling committee.c: too many arguments to function