提交 b611b620 编写于 作者: P Paulo de Rezende Pinatti 提交者: Erik Skultety

qemu: Check if s390 secure guest support is enabled

This patch introduces a common function to verify if the
availability of the so-called Secure Guest feature on the host
has changed in order to invalidate the qemu capabilities cache.
It can be used as an entry point for verification on different
architectures.

For s390 the verification consists of:
- checking if /sys/firmware/uv is available: meaning the HW
facility is available and the host OS supports it;
- checking if the kernel cmdline contains 'prot_virt=1': meaning
the host OS wants to use the feature.

Whenever the availability of the feature does not match the secure
guest flag in the cache then libvirt will re-build it in order to
pick up the new set of capabilities available.
Signed-off-by: NPaulo de Rezende Pinatti <ppinatti@linux.ibm.com>
Signed-off-by: NBoris Fiuczynski <fiuczy@linux.ibm.com>
Tested-by: NViktor Mihajlovski <mihajlov@linux.ibm.com>
Reviewed-by: NBjoern Walk <bwalk@linux.ibm.com>
Reviewed-by: NErik Skultety <eskultet@redhat.com>
上级 c5fffb95
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include "qemu_capabilities.h" #include "qemu_capabilities.h"
#include "viralloc.h" #include "viralloc.h"
#include "virarch.h"
#include "vircrypto.h" #include "vircrypto.h"
#include "virlog.h" #include "virlog.h"
#include "virerror.h" #include "virerror.h"
...@@ -662,6 +663,7 @@ struct _virQEMUCaps { ...@@ -662,6 +663,7 @@ struct _virQEMUCaps {
virObject parent; virObject parent;
bool kvmSupportsNesting; bool kvmSupportsNesting;
bool kvmSupportsSecureGuest;
char *binary; char *binary;
time_t ctime; time_t ctime;
...@@ -1907,6 +1909,7 @@ virQEMUCapsPtr virQEMUCapsNewCopy(virQEMUCapsPtr qemuCaps) ...@@ -1907,6 +1909,7 @@ virQEMUCapsPtr virQEMUCapsNewCopy(virQEMUCapsPtr qemuCaps)
ret->invalidation = qemuCaps->invalidation; ret->invalidation = qemuCaps->invalidation;
ret->kvmSupportsNesting = qemuCaps->kvmSupportsNesting; ret->kvmSupportsNesting = qemuCaps->kvmSupportsNesting;
ret->kvmSupportsSecureGuest = qemuCaps->kvmSupportsSecureGuest;
ret->ctime = qemuCaps->ctime; ret->ctime = qemuCaps->ctime;
...@@ -4404,6 +4407,9 @@ virQEMUCapsLoadCache(virArch hostArch, ...@@ -4404,6 +4407,9 @@ virQEMUCapsLoadCache(virArch hostArch,
if (virXPathBoolean("boolean(./kvmSupportsNesting)", ctxt) > 0) if (virXPathBoolean("boolean(./kvmSupportsNesting)", ctxt) > 0)
qemuCaps->kvmSupportsNesting = true; qemuCaps->kvmSupportsNesting = true;
if (virXPathBoolean("boolean(./kvmSupportsSecureGuest)", ctxt) > 0)
qemuCaps->kvmSupportsSecureGuest = true;
ret = 0; ret = 0;
cleanup: cleanup:
VIR_FREE(str); VIR_FREE(str);
...@@ -4641,6 +4647,9 @@ virQEMUCapsFormatCache(virQEMUCapsPtr qemuCaps) ...@@ -4641,6 +4647,9 @@ virQEMUCapsFormatCache(virQEMUCapsPtr qemuCaps)
if (qemuCaps->kvmSupportsNesting) if (qemuCaps->kvmSupportsNesting)
virBufferAddLit(&buf, "<kvmSupportsNesting/>\n"); virBufferAddLit(&buf, "<kvmSupportsNesting/>\n");
if (qemuCaps->kvmSupportsSecureGuest)
virBufferAddLit(&buf, "<kvmSupportsSecureGuest/>\n");
virBufferAdjustIndent(&buf, -2); virBufferAdjustIndent(&buf, -2);
virBufferAddLit(&buf, "</qemuCaps>\n"); virBufferAddLit(&buf, "</qemuCaps>\n");
...@@ -4678,6 +4687,49 @@ virQEMUCapsSaveFile(void *data, ...@@ -4678,6 +4687,49 @@ virQEMUCapsSaveFile(void *data,
} }
/*
* Check whether IBM Secure Execution (S390) is enabled
*/
static bool
virQEMUCapsKVMSupportsSecureGuestS390(void)
{
g_autofree char *cmdline = NULL;
static const char *kValues[] = {"y", "Y", "on", "ON", "oN", "On", "1"};
if (!virFileIsDir("/sys/firmware/uv"))
return false;
if (virFileReadValueString(&cmdline, "/proc/cmdline") < 0)
return false;
/* we're prefix matching rather than equality matching here, because kernel
* would treat even something like prot_virt='yFOO' as enabled */
if (virKernelCmdlineMatchParam(cmdline, "prot_virt", kValues,
G_N_ELEMENTS(kValues),
VIR_KERNEL_CMDLINE_FLAGS_SEARCH_FIRST |
VIR_KERNEL_CMDLINE_FLAGS_CMP_PREFIX))
return true;
return false;
}
/*
* Check whether the secure guest functionality is enabled.
* See the specific architecture function for details on the verifications made.
*/
static bool
virQEMUCapsKVMSupportsSecureGuest(void)
{
virArch arch = virArchFromHost();
if (ARCH_IS_S390(arch))
return virQEMUCapsKVMSupportsSecureGuestS390();
return false;
}
/* Check the kernel module parameters 'nested' file to determine if enabled /* Check the kernel module parameters 'nested' file to determine if enabled
* *
* Intel: 'kvm_intel' uses 'Y' * Intel: 'kvm_intel' uses 'Y'
...@@ -4865,6 +4917,13 @@ virQEMUCapsIsValid(void *data, ...@@ -4865,6 +4917,13 @@ virQEMUCapsIsValid(void *data,
qemuCaps->binary, qemuCaps->kvmSupportsNesting); qemuCaps->binary, qemuCaps->kvmSupportsNesting);
return false; return false;
} }
if (virQEMUCapsKVMSupportsSecureGuest() != qemuCaps->kvmSupportsSecureGuest) {
VIR_DEBUG("Outdated capabilities for '%s': kvm kernel secure guest "
"value changed from %d",
qemuCaps->binary, qemuCaps->kvmSupportsSecureGuest);
return false;
}
} }
return true; return true;
...@@ -5366,6 +5425,8 @@ virQEMUCapsNewForBinaryInternal(virArch hostArch, ...@@ -5366,6 +5425,8 @@ virQEMUCapsNewForBinaryInternal(virArch hostArch,
qemuCaps->kernelVersion = g_strdup(kernelVersion); qemuCaps->kernelVersion = g_strdup(kernelVersion);
qemuCaps->kvmSupportsNesting = virQEMUCapsKVMSupportsNesting(); qemuCaps->kvmSupportsNesting = virQEMUCapsKVMSupportsNesting();
qemuCaps->kvmSupportsSecureGuest = virQEMUCapsKVMSupportsSecureGuest();
} }
return qemuCaps; return qemuCaps;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册