KVM: x86: Fix page-tables reserved bits
authorNadav Amit <namit@cs.technion.ac.il>
Fri, 4 Apr 2014 03:31:04 +0000 (06:31 +0300)
committerMarcelo Tosatti <mtosatti@redhat.com>
Wed, 16 Apr 2014 21:59:23 +0000 (18:59 -0300)
KVM does not handle the reserved bits of x86 page tables correctly:
In PAE, bits 5:8 are reserved in the PDPTE.
In IA-32e, bit 8 is not reserved.

Signed-off-by: Nadav Amit <namit@cs.technion.ac.il>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
arch/x86/kvm/mmu.c

index 813d31038b93bf8d7232db9435e2ee0e59996118..668ae5916de9079241d73101e37daaa1d25410c5 100644 (file)
@@ -3538,7 +3538,7 @@ static void reset_rsvds_bits_mask(struct kvm_vcpu *vcpu,
        case PT32E_ROOT_LEVEL:
                context->rsvd_bits_mask[0][2] =
                        rsvd_bits(maxphyaddr, 63) |
-                       rsvd_bits(7, 8) | rsvd_bits(1, 2);      /* PDPTE */
+                       rsvd_bits(5, 8) | rsvd_bits(1, 2);      /* PDPTE */
                context->rsvd_bits_mask[0][1] = exb_bit_rsvd |
                        rsvd_bits(maxphyaddr, 62);      /* PDE */
                context->rsvd_bits_mask[0][0] = exb_bit_rsvd |
@@ -3550,9 +3550,9 @@ static void reset_rsvds_bits_mask(struct kvm_vcpu *vcpu,
                break;
        case PT64_ROOT_LEVEL:
                context->rsvd_bits_mask[0][3] = exb_bit_rsvd |
-                       rsvd_bits(maxphyaddr, 51) | rsvd_bits(7, 8);
+                       rsvd_bits(maxphyaddr, 51) | rsvd_bits(7, 7);
                context->rsvd_bits_mask[0][2] = exb_bit_rsvd |
-                       rsvd_bits(maxphyaddr, 51) | rsvd_bits(7, 8);
+                       rsvd_bits(maxphyaddr, 51) | rsvd_bits(7, 7);
                context->rsvd_bits_mask[0][1] = exb_bit_rsvd |
                        rsvd_bits(maxphyaddr, 51);
                context->rsvd_bits_mask[0][0] = exb_bit_rsvd |