• Sean Christopherson's avatar
    KVM: x86/mmu: WARN if upper 32 bits of legacy #PF error code are non-zero · 7bdbb820
    Sean Christopherson authored
    WARN if bits 63:32 are non-zero when handling an intercepted legacy #PF,
    as the error code for #PF is limited to 32 bits (and in practice, 16 bits
    on Intel CPUS).  This behavior is architectural, is part of KVM's ABI
    (see kvm_vcpu_events.error_code), and is explicitly documented as being
    preserved for intecerpted #PF in both the APM:
    
      The error code saved in EXITINFO1 is the same as would be pushed onto
      the stack by a non-intercepted #PF exception in protected mode.
    
    and even more explicitly in the SDM as VMCS.VM_EXIT_INTR_ERROR_CODE is a
    32-bit field.
    
    Simply drop the upper bits if hardware provides garbage, as spurious
    information should do no harm (though in all likelihood hardware is buggy
    and the kernel is doomed).
    
    Handling all upper 32 bits in the #PF path will allow moving the sanity
    check on synthetic checks from kvm_mmu_page_fault() to npf_interception(),
    which in turn will allow deriving PFERR_PRIVATE_ACCESS from AMD's
    PFERR_GUEST_ENC_MASK without running afoul of the sanity check.
    
    Note, this is also why Intel uses bit 15 for SGX (highest bit on Intel CPUs)
    and AMD uses bit 31 for RMP (highest bit on AMD CPUs); using the highest
    bit minimizes the probability of a collision with the "other" vendor,
    without needing to plumb more bits through microcode.
    Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
    Reviewed-by: default avatarKai Huang <kai.huang@intel.com>
    Message-ID: <20240228024147.41573-7-seanjc@google.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    7bdbb820
mmu.c 206 KB