• Paolo Bonzini's avatar
    KVM: MMU: fix reserved bit check for ept=0/CR0.WP=0/CR4.SMEP=1/EFER.NX=0 · 5f0b8199
    Paolo Bonzini authored
    KVM has special logic to handle pages with pte.u=1 and pte.w=0 when
    CR0.WP=1.  These pages' SPTEs flip continuously between two states:
    U=1/W=0 (user and supervisor reads allowed, supervisor writes not allowed)
    and U=0/W=1 (supervisor reads and writes allowed, user writes not allowed).
    
    When SMEP is in effect, however, U=0 will enable kernel execution of
    this page.  To avoid this, KVM also sets NX=1 in the shadow PTE together
    with U=0, making the two states U=1/W=0/NX=gpte.NX and U=0/W=1/NX=1.
    When guest EFER has the NX bit cleared, the reserved bit check thinks
    that the latter state is invalid; teach it that the smep_andnot_wp case
    will also use the NX bit of SPTEs.
    
    Cc: stable@vger.kernel.org
    Reviewed-by: default avatarXiao Guangrong <guangrong.xiao@linux.inel.com>
    Fixes: c258b62bSigned-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    5f0b8199
mmu.c 124 KB