File 45422935-intro-virNodeGetSEVInfo-API.patch of Package libvirt.16766
commit 45422935c38c4d22fb2320767092c166d190a68b
Author: Brijesh Singh <brijesh.singh@amd.com>
Date: Fri Jun 8 09:40:53 2018 -0500
libvirt: Introduce virNodeGetSEVInfo public API
The API can be used by application to retrieve the Platform Diffie-Hellman
Key and Platform Certificate chain.
Signed-off-by: Brijesh Singh <brijesh.singh@amd.com>
Reviewed-by: Erik Skultety <eskultet@redhat.com>
Index: libvirt-4.0.0/include/libvirt/libvirt-host.h
===================================================================
--- libvirt-4.0.0.orig/include/libvirt/libvirt-host.h
+++ libvirt-4.0.0/include/libvirt/libvirt-host.h
@@ -432,6 +432,48 @@ typedef virNodeCPUStats *virNodeCPUStats
typedef virNodeMemoryStats *virNodeMemoryStatsPtr;
+
+/**
+ *
+ * SEV Parameters
+ */
+
+/**
+ * VIR_NODE_SEV_PDH:
+ *
+ * Macro represents the Platform Diffie-Hellman key, as VIR_TYPED_PARAMS_STRING.
+ */
+# define VIR_NODE_SEV_PDH "pdh"
+
+/**
+ * VIR_NODE_SEV_CERT_CHAIN:
+ *
+ * Macro represents the platform certificate chain that includes the platform
+ * endorsement key (PEK), owner certificate authority (OCD) and chip
+ * endorsement key (CEK), as VIR_TYPED_PARAMS_STRING.
+ */
+# define VIR_NODE_SEV_CERT_CHAIN "cert-chain"
+
+/**
+ * VIR_NODE_SEV_CBITPOS:
+ *
+ * Macro represents the CBit Position used by hypervisor when SEV is enabled.
+ */
+# define VIR_NODE_SEV_CBITPOS "cbitpos"
+
+/**
+ * VIR_NODE_SEV_REDUCED_PHYS_BITS:
+ *
+ * Macro represents the number of bits we lose in physical address space
+ * when SEV is enabled in the guest.
+ */
+# define VIR_NODE_SEV_REDUCED_PHYS_BITS "reduced-phys-bits"
+
+int virNodeGetSEVInfo (virConnectPtr conn,
+ virTypedParameterPtr *params,
+ int *nparams,
+ unsigned int flags);
+
/**
* virConnectFlags
*
Index: libvirt-4.0.0/src/driver-hypervisor.h
===================================================================
--- libvirt-4.0.0.orig/src/driver-hypervisor.h
+++ libvirt-4.0.0/src/driver-hypervisor.h
@@ -1283,6 +1283,11 @@ typedef int
unsigned int action,
unsigned int flags);
+typedef int
+(*virDrvNodeGetSEVInfo)(virConnectPtr conn,
+ virTypedParameterPtr *params,
+ int *nparams,
+ unsigned int flags);
typedef struct _virHypervisorDriver virHypervisorDriver;
typedef virHypervisorDriver *virHypervisorDriverPtr;
@@ -1528,6 +1533,7 @@ struct _virHypervisorDriver {
virDrvDomainSetVcpu domainSetVcpu;
virDrvDomainSetBlockThreshold domainSetBlockThreshold;
virDrvDomainSetLifecycleAction domainSetLifecycleAction;
+ virDrvNodeGetSEVInfo nodeGetSEVInfo;
};
Index: libvirt-4.0.0/src/libvirt-host.c
===================================================================
--- libvirt-4.0.0.orig/src/libvirt-host.c
+++ libvirt-4.0.0/src/libvirt-host.c
@@ -1482,3 +1482,52 @@ virNodeAllocPages(virConnectPtr conn,
virDispatchError(conn);
return -1;
}
+
+
+/*
+ * virNodeGetSEVInfo:
+ * @conn: pointer to the hypervisor connection
+ * @params: where to store SEV information
+ * @nparams: pointer to number of SEV parameters returned in @params
+ * @flags: extra flags; not used yet, so callers should always pass 0
+ *
+ * If hypervisor supports AMD's SEV feature, then @params will contain various
+ * platform specific information like PDH and certificate chain. Caller is
+ * responsible for freeing @params.
+ *
+ * Returns 0 in case of success, and -1 in case of failure.
+ */
+int
+virNodeGetSEVInfo(virConnectPtr conn,
+ virTypedParameterPtr *params,
+ int *nparams,
+ unsigned int flags)
+{
+ VIR_DEBUG("conn=%p, params=%p, nparams=%p, flags=0x%x",
+ conn, params, nparams, flags);
+
+ virResetLastError();
+
+ virCheckConnectReturn(conn, -1);
+ virCheckNonNullArgGoto(nparams, error);
+ virCheckNonNegativeArgGoto(*nparams, error);
+ virCheckReadOnlyGoto(conn->flags, error);
+
+ if (VIR_DRV_SUPPORTS_FEATURE(conn->driver, conn,
+ VIR_DRV_FEATURE_TYPED_PARAM_STRING))
+ flags |= VIR_TYPED_PARAM_STRING_OKAY;
+
+ if (conn->driver->nodeGetSEVInfo) {
+ int ret;
+ ret = conn->driver->nodeGetSEVInfo(conn, params, nparams, flags);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virReportUnsupportedError();
+
+ error:
+ virDispatchError(conn);
+ return -1;
+}
Index: libvirt-4.0.0/src/libvirt_public.syms
===================================================================
--- libvirt-4.0.0.orig/src/libvirt_public.syms
+++ libvirt-4.0.0/src/libvirt_public.syms
@@ -779,4 +779,9 @@ LIBVIRT_3.9.0 {
global:
virDomainSetLifecycleAction;
} LIBVIRT_3.7.0;
+
+LIBVIRT_4.0.0 {
+ global:
+ virNodeGetSEVInfo;
+} LIBVIRT_3.9.0;
# .... define new API here using predicted next version number ....