On 13.06.2016 16:21, Jim Fehlig wrote: > On 06/13/2016 03:33 AM, Michal Privoznik wrote: >> On 11.06.2016 00:34, Jim Fehlig wrote: >>> Add support to xenconfig for conversion of xl.cfg(5) bios config >>> to/from libvirt domXml <loader> config. SeaBIOS is the default >>> for HVM guests using upstream QEMU. ROMBIOS is the default when >>> using the old qemu-dm. This patch allows specifying OVMF as an >>> alternate firmware. >>> >>> Example xl.cfg: >>> bios = "ovmf" >>> >>> Example domXML: >>> <os> >>> ... >>> <loader readonly='yes' type='pflash'>/usr/lib/xen/boot/ovmf.bin</loader> >>> </os> >>> >>> Note that currently Xen does not support a separate nvram for >>> non-volatile variables. >>> >>> Signed-off-by: Jim Fehlig <jfehlig@xxxxxxxx> >>> --- >>> >>> V3: >>> - Rework test code to account for discovery of LIBXL_FIRMWARE_DIR >>> at build time >>> - Drop code that relies on Xen patches that are not yet committed >>> to xen.git master >>> >>> src/Makefile.am | 2 +- >>> src/xenconfig/xen_xl.c | 37 ++++++++++--- >>> tests/testutils.c | 16 ++++++ >>> tests/testutils.h | 2 + >>> tests/xlconfigdata/test-fullvirt-ovmf.cfg | 26 +++++++++ >>> tests/xlconfigdata/test-fullvirt-ovmf.xml | 58 ++++++++++++++++++++ >>> tests/xlconfigtest.c | 90 +++++++++++++++++++++++-------- >>> 7 files changed, 202 insertions(+), 29 deletions(-) >>> >>> diff --git a/src/Makefile.am b/src/Makefile.am >>> index 7004d14..1aff57d 100644 >>> --- a/src/Makefile.am >>> +++ b/src/Makefile.am >>> @@ -1151,7 +1151,7 @@ noinst_LTLIBRARIES += libvirt_xenconfig.la >>> libvirt_la_BUILT_LIBADD += libvirt_xenconfig.la >>> libvirt_xenconfig_la_LIBADD = $(LIBXL_LIBS) >>> libvirt_xenconfig_la_CFLAGS = \ >>> - -I$(srcdir)/conf $(AM_CFLAGS) >>> + -I$(srcdir)/conf -I$(srcdir)/libxl $(AM_CFLAGS) >>> libvirt_xenconfig_la_SOURCES = $(XENCONFIG_SOURCES) >>> endif WITH_XENCONFIG >>> >>> diff --git a/src/xenconfig/xen_xl.c b/src/xenconfig/xen_xl.c >>> index 9b8306f..dc54a73 100644 >>> --- a/src/xenconfig/xen_xl.c >>> +++ b/src/xenconfig/xen_xl.c >>> @@ -33,6 +33,7 @@ >>> #include "virstring.h" >>> #include "virstoragefile.h" >>> #include "xen_xl.h" >>> +#include "libxl_capabilities.h" >>> >>> #define VIR_FROM_THIS VIR_FROM_XENXL >>> >>> @@ -103,15 +104,31 @@ xenParseXLOS(virConfPtr conf, virDomainDefPtr def, virCapsPtr caps) >>> size_t i; >>> >>> if (def->os.type == VIR_DOMAIN_OSTYPE_HVM) { >>> + const char *bios; >>> const char *boot; >>> >>> - for (i = 0; i < caps->nguests; i++) { >>> - if (caps->guests[i]->ostype == VIR_DOMAIN_OSTYPE_HVM && >>> - caps->guests[i]->arch.id == def->os.arch) { >>> - if (VIR_ALLOC(def->os.loader) < 0 || >>> - VIR_STRDUP(def->os.loader->path, >>> - caps->guests[i]->arch.defaultInfo.loader) < 0) >>> - return -1; >>> + if (xenConfigGetString(conf, "bios", &bios, NULL) < 0) >>> + return -1; >>> + >>> + if (bios && STREQ(bios, "ovmf")) { >>> + if (VIR_ALLOC(def->os.loader) < 0) >>> + return -1; >>> + >>> + def->os.loader->type = VIR_DOMAIN_LOADER_TYPE_PFLASH; >>> + def->os.loader->readonly = VIR_TRISTATE_BOOL_YES; >>> + >>> + if (VIR_STRDUP(def->os.loader->path, >>> + LIBXL_FIRMWARE_DIR "/ovmf.bin") < 0) >>> + return -1; >>> + } else { >>> + for (i = 0; i < caps->nguests; i++) { >>> + if (caps->guests[i]->ostype == VIR_DOMAIN_OSTYPE_HVM && >>> + caps->guests[i]->arch.id == def->os.arch) { >>> + if (VIR_ALLOC(def->os.loader) < 0 || >>> + VIR_STRDUP(def->os.loader->path, >>> + caps->guests[i]->arch.defaultInfo.loader) < 0) >>> + return -1; >>> + } >>> } >>> } >>> >>> @@ -535,6 +552,12 @@ xenFormatXLOS(virConfPtr conf, virDomainDefPtr def) >>> if (xenConfigSetString(conf, "builder", "hvm") < 0) >>> return -1; >>> >>> + if (def->os.loader && >>> + def->os.loader->type == VIR_DOMAIN_LOADER_TYPE_PFLASH) { >>> + if (xenConfigSetString(conf, "bios", "ovmf") < 0) >>> + return -1; >>> + } >>> + >>> #ifdef LIBXL_HAVE_BUILDINFO_KERNEL >>> if (def->os.kernel && >>> xenConfigSetString(conf, "kernel", def->os.kernel) < 0) >>> diff --git a/tests/testutils.c b/tests/testutils.c >>> index e2dd2fe..54adab2 100644 >>> --- a/tests/testutils.c >>> +++ b/tests/testutils.c >>> @@ -718,6 +718,22 @@ virTestCompareToFile(const char *strcontent, >>> return ret; >>> } >>> >>> +/* >>> + * @param strcontent: String input content >>> + * @param strsrc: String source to compare strcontent against >>> + */ >>> +int >>> +virTestCompareToString(const char *strcontent, >>> + const char *strsrc) >>> +{ >>> + if (STRNEQ_NULLABLE(strcontent, strsrc)) { >>> + virTestDifference(stderr, strcontent, strsrc); >>> + return -1; >>> + } >>> + >>> + return 0; >>> +} >>> + >>> static void >>> virTestErrorFuncQuiet(void *data ATTRIBUTE_UNUSED, >>> virErrorPtr err ATTRIBUTE_UNUSED) >>> diff --git a/tests/testutils.h b/tests/testutils.h >>> index e3881e8..c7c641c 100644 >>> --- a/tests/testutils.h >>> +++ b/tests/testutils.h >>> @@ -75,6 +75,8 @@ int virTestDifferenceBin(FILE *stream, >>> size_t length); >>> int virTestCompareToFile(const char *strcontent, >>> const char *filename); >>> +int virTestCompareToString(const char *strcontent, >>> + const char *strsrc); >>> >>> unsigned int virTestGetDebug(void); >>> unsigned int virTestGetVerbose(void); >>> diff --git a/tests/xlconfigdata/test-fullvirt-ovmf.cfg b/tests/xlconfigdata/test-fullvirt-ovmf.cfg >>> new file mode 100644 >>> index 0000000..b08e7fd >>> --- /dev/null >>> +++ b/tests/xlconfigdata/test-fullvirt-ovmf.cfg >>> @@ -0,0 +1,26 @@ >>> +name = "XenGuest2" >>> +uuid = "c7a5fdb2-cdaf-9455-926a-d65c16db1809" >>> +maxmem = 579 >>> +memory = 394 >>> +vcpus = 1 >>> +pae = 1 >>> +acpi = 1 >>> +apic = 1 >>> +viridian = 0 >>> +rtc_timeoffset = 0 >>> +localtime = 0 >>> +on_poweroff = "destroy" >>> +on_reboot = "restart" >>> +on_crash = "restart" >>> +device_model = "/usr/lib/xen/bin/qemu-system-i386" >>> +sdl = 0 >>> +vnc = 1 >>> +vncunused = 1 >>> +vnclisten = "127.0.0.1" >>> +vif = [ "mac=00:16:3e:66:92:9c,bridge=xenbr1,script=vif-bridge,model=e1000" ] >>> +parallel = "none" >>> +serial = "none" >>> +builder = "hvm" >>> +bios = "ovmf" >>> +boot = "d" >>> +disk = [ "format=raw,vdev=hda,access=rw,backendtype=phy,target=/dev/HostVG/XenGuest2", "format=qcow2,vdev=hdb,access=rw,backendtype=qdisk,target=/var/lib/libvirt/images/XenGuest2-home", "format=raw,vdev=hdc,access=ro,backendtype=qdisk,devtype=cdrom,target=/root/boot.iso" ] >>> diff --git a/tests/xlconfigdata/test-fullvirt-ovmf.xml b/tests/xlconfigdata/test-fullvirt-ovmf.xml >>> new file mode 100644 >>> index 0000000..ca902e6 >>> --- /dev/null >>> +++ b/tests/xlconfigdata/test-fullvirt-ovmf.xml >>> @@ -0,0 +1,58 @@ >>> +<domain type='xen'> >>> + <name>XenGuest2</name> >>> + <uuid>c7a5fdb2-cdaf-9455-926a-d65c16db1809</uuid> >>> + <memory unit='KiB'>592896</memory> >>> + <currentMemory unit='KiB'>403456</currentMemory> >>> + <vcpu placement='static'>1</vcpu> >>> + <os> >>> + <type arch='x86_64' machine='xenfv'>hvm</type> >>> + <loader readonly='yes' type='pflash'>/LIBXL_FIRMWARE_DIR/ovmf.bin</loader> >>> + <boot dev='cdrom'/> >>> + </os> >>> + <features> >>> + <acpi/> >>> + <apic/> >>> + <pae/> >>> + </features> >>> + <clock offset='variable' adjustment='0' basis='utc'/> >>> + <on_poweroff>destroy</on_poweroff> >>> + <on_reboot>restart</on_reboot> >>> + <on_crash>restart</on_crash> >>> + <devices> >>> + <emulator>/usr/lib/xen/bin/qemu-system-i386</emulator> >>> + <disk type='block' device='disk'> >>> + <driver name='phy' type='raw'/> >>> + <source dev='/dev/HostVG/XenGuest2'/> >>> + <target dev='hda' bus='ide'/> >>> + <address type='drive' controller='0' bus='0' target='0' unit='0'/> >>> + </disk> >>> + <disk type='file' device='disk'> >>> + <driver name='qemu' type='qcow2'/> >>> + <source file='/var/lib/libvirt/images/XenGuest2-home'/> >>> + <target dev='hdb' bus='ide'/> >>> + <address type='drive' controller='0' bus='0' target='0' unit='1'/> >>> + </disk> >>> + <disk type='file' device='cdrom'> >>> + <driver name='qemu' type='raw'/> >>> + <source file='/root/boot.iso'/> >>> + <target dev='hdc' bus='ide'/> >>> + <readonly/> >>> + <address type='drive' controller='0' bus='1' target='0' unit='0'/> >>> + </disk> >>> + <controller type='ide' index='0'/> >>> + <interface type='bridge'> >>> + <mac address='00:16:3e:66:92:9c'/> >>> + <source bridge='xenbr1'/> >>> + <script path='vif-bridge'/> >>> + <model type='e1000'/> >>> + </interface> >>> + <input type='mouse' bus='ps2'/> >>> + <input type='keyboard' bus='ps2'/> >>> + <graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1'> >>> + <listen type='address' address='127.0.0.1'/> >>> + </graphics> >>> + <video> >>> + <model type='cirrus' vram='8192' heads='1' primary='yes'/> >>> + </video> >>> + </devices> >>> +</domain> >>> diff --git a/tests/xlconfigtest.c b/tests/xlconfigtest.c >>> index 62bb144..55c756c 100644 >>> --- a/tests/xlconfigtest.c >>> +++ b/tests/xlconfigtest.c >>> @@ -43,12 +43,33 @@ >>> static virCapsPtr caps; >>> static virDomainXMLOptionPtr xmlopt; >>> >>> + >>> +/* >>> + * This function provides a mechanism to replace variables in test >>> + * data files whose values are discovered at built time. >>> + */ >>> +static char * >>> +testReplaceVarsXML(const char *xml) >>> +{ >>> + char *xmlcfgData; >>> + char *replacedXML; >>> + >>> + if (virTestLoadFile(xml, &xmlcfgData) < 0) >>> + return NULL; >>> + >>> + replacedXML = virStringReplace(xmlcfgData, "/LIBXL_FIRMWARE_DIR", >>> + LIBXL_FIRMWARE_DIR); >> I think we want to replace just LIBXL_FW_DIR without the leading slash. >> That's what would have been done if we had .in files anyway. > > If only LIBXL_FIRMWARE_DIR is replaced, the test fails since there are two > leading slashes instead of the expected one. If I remove the leading slash from > the test data fail, then virschematest fails on the test data file with > > XML document failed to validate against schema: Unable to validate doc against > /home/jfehlig/virt/upstream/libvirt/docs/schemas/domain.rng > Extra element os in interleave > Ah. Okay then. It's a bit unfortunate but I can live with that. Michal -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list