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 10/15] virt: sev-guest: Choose the VMPCK key based on executing VMPL
    Date
    Currently, the sev-guest driver uses the vmpck-0 key by default. When an
    SVSM is present the kernel is running at a VMPL other than 0 and the
    vmpck-0 key is no longer available. If a specific vmpck key has not be
    requested by the user via the vmpck_id module parameter, choose the vmpck
    key based on the active VMPL level.

    Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com>
    ---
    arch/x86/include/asm/sev.h | 2 ++
    arch/x86/kernel/sev.c | 6 ++++++
    drivers/virt/coco/sev-guest/sev-guest.c | 10 +++++++---
    3 files changed, 15 insertions(+), 3 deletions(-)

    diff --git a/arch/x86/include/asm/sev.h b/arch/x86/include/asm/sev.h
    index a7312b936d16..64fcadd6d602 100644
    --- a/arch/x86/include/asm/sev.h
    +++ b/arch/x86/include/asm/sev.h
    @@ -307,6 +307,7 @@ u64 snp_get_unsupported_features(u64 status);
    u64 sev_get_status(void);
    void sev_show_status(void);
    void snp_remap_svsm_ca(void);
    +int snp_get_vmpl(void);
    #else
    static inline void sev_es_ist_enter(struct pt_regs *regs) { }
    static inline void sev_es_ist_exit(void) { }
    @@ -337,6 +338,7 @@ static inline u64 snp_get_unsupported_features(u64 status) { return 0; }
    static inline u64 sev_get_status(void) { return 0; }
    static inline void sev_show_status(void) { }
    static inline void snp_remap_svsm_ca(void) { }
    +static inline int snp_get_vmpl(void) { return 0; }
    #endif

    #ifdef CONFIG_KVM_AMD_SEV
    diff --git a/arch/x86/kernel/sev.c b/arch/x86/kernel/sev.c
    index 8edf7362136b..75f11da867a3 100644
    --- a/arch/x86/kernel/sev.c
    +++ b/arch/x86/kernel/sev.c
    @@ -2454,6 +2454,12 @@ int snp_issue_guest_request(u64 exit_code, struct snp_req_data *input, struct sn
    }
    EXPORT_SYMBOL_GPL(snp_issue_guest_request);

    +int snp_get_vmpl(void)
    +{
    + return vmpl;
    +}
    +EXPORT_SYMBOL_GPL(snp_get_vmpl);
    +
    static struct platform_device sev_guest_device = {
    .name = "sev-guest",
    .id = -1,
    diff --git a/drivers/virt/coco/sev-guest/sev-guest.c b/drivers/virt/coco/sev-guest/sev-guest.c
    index 04a7bd1e4314..e7dd7df86427 100644
    --- a/drivers/virt/coco/sev-guest/sev-guest.c
    +++ b/drivers/virt/coco/sev-guest/sev-guest.c
    @@ -2,7 +2,7 @@
    /*
    * AMD Secure Encrypted Virtualization (SEV) guest driver interface
    *
    - * Copyright (C) 2021 Advanced Micro Devices, Inc.
    + * Copyright (C) 2021-2024 Advanced Micro Devices, Inc.
    *
    * Author: Brijesh Singh <brijesh.singh@amd.com>
    */
    @@ -70,8 +70,8 @@ struct snp_guest_dev {
    u8 *vmpck;
    };

    -static u32 vmpck_id;
    -module_param(vmpck_id, uint, 0444);
    +static int vmpck_id = -1;
    +module_param(vmpck_id, int, 0444);
    MODULE_PARM_DESC(vmpck_id, "The VMPCK ID to use when communicating with the PSP.");

    /* Mutex to serialize the shared buffer access and command handling. */
    @@ -923,6 +923,10 @@ static int __init sev_guest_probe(struct platform_device *pdev)
    if (!snp_dev)
    goto e_unmap;

    + /* Adjust the default VMPCK key based on the executing VMPL level */
    + if (vmpck_id == -1)
    + vmpck_id = snp_get_vmpl();
    +
    ret = -EINVAL;
    snp_dev->vmpck = get_vmpck(vmpck_id, layout, &snp_dev->os_area_msg_seqno);
    if (!snp_dev->vmpck) {
    --
    2.43.2

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