mirror of https://gitee.com/openkylin/libvirt.git
qemu: Implement the driver backend for virDomainGetLaunchSecurityInfo
This patch implements the internal driver API for launch event into qemu driver. When SEV is enabled, execute 'query-sev-launch-measurement' to get the measurement of memory encrypted through launch sequence. Signed-off-by: Brijesh Singh <brijesh.singh@amd.com> Reviewed-by: Erik Skultety <eskultet@redhat.com>
This commit is contained in:
parent
a12278a165
commit
bfaa61c83c
|
@ -21501,6 +21501,74 @@ qemuNodeGetSEVInfo(virConnectPtr conn,
|
|||
}
|
||||
|
||||
|
||||
static int
|
||||
qemuDomainGetSEVMeasurement(virQEMUDriverPtr driver,
|
||||
virDomainObjPtr vm,
|
||||
virTypedParameterPtr *params,
|
||||
int *nparams,
|
||||
unsigned int flags)
|
||||
{
|
||||
int ret = -1;
|
||||
char *tmp;
|
||||
int maxpar = 0;
|
||||
|
||||
virCheckFlags(VIR_TYPED_PARAM_STRING_OKAY, -1);
|
||||
|
||||
if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_QUERY) < 0)
|
||||
return -1;
|
||||
|
||||
if (qemuDomainObjEnterMonitorAsync(driver, vm, QEMU_ASYNC_JOB_NONE) < 0)
|
||||
goto endjob;
|
||||
|
||||
tmp = qemuMonitorGetSEVMeasurement(QEMU_DOMAIN_PRIVATE(vm)->mon);
|
||||
if (tmp == NULL)
|
||||
goto endjob;
|
||||
|
||||
if (qemuDomainObjExitMonitor(driver, vm) < 0)
|
||||
goto endjob;
|
||||
|
||||
if (virTypedParamsAddString(params, nparams, &maxpar,
|
||||
VIR_DOMAIN_LAUNCH_SECURITY_SEV_MEASUREMENT,
|
||||
tmp) < 0)
|
||||
goto endjob;
|
||||
|
||||
VIR_FREE(tmp);
|
||||
ret = 0;
|
||||
|
||||
endjob:
|
||||
qemuDomainObjEndJob(driver, vm);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
qemuDomainGetLaunchSecurityInfo(virDomainPtr domain,
|
||||
virTypedParameterPtr *params,
|
||||
int *nparams,
|
||||
unsigned int flags)
|
||||
{
|
||||
virQEMUDriverPtr driver = domain->conn->privateData;
|
||||
virDomainObjPtr vm;
|
||||
int ret = -1;
|
||||
|
||||
if (!(vm = qemuDomObjFromDomain(domain)))
|
||||
goto cleanup;
|
||||
|
||||
if (virDomainGetLaunchSecurityInfoEnsureACL(domain->conn, vm->def) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (vm->def->sev) {
|
||||
if (qemuDomainGetSEVMeasurement(driver, vm, params, nparams, flags) < 0)
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
ret = 0;
|
||||
|
||||
cleanup:
|
||||
virDomainObjEndAPI(&vm);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static virHypervisorDriver qemuHypervisorDriver = {
|
||||
.name = QEMU_DRIVER_NAME,
|
||||
.connectURIProbe = qemuConnectURIProbe,
|
||||
|
@ -21725,6 +21793,7 @@ static virHypervisorDriver qemuHypervisorDriver = {
|
|||
.connectCompareHypervisorCPU = qemuConnectCompareHypervisorCPU, /* 4.4.0 */
|
||||
.connectBaselineHypervisorCPU = qemuConnectBaselineHypervisorCPU, /* 4.4.0 */
|
||||
.nodeGetSEVInfo = qemuNodeGetSEVInfo, /* 4.5.0 */
|
||||
.domainGetLaunchSecurityInfo = qemuDomainGetLaunchSecurityInfo, /* 4.5.0 */
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -4297,3 +4297,11 @@ qemuMonitorBlockdevDel(qemuMonitorPtr mon,
|
|||
|
||||
return qemuMonitorJSONBlockdevDel(mon, nodename);
|
||||
}
|
||||
|
||||
char *
|
||||
qemuMonitorGetSEVMeasurement(qemuMonitorPtr mon)
|
||||
{
|
||||
QEMU_CHECK_MONITOR_NULL(mon);
|
||||
|
||||
return qemuMonitorJSONGetSEVMeasurement(mon);
|
||||
}
|
||||
|
|
|
@ -1142,4 +1142,7 @@ int qemuMonitorBlockdevAdd(qemuMonitorPtr mon,
|
|||
int qemuMonitorBlockdevDel(qemuMonitorPtr mon,
|
||||
const char *nodename);
|
||||
|
||||
char *
|
||||
qemuMonitorGetSEVMeasurement(qemuMonitorPtr mon);
|
||||
|
||||
#endif /* QEMU_MONITOR_H */
|
||||
|
|
|
@ -7994,3 +7994,45 @@ qemuMonitorJSONBlockdevDel(qemuMonitorPtr mon,
|
|||
virJSONValueFree(reply);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* The function is used to retrieve the measurement of a SEV guest.
|
||||
* The measurement is signature of the memory contents that was encrypted
|
||||
* through the SEV launch flow.
|
||||
*
|
||||
* A example JSON output:
|
||||
*
|
||||
* { "execute" : "query-sev-launch-measure" }
|
||||
* { "return" : { "data" : "4l8LXeNlSPUDlXPJG5966/8%YZ" } }
|
||||
*/
|
||||
char *
|
||||
qemuMonitorJSONGetSEVMeasurement(qemuMonitorPtr mon)
|
||||
{
|
||||
const char *tmp;
|
||||
char *measurement = NULL;
|
||||
virJSONValuePtr cmd;
|
||||
virJSONValuePtr reply = NULL;
|
||||
virJSONValuePtr data;
|
||||
|
||||
if (!(cmd = qemuMonitorJSONMakeCommand("query-sev-launch-measure", NULL)))
|
||||
return NULL;
|
||||
|
||||
if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (qemuMonitorJSONCheckReply(cmd, reply, VIR_JSON_TYPE_OBJECT) < 0)
|
||||
goto cleanup;
|
||||
|
||||
data = virJSONValueObjectGetObject(reply, "return");
|
||||
|
||||
if (!(tmp = virJSONValueObjectGetString(data, "data")))
|
||||
goto cleanup;
|
||||
|
||||
if (VIR_STRDUP(measurement, tmp) < 0)
|
||||
goto cleanup;
|
||||
|
||||
cleanup:
|
||||
virJSONValueFree(cmd);
|
||||
virJSONValueFree(reply);
|
||||
return measurement;
|
||||
}
|
||||
|
|
|
@ -343,6 +343,8 @@ int qemuMonitorJSONGetBlockIoThrottle(qemuMonitorPtr mon,
|
|||
|
||||
int qemuMonitorJSONSystemWakeup(qemuMonitorPtr mon);
|
||||
|
||||
char *qemuMonitorJSONGetSEVMeasurement(qemuMonitorPtr mon);
|
||||
|
||||
int qemuMonitorJSONGetVersion(qemuMonitorPtr mon,
|
||||
int *major,
|
||||
int *minor,
|
||||
|
|
Loading…
Reference in New Issue