lkml.org 
[lkml]   [2024]   [Apr]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v4 03/15] x86/sev: Make the VMPL0 checking more straight forward
    Date
    Currently, the enforce_vmpl0() function uses a set argument when modifying
    the VMPL1 permissions used to test for VMPL0. If the guest is not running
    at VMPL0, the guest self-terminates.

    The function is just a wrapper for a fixed RMPADJUST function. Eliminate
    the function and perform the RMPADJUST directly.

    No functional change.

    Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com>
    ---
    arch/x86/boot/compressed/sev.c | 35 ++++++++++++++--------------------
    1 file changed, 14 insertions(+), 21 deletions(-)

    diff --git a/arch/x86/boot/compressed/sev.c b/arch/x86/boot/compressed/sev.c
    index 5ad0ff4664f1..0457a9d7e515 100644
    --- a/arch/x86/boot/compressed/sev.c
    +++ b/arch/x86/boot/compressed/sev.c
    @@ -335,26 +335,6 @@ void do_boot_stage2_vc(struct pt_regs *regs, unsigned long exit_code)
    sev_es_terminate(SEV_TERM_SET_GEN, GHCB_SEV_ES_GEN_REQ);
    }

    -static void enforce_vmpl0(void)
    -{
    - u64 attrs;
    - int err;
    -
    - /*
    - * RMPADJUST modifies RMP permissions of a lesser-privileged (numerically
    - * higher) privilege level. Here, clear the VMPL1 permission mask of the
    - * GHCB page. If the guest is not running at VMPL0, this will fail.
    - *
    - * If the guest is running at VMPL0, it will succeed. Even if that operation
    - * modifies permission bits, it is still ok to do so currently because Linux
    - * SNP guests are supported only on VMPL0 so VMPL1 or higher permission masks
    - * changing is a don't-care.
    - */
    - attrs = 1;
    - if (rmpadjust((unsigned long)&boot_ghcb_page, RMP_PG_SIZE_4K, attrs))
    - sev_es_terminate(SEV_TERM_SET_LINUX, GHCB_TERM_NOT_VMPL0);
    -}
    -
    /*
    * SNP_FEATURES_IMPL_REQ is the mask of SNP features that will need
    * guest side implementation for proper functioning of the guest. If any
    @@ -588,7 +568,20 @@ void sev_enable(struct boot_params *bp)
    if (!(get_hv_features() & GHCB_HV_FT_SNP))
    sev_es_terminate(SEV_TERM_SET_GEN, GHCB_SNP_UNSUPPORTED);

    - enforce_vmpl0();
    + /*
    + * Enforce running at VMPL0.
    + *
    + * RMPADJUST modifies RMP permissions of a lesser-privileged (numerically
    + * higher) privilege level. Here, clear the VMPL1 permission mask of the
    + * GHCB page. If the guest is not running at VMPL0, this will fail.
    + *
    + * If the guest is running at VMPL0, it will succeed. Even if that operation
    + * modifies permission bits, it is still ok to do so currently because Linux
    + * SNP guests running at VMPL0 only run at VMPL0, so VMPL1 or higher
    + * permission mask changes are a don't-care.
    + */
    + if (rmpadjust((unsigned long)&boot_ghcb_page, RMP_PG_SIZE_4K, 1))
    + sev_es_terminate(SEV_TERM_SET_LINUX, GHCB_TERM_NOT_VMPL0);
    }

    if (snp && !(sev_status & MSR_AMD64_SEV_SNP_ENABLED))
    --
    2.43.2

    \
     
     \ /
      Last update: 2024-05-27 18:01    [W:4.513 / U:0.248 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site