• Kai Huang's avatar
    kvm: x86: Fix reserved bits related calculation errors caused by MKTME · f3ecb59d
    Kai Huang authored
    Intel MKTME repurposes several high bits of physical address as 'keyID'
    for memory encryption thus effectively reduces platform's maximum
    physical address bits. Exactly how many bits are reduced is configured
    by BIOS. To honor such HW behavior, the repurposed bits are reduced from
    cpuinfo_x86->x86_phys_bits when MKTME is detected in CPU detection.
    Similarly, AMD SME/SEV also reduces physical address bits for memory
    encryption, and cpuinfo->x86_phys_bits is reduced too when SME/SEV is
    detected, so for both MKTME and SME/SEV, boot_cpu_data.x86_phys_bits
    doesn't hold physical address bits reported by CPUID anymore.
    
    Currently KVM treats bits from boot_cpu_data.x86_phys_bits to 51 as
    reserved bits, but it's not true anymore for MKTME, since MKTME treats
    those reduced bits as 'keyID', but not reserved bits. Therefore
    boot_cpu_data.x86_phys_bits cannot be used to calculate reserved bits
    anymore, although we can still use it for AMD SME/SEV since SME/SEV
    treats the reduced bits differently -- they are treated as reserved
    bits, the same as other reserved bits in page table entity [1].
    
    Fix by introducing a new 'shadow_phys_bits' variable in KVM x86 MMU code
    to store the effective physical bits w/o reserved bits -- for MKTME,
    it equals to physical address reported by CPUID, and for SME/SEV, it is
    boot_cpu_data.x86_phys_bits.
    
    Note that for the physical address bits reported to guest should remain
    unchanged -- KVM should report physical address reported by CPUID to
    guest, but not boot_cpu_data.x86_phys_bits. Because for Intel MKTME,
    there's no harm if guest sets up 'keyID' bits in guest page table (since
    MKTME only works at physical address level), and KVM doesn't even expose
    MKTME to guest. Arguably, for AMD SME/SEV, guest is aware of SEV thus it
    should adjust boot_cpu_data.x86_phys_bits when it detects SEV, therefore
    KVM should still reports physcial address reported by CPUID to guest.
    Reviewed-by: default avatarSean Christopherson <sean.j.christopherson@intel.com>
    Signed-off-by: default avatarKai Huang <kai.huang@linux.intel.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    f3ecb59d
mmu.c 160 KB