On Tue, Nov 29, 2011 at 08:29:56PM +0530, Prerna Saxena wrote: > From: Prerna Saxena <prerna@xxxxxxxxxxxxxxxxxx> > Date: Mon, 3 Oct 2011 06:01:33 -0700 > Subject: [PATCH 3/5] Add support for ppc64 qemu > > This enables libvirt to select the correct qemu binary (qemu-system-ppc64) > for a guest vm based on arch 'ppc64'. > Also, libvirt is enabled to correctly parse the list of supported PowerPC > CPUs, generated by running 'qemu-system-ppc64 -cpu ?' > > Signed-off-by: Prerna Saxena <prerna@xxxxxxxxxxxxxxxxxx> > --- > src/qemu/qemu_capabilities.c | 64 ++++++++++++++++++++++++++++++++++++++++++ > 1 files changed, 64 insertions(+), 0 deletions(-) > > diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c > index c5fe41d..c2d3d93 100644 > --- a/src/qemu/qemu_capabilities.c > +++ b/src/qemu/qemu_capabilities.c > @@ -185,6 +185,7 @@ static const struct qemu_arch_info const arch_info_hvm[] = { > { "mipsel", 32, NULL, "qemu-system-mipsel", NULL, NULL, 0 }, > { "sparc", 32, NULL, "qemu-system-sparc", NULL, NULL, 0 }, > { "ppc", 32, NULL, "qemu-system-ppc", NULL, NULL, 0 }, > + { "ppc64", 64, NULL, "qemu-system-ppc64", NULL, NULL, 0 }, > { "itanium", 64, NULL, "qemu-system-ia64", NULL, NULL, 0 }, > { "s390x", 64, NULL, "qemu-system-s390x", NULL, NULL, 0 }, > }; > @@ -477,6 +478,67 @@ error: > return -1; > } > > +/* ppc64 parser. > + * Format : PowerPC <machine> <description> > + */ > +static int > +qemuCapsParsePPCModels(const char *output, > + unsigned int *retcount, > + const char ***retcpus) > +{ > + const char *p = output; > + const char *next; > + unsigned int count = 0; > + const char **cpus = NULL; > + int i; > + do { > + const char *t; > + > + if ((next = strchr(p, '\n'))) > + next++; > + > + if (!STRPREFIX(p, "PowerPC ")) > + continue; > + > + /* Skip the preceding sub-string "PowerPC " */ > + p += 8; > + > + /*Malformed string, does not obey the format 'PowerPC <model> <desc>'*/ > + if (!(t = strchr(p, ' ')) || (next && t >= next)) > + continue; > + > + if (*p == '\0' || *p == '\n') > + continue; > + > + if (retcpus) { > + unsigned int len; > + > + if (VIR_REALLOC_N(cpus, count + 1) < 0) > + goto error; Need a virReportOOMError() call here > + > + if (t) > + len = t - p - 1; > + > + if (!(cpus[count] = strndup(p, len))) > + goto error; Need a virReportOOMError() call here too > + } > + count++; > + } while ((p = next)); > + > + if (retcount) > + *retcount = count; > + if (retcpus) > + *retcpus = cpus; > + return 0; > + > +error: > + if (cpus) { > + for (i = 0; i < count; i++) > + VIR_FREE(cpus[i]); > + } > + VIR_FREE(cpus); > + return -1; > +} > > int > qemuCapsProbeCPUModels(const char *qemu, > @@ -497,6 +559,8 @@ qemuCapsProbeCPUModels(const char *qemu, > > if (STREQ(arch, "i686") || STREQ(arch, "x86_64")) > parse = qemuCapsParseX86Models; > + else if (STREQ(arch, "ppc64")) > + parse = qemuCapsParsePPCModels; > else { > VIR_DEBUG("don't know how to parse %s CPU models", arch); > return 0; I know we don't have any test case for the x86 CPU parser here either, but it would be desirable to create a test case for the PPC parser while doing this. eg, save the QEMU -cpu? output into a text file in the tests/ directory, and invoke qemuCapsParsePPCModels() on it and validate the result. Regards, Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :| -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list