• Brijesh Singh's avatar
    x86/kvm: Add AMD SEV specific Hypercall3 · 08c2336d
    Brijesh Singh authored
    KVM hypercall framework relies on alternative framework to patch the
    VMCALL -> VMMCALL on AMD platform. If a hypercall is made before
    apply_alternative() is called then it defaults to VMCALL. The approach
    works fine on non SEV guest. A VMCALL would causes #UD, and hypervisor
    will be able to decode the instruction and do the right things. But
    when SEV is active, guest memory is encrypted with guest key and
    hypervisor will not be able to decode the instruction bytes.
    
    To highlight the need to provide this interface, capturing the
    flow of apply_alternatives() :
    setup_arch() call init_hypervisor_platform() which detects
    the hypervisor platform the kernel is running under and then the
    hypervisor specific initialization code can make early hypercalls.
    For example, KVM specific initialization in case of SEV will try
    to mark the "__bss_decrypted" section's encryption state via early
    page encryption status hypercalls.
    
    Now, apply_alternatives() is called much later when setup_arch()
    calls check_bugs(), so we do need some kind of an early,
    pre-alternatives hypercall interface. Other cases of pre-alternatives
    hypercalls include marking per-cpu GHCB pages as decrypted on SEV-ES
    and per-cpu apf_reason, steal_time and kvm_apic_eoi as decrypted for
    SEV generally.
    
    Add SEV specific hypercall3, it unconditionally uses VMMCALL. The hypercall
    will be used by the SEV guest to notify encrypted pages to the hypervisor.
    
    This kvm_sev_hypercall3() function is abstracted and used as follows :
    All these early hypercalls are made through early_set_memory_XX() interfaces,
    which in turn invoke pv_ops (paravirt_ops).
    
    This early_set_memory_XX() -> pv_ops.mmu.notify_page_enc_status_changed()
    is a generic interface and can easily have SEV, TDX and any other
    future platform specific abstractions added to it.
    
    Currently, pv_ops.mmu.notify_page_enc_status_changed() callback is setup to
    invoke kvm_sev_hypercall3() in case of SEV.
    
    Similarly, in case of TDX, pv_ops.mmu.notify_page_enc_status_changed()
    can be setup to a TDX specific callback.
    
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: "H. Peter Anvin" <hpa@zytor.com>
    Cc: Paolo Bonzini <pbonzini@redhat.com>
    Cc: Joerg Roedel <joro@8bytes.org>
    Cc: Borislav Petkov <bp@suse.de>
    Cc: Tom Lendacky <thomas.lendacky@amd.com>
    Cc: x86@kernel.org
    Cc: kvm@vger.kernel.org
    Cc: linux-kernel@vger.kernel.org
    Reviewed-by: default avatarSteve Rutherford <srutherford@google.com>
    Reviewed-by: default avatarVenu Busireddy <venu.busireddy@oracle.com>
    Signed-off-by: default avatarBrijesh Singh <brijesh.singh@amd.com>
    Signed-off-by: default avatarAshish Kalra <ashish.kalra@amd.com>
    Message-Id: <6fd25c749205dd0b1eb492c60d41b124760cc6ae.1629726117.git.ashish.kalra@amd.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    08c2336d
kvm_para.h 3.64 KB