Commit cb645fe4 authored by Brijesh Singh's avatar Brijesh Singh Committed by Borislav Petkov (AMD)

crypto: ccp: Add the SNP_SET_CONFIG command

The SEV-SNP firmware provides the SNP_CONFIG command used to set various
system-wide configuration values for SNP guests, such as the reported
TCB version used when signing guest attestation reports. Add an
interface to set this via userspace.

  [ mdr: Squash in doc patch from Dionna, drop extended request/
    certificate handling and simplify this to a simple wrapper around
    SNP_CONFIG fw cmd. ]
Signed-off-by: default avatarBrijesh Singh <brijesh.singh@amd.com>
Co-developed-by: default avatarAlexey Kardashevskiy <aik@amd.com>
Signed-off-by: default avatarAlexey Kardashevskiy <aik@amd.com>
Co-developed-by: default avatarDionna Glaze <dionnaglaze@google.com>
Signed-off-by: default avatarDionna Glaze <dionnaglaze@google.com>
Signed-off-by: default avatarAshish Kalra <ashish.kalra@amd.com>
Signed-off-by: default avatarMichael Roth <michael.roth@amd.com>
Signed-off-by: default avatarBorislav Petkov (AMD) <bp@alien8.de>
Link: https://lore.kernel.org/r/20240126041126.1927228-26-michael.roth@amd.com
parent fad133c7
...@@ -162,6 +162,19 @@ SEV-SNP firmware SNP_COMMIT command. This prevents roll-back to a previously ...@@ -162,6 +162,19 @@ SEV-SNP firmware SNP_COMMIT command. This prevents roll-back to a previously
committed firmware version. This will also update the reported TCB to match committed firmware version. This will also update the reported TCB to match
that of the currently installed firmware. that of the currently installed firmware.
2.6 SNP_SET_CONFIG
------------------
:Technology: sev-snp
:Type: hypervisor ioctl cmd
:Parameters (in): struct sev_user_data_snp_config
:Returns (out): 0 on success, -negative on error
SNP_SET_CONFIG is used to set the system-wide configuration such as
reported TCB version in the attestation report. The command is similar
to SNP_CONFIG command defined in the SEV-SNP spec. The current values of
the firmware parameters affected by this command can be queried via
SNP_PLATFORM_STATUS.
3. SEV-SNP CPUID Enforcement 3. SEV-SNP CPUID Enforcement
============================ ============================
......
...@@ -2004,6 +2004,23 @@ static int sev_ioctl_do_snp_commit(struct sev_issue_cmd *argp) ...@@ -2004,6 +2004,23 @@ static int sev_ioctl_do_snp_commit(struct sev_issue_cmd *argp)
return __sev_do_cmd_locked(SEV_CMD_SNP_COMMIT, &buf, &argp->error); return __sev_do_cmd_locked(SEV_CMD_SNP_COMMIT, &buf, &argp->error);
} }
static int sev_ioctl_do_snp_set_config(struct sev_issue_cmd *argp, bool writable)
{
struct sev_device *sev = psp_master->sev_data;
struct sev_user_data_snp_config config;
if (!sev->snp_initialized || !argp->data)
return -EINVAL;
if (!writable)
return -EPERM;
if (copy_from_user(&config, (void __user *)argp->data, sizeof(config)))
return -EFAULT;
return __sev_do_cmd_locked(SEV_CMD_SNP_CONFIG, &config, &argp->error);
}
static long sev_ioctl(struct file *file, unsigned int ioctl, unsigned long arg) static long sev_ioctl(struct file *file, unsigned int ioctl, unsigned long arg)
{ {
void __user *argp = (void __user *)arg; void __user *argp = (void __user *)arg;
...@@ -2061,6 +2078,9 @@ static long sev_ioctl(struct file *file, unsigned int ioctl, unsigned long arg) ...@@ -2061,6 +2078,9 @@ static long sev_ioctl(struct file *file, unsigned int ioctl, unsigned long arg)
case SNP_COMMIT: case SNP_COMMIT:
ret = sev_ioctl_do_snp_commit(&input); ret = sev_ioctl_do_snp_commit(&input);
break; break;
case SNP_SET_CONFIG:
ret = sev_ioctl_do_snp_set_config(&input, writable);
break;
default: default:
ret = -EINVAL; ret = -EINVAL;
goto out; goto out;
......
...@@ -30,6 +30,7 @@ enum { ...@@ -30,6 +30,7 @@ enum {
SEV_GET_ID2, SEV_GET_ID2,
SNP_PLATFORM_STATUS, SNP_PLATFORM_STATUS,
SNP_COMMIT, SNP_COMMIT,
SNP_SET_CONFIG,
SEV_MAX, SEV_MAX,
}; };
......
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