crypto: ccp - Name -1 return value as SEV_RET_NO_FW_CALL

[ Upstream commit efb339a833 ]

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>
Link: https://lore.kernel.org/r/20221207010210.2563293-2-dionnaglaze@google.com
Stable-dep-of: db10cb9b5746 ("virt: sevguest: Fix passing a stack buffer as a scatterlist target")
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
Peter Gonda 2023-03-07 20:24:39 +01:00 committed by Greg Kroah-Hartman
parent 7c7371b41a
commit a5b03f56d3
3 changed files with 14 additions and 5 deletions

View File

@ -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 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 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 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 to execute due to a firmware error, then fw_err code will be set. Otherwise, fw_err
fw_err will be set to 0x00000000000000ff. 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 firmware checks that the message sequence counter is one greater than
the guests message sequence counter. If guest driver fails to increment message the guests message sequence counter. If guest driver fails to increment message

View File

@ -443,10 +443,10 @@ static int __sev_init_ex_locked(int *error)
static int __sev_platform_init_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 psp_device *psp = psp_master;
struct sev_device *sev;
int rc = 0, psp_ret = -1;
int (*init_function)(int *error); int (*init_function)(int *error);
struct sev_device *sev;
if (!psp || !psp->sev_data) if (!psp || !psp->sev_data)
return -ENODEV; return -ENODEV;
@ -474,9 +474,11 @@ static int __sev_platform_init_locked(int *error)
* initialization function should succeed by replacing the state * initialization function should succeed by replacing the state
* with a reset 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); rc = init_function(&psp_ret);
} }
if (error) if (error)
*error = psp_ret; *error = psp_ret;

View File

@ -36,6 +36,13 @@ enum {
* SEV Firmware status code * SEV Firmware status code
*/ */
typedef enum { 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_SUCCESS = 0,
SEV_RET_INVALID_PLATFORM_STATE, SEV_RET_INVALID_PLATFORM_STATE,
SEV_RET_INVALID_GUEST_STATE, SEV_RET_INVALID_GUEST_STATE,