From: "Daniel P. Berrange" <berrange(a)redhat.com>
Signed-off-by: Daniel P. Berrange <berrange(a)redhat.com>
---
src/qemu/qemu_capabilities.c | 94 ++++++++++++++++++--------------------------
src/qemu/qemu_capabilities.h | 2 +-
2 files changed, 40 insertions(+), 56 deletions(-)
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index f6b53ca..a0fe1c5 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -42,7 +42,6 @@
#include <sys/stat.h>
#include <unistd.h>
#include <sys/wait.h>
-#include <sys/utsname.h>
#include <stdarg.h>
#define VIR_FROM_THIS VIR_FROM_QEMU
@@ -209,7 +208,7 @@ struct _qemuCaps {
unsigned int version;
unsigned int kvmVersion;
- char *arch;
+ virArch arch;
size_t ncpuDefinitions;
char **cpuDefinitions;
@@ -544,14 +543,14 @@ qemuCapsProbeCPUModels(qemuCapsPtr caps, qemuCapsHookDataPtr
hookData)
qemuCapsParseCPUModels parse;
virCommandPtr cmd;
- if (STREQ(caps->arch, "i686") ||
- STREQ(caps->arch, "x86_64"))
+ if (caps->arch == VIR_ARCH_I686 ||
+ caps->arch == VIR_ARCH_X86_64)
parse = qemuCapsParseX86Models;
- else if (STREQ(caps->arch, "ppc64"))
+ else if (caps->arch == VIR_ARCH_PPC64)
parse = qemuCapsParsePPCModels;
else {
VIR_DEBUG("don't know how to parse %s CPU models",
- caps->arch);
+ virArchToString(caps->arch));
return 0;
}
@@ -599,6 +598,8 @@ qemuCapsFindBinaryForArch(virArch hostarch,
ret = virFindFileInPath("qemu");
} else if (guestarch == VIR_ARCH_ITANIUM) {
ret = virFindFileInPath("qemu-system-ia64");
+ } else if (guestarch == VIR_ARCH_ARMV7L) {
+ ret = virFindFileInPath("qemu-system-arm");
} else {
/* Default case we have matching arch strings */
char *bin;
@@ -1596,20 +1597,6 @@ cleanup:
return ret;
}
-static void
-uname_normalize(struct utsname *ut)
-{
- uname(ut);
-
- /* Map i386, i486, i586 to i686. */
- if (ut->machine[0] == 'i' &&
- ut->machine[1] != '\0' &&
- ut->machine[2] == '8' &&
- ut->machine[3] == '6' &&
- ut->machine[4] == '\0')
- ut->machine[1] = '6';
-}
-
int qemuCapsGetDefaultVersion(virCapsPtr caps,
qemuCapsCachePtr capsCache,
@@ -1677,10 +1664,7 @@ qemuCapsPtr qemuCapsNewCopy(qemuCapsPtr caps)
ret->version = caps->version;
ret->kvmVersion = caps->kvmVersion;
-
- if (caps->arch &&
- !(ret->arch = strdup(caps->arch)))
- goto no_memory;
+ ret->arch = caps->arch;
if (VIR_ALLOC_N(ret->cpuDefinitions, caps->ncpuDefinitions) < 0)
goto no_memory;
@@ -1717,8 +1701,6 @@ void qemuCapsDispose(void *obj)
qemuCapsPtr caps = obj;
size_t i;
- VIR_FREE(caps->arch);
-
for (i = 0 ; i < caps->nmachineTypes ; i++) {
VIR_FREE(caps->machineTypes[i]);
VIR_FREE(caps->machineAliases[i]);
@@ -1789,7 +1771,7 @@ const char *qemuCapsGetBinary(qemuCapsPtr caps)
return caps->binary;
}
-const char *qemuCapsGetArch(qemuCapsPtr caps)
+virArch qemuCapsGetArch(qemuCapsPtr caps)
{
return caps->arch;
}
@@ -2120,6 +2102,18 @@ int qemuCapsProbeQMP(qemuCapsPtr caps,
}
+static virArch qemuCapsArchFromString(const char *arch)
+{
+ if (STREQ(arch, "ia64"))
+ return VIR_ARCH_ITANIUM;
+ if (STREQ(arch, "i386"))
+ return VIR_ARCH_I686;
+ if (STREQ(arch, "arm"))
+ return VIR_ARCH_ARMV7L;
+
+ return virArchFromString(arch);
+}
+
#define QEMU_SYSTEM_PREFIX "qemu-system-"
static int
@@ -2130,7 +2124,6 @@ qemuCapsInitHelp(qemuCapsPtr caps, uid_t runUid, gid_t runGid)
char *help = NULL;
int ret = -1;
const char *tmp;
- struct utsname ut;
qemuCapsHookData hookData;
VIR_DEBUG("caps=%p", caps);
@@ -2139,18 +2132,9 @@ qemuCapsInitHelp(qemuCapsPtr caps, uid_t runUid, gid_t runGid)
if (tmp) {
tmp += strlen(QEMU_SYSTEM_PREFIX);
- /* For historical compat we use 'itanium' as arch name */
- if (STREQ(tmp, "ia64"))
- tmp = "itanium";
- else if (STREQ(tmp, "i386"))
- tmp = "i686";
+ caps->arch = qemuCapsArchFromString(tmp);
} else {
- uname_normalize(&ut);
- tmp = ut.machine;
- }
- if (!(caps->arch = strdup(tmp))) {
- virReportOOMError();
- goto cleanup;
+ caps->arch = virArchFromHost();
}
hookData.runUid = runUid;
@@ -2171,14 +2155,15 @@ qemuCapsInitHelp(qemuCapsPtr caps, uid_t runUid, gid_t runGid)
goto cleanup;
/* Currently only x86_64 and i686 support PCI-multibus. */
- if (STREQLEN(caps->arch, "x86_64", 6) ||
- STREQLEN(caps->arch, "i686", 4)) {
+ if (caps->arch == VIR_ARCH_X86_64 ||
+ caps->arch == VIR_ARCH_I686) {
qemuCapsSet(caps, QEMU_CAPS_PCI_MULTIBUS);
}
/* S390 and probably other archs do not support no-acpi -
maybe the qemu option parsing should be re-thought. */
- if (STRPREFIX(caps->arch, "s390"))
+ if (caps->arch == VIR_ARCH_S390 ||
+ caps->arch == VIR_ARCH_S390X)
qemuCapsClear(caps, QEMU_CAPS_NO_ACPI);
/* qemuCapsExtractDeviceStr will only set additional caps if qemu
@@ -2289,6 +2274,7 @@ qemuCapsInitQMP(qemuCapsPtr caps,
char *monpath = NULL;
char *pidfile = NULL;
qemuCapsHookData hookData;
+ char *archstr;
/* the ".sock" sufix is important to avoid a possible clash with a qemu
* domain called "capabilities"
@@ -2381,26 +2367,24 @@ qemuCapsInitQMP(qemuCapsPtr caps,
qemuCapsInitQMPBasic(caps);
- if (!(caps->arch = qemuMonitorGetTargetArch(mon)))
+ archstr = qemuMonitorGetTargetArch(mon);
+ if ((caps->arch = qemuCapsArchFromString(archstr)) == VIR_ARCH_NONE) {
+ VIR_DEBUG("Unknown QEMU arch %s", archstr);
+ ret = 0;
+ VIR_FREE(archstr);
goto cleanup;
-
- /* Map i386, i486, i586 to i686. */
- if (caps->arch[0] == 'i' &&
- caps->arch[1] != '\0' &&
- caps->arch[2] == '8' &&
- caps->arch[3] == '6' &&
- caps->arch[4] == '\0')
- caps->arch[1] = '6';
+ }
+ VIR_FREE(archstr);
/* Currently only x86_64 and i686 support PCI-multibus. */
- if (STREQLEN(caps->arch, "x86_64", 6) ||
- STREQLEN(caps->arch, "i686", 4)) {
+ if (caps->arch == VIR_ARCH_X86_64 ||
+ caps->arch == VIR_ARCH_I686)
qemuCapsSet(caps, QEMU_CAPS_PCI_MULTIBUS);
- }
/* S390 and probably other archs do not support no-acpi -
maybe the qemu option parsing should be re-thought. */
- if (STRPREFIX(caps->arch, "s390"))
+ if (caps->arch == VIR_ARCH_S390 ||
+ caps->arch == VIR_ARCH_S390X)
qemuCapsClear(caps, QEMU_CAPS_NO_ACPI);
if (qemuCapsProbeQMPCommands(caps, mon) < 0)
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
index 3da8672..c27b48c 100644
--- a/src/qemu/qemu_capabilities.h
+++ b/src/qemu/qemu_capabilities.h
@@ -191,7 +191,7 @@ bool qemuCapsGet(qemuCapsPtr caps,
char *qemuCapsFlagsString(qemuCapsPtr caps);
const char *qemuCapsGetBinary(qemuCapsPtr caps);
-const char *qemuCapsGetArch(qemuCapsPtr caps);
+virArch qemuCapsGetArch(qemuCapsPtr caps);
unsigned int qemuCapsGetVersion(qemuCapsPtr caps);
unsigned int qemuCapsGetKVMVersion(qemuCapsPtr caps);
int qemuCapsAddCPUDefinition(qemuCapsPtr caps,
--
1.7.11.7