lkml.org 
[lkml]   [2023]   [Feb]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 01/11] crypto: ccp - Name -1 return value as SEV_RET_NO_FW_CALL
    Date
    From: Peter Gonda <pgonda@google.com>

    The PSP can return a "firmware error" code of -1 in circumstances where
    the PSP has not actually been called. To make this protocol unambiguous,
    name the value SEV_RET_NO_FW_CALL.

    [ bp: Massage a bit. ]

    Signed-off-by: Peter Gonda <pgonda@google.com>
    Signed-off-by: Dionna Glaze <dionnaglaze@google.com>
    Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
    Cc: <stable@kernel.org>
    Link: https://lore.kernel.org/r/20221207010210.2563293-2-dionnaglaze@google.com
    ---
    Documentation/virt/coco/sev-guest.rst | 4 ++--
    drivers/crypto/ccp/sev-dev.c | 8 +++++---
    include/uapi/linux/psp-sev.h | 7 +++++++
    3 files changed, 14 insertions(+), 5 deletions(-)

    diff --git a/Documentation/virt/coco/sev-guest.rst b/Documentation/virt/coco/sev-guest.rst
    index bf593e88cfd9..aa3e4c6a1f90 100644
    --- a/Documentation/virt/coco/sev-guest.rst
    +++ b/Documentation/virt/coco/sev-guest.rst
    @@ -40,8 +40,8 @@ along with a description:
    The guest ioctl should be issued on a file descriptor of the /dev/sev-guest device.
    The ioctl accepts struct snp_user_guest_request. The input and output structure is
    specified through the req_data and resp_data field respectively. If the ioctl fails
    -to execute due to a firmware error, then fw_err code will be set otherwise the
    -fw_err will be set to 0x00000000000000ff.
    +to execute due to a firmware error, then fw_err code will be set. Otherwise, fw_err
    +will be set to 0x00000000ffffffff, i.e., the lower 32-bits are -1.

    The firmware checks that the message sequence counter is one greater than
    the guests message sequence counter. If guest driver fails to increment message
    diff --git a/drivers/crypto/ccp/sev-dev.c b/drivers/crypto/ccp/sev-dev.c
    index 06fc7156c04f..f60bb73edfda 100644
    --- a/drivers/crypto/ccp/sev-dev.c
    +++ b/drivers/crypto/ccp/sev-dev.c
    @@ -442,10 +442,10 @@ static int __sev_init_ex_locked(int *error)

    static int __sev_platform_init_locked(int *error)
    {
    + int rc = 0, psp_ret = SEV_RET_NO_FW_CALL;
    struct psp_device *psp = psp_master;
    - struct sev_device *sev;
    - int rc = 0, psp_ret = -1;
    int (*init_function)(int *error);
    + struct sev_device *sev;

    if (!psp || !psp->sev_data)
    return -ENODEV;
    @@ -473,9 +473,11 @@ static int __sev_platform_init_locked(int *error)
    * initialization function should succeed by replacing the state
    * with a reset state.
    */
    - dev_err(sev->dev, "SEV: retrying INIT command because of SECURE_DATA_INVALID error. Retrying once to reset PSP SEV state.");
    + dev_err(sev->dev,
    +"SEV: retrying INIT command because of SECURE_DATA_INVALID error. Retrying once to reset PSP SEV state.");
    rc = init_function(&psp_ret);
    }
    +
    if (error)
    *error = psp_ret;

    diff --git a/include/uapi/linux/psp-sev.h b/include/uapi/linux/psp-sev.h
    index 91b4c63d5cbf..1c9da485318f 100644
    --- a/include/uapi/linux/psp-sev.h
    +++ b/include/uapi/linux/psp-sev.h
    @@ -36,6 +36,13 @@ enum {
    * SEV Firmware status code
    */
    typedef enum {
    + /*
    + * This error code is not in the SEV spec. Its purpose is to convey that
    + * there was an error that prevented the SEV firmware from being called.
    + * The SEV API error codes are 16 bits, so the -1 value will not overlap
    + * with possible values from the specification.
    + */
    + SEV_RET_NO_FW_CALL = -1,
    SEV_RET_SUCCESS = 0,
    SEV_RET_INVALID_PLATFORM_STATE,
    SEV_RET_INVALID_GUEST_STATE,
    --
    2.35.1
    \
     
     \ /
      Last update: 2023-03-27 00:25    [W:3.442 / U:0.056 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site