crypto: ccp - Consolidate sev INIT logic
Subsystems (3)
PATCH v2 1/1 crypto: ccp - Consolidate sev INIT logic
Adds new helper function sev_init_if_required() for use in sev_ioctl(). The function calls __sev_platform_init_locked() if the command requires the PSP's internal state be at least SEV_STATE_INIT. This consolidates many checks scattered through out the ioctl delegation functions.
Signed-off-by Peter Gonda <[email protected]>
Cc Tom Lendacky <[email protected]>
Cc Brijesh Singh <[email protected]>
Cc Marc Orr <[email protected]>
Cc Joerg Roedel <[email protected]>
Cc Herbert Xu <[email protected]>
Cc David Rientjes <[email protected]>
Cc John Allen <[email protected]>
Cc "David S. Miller" <[email protected]>
---
V2
* Move calls of sev_init_if_required() into command specific functions to remove tedious command_id if statement.
--- drivers/crypto/ccp/sev-dev.c | 62 +++++++++++++++++------------------- 1 file changed, 30 insertions(+), 32 deletions(-)
drivers/crypto/ccp/sev-dev.c +30 -32
@@ -384,26 +384,37 @@ static int sev_ioctl_do_platform_status(struct sev_issue_cmd *argp)return ret; } -static int sev_ioctl_do_pek_pdh_gen (int cmd,struct sev_issue_cmd *argp,bool writable) +static int sev_init_if_required (bool writable,int *error) {struct sev_device *sev = psp_master->sev_data; + +lockdep_assert_held (&sev_cmd_mutex); + +if (sev->state !=SEV_STATE_UNINIT ) +return 0 ; + +if (!writable) +return -EPERM ; + +return __sev_platform_init_locked (error); +} + +static int sev_ioctl_do_pek_pdh_gen (int cmd,struct sev_issue_cmd *argp,bool writable) +{int rc;if (!writable)return -EPERM ; -if (sev->state ==SEV_STATE_UNINIT ) { - rc =__sev_platform_init_locked (&argp->error); -if (rc) -return rc; - } + rc =sev_init_if_required (writable, &argp->error); +if (rc) +return rc;return __sev_do_cmd_locked (cmd,NULL , &argp->error); }static int sev_ioctl_do_pek_csr (struct sev_issue_cmd *argp,bool writable) { -struct sev_device *sev = psp_master->sev_data;struct sev_user_data_pek_csr input;struct sev_data_pek_csr data;void __user *input_address;
@@ -413,6 +424,10 @@ static int sev_ioctl_do_pek_csr(struct sev_issue_cmd *argp, bool writable)if (!writable)return -EPERM ; + ret =sev_init_if_required (writable, &argp->error); +if (ret) +return ret; +if (copy_from_user (&input, (void __user *)argp->data,sizeof (input)))return -EFAULT ;
@@ -435,12 +450,6 @@ static int sev_ioctl_do_pek_csr(struct sev_issue_cmd *argp, bool writable) data.len = input.length; cmd: -if (sev->state ==SEV_STATE_UNINIT ) { - ret =__sev_platform_init_locked (&argp->error); -if (ret) - goto e_free_blob; - } - ret =__sev_do_cmd_locked (SEV_CMD_PEK_CSR , &data, &argp->error);/* If we query the CSR length, FW responded with expected data. */
@@ -586,7 +595,6 @@ static int sev_update_firmware(struct device *dev)static int sev_ioctl_do_pek_import (struct sev_issue_cmd *argp,bool writable) { -struct sev_device *sev = psp_master->sev_data;struct sev_user_data_pek_cert_import input;struct sev_data_pek_cert_import data;void *pek_blob, *oca_blob;
@@ -595,6 +603,10 @@ static int sev_ioctl_do_pek_import(struct sev_issue_cmd *argp, bool writable)if (!writable)return -EPERM ; + ret =sev_init_if_required (writable, &argp->error); +if (ret) +return ret; +if (copy_from_user (&input, (void __user *)argp->data,sizeof (input)))return -EFAULT ;
@@ -617,17 +629,10 @@ static int sev_ioctl_do_pek_import(struct sev_issue_cmd *argp, bool writable) data.oca_cert_address =__psp_pa (oca_blob); data.oca_cert_len = input.oca_cert_len; -/* If platform is not in INIT state then transition it to INIT */ -if (sev->state !=SEV_STATE_INIT ) { - ret =__sev_platform_init_locked (&argp->error); -if (ret) - goto e_free_oca; - } - ret =__sev_do_cmd_locked (SEV_CMD_PEK_CERT_IMPORT , &data, &argp->error); -e_free_oca:kfree (oca_blob); + e_free_pek:kfree (pek_blob);return ret;
@@ -730,7 +735,6 @@ static int sev_ioctl_do_get_id(struct sev_issue_cmd *argp)static int sev_ioctl_do_pdh_export (struct sev_issue_cmd *argp,bool writable) { -struct sev_device *sev = psp_master->sev_data;struct sev_user_data_pdh_cert_export input;void *pdh_blob =NULL , *cert_blob =NULL ;struct sev_data_pdh_cert_export data;
@@ -738,15 +742,9 @@ static int sev_ioctl_do_pdh_export(struct sev_issue_cmd *argp, bool writable)void __user *input_pdh_cert_address;int ret; -/* If platform is not in INIT state then transition it to INIT. */ -if (sev->state !=SEV_STATE_INIT ) { -if (!writable) -return -EPERM ; - - ret =__sev_platform_init_locked (&argp->error); -if (ret) -return ret; - } + ret =sev_init_if_required (writable, &argp->error); +if (ret) +return ret;if (copy_from_user (&input, (void __user *)argp->data,sizeof (input)))return -EFAULT ;
Signature · 1 line
2.33.0.882.g93a45727a2-goog