lkml.org 
[lkml]   [2021]   [Nov]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v7 15/45] x86/compressed: Register GHCB memory when SEV-SNP is active
    Date
    The SEV-SNP guest is required to perform GHCB GPA registration. This is
    because the hypervisor may prefer that a guest use a consistent and/or
    specific GPA for the GHCB associated with a vCPU. For more information,
    see the GHCB specification.

    If hypervisor can not work with the guest provided GPA then terminate the
    guest boot.

    Signed-off-by: Brijesh Singh <brijesh.singh@amd.com>
    ---
    arch/x86/boot/compressed/sev.c | 4 ++++
    arch/x86/include/asm/sev-common.h | 13 +++++++++++++
    arch/x86/kernel/sev-shared.c | 16 ++++++++++++++++
    3 files changed, 33 insertions(+)

    diff --git a/arch/x86/boot/compressed/sev.c b/arch/x86/boot/compressed/sev.c
    index f85094dd957f..fb2f763dfc19 100644
    --- a/arch/x86/boot/compressed/sev.c
    +++ b/arch/x86/boot/compressed/sev.c
    @@ -217,6 +217,10 @@ static bool do_early_sev_setup(void)
    /* Initialize lookup tables for the instruction decoder */
    inat_init_tables();

    + /* SEV-SNP guest requires the GHCB GPA must be registered */
    + if (sev_snp_enabled())
    + snp_register_ghcb_early(__pa(&boot_ghcb_page));
    +
    return true;
    }

    diff --git a/arch/x86/include/asm/sev-common.h b/arch/x86/include/asm/sev-common.h
    index 1c76b6b775cc..b82fff9d607b 100644
    --- a/arch/x86/include/asm/sev-common.h
    +++ b/arch/x86/include/asm/sev-common.h
    @@ -57,6 +57,19 @@
    #define GHCB_MSR_AP_RESET_HOLD_REQ 0x006
    #define GHCB_MSR_AP_RESET_HOLD_RESP 0x007

    +/* GHCB GPA Register */
    +#define GHCB_MSR_REG_GPA_REQ 0x012
    +#define GHCB_MSR_REG_GPA_REQ_VAL(v) \
    + /* GHCBData[63:12] */ \
    + (((u64)((v) & GENMASK_ULL(51, 0)) << 12) | \
    + /* GHCBData[11:0] */ \
    + GHCB_MSR_REG_GPA_REQ)
    +
    +#define GHCB_MSR_REG_GPA_RESP 0x013
    +#define GHCB_MSR_REG_GPA_RESP_VAL(v) \
    + /* GHCBData[63:12] */ \
    + (((u64)(v) & GENMASK_ULL(63, 12)) >> 12)
    +
    /*
    * SNP Page State Change Operation
    *
    diff --git a/arch/x86/kernel/sev-shared.c b/arch/x86/kernel/sev-shared.c
    index 85b549f3ee1a..b0ed64fc6520 100644
    --- a/arch/x86/kernel/sev-shared.c
    +++ b/arch/x86/kernel/sev-shared.c
    @@ -75,6 +75,22 @@ static bool get_hv_features(void)
    return true;
    }

    +static void snp_register_ghcb_early(unsigned long paddr)
    +{
    + unsigned long pfn = paddr >> PAGE_SHIFT;
    + u64 val;
    +
    + sev_es_wr_ghcb_msr(GHCB_MSR_REG_GPA_REQ_VAL(pfn));
    + VMGEXIT();
    +
    + val = sev_es_rd_ghcb_msr();
    +
    + /* If the response GPA is not ours then abort the guest */
    + if ((GHCB_RESP_CODE(val) != GHCB_MSR_REG_GPA_RESP) ||
    + (GHCB_MSR_REG_GPA_RESP_VAL(val) != pfn))
    + sev_es_terminate(SEV_TERM_SET_LINUX, GHCB_TERM_REGISTER);
    +}
    +
    static bool sev_es_negotiate_protocol(void)
    {
    u64 val;
    --
    2.25.1
    \
     
     \ /
      Last update: 2021-11-10 23:10    [W:4.110 / U:0.196 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site