From c7722ca345d8cf65e77c411be713c8ec6f9c0fad Mon Sep 17 00:00:00 2001 From: Daniel Veillard Date: Mon, 30 Jul 2007 09:59:05 +0000 Subject: [PATCH] * src/qemu_conf.[ch] src/qemu_driver.c: add qemu/kvm drivers report features for i686 and x86_64, patch from David Lutterkort Daniel --- ChangeLog | 5 ++++ src/qemu_conf.c | 28 ++++++++++++++++------ src/qemu_conf.h | 7 ++++++ src/qemu_driver.c | 61 +++++++++++++++++++++++++++++++++++++---------- 4 files changed, 82 insertions(+), 19 deletions(-) diff --git a/ChangeLog b/ChangeLog index b72e6a3ffb..15f4ed3fc2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Mon Jul 30 11:59:51 CEST 2007 Daniel Veillard + + * src/qemu_conf.[ch] src/qemu_driver.c: add qemu/kvm drivers report + features for i686 and x86_64, patch from David Lutterkort + Fri Jul 27 19:19:31 EST 2007 Daniel P. Berrange * src/test.c: Added impl of networking APIs. Cleanup all other diff --git a/src/qemu_conf.c b/src/qemu_conf.c index 6a112daebf..fbd0ba3c65 100644 --- a/src/qemu_conf.c +++ b/src/qemu_conf.c @@ -221,17 +221,31 @@ static const char *arch_info_ppc_machines[] = { "g3bw", "mac99", "prep", NULL }; +/* Feature flags for the architecture info */ +struct qemu_feature_flags arch_info_i686_flags [] = { + { "pae", 1, 1 }, + { "acpi", 1, 1 }, + { "apic", 1, 0 }, + { NULL, -1, -1 } +}; + +struct qemu_feature_flags arch_info_x86_64_flags [] = { + { "acpi", 1, 1 }, + { "apic", 1, 0 }, + { NULL, -1, -1 } +}; + /* The archicture tables for supported QEMU archs */ struct qemu_arch_info qemudArchs[] = { /* i686 must be in position 0 */ - { "i686", 32, arch_info_x86_machines, "qemu" }, + { "i686", 32, arch_info_x86_machines, "qemu", arch_info_i686_flags }, /* x86_64 must be in position 1 */ - { "x86_64", 64, arch_info_x86_machines, "qemu-system-x86_64" }, - { "mips", 32, arch_info_mips_machines, "qemu-system-mips" }, - { "mipsel", 32, arch_info_mips_machines, "qemu-system-mipsel" }, - { "sparc", 32, arch_info_sparc_machines, "qemu-system-sparc" }, - { "ppc", 32, arch_info_ppc_machines, "qemu-system-ppc" }, - { NULL, -1, NULL, NULL } + { "x86_64", 64, arch_info_x86_machines, "qemu-system-x86_64", arch_info_x86_64_flags }, + { "mips", 32, arch_info_mips_machines, "qemu-system-mips", NULL }, + { "mipsel", 32, arch_info_mips_machines, "qemu-system-mipsel", NULL }, + { "sparc", 32, arch_info_sparc_machines, "qemu-system-sparc", NULL }, + { "ppc", 32, arch_info_ppc_machines, "qemu-system-ppc", NULL }, + { NULL, -1, NULL, NULL, NULL } }; /* Return the default architecture if none is explicitly requested*/ diff --git a/src/qemu_conf.h b/src/qemu_conf.h index ed7aba243c..836bcb0f71 100644 --- a/src/qemu_conf.h +++ b/src/qemu_conf.h @@ -384,11 +384,18 @@ char * qemudGenerateNetworkXML (virConnectPtr conn, struct qemud_network *network, struct qemud_network_def *def); +struct qemu_feature_flags { + const char *name; + const int default_on; + const int toggle; +}; + struct qemu_arch_info { const char *arch; int wordsize; const char **machines; const char *binary; + const struct qemu_feature_flags *fflags; }; extern struct qemu_arch_info qemudArchs[]; diff --git a/src/qemu_driver.c b/src/qemu_driver.c index e181e69dc0..7c75d9c458 100644 --- a/src/qemu_driver.c +++ b/src/qemu_driver.c @@ -1416,6 +1416,40 @@ static int qemudGetNodeInfo(virConnectPtr conn, return virNodeInfoPopulate(conn, nodeinfo); } +static int qemudGetFeatures(virBufferPtr xml, + const struct qemu_feature_flags *flags) { + int i, r; + + if (flags == NULL) + return 0; + + r = virBufferAdd(xml, "\ + \n", -1); + if (r == -1) return r; + for (i = 0; flags[i].name; ++i) { + if (STREQ(flags[i].name, "pae")) { + int pae = flags[i].default_on || flags[i].toggle; + int nonpae = flags[i].toggle; + if (pae) { + r = virBufferAdd(xml, " \n", -1); + if (r == -1) return r; + } + if (nonpae) { + r = virBufferAdd(xml, " \n", -1); + if (r == -1) return r; + } + } else { + r = virBufferVSprintf(xml, " <%s default='%s' toggle='%s'/>\n", + flags[i].name, + flags[i].default_on ? "on" : "off", + flags[i].toggle ? "yes" : "no"); + if (r == -1) return r; + } + } + r = virBufferAdd(xml, " \n", -1); + return r; +} + static char *qemudGetCapabilities(virConnectPtr conn ATTRIBUTE_UNUSED) { struct utsname utsname; int i, j, r; @@ -1493,10 +1527,13 @@ static char *qemudGetCapabilities(virConnectPtr conn ATTRIBUTE_UNUSED) { \n", -1); if (r == -1) goto vir_buffer_failed; } - r = virBufferAdd (xml, - "\ - \n\ - \n", -1); + r = virBufferAdd (xml, " \n", -1); + if (r == -1) goto vir_buffer_failed; + + r = qemudGetFeatures(xml, qemudArchs[i].fflags); + if (r == -1) goto vir_buffer_failed; + + r = virBufferAdd (xml, " \n", -1); if (r == -1) goto vir_buffer_failed; /* The "other" PC architecture needs emulation. */ @@ -1521,10 +1558,7 @@ static char *qemudGetCapabilities(virConnectPtr conn ATTRIBUTE_UNUSED) { qemudArchs[i].machines[j]); if (r == -1) goto vir_buffer_failed; } - r = virBufferAdd (xml, - "\ - \n\ - \n", -1); + r = virBufferAdd (xml, " \n \n", -1); if (r == -1) goto vir_buffer_failed; } @@ -1550,10 +1584,13 @@ static char *qemudGetCapabilities(virConnectPtr conn ATTRIBUTE_UNUSED) { qemudArchs[i].machines[j]); if (r == -1) goto vir_buffer_failed; } - r = virBufferAdd (xml, - "\ - \n\ - \n", -1); + r = virBufferAdd (xml, " \n", -1); + if (r == -1) goto vir_buffer_failed; + + r = qemudGetFeatures(xml, qemudArchs[i].fflags); + if (r == -1) goto vir_buffer_failed; + + r = virBufferAdd (xml, " \n", -1); if (r == -1) goto vir_buffer_failed; }