mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-22 03:12:22 +00:00
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 = {
|
static virHypervisorDriver qemuHypervisorDriver = {
|
||||||
.name = QEMU_DRIVER_NAME,
|
.name = QEMU_DRIVER_NAME,
|
||||||
.connectURIProbe = qemuConnectURIProbe,
|
.connectURIProbe = qemuConnectURIProbe,
|
||||||
@ -21725,6 +21793,7 @@ static virHypervisorDriver qemuHypervisorDriver = {
|
|||||||
.connectCompareHypervisorCPU = qemuConnectCompareHypervisorCPU, /* 4.4.0 */
|
.connectCompareHypervisorCPU = qemuConnectCompareHypervisorCPU, /* 4.4.0 */
|
||||||
.connectBaselineHypervisorCPU = qemuConnectBaselineHypervisorCPU, /* 4.4.0 */
|
.connectBaselineHypervisorCPU = qemuConnectBaselineHypervisorCPU, /* 4.4.0 */
|
||||||
.nodeGetSEVInfo = qemuNodeGetSEVInfo, /* 4.5.0 */
|
.nodeGetSEVInfo = qemuNodeGetSEVInfo, /* 4.5.0 */
|
||||||
|
.domainGetLaunchSecurityInfo = qemuDomainGetLaunchSecurityInfo, /* 4.5.0 */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -4297,3 +4297,11 @@ qemuMonitorBlockdevDel(qemuMonitorPtr mon,
|
|||||||
|
|
||||||
return qemuMonitorJSONBlockdevDel(mon, nodename);
|
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,
|
int qemuMonitorBlockdevDel(qemuMonitorPtr mon,
|
||||||
const char *nodename);
|
const char *nodename);
|
||||||
|
|
||||||
|
char *
|
||||||
|
qemuMonitorGetSEVMeasurement(qemuMonitorPtr mon);
|
||||||
|
|
||||||
#endif /* QEMU_MONITOR_H */
|
#endif /* QEMU_MONITOR_H */
|
||||||
|
@ -7994,3 +7994,45 @@ qemuMonitorJSONBlockdevDel(qemuMonitorPtr mon,
|
|||||||
virJSONValueFree(reply);
|
virJSONValueFree(reply);
|
||||||
return ret;
|
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);
|
int qemuMonitorJSONSystemWakeup(qemuMonitorPtr mon);
|
||||||
|
|
||||||
|
char *qemuMonitorJSONGetSEVMeasurement(qemuMonitorPtr mon);
|
||||||
|
|
||||||
int qemuMonitorJSONGetVersion(qemuMonitorPtr mon,
|
int qemuMonitorJSONGetVersion(qemuMonitorPtr mon,
|
||||||
int *major,
|
int *major,
|
||||||
int *minor,
|
int *minor,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user