Commit efb339a8 authored by Peter Gonda's avatar Peter Gonda Committed by Borislav Petkov (AMD)

crypto: ccp - Name -1 return value as SEV_RET_NO_FW_CALL

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: default avatarPeter Gonda <pgonda@google.com>
Signed-off-by: default avatarDionna Glaze <dionnaglaze@google.com>
Signed-off-by: default avatarBorislav Petkov (AMD) <bp@alien8.de>
Link: https://lore.kernel.org/r/20221207010210.2563293-2-dionnaglaze@google.com
parent e8d018dd
...@@ -40,8 +40,8 @@ along with a description: ...@@ -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
......
...@@ -444,10 +444,10 @@ static int __sev_init_ex_locked(int *error) ...@@ -444,10 +444,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;
...@@ -475,9 +475,11 @@ static int __sev_platform_init_locked(int *error) ...@@ -475,9 +475,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;
......
...@@ -36,6 +36,13 @@ enum { ...@@ -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,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment