• Babu Moger's avatar
    KVM: x86: Introduce cr3_lm_rsvd_bits in kvm_vcpu_arch · 0107973a
    Babu Moger authored
    SEV guests fail to boot on a system that supports the PCID feature.
    
    While emulating the RSM instruction, KVM reads the guest CR3
    and calls kvm_set_cr3(). If the vCPU is in the long mode,
    kvm_set_cr3() does a sanity check for the CR3 value. In this case,
    it validates whether the value has any reserved bits set. The
    reserved bit range is 63:cpuid_maxphysaddr(). When AMD memory
    encryption is enabled, the memory encryption bit is set in the CR3
    value. The memory encryption bit may fall within the KVM reserved
    bit range, causing the KVM emulation failure.
    
    Introduce a new field cr3_lm_rsvd_bits in kvm_vcpu_arch which will
    cache the reserved bits in the CR3 value. This will be initialized
    to rsvd_bits(cpuid_maxphyaddr(vcpu), 63).
    
    If the architecture has any special bits(like AMD SEV encryption bit)
    that needs to be masked from the reserved bits, should be cleared
    in vendor specific kvm_x86_ops.vcpu_after_set_cpuid handler.
    
    Fixes: a780a3ea ("KVM: X86: Fix reserved bits check for MOV to CR3")
    Signed-off-by: default avatarBabu Moger <babu.moger@amd.com>
    Message-Id: <160521947657.32054.3264016688005356563.stgit@bmoger-ubuntu>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    0107973a
cpuid.c 29.3 KB