Create a new helper to remove the GIC parse logic from the body of
virQEMUCapsLoadCache().
Signed-off-by: Daniel Henrique Barboza <danielhb413(a)gmail.com>
---
src/qemu/qemu_capabilities.c | 142 +++++++++++++++++++----------------
1 file changed, 77 insertions(+), 65 deletions(-)
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 61ec0727cb..38558a9ee0 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -4136,6 +4136,82 @@ virQEMUCapsParseFlags(virQEMUCaps *qemuCaps, xmlXPathContextPtr
ctxt)
}
+static int
+virQEMUCapsParseGIC(virQEMUCaps *qemuCaps, xmlXPathContextPtr ctxt)
+{
+ g_autofree xmlNodePtr *nodes = NULL;
+ size_t i;
+ int n;
+
+ if ((n = virXPathNodeSet("./gic", ctxt, &nodes)) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("failed to parse qemu capabilities gic"));
+ return -1;
+ }
+
+ if (n > 0) {
+ unsigned int uintValue;
+ bool boolValue;
+
+ qemuCaps->ngicCapabilities = n;
+ qemuCaps->gicCapabilities = g_new0(virGICCapability, n);
+
+ for (i = 0; i < n; i++) {
+ virGICCapability *cap = &qemuCaps->gicCapabilities[i];
+ g_autofree char *version = NULL;
+ g_autofree char *kernel = NULL;
+ g_autofree char *emulated = NULL;
+
+ if (!(version = virXMLPropString(nodes[i], "version"))) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("missing GIC version "
+ "in QEMU capabilities cache"));
+ return -1;
+ }
+ if (virStrToLong_ui(version, NULL, 10, &uintValue) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("malformed GIC version "
+ "in QEMU capabilities cache"));
+ return -1;
+ }
+ cap->version = uintValue;
+
+ if (!(kernel = virXMLPropString(nodes[i], "kernel"))) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("missing in-kernel GIC information "
+ "in QEMU capabilities cache"));
+ return -1;
+ }
+ if (!(boolValue = STREQ(kernel, "yes")) && STRNEQ(kernel,
"no")) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("malformed in-kernel GIC information "
+ "in QEMU capabilities cache"));
+ return -1;
+ }
+ if (boolValue)
+ cap->implementation |= VIR_GIC_IMPLEMENTATION_KERNEL;
+
+ if (!(emulated = virXMLPropString(nodes[i], "emulated"))) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("missing emulated GIC information "
+ "in QEMU capabilities cache"));
+ return -1;
+ }
+ if (!(boolValue = STREQ(emulated, "yes")) &&
STRNEQ(emulated, "no")) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("malformed emulated GIC information "
+ "in QEMU capabilities cache"));
+ return -1;
+ }
+ if (boolValue)
+ cap->implementation |= VIR_GIC_IMPLEMENTATION_EMULATED;
+ }
+ }
+
+ return 0;
+}
+
+
/*
* Parsing a doc that looks like
*
@@ -4164,8 +4240,6 @@ virQEMUCapsLoadCache(virArch hostArch,
{
g_autoptr(xmlDoc) doc = NULL;
int ret = -1;
- size_t i;
- int n;
xmlNodePtr *nodes = NULL;
g_autoptr(xmlXPathContext) ctxt = NULL;
char *str = NULL;
@@ -4293,70 +4367,8 @@ virQEMUCapsLoadCache(virArch hostArch,
virQEMUCapsLoadAccel(qemuCaps, ctxt, VIR_DOMAIN_VIRT_QEMU) < 0)
goto cleanup;
- if ((n = virXPathNodeSet("./gic", ctxt, &nodes)) < 0) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("failed to parse qemu capabilities gic"));
+ if (virQEMUCapsParseGIC(qemuCaps, ctxt) < 0)
goto cleanup;
- }
- if (n > 0) {
- unsigned int uintValue;
- bool boolValue;
-
- qemuCaps->ngicCapabilities = n;
- qemuCaps->gicCapabilities = g_new0(virGICCapability, n);
-
- for (i = 0; i < n; i++) {
- virGICCapability *cap = &qemuCaps->gicCapabilities[i];
-
- if (!(str = virXMLPropString(nodes[i], "version"))) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("missing GIC version "
- "in QEMU capabilities cache"));
- goto cleanup;
- }
- if (virStrToLong_ui(str, NULL, 10, &uintValue) < 0) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("malformed GIC version "
- "in QEMU capabilities cache"));
- goto cleanup;
- }
- cap->version = uintValue;
- VIR_FREE(str);
-
- if (!(str = virXMLPropString(nodes[i], "kernel"))) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("missing in-kernel GIC information "
- "in QEMU capabilities cache"));
- goto cleanup;
- }
- if (!(boolValue = STREQ(str, "yes")) && STRNEQ(str,
"no")) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("malformed in-kernel GIC information "
- "in QEMU capabilities cache"));
- goto cleanup;
- }
- if (boolValue)
- cap->implementation |= VIR_GIC_IMPLEMENTATION_KERNEL;
- VIR_FREE(str);
-
- if (!(str = virXMLPropString(nodes[i], "emulated"))) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("missing emulated GIC information "
- "in QEMU capabilities cache"));
- goto cleanup;
- }
- if (!(boolValue = STREQ(str, "yes")) && STRNEQ(str,
"no")) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("malformed emulated GIC information "
- "in QEMU capabilities cache"));
- goto cleanup;
- }
- if (boolValue)
- cap->implementation |= VIR_GIC_IMPLEMENTATION_EMULATED;
- VIR_FREE(str);
- }
- }
- VIR_FREE(nodes);
if (virQEMUCapsParseSEVInfo(qemuCaps, ctxt) < 0)
goto cleanup;
--
2.31.1