@@ -3548,10 +3548,11 @@ static inline bool is_last_gpte(struct kvm_mmu *mmu, unsigned level, unsigned gp
3548
3548
3549
3549
static bool is_rsvd_bits_set (struct kvm_mmu * mmu , u64 gpte , int level )
3550
3550
{
3551
+ struct rsvd_bits_validate * rsvd_check = & mmu -> guest_rsvd_check ;
3551
3552
int bit7 = (gpte >> 7 ) & 1 , low6 = gpte & 0x3f ;
3552
3553
3553
- return (gpte & mmu -> rsvd_bits_mask [bit7 ][level - 1 ]) |
3554
- ((mmu -> bad_mt_xwr & (1ull << low6 )) != 0 );
3554
+ return (gpte & rsvd_check -> rsvd_bits_mask [bit7 ][level - 1 ]) |
3555
+ ((rsvd_check -> bad_mt_xwr & (1ull << low6 )) != 0 );
3555
3556
}
3556
3557
3557
3558
#define PTTYPE_EPT 18 /* arbitrary */
@@ -3570,12 +3571,13 @@ static bool is_rsvd_bits_set(struct kvm_mmu *mmu, u64 gpte, int level)
3570
3571
static void reset_rsvds_bits_mask (struct kvm_vcpu * vcpu ,
3571
3572
struct kvm_mmu * context )
3572
3573
{
3574
+ struct rsvd_bits_validate * rsvd_check = & context -> guest_rsvd_check ;
3573
3575
int maxphyaddr = cpuid_maxphyaddr (vcpu );
3574
3576
u64 exb_bit_rsvd = 0 ;
3575
3577
u64 gbpages_bit_rsvd = 0 ;
3576
3578
u64 nonleaf_bit8_rsvd = 0 ;
3577
3579
3578
- context -> bad_mt_xwr = 0 ;
3580
+ rsvd_check -> bad_mt_xwr = 0 ;
3579
3581
3580
3582
if (!context -> nx )
3581
3583
exb_bit_rsvd = rsvd_bits (63 , 63 );
@@ -3592,85 +3594,92 @@ static void reset_rsvds_bits_mask(struct kvm_vcpu *vcpu,
3592
3594
switch (context -> root_level ) {
3593
3595
case PT32_ROOT_LEVEL :
3594
3596
/* no rsvd bits for 2 level 4K page table entries */
3595
- context -> rsvd_bits_mask [0 ][1 ] = 0 ;
3596
- context -> rsvd_bits_mask [0 ][0 ] = 0 ;
3597
- context -> rsvd_bits_mask [1 ][0 ] = context -> rsvd_bits_mask [0 ][0 ];
3597
+ rsvd_check -> rsvd_bits_mask [0 ][1 ] = 0 ;
3598
+ rsvd_check -> rsvd_bits_mask [0 ][0 ] = 0 ;
3599
+ rsvd_check -> rsvd_bits_mask [1 ][0 ] =
3600
+ rsvd_check -> rsvd_bits_mask [0 ][0 ];
3598
3601
3599
3602
if (!is_pse (vcpu )) {
3600
- context -> rsvd_bits_mask [1 ][1 ] = 0 ;
3603
+ rsvd_check -> rsvd_bits_mask [1 ][1 ] = 0 ;
3601
3604
break ;
3602
3605
}
3603
3606
3604
3607
if (is_cpuid_PSE36 ())
3605
3608
/* 36bits PSE 4MB page */
3606
- context -> rsvd_bits_mask [1 ][1 ] = rsvd_bits (17 , 21 );
3609
+ rsvd_check -> rsvd_bits_mask [1 ][1 ] = rsvd_bits (17 , 21 );
3607
3610
else
3608
3611
/* 32 bits PSE 4MB page */
3609
- context -> rsvd_bits_mask [1 ][1 ] = rsvd_bits (13 , 21 );
3612
+ rsvd_check -> rsvd_bits_mask [1 ][1 ] = rsvd_bits (13 , 21 );
3610
3613
break ;
3611
3614
case PT32E_ROOT_LEVEL :
3612
- context -> rsvd_bits_mask [0 ][2 ] =
3615
+ rsvd_check -> rsvd_bits_mask [0 ][2 ] =
3613
3616
rsvd_bits (maxphyaddr , 63 ) |
3614
3617
rsvd_bits (5 , 8 ) | rsvd_bits (1 , 2 ); /* PDPTE */
3615
- context -> rsvd_bits_mask [0 ][1 ] = exb_bit_rsvd |
3618
+ rsvd_check -> rsvd_bits_mask [0 ][1 ] = exb_bit_rsvd |
3616
3619
rsvd_bits (maxphyaddr , 62 ); /* PDE */
3617
- context -> rsvd_bits_mask [0 ][0 ] = exb_bit_rsvd |
3620
+ rsvd_check -> rsvd_bits_mask [0 ][0 ] = exb_bit_rsvd |
3618
3621
rsvd_bits (maxphyaddr , 62 ); /* PTE */
3619
- context -> rsvd_bits_mask [1 ][1 ] = exb_bit_rsvd |
3622
+ rsvd_check -> rsvd_bits_mask [1 ][1 ] = exb_bit_rsvd |
3620
3623
rsvd_bits (maxphyaddr , 62 ) |
3621
3624
rsvd_bits (13 , 20 ); /* large page */
3622
- context -> rsvd_bits_mask [1 ][0 ] = context -> rsvd_bits_mask [0 ][0 ];
3625
+ rsvd_check -> rsvd_bits_mask [1 ][0 ] =
3626
+ rsvd_check -> rsvd_bits_mask [0 ][0 ];
3623
3627
break ;
3624
3628
case PT64_ROOT_LEVEL :
3625
- context -> rsvd_bits_mask [0 ][3 ] = exb_bit_rsvd |
3626
- nonleaf_bit8_rsvd | rsvd_bits (7 , 7 ) | rsvd_bits (maxphyaddr , 51 );
3627
- context -> rsvd_bits_mask [0 ][2 ] = exb_bit_rsvd |
3628
- nonleaf_bit8_rsvd | gbpages_bit_rsvd | rsvd_bits (maxphyaddr , 51 );
3629
- context -> rsvd_bits_mask [0 ][1 ] = exb_bit_rsvd |
3629
+ rsvd_check -> rsvd_bits_mask [0 ][3 ] = exb_bit_rsvd |
3630
+ nonleaf_bit8_rsvd | rsvd_bits (7 , 7 ) |
3630
3631
rsvd_bits (maxphyaddr , 51 );
3631
- context -> rsvd_bits_mask [0 ][0 ] = exb_bit_rsvd |
3632
+ rsvd_check -> rsvd_bits_mask [0 ][2 ] = exb_bit_rsvd |
3633
+ nonleaf_bit8_rsvd | gbpages_bit_rsvd |
3632
3634
rsvd_bits (maxphyaddr , 51 );
3633
- context -> rsvd_bits_mask [1 ][3 ] = context -> rsvd_bits_mask [0 ][3 ];
3634
- context -> rsvd_bits_mask [1 ][2 ] = exb_bit_rsvd |
3635
+ rsvd_check -> rsvd_bits_mask [0 ][1 ] = exb_bit_rsvd |
3636
+ rsvd_bits (maxphyaddr , 51 );
3637
+ rsvd_check -> rsvd_bits_mask [0 ][0 ] = exb_bit_rsvd |
3638
+ rsvd_bits (maxphyaddr , 51 );
3639
+ rsvd_check -> rsvd_bits_mask [1 ][3 ] =
3640
+ rsvd_check -> rsvd_bits_mask [0 ][3 ];
3641
+ rsvd_check -> rsvd_bits_mask [1 ][2 ] = exb_bit_rsvd |
3635
3642
gbpages_bit_rsvd | rsvd_bits (maxphyaddr , 51 ) |
3636
3643
rsvd_bits (13 , 29 );
3637
- context -> rsvd_bits_mask [1 ][1 ] = exb_bit_rsvd |
3644
+ rsvd_check -> rsvd_bits_mask [1 ][1 ] = exb_bit_rsvd |
3638
3645
rsvd_bits (maxphyaddr , 51 ) |
3639
3646
rsvd_bits (13 , 20 ); /* large page */
3640
- context -> rsvd_bits_mask [1 ][0 ] = context -> rsvd_bits_mask [0 ][0 ];
3647
+ rsvd_check -> rsvd_bits_mask [1 ][0 ] =
3648
+ rsvd_check -> rsvd_bits_mask [0 ][0 ];
3641
3649
break ;
3642
3650
}
3643
3651
}
3644
3652
3645
3653
static void reset_rsvds_bits_mask_ept (struct kvm_vcpu * vcpu ,
3646
3654
struct kvm_mmu * context , bool execonly )
3647
3655
{
3656
+ struct rsvd_bits_validate * rsvd_check = & context -> guest_rsvd_check ;
3648
3657
int maxphyaddr = cpuid_maxphyaddr (vcpu );
3649
3658
int pte ;
3650
3659
3651
- context -> rsvd_bits_mask [0 ][3 ] =
3660
+ rsvd_check -> rsvd_bits_mask [0 ][3 ] =
3652
3661
rsvd_bits (maxphyaddr , 51 ) | rsvd_bits (3 , 7 );
3653
- context -> rsvd_bits_mask [0 ][2 ] =
3662
+ rsvd_check -> rsvd_bits_mask [0 ][2 ] =
3654
3663
rsvd_bits (maxphyaddr , 51 ) | rsvd_bits (3 , 6 );
3655
- context -> rsvd_bits_mask [0 ][1 ] =
3664
+ rsvd_check -> rsvd_bits_mask [0 ][1 ] =
3656
3665
rsvd_bits (maxphyaddr , 51 ) | rsvd_bits (3 , 6 );
3657
- context -> rsvd_bits_mask [0 ][0 ] = rsvd_bits (maxphyaddr , 51 );
3666
+ rsvd_check -> rsvd_bits_mask [0 ][0 ] = rsvd_bits (maxphyaddr , 51 );
3658
3667
3659
3668
/* large page */
3660
- context -> rsvd_bits_mask [1 ][3 ] = context -> rsvd_bits_mask [0 ][3 ];
3661
- context -> rsvd_bits_mask [1 ][2 ] =
3669
+ rsvd_check -> rsvd_bits_mask [1 ][3 ] = rsvd_check -> rsvd_bits_mask [0 ][3 ];
3670
+ rsvd_check -> rsvd_bits_mask [1 ][2 ] =
3662
3671
rsvd_bits (maxphyaddr , 51 ) | rsvd_bits (12 , 29 );
3663
- context -> rsvd_bits_mask [1 ][1 ] =
3672
+ rsvd_check -> rsvd_bits_mask [1 ][1 ] =
3664
3673
rsvd_bits (maxphyaddr , 51 ) | rsvd_bits (12 , 20 );
3665
- context -> rsvd_bits_mask [1 ][0 ] = context -> rsvd_bits_mask [0 ][0 ];
3674
+ rsvd_check -> rsvd_bits_mask [1 ][0 ] = rsvd_check -> rsvd_bits_mask [0 ][0 ];
3666
3675
3667
3676
for (pte = 0 ; pte < 64 ; pte ++ ) {
3668
3677
int rwx_bits = pte & 7 ;
3669
3678
int mt = pte >> 3 ;
3670
3679
if (mt == 0x2 || mt == 0x3 || mt == 0x7 ||
3671
3680
rwx_bits == 0x2 || rwx_bits == 0x6 ||
3672
3681
(rwx_bits == 0x4 && !execonly ))
3673
- context -> bad_mt_xwr |= (1ull << pte );
3682
+ rsvd_check -> bad_mt_xwr |= (1ull << pte );
3674
3683
}
3675
3684
}
3676
3685
0 commit comments