docs/formatdomain.html.in | 4 +++ docs/schemas/domaincommon.rng | 5 +++ src/conf/domain_conf.c | 5 ++- src/conf/domain_conf.h | 1 + src/qemu/qemu_capabilities.c | 2 ++ src/qemu/qemu_capabilities.h | 1 + src/qemu/qemu_command.c | 26 +++++++++++++++ .../qemuxml2argvdata/qemuxml2argv-vmcoreinfo.args | 25 ++++++++++++++ tests/qemuxml2argvdata/qemuxml2argv-vmcoreinfo.xml | 28 ++++++++++++++++ tests/qemuxml2argvtest.c | 1 + .../qemuxml2xmlout-vmcoreinfo.xml | 38 ++++++++++++++++++++++ tests/qemuxml2xmltest.c | 1 + 12 files changed, 136 insertions(+), 1 deletion(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-vmcoreinfo.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-vmcoreinfo.xml create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-vmcoreinfo.xml
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Starting from qemu 2.11, the `-device vmcoreinfo` will create a fw_cfg
entry for a guest to store dump details, necessary to process kernel
dump with KASLR enabled and providing additional kernel details.
Since the device is a singleton and shouldn't use additional hardware
resources, I decided to map this to a <feature> element in the libvirt
domain XML. Feel free to argue and decide if it is better to have it
under <devices> instead.
The device is arm/x86 only for now (targets that support fw_cfg+dma).
Related to:
https://bugzilla.redhat.com/show_bug.cgi?id=1395248
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
docs/formatdomain.html.in | 4 +++
docs/schemas/domaincommon.rng | 5 +++
src/conf/domain_conf.c | 5 ++-
src/conf/domain_conf.h | 1 +
src/qemu/qemu_capabilities.c | 2 ++
src/qemu/qemu_capabilities.h | 1 +
src/qemu/qemu_command.c | 26 +++++++++++++++
.../qemuxml2argvdata/qemuxml2argv-vmcoreinfo.args | 25 ++++++++++++++
tests/qemuxml2argvdata/qemuxml2argv-vmcoreinfo.xml | 28 ++++++++++++++++
tests/qemuxml2argvtest.c | 1 +
.../qemuxml2xmlout-vmcoreinfo.xml | 38 ++++++++++++++++++++++
tests/qemuxml2xmltest.c | 1 +
12 files changed, 136 insertions(+), 1 deletion(-)
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-vmcoreinfo.args
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-vmcoreinfo.xml
create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-vmcoreinfo.xml
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 92e14a919..d87a32a89 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -1878,6 +1878,10 @@
which is also known as a split I/O APIC mode.
<span class="since">Since 3.4.0</span> (QEMU/KVM only)
</dd>
+ <dt><code>vmcoreinfo</code></dt>
+ <dd>Enable QEMU vmcoreinfo device to let the guest kernel save debug
+ details. <span class="since">Since 3.10.0</span> (QEMU only)
+ </dd>
</dl>
<h3><a id="elementsTime">Time keeping</a></h3>
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 9cec1a063..86cbe2c8c 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -4736,6 +4736,11 @@
<optional>
<ref name="ioapic"/>
</optional>
+ <optional>
+ <element name="vmcoreinfo">
+ <empty/>
+ </element>
+ </optional>
</interleave>
</element>
</optional>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 400e90032..3a9b56cd2 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -148,7 +148,8 @@ VIR_ENUM_IMPL(virDomainFeature, VIR_DOMAIN_FEATURE_LAST,
"vmport",
"gic",
"smm",
- "ioapic")
+ "ioapic",
+ "vmcoreinfo")
VIR_ENUM_IMPL(virDomainCapabilitiesPolicy, VIR_DOMAIN_CAPABILITIES_POLICY_LAST,
"default",
@@ -18710,6 +18711,7 @@ virDomainDefParseXML(xmlDocPtr xml,
case VIR_DOMAIN_FEATURE_VIRIDIAN:
case VIR_DOMAIN_FEATURE_PRIVNET:
case VIR_DOMAIN_FEATURE_HYPERV:
+ case VIR_DOMAIN_FEATURE_VMCOREINFO:
case VIR_DOMAIN_FEATURE_KVM:
def->features[val] = VIR_TRISTATE_SWITCH_ON;
break;
@@ -26052,6 +26054,7 @@ virDomainDefFormatInternal(virDomainDefPtr def,
case VIR_DOMAIN_FEATURE_ACPI:
case VIR_DOMAIN_FEATURE_PAE:
case VIR_DOMAIN_FEATURE_VIRIDIAN:
+ case VIR_DOMAIN_FEATURE_VMCOREINFO:
case VIR_DOMAIN_FEATURE_PRIVNET:
switch ((virTristateSwitch) def->features[i]) {
case VIR_TRISTATE_SWITCH_ABSENT:
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index be38792c6..add668025 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1723,6 +1723,7 @@ typedef enum {
VIR_DOMAIN_FEATURE_GIC,
VIR_DOMAIN_FEATURE_SMM,
VIR_DOMAIN_FEATURE_IOAPIC,
+ VIR_DOMAIN_FEATURE_VMCOREINFO,
VIR_DOMAIN_FEATURE_LAST
} virDomainFeature;
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 7cb091056..44a2833a7 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -443,6 +443,7 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST,
/* 270 */
"vxhs",
"virtio-blk.num-queues",
+ "vmcoreinfo",
);
@@ -1670,6 +1671,7 @@ struct virQEMUCapsStringFlags virQEMUCapsObjectTypes[] = {
{ "pcie-root-port", QEMU_CAPS_DEVICE_PCIE_ROOT_PORT },
{ "qemu-xhci", QEMU_CAPS_DEVICE_QEMU_XHCI },
{ "spapr-pci-host-bridge", QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE },
+ { "vmcoreinfo", QEMU_CAPS_DEVICE_VMCOREINFO },
};
static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsVirtioBalloon[] = {
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
index cacc2b77e..0cd9755a8 100644
--- a/src/qemu/qemu_capabilities.h
+++ b/src/qemu/qemu_capabilities.h
@@ -429,6 +429,7 @@ typedef enum {
/* 270 */
QEMU_CAPS_VXHS, /* -drive file.driver=vxhs via query-qmp-schema */
QEMU_CAPS_VIRTIO_BLK_NUM_QUEUES, /* virtio-blk-*.num-queues */
+ QEMU_CAPS_DEVICE_VMCOREINFO, /* -device vmcoreinfo */
QEMU_CAPS_LAST /* this must always be the last item */
} virQEMUCapsFlags;
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 8708b79ed..b903b27b9 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -9727,6 +9727,29 @@ qemuBuildTPMCommandLine(virCommandPtr cmd,
}
+static int
+qemuBuildVMCoreInfoCommandLine(virCommandPtr cmd,
+ const virDomainDef *def,
+ virQEMUCapsPtr qemuCaps)
+{
+ virTristateSwitch vmci = def->features[VIR_DOMAIN_FEATURE_VMCOREINFO];
+
+ if (vmci != VIR_TRISTATE_SWITCH_ON) {
+ return 0;
+ }
+
+ if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VMCOREINFO)) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("vmcoreinfo is not available "
+ "with this QEMU binary"));
+ return -1;
+ }
+
+ virCommandAddArgList(cmd, "-device", "vmcoreinfo", NULL);
+ return 0;
+}
+
+
static int
qemuBuildPanicCommandLine(virCommandPtr cmd,
const virDomainDef *def,
@@ -10146,6 +10169,9 @@ qemuBuildCommandLine(virQEMUDriverPtr driver,
if (qemuBuildNVRAMCommandLine(cmd, def, qemuCaps) < 0)
goto error;
+ if (qemuBuildVMCoreInfoCommandLine(cmd, def, qemuCaps) < 0)
+ goto error;
+
if (snapshot)
virCommandAddArgList(cmd, "-loadvm", snapshot->def->name, NULL);
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-vmcoreinfo.args b/tests/qemuxml2argvdata/qemuxml2argv-vmcoreinfo.args
new file mode 100644
index 000000000..772e5a071
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-vmcoreinfo.args
@@ -0,0 +1,25 @@
+LC_ALL=C \
+PATH=/bin \
+HOME=/home/test \
+USER=test \
+LOGNAME=test \
+QEMU_AUDIO_DRV=none \
+/usr/bin/qemu-system-i686 \
+-name QEMUGuest1 \
+-S \
+-M pc \
+-m 214 \
+-smp 1,sockets=1,cores=1,threads=1 \
+-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
+-nographic \
+-nodefaults \
+-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/monitor.sock,\
+server,nowait \
+-mon chardev=charmonitor,id=monitor,mode=readline \
+-no-acpi \
+-boot c \
+-usb \
+-drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-ide0-0-0 \
+-device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 \
+-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3 \
+-device vmcoreinfo
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-vmcoreinfo.xml b/tests/qemuxml2argvdata/qemuxml2argv-vmcoreinfo.xml
new file mode 100644
index 000000000..f8e586531
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-vmcoreinfo.xml
@@ -0,0 +1,28 @@
+<domain type='qemu'>
+ <name>QEMUGuest1</name>
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+ <memory unit='KiB'>219100</memory>
+ <currentMemory unit='KiB'>219100</currentMemory>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='i686' machine='pc'>hvm</type>
+ <boot dev='hd'/>
+ </os>
+ <features>
+ <vmcoreinfo/>
+ </features>
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>destroy</on_crash>
+ <devices>
+ <emulator>/usr/bin/qemu-system-i686</emulator>
+ <disk type='block' device='disk'>
+ <source dev='/dev/HostVG/QEMUGuest1'/>
+ <target dev='hda' bus='ide'/>
+ <address type='drive' controller='0' bus='0' target='0' unit='0'/>
+ </disk>
+ <controller type='ide' index='0'/>
+ <memballoon model='virtio'/>
+ </devices>
+</domain>
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
index 2e07b85aa..7b9b846ef 100644
--- a/tests/qemuxml2argvtest.c
+++ b/tests/qemuxml2argvtest.c
@@ -2810,6 +2810,7 @@ mymain(void)
DO_TEST_PARSE_ERROR("cpu-cache-emulate-l2", QEMU_CAPS_KVM);
DO_TEST_PARSE_ERROR("cpu-cache-passthrough3", QEMU_CAPS_KVM);
DO_TEST_PARSE_ERROR("cpu-cache-passthrough-l3", QEMU_CAPS_KVM);
+ DO_TEST("vmcoreinfo", QEMU_CAPS_DEVICE_VMCOREINFO);
DO_TEST("user-aliases", QEMU_CAPS_KVM, QEMU_CAPS_DEVICE_CIRRUS_VGA,
QEMU_CAPS_OBJECT_MEMORY_FILE, QEMU_CAPS_PIIX_DISABLE_S3,
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-vmcoreinfo.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-vmcoreinfo.xml
new file mode 100644
index 000000000..a3922d630
--- /dev/null
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-vmcoreinfo.xml
@@ -0,0 +1,38 @@
+<domain type='qemu'>
+ <name>QEMUGuest1</name>
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+ <memory unit='KiB'>219100</memory>
+ <currentMemory unit='KiB'>219100</currentMemory>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='i686' machine='pc'>hvm</type>
+ <boot dev='hd'/>
+ </os>
+ <features>
+ <vmcoreinfo/>
+ </features>
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>destroy</on_crash>
+ <devices>
+ <emulator>/usr/bin/qemu-system-i686</emulator>
+ <disk type='block' device='disk'>
+ <source dev='/dev/HostVG/QEMUGuest1'/>
+ <target dev='hda' bus='ide'/>
+ <address type='drive' controller='0' bus='0' target='0' unit='0'/>
+ </disk>
+ <controller type='ide' index='0'>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
+ </controller>
+ <controller type='usb' index='0'>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
+ </controller>
+ <controller type='pci' index='0' model='pci-root'/>
+ <input type='mouse' bus='ps2'/>
+ <input type='keyboard' bus='ps2'/>
+ <memballoon model='virtio'>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
+ </memballoon>
+ </devices>
+</domain>
diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
index 5a282e5ff..9a7d460e5 100644
--- a/tests/qemuxml2xmltest.c
+++ b/tests/qemuxml2xmltest.c
@@ -1260,6 +1260,7 @@ mymain(void)
DO_TEST("cpu-check-default-none2", NONE);
DO_TEST("cpu-check-default-partial", NONE);
DO_TEST("cpu-check-default-partial2", NONE);
+ DO_TEST("vmcoreinfo", NONE);
DO_TEST("smartcard-host", NONE);
DO_TEST("smartcard-host-certificates", NONE);
--
2.15.0.rc0.40.gaefcc5f6f
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
ping, please review/comment On Mon, Nov 6, 2017 at 1:09 PM, <marcandre.lureau@redhat.com> wrote: > From: Marc-André Lureau <marcandre.lureau@redhat.com> > > Starting from qemu 2.11, the `-device vmcoreinfo` will create a fw_cfg > entry for a guest to store dump details, necessary to process kernel > dump with KASLR enabled and providing additional kernel details. > > Since the device is a singleton and shouldn't use additional hardware > resources, I decided to map this to a <feature> element in the libvirt > domain XML. Feel free to argue and decide if it is better to have it > under <devices> instead. > > The device is arm/x86 only for now (targets that support fw_cfg+dma). > > Related to: > https://bugzilla.redhat.com/show_bug.cgi?id=1395248 > > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> > --- > docs/formatdomain.html.in | 4 +++ > docs/schemas/domaincommon.rng | 5 +++ > src/conf/domain_conf.c | 5 ++- > src/conf/domain_conf.h | 1 + > src/qemu/qemu_capabilities.c | 2 ++ > src/qemu/qemu_capabilities.h | 1 + > src/qemu/qemu_command.c | 26 +++++++++++++++ > .../qemuxml2argvdata/qemuxml2argv-vmcoreinfo.args | 25 ++++++++++++++ > tests/qemuxml2argvdata/qemuxml2argv-vmcoreinfo.xml | 28 ++++++++++++++++ > tests/qemuxml2argvtest.c | 1 + > .../qemuxml2xmlout-vmcoreinfo.xml | 38 ++++++++++++++++++++++ > tests/qemuxml2xmltest.c | 1 + > 12 files changed, 136 insertions(+), 1 deletion(-) > create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-vmcoreinfo.args > create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-vmcoreinfo.xml > create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-vmcoreinfo.xml > > diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in > index 92e14a919..d87a32a89 100644 > --- a/docs/formatdomain.html.in > +++ b/docs/formatdomain.html.in > @@ -1878,6 +1878,10 @@ > which is also known as a split I/O APIC mode. > <span class="since">Since 3.4.0</span> (QEMU/KVM only) > </dd> > + <dt><code>vmcoreinfo</code></dt> > + <dd>Enable QEMU vmcoreinfo device to let the guest kernel save debug > + details. <span class="since">Since 3.10.0</span> (QEMU only) > + </dd> > </dl> > > <h3><a id="elementsTime">Time keeping</a></h3> > diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng > index 9cec1a063..86cbe2c8c 100644 > --- a/docs/schemas/domaincommon.rng > +++ b/docs/schemas/domaincommon.rng > @@ -4736,6 +4736,11 @@ > <optional> > <ref name="ioapic"/> > </optional> > + <optional> > + <element name="vmcoreinfo"> > + <empty/> > + </element> > + </optional> > </interleave> > </element> > </optional> > diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c > index 400e90032..3a9b56cd2 100644 > --- a/src/conf/domain_conf.c > +++ b/src/conf/domain_conf.c > @@ -148,7 +148,8 @@ VIR_ENUM_IMPL(virDomainFeature, VIR_DOMAIN_FEATURE_LAST, > "vmport", > "gic", > "smm", > - "ioapic") > + "ioapic", > + "vmcoreinfo") > > VIR_ENUM_IMPL(virDomainCapabilitiesPolicy, VIR_DOMAIN_CAPABILITIES_POLICY_LAST, > "default", > @@ -18710,6 +18711,7 @@ virDomainDefParseXML(xmlDocPtr xml, > case VIR_DOMAIN_FEATURE_VIRIDIAN: > case VIR_DOMAIN_FEATURE_PRIVNET: > case VIR_DOMAIN_FEATURE_HYPERV: > + case VIR_DOMAIN_FEATURE_VMCOREINFO: > case VIR_DOMAIN_FEATURE_KVM: > def->features[val] = VIR_TRISTATE_SWITCH_ON; > break; > @@ -26052,6 +26054,7 @@ virDomainDefFormatInternal(virDomainDefPtr def, > case VIR_DOMAIN_FEATURE_ACPI: > case VIR_DOMAIN_FEATURE_PAE: > case VIR_DOMAIN_FEATURE_VIRIDIAN: > + case VIR_DOMAIN_FEATURE_VMCOREINFO: > case VIR_DOMAIN_FEATURE_PRIVNET: > switch ((virTristateSwitch) def->features[i]) { > case VIR_TRISTATE_SWITCH_ABSENT: > diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h > index be38792c6..add668025 100644 > --- a/src/conf/domain_conf.h > +++ b/src/conf/domain_conf.h > @@ -1723,6 +1723,7 @@ typedef enum { > VIR_DOMAIN_FEATURE_GIC, > VIR_DOMAIN_FEATURE_SMM, > VIR_DOMAIN_FEATURE_IOAPIC, > + VIR_DOMAIN_FEATURE_VMCOREINFO, > > VIR_DOMAIN_FEATURE_LAST > } virDomainFeature; > diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c > index 7cb091056..44a2833a7 100644 > --- a/src/qemu/qemu_capabilities.c > +++ b/src/qemu/qemu_capabilities.c > @@ -443,6 +443,7 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST, > /* 270 */ > "vxhs", > "virtio-blk.num-queues", > + "vmcoreinfo", > ); > > > @@ -1670,6 +1671,7 @@ struct virQEMUCapsStringFlags virQEMUCapsObjectTypes[] = { > { "pcie-root-port", QEMU_CAPS_DEVICE_PCIE_ROOT_PORT }, > { "qemu-xhci", QEMU_CAPS_DEVICE_QEMU_XHCI }, > { "spapr-pci-host-bridge", QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE }, > + { "vmcoreinfo", QEMU_CAPS_DEVICE_VMCOREINFO }, > }; > > static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsVirtioBalloon[] = { > diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h > index cacc2b77e..0cd9755a8 100644 > --- a/src/qemu/qemu_capabilities.h > +++ b/src/qemu/qemu_capabilities.h > @@ -429,6 +429,7 @@ typedef enum { > /* 270 */ > QEMU_CAPS_VXHS, /* -drive file.driver=vxhs via query-qmp-schema */ > QEMU_CAPS_VIRTIO_BLK_NUM_QUEUES, /* virtio-blk-*.num-queues */ > + QEMU_CAPS_DEVICE_VMCOREINFO, /* -device vmcoreinfo */ > > QEMU_CAPS_LAST /* this must always be the last item */ > } virQEMUCapsFlags; > diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c > index 8708b79ed..b903b27b9 100644 > --- a/src/qemu/qemu_command.c > +++ b/src/qemu/qemu_command.c > @@ -9727,6 +9727,29 @@ qemuBuildTPMCommandLine(virCommandPtr cmd, > } > > > +static int > +qemuBuildVMCoreInfoCommandLine(virCommandPtr cmd, > + const virDomainDef *def, > + virQEMUCapsPtr qemuCaps) > +{ > + virTristateSwitch vmci = def->features[VIR_DOMAIN_FEATURE_VMCOREINFO]; > + > + if (vmci != VIR_TRISTATE_SWITCH_ON) { > + return 0; > + } > + > + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VMCOREINFO)) { > + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", > + _("vmcoreinfo is not available " > + "with this QEMU binary")); > + return -1; > + } > + > + virCommandAddArgList(cmd, "-device", "vmcoreinfo", NULL); > + return 0; > +} > + > + > static int > qemuBuildPanicCommandLine(virCommandPtr cmd, > const virDomainDef *def, > @@ -10146,6 +10169,9 @@ qemuBuildCommandLine(virQEMUDriverPtr driver, > if (qemuBuildNVRAMCommandLine(cmd, def, qemuCaps) < 0) > goto error; > > + if (qemuBuildVMCoreInfoCommandLine(cmd, def, qemuCaps) < 0) > + goto error; > + > if (snapshot) > virCommandAddArgList(cmd, "-loadvm", snapshot->def->name, NULL); > > diff --git a/tests/qemuxml2argvdata/qemuxml2argv-vmcoreinfo.args b/tests/qemuxml2argvdata/qemuxml2argv-vmcoreinfo.args > new file mode 100644 > index 000000000..772e5a071 > --- /dev/null > +++ b/tests/qemuxml2argvdata/qemuxml2argv-vmcoreinfo.args > @@ -0,0 +1,25 @@ > +LC_ALL=C \ > +PATH=/bin \ > +HOME=/home/test \ > +USER=test \ > +LOGNAME=test \ > +QEMU_AUDIO_DRV=none \ > +/usr/bin/qemu-system-i686 \ > +-name QEMUGuest1 \ > +-S \ > +-M pc \ > +-m 214 \ > +-smp 1,sockets=1,cores=1,threads=1 \ > +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ > +-nographic \ > +-nodefaults \ > +-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/monitor.sock,\ > +server,nowait \ > +-mon chardev=charmonitor,id=monitor,mode=readline \ > +-no-acpi \ > +-boot c \ > +-usb \ > +-drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-ide0-0-0 \ > +-device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 \ > +-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3 \ > +-device vmcoreinfo > diff --git a/tests/qemuxml2argvdata/qemuxml2argv-vmcoreinfo.xml b/tests/qemuxml2argvdata/qemuxml2argv-vmcoreinfo.xml > new file mode 100644 > index 000000000..f8e586531 > --- /dev/null > +++ b/tests/qemuxml2argvdata/qemuxml2argv-vmcoreinfo.xml > @@ -0,0 +1,28 @@ > +<domain type='qemu'> > + <name>QEMUGuest1</name> > + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> > + <memory unit='KiB'>219100</memory> > + <currentMemory unit='KiB'>219100</currentMemory> > + <vcpu placement='static'>1</vcpu> > + <os> > + <type arch='i686' machine='pc'>hvm</type> > + <boot dev='hd'/> > + </os> > + <features> > + <vmcoreinfo/> > + </features> > + <clock offset='utc'/> > + <on_poweroff>destroy</on_poweroff> > + <on_reboot>restart</on_reboot> > + <on_crash>destroy</on_crash> > + <devices> > + <emulator>/usr/bin/qemu-system-i686</emulator> > + <disk type='block' device='disk'> > + <source dev='/dev/HostVG/QEMUGuest1'/> > + <target dev='hda' bus='ide'/> > + <address type='drive' controller='0' bus='0' target='0' unit='0'/> > + </disk> > + <controller type='ide' index='0'/> > + <memballoon model='virtio'/> > + </devices> > +</domain> > diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c > index 2e07b85aa..7b9b846ef 100644 > --- a/tests/qemuxml2argvtest.c > +++ b/tests/qemuxml2argvtest.c > @@ -2810,6 +2810,7 @@ mymain(void) > DO_TEST_PARSE_ERROR("cpu-cache-emulate-l2", QEMU_CAPS_KVM); > DO_TEST_PARSE_ERROR("cpu-cache-passthrough3", QEMU_CAPS_KVM); > DO_TEST_PARSE_ERROR("cpu-cache-passthrough-l3", QEMU_CAPS_KVM); > + DO_TEST("vmcoreinfo", QEMU_CAPS_DEVICE_VMCOREINFO); > > DO_TEST("user-aliases", QEMU_CAPS_KVM, QEMU_CAPS_DEVICE_CIRRUS_VGA, > QEMU_CAPS_OBJECT_MEMORY_FILE, QEMU_CAPS_PIIX_DISABLE_S3, > diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-vmcoreinfo.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-vmcoreinfo.xml > new file mode 100644 > index 000000000..a3922d630 > --- /dev/null > +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-vmcoreinfo.xml > @@ -0,0 +1,38 @@ > +<domain type='qemu'> > + <name>QEMUGuest1</name> > + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> > + <memory unit='KiB'>219100</memory> > + <currentMemory unit='KiB'>219100</currentMemory> > + <vcpu placement='static'>1</vcpu> > + <os> > + <type arch='i686' machine='pc'>hvm</type> > + <boot dev='hd'/> > + </os> > + <features> > + <vmcoreinfo/> > + </features> > + <clock offset='utc'/> > + <on_poweroff>destroy</on_poweroff> > + <on_reboot>restart</on_reboot> > + <on_crash>destroy</on_crash> > + <devices> > + <emulator>/usr/bin/qemu-system-i686</emulator> > + <disk type='block' device='disk'> > + <source dev='/dev/HostVG/QEMUGuest1'/> > + <target dev='hda' bus='ide'/> > + <address type='drive' controller='0' bus='0' target='0' unit='0'/> > + </disk> > + <controller type='ide' index='0'> > + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/> > + </controller> > + <controller type='usb' index='0'> > + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/> > + </controller> > + <controller type='pci' index='0' model='pci-root'/> > + <input type='mouse' bus='ps2'/> > + <input type='keyboard' bus='ps2'/> > + <memballoon model='virtio'> > + <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> > + </memballoon> > + </devices> > +</domain> > diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c > index 5a282e5ff..9a7d460e5 100644 > --- a/tests/qemuxml2xmltest.c > +++ b/tests/qemuxml2xmltest.c > @@ -1260,6 +1260,7 @@ mymain(void) > DO_TEST("cpu-check-default-none2", NONE); > DO_TEST("cpu-check-default-partial", NONE); > DO_TEST("cpu-check-default-partial2", NONE); > + DO_TEST("vmcoreinfo", NONE); > > DO_TEST("smartcard-host", NONE); > DO_TEST("smartcard-host-certificates", NONE); > -- > 2.15.0.rc0.40.gaefcc5f6f > > -- > libvir-list mailing list > libvir-list@redhat.com > https://www.redhat.com/mailman/listinfo/libvir-list -- Marc-André Lureau -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
On Mon, Nov 06, 2017 at 01:09:09PM +0100, marcandre.lureau@redhat.com wrote: >From: Marc-André Lureau <marcandre.lureau@redhat.com> > >Starting from qemu 2.11, the `-device vmcoreinfo` will create a fw_cfg >entry for a guest to store dump details, necessary to process kernel >dump with KASLR enabled and providing additional kernel details. > >Since the device is a singleton and shouldn't use additional hardware >resources, I decided to map this to a <feature> element in the libvirt >domain XML. Feel free to argue and decide if it is better to have it >under <devices> instead. > So is this similar to -fw_cfg name=etc/vmcoreinfo,file=X but in this case it is not backed by a file, but collected by QEMU itself? I'm OK with this being a feature. >The device is arm/x86 only for now (targets that support fw_cfg+dma). > >Related to: >https://bugzilla.redhat.com/show_bug.cgi?id=1395248 > >Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> >--- > docs/formatdomain.html.in | 4 +++ > docs/schemas/domaincommon.rng | 5 +++ > src/conf/domain_conf.c | 5 ++- > src/conf/domain_conf.h | 1 + > src/qemu/qemu_capabilities.c | 2 ++ > src/qemu/qemu_capabilities.h | 1 + > src/qemu/qemu_command.c | 26 +++++++++++++++ > .../qemuxml2argvdata/qemuxml2argv-vmcoreinfo.args | 25 ++++++++++++++ > tests/qemuxml2argvdata/qemuxml2argv-vmcoreinfo.xml | 28 ++++++++++++++++ > tests/qemuxml2argvtest.c | 1 + > .../qemuxml2xmlout-vmcoreinfo.xml | 38 ++++++++++++++++++++++ > tests/qemuxml2xmltest.c | 1 + > 12 files changed, 136 insertions(+), 1 deletion(-) > create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-vmcoreinfo.args > create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-vmcoreinfo.xml > create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-vmcoreinfo.xml > >diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in >index 92e14a919..d87a32a89 100644 >--- a/docs/formatdomain.html.in >+++ b/docs/formatdomain.html.in >@@ -1878,6 +1878,10 @@ > which is also known as a split I/O APIC mode. > <span class="since">Since 3.4.0</span> (QEMU/KVM only) > </dd> >+ <dt><code>vmcoreinfo</code></dt> >+ <dd>Enable QEMU vmcoreinfo device to let the guest kernel save debug >+ details. <span class="since">Since 3.10.0</span> (QEMU only) >+ </dd> > </dl> > > <h3><a id="elementsTime">Time keeping</a></h3> >diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng >index 9cec1a063..86cbe2c8c 100644 >--- a/docs/schemas/domaincommon.rng >+++ b/docs/schemas/domaincommon.rng >@@ -4736,6 +4736,11 @@ > <optional> > <ref name="ioapic"/> > </optional> >+ <optional> >+ <element name="vmcoreinfo"> >+ <empty/> >+ </element> >+ </optional> > </interleave> > </element> > </optional> >diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c >index 400e90032..3a9b56cd2 100644 >--- a/src/conf/domain_conf.c >+++ b/src/conf/domain_conf.c >@@ -148,7 +148,8 @@ VIR_ENUM_IMPL(virDomainFeature, VIR_DOMAIN_FEATURE_LAST, > "vmport", > "gic", > "smm", >- "ioapic") >+ "ioapic", >+ "vmcoreinfo") > > VIR_ENUM_IMPL(virDomainCapabilitiesPolicy, VIR_DOMAIN_CAPABILITIES_POLICY_LAST, > "default", >@@ -18710,6 +18711,7 @@ virDomainDefParseXML(xmlDocPtr xml, > case VIR_DOMAIN_FEATURE_VIRIDIAN: > case VIR_DOMAIN_FEATURE_PRIVNET: > case VIR_DOMAIN_FEATURE_HYPERV: >+ case VIR_DOMAIN_FEATURE_VMCOREINFO: > case VIR_DOMAIN_FEATURE_KVM: > def->features[val] = VIR_TRISTATE_SWITCH_ON; > break; >@@ -26052,6 +26054,7 @@ virDomainDefFormatInternal(virDomainDefPtr def, > case VIR_DOMAIN_FEATURE_ACPI: > case VIR_DOMAIN_FEATURE_PAE: > case VIR_DOMAIN_FEATURE_VIRIDIAN: >+ case VIR_DOMAIN_FEATURE_VMCOREINFO: > case VIR_DOMAIN_FEATURE_PRIVNET: > switch ((virTristateSwitch) def->features[i]) { > case VIR_TRISTATE_SWITCH_ABSENT: >diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h >index be38792c6..add668025 100644 >--- a/src/conf/domain_conf.h >+++ b/src/conf/domain_conf.h >@@ -1723,6 +1723,7 @@ typedef enum { > VIR_DOMAIN_FEATURE_GIC, > VIR_DOMAIN_FEATURE_SMM, > VIR_DOMAIN_FEATURE_IOAPIC, >+ VIR_DOMAIN_FEATURE_VMCOREINFO, > > VIR_DOMAIN_FEATURE_LAST > } virDomainFeature; >diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c >index 7cb091056..44a2833a7 100644 >--- a/src/qemu/qemu_capabilities.c >+++ b/src/qemu/qemu_capabilities.c >@@ -443,6 +443,7 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST, > /* 270 */ > "vxhs", > "virtio-blk.num-queues", >+ "vmcoreinfo", > ); > > >@@ -1670,6 +1671,7 @@ struct virQEMUCapsStringFlags virQEMUCapsObjectTypes[] = { > { "pcie-root-port", QEMU_CAPS_DEVICE_PCIE_ROOT_PORT }, > { "qemu-xhci", QEMU_CAPS_DEVICE_QEMU_XHCI }, > { "spapr-pci-host-bridge", QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE }, >+ { "vmcoreinfo", QEMU_CAPS_DEVICE_VMCOREINFO }, > }; > > static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsVirtioBalloon[] = { >diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h >index cacc2b77e..0cd9755a8 100644 >--- a/src/qemu/qemu_capabilities.h >+++ b/src/qemu/qemu_capabilities.h >@@ -429,6 +429,7 @@ typedef enum { > /* 270 */ > QEMU_CAPS_VXHS, /* -drive file.driver=vxhs via query-qmp-schema */ > QEMU_CAPS_VIRTIO_BLK_NUM_QUEUES, /* virtio-blk-*.num-queues */ >+ QEMU_CAPS_DEVICE_VMCOREINFO, /* -device vmcoreinfo */ > > QEMU_CAPS_LAST /* this must always be the last item */ > } virQEMUCapsFlags; >diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c >index 8708b79ed..b903b27b9 100644 >--- a/src/qemu/qemu_command.c >+++ b/src/qemu/qemu_command.c >@@ -9727,6 +9727,29 @@ qemuBuildTPMCommandLine(virCommandPtr cmd, > } > > >+static int >+qemuBuildVMCoreInfoCommandLine(virCommandPtr cmd, >+ const virDomainDef *def, >+ virQEMUCapsPtr qemuCaps) >+{ >+ virTristateSwitch vmci = def->features[VIR_DOMAIN_FEATURE_VMCOREINFO]; >+ >+ if (vmci != VIR_TRISTATE_SWITCH_ON) { >+ return 0; >+ } >+ >+ if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VMCOREINFO)) { >+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", >+ _("vmcoreinfo is not available " >+ "with this QEMU binary")); >+ return -1; >+ } >+ >+ virCommandAddArgList(cmd, "-device", "vmcoreinfo", NULL); >+ return 0; >+} >+ >+ > static int > qemuBuildPanicCommandLine(virCommandPtr cmd, > const virDomainDef *def, >@@ -10146,6 +10169,9 @@ qemuBuildCommandLine(virQEMUDriverPtr driver, > if (qemuBuildNVRAMCommandLine(cmd, def, qemuCaps) < 0) > goto error; > >+ if (qemuBuildVMCoreInfoCommandLine(cmd, def, qemuCaps) < 0) >+ goto error; >+ > if (snapshot) > virCommandAddArgList(cmd, "-loadvm", snapshot->def->name, NULL); > >diff --git a/tests/qemuxml2argvdata/qemuxml2argv-vmcoreinfo.args b/tests/qemuxml2argvdata/qemuxml2argv-vmcoreinfo.args >new file mode 100644 >index 000000000..772e5a071 >--- /dev/null >+++ b/tests/qemuxml2argvdata/qemuxml2argv-vmcoreinfo.args >@@ -0,0 +1,25 @@ >+LC_ALL=C \ >+PATH=/bin \ >+HOME=/home/test \ >+USER=test \ >+LOGNAME=test \ >+QEMU_AUDIO_DRV=none \ >+/usr/bin/qemu-system-i686 \ >+-name QEMUGuest1 \ >+-S \ >+-M pc \ >+-m 214 \ >+-smp 1,sockets=1,cores=1,threads=1 \ >+-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ >+-nographic \ >+-nodefaults \ >+-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/monitor.sock,\ >+server,nowait \ >+-mon chardev=charmonitor,id=monitor,mode=readline \ >+-no-acpi \ >+-boot c \ >+-usb \ >+-drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-ide0-0-0 \ >+-device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 \ >+-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3 \ >+-device vmcoreinfo >diff --git a/tests/qemuxml2argvdata/qemuxml2argv-vmcoreinfo.xml b/tests/qemuxml2argvdata/qemuxml2argv-vmcoreinfo.xml >new file mode 100644 >index 000000000..f8e586531 >--- /dev/null >+++ b/tests/qemuxml2argvdata/qemuxml2argv-vmcoreinfo.xml >@@ -0,0 +1,28 @@ >+<domain type='qemu'> >+ <name>QEMUGuest1</name> >+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> >+ <memory unit='KiB'>219100</memory> >+ <currentMemory unit='KiB'>219100</currentMemory> >+ <vcpu placement='static'>1</vcpu> >+ <os> >+ <type arch='i686' machine='pc'>hvm</type> >+ <boot dev='hd'/> >+ </os> >+ <features> >+ <vmcoreinfo/> >+ </features> >+ <clock offset='utc'/> >+ <on_poweroff>destroy</on_poweroff> >+ <on_reboot>restart</on_reboot> >+ <on_crash>destroy</on_crash> >+ <devices> >+ <emulator>/usr/bin/qemu-system-i686</emulator> >+ <disk type='block' device='disk'> >+ <source dev='/dev/HostVG/QEMUGuest1'/> >+ <target dev='hda' bus='ide'/> >+ <address type='drive' controller='0' bus='0' target='0' unit='0'/> >+ </disk> >+ <controller type='ide' index='0'/> >+ <memballoon model='virtio'/> >+ </devices> >+</domain> >diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c >index 2e07b85aa..7b9b846ef 100644 >--- a/tests/qemuxml2argvtest.c >+++ b/tests/qemuxml2argvtest.c >@@ -2810,6 +2810,7 @@ mymain(void) > DO_TEST_PARSE_ERROR("cpu-cache-emulate-l2", QEMU_CAPS_KVM); > DO_TEST_PARSE_ERROR("cpu-cache-passthrough3", QEMU_CAPS_KVM); > DO_TEST_PARSE_ERROR("cpu-cache-passthrough-l3", QEMU_CAPS_KVM); >+ DO_TEST("vmcoreinfo", QEMU_CAPS_DEVICE_VMCOREINFO); > > DO_TEST("user-aliases", QEMU_CAPS_KVM, QEMU_CAPS_DEVICE_CIRRUS_VGA, > QEMU_CAPS_OBJECT_MEMORY_FILE, QEMU_CAPS_PIIX_DISABLE_S3, >diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-vmcoreinfo.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-vmcoreinfo.xml >new file mode 100644 >index 000000000..a3922d630 >--- /dev/null >+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-vmcoreinfo.xml >@@ -0,0 +1,38 @@ >+<domain type='qemu'> >+ <name>QEMUGuest1</name> >+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> >+ <memory unit='KiB'>219100</memory> >+ <currentMemory unit='KiB'>219100</currentMemory> >+ <vcpu placement='static'>1</vcpu> >+ <os> >+ <type arch='i686' machine='pc'>hvm</type> >+ <boot dev='hd'/> >+ </os> >+ <features> >+ <vmcoreinfo/> >+ </features> >+ <clock offset='utc'/> >+ <on_poweroff>destroy</on_poweroff> >+ <on_reboot>restart</on_reboot> >+ <on_crash>destroy</on_crash> >+ <devices> >+ <emulator>/usr/bin/qemu-system-i686</emulator> >+ <disk type='block' device='disk'> >+ <source dev='/dev/HostVG/QEMUGuest1'/> >+ <target dev='hda' bus='ide'/> >+ <address type='drive' controller='0' bus='0' target='0' unit='0'/> >+ </disk> >+ <controller type='ide' index='0'> >+ <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/> >+ </controller> >+ <controller type='usb' index='0'> >+ <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/> >+ </controller> >+ <controller type='pci' index='0' model='pci-root'/> >+ <input type='mouse' bus='ps2'/> >+ <input type='keyboard' bus='ps2'/> >+ <memballoon model='virtio'> >+ <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> >+ </memballoon> >+ </devices> >+</domain> >diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c >index 5a282e5ff..9a7d460e5 100644 >--- a/tests/qemuxml2xmltest.c >+++ b/tests/qemuxml2xmltest.c >@@ -1260,6 +1260,7 @@ mymain(void) > DO_TEST("cpu-check-default-none2", NONE); > DO_TEST("cpu-check-default-partial", NONE); > DO_TEST("cpu-check-default-partial2", NONE); >+ DO_TEST("vmcoreinfo", NONE); > > DO_TEST("smartcard-host", NONE); > DO_TEST("smartcard-host-certificates", NONE); >-- >2.15.0.rc0.40.gaefcc5f6f > >-- >libvir-list mailing list >libvir-list@redhat.com >https://www.redhat.com/mailman/listinfo/libvir-list -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Hi ----- Original Message ----- > On Mon, Nov 06, 2017 at 01:09:09PM +0100, marcandre.lureau@redhat.com wrote: > >From: Marc-André Lureau <marcandre.lureau@redhat.com> > > > >Starting from qemu 2.11, the `-device vmcoreinfo` will create a fw_cfg > >entry for a guest to store dump details, necessary to process kernel > >dump with KASLR enabled and providing additional kernel details. > > > >Since the device is a singleton and shouldn't use additional hardware > >resources, I decided to map this to a <feature> element in the libvirt > >domain XML. Feel free to argue and decide if it is better to have it > >under <devices> instead. > > > > So is this similar to -fw_cfg name=etc/vmcoreinfo,file=X but in this case it > is > not backed by a file, but collected by QEMU itself? correct > > I'm OK with this being a feature. Should I split the commit or can I resubmit like this without RFC? Thanks > > >The device is arm/x86 only for now (targets that support fw_cfg+dma). > > > >Related to: > >https://bugzilla.redhat.com/show_bug.cgi?id=1395248 > > > >Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> > >--- > > docs/formatdomain.html.in | 4 +++ > > docs/schemas/domaincommon.rng | 5 +++ > > src/conf/domain_conf.c | 5 ++- > > src/conf/domain_conf.h | 1 + > > src/qemu/qemu_capabilities.c | 2 ++ > > src/qemu/qemu_capabilities.h | 1 + > > src/qemu/qemu_command.c | 26 +++++++++++++++ > > .../qemuxml2argvdata/qemuxml2argv-vmcoreinfo.args | 25 ++++++++++++++ > > tests/qemuxml2argvdata/qemuxml2argv-vmcoreinfo.xml | 28 ++++++++++++++++ > > tests/qemuxml2argvtest.c | 1 + > > .../qemuxml2xmlout-vmcoreinfo.xml | 38 > > ++++++++++++++++++++++ > > tests/qemuxml2xmltest.c | 1 + > > 12 files changed, 136 insertions(+), 1 deletion(-) > > create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-vmcoreinfo.args > > create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-vmcoreinfo.xml > > create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-vmcoreinfo.xml > > > >diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in > >index 92e14a919..d87a32a89 100644 > >--- a/docs/formatdomain.html.in > >+++ b/docs/formatdomain.html.in > >@@ -1878,6 +1878,10 @@ > > which is also known as a split I/O APIC mode. > > <span class="since">Since 3.4.0</span> (QEMU/KVM only) > > </dd> > >+ <dt><code>vmcoreinfo</code></dt> > >+ <dd>Enable QEMU vmcoreinfo device to let the guest kernel save debug > >+ details. <span class="since">Since 3.10.0</span> (QEMU only) > >+ </dd> > > </dl> > > > > <h3><a id="elementsTime">Time keeping</a></h3> > >diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng > >index 9cec1a063..86cbe2c8c 100644 > >--- a/docs/schemas/domaincommon.rng > >+++ b/docs/schemas/domaincommon.rng > >@@ -4736,6 +4736,11 @@ > > <optional> > > <ref name="ioapic"/> > > </optional> > >+ <optional> > >+ <element name="vmcoreinfo"> > >+ <empty/> > >+ </element> > >+ </optional> > > </interleave> > > </element> > > </optional> > >diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c > >index 400e90032..3a9b56cd2 100644 > >--- a/src/conf/domain_conf.c > >+++ b/src/conf/domain_conf.c > >@@ -148,7 +148,8 @@ VIR_ENUM_IMPL(virDomainFeature, VIR_DOMAIN_FEATURE_LAST, > > "vmport", > > "gic", > > "smm", > >- "ioapic") > >+ "ioapic", > >+ "vmcoreinfo") > > > > VIR_ENUM_IMPL(virDomainCapabilitiesPolicy, > > VIR_DOMAIN_CAPABILITIES_POLICY_LAST, > > "default", > >@@ -18710,6 +18711,7 @@ virDomainDefParseXML(xmlDocPtr xml, > > case VIR_DOMAIN_FEATURE_VIRIDIAN: > > case VIR_DOMAIN_FEATURE_PRIVNET: > > case VIR_DOMAIN_FEATURE_HYPERV: > >+ case VIR_DOMAIN_FEATURE_VMCOREINFO: > > case VIR_DOMAIN_FEATURE_KVM: > > def->features[val] = VIR_TRISTATE_SWITCH_ON; > > break; > >@@ -26052,6 +26054,7 @@ virDomainDefFormatInternal(virDomainDefPtr def, > > case VIR_DOMAIN_FEATURE_ACPI: > > case VIR_DOMAIN_FEATURE_PAE: > > case VIR_DOMAIN_FEATURE_VIRIDIAN: > >+ case VIR_DOMAIN_FEATURE_VMCOREINFO: > > case VIR_DOMAIN_FEATURE_PRIVNET: > > switch ((virTristateSwitch) def->features[i]) { > > case VIR_TRISTATE_SWITCH_ABSENT: > >diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h > >index be38792c6..add668025 100644 > >--- a/src/conf/domain_conf.h > >+++ b/src/conf/domain_conf.h > >@@ -1723,6 +1723,7 @@ typedef enum { > > VIR_DOMAIN_FEATURE_GIC, > > VIR_DOMAIN_FEATURE_SMM, > > VIR_DOMAIN_FEATURE_IOAPIC, > >+ VIR_DOMAIN_FEATURE_VMCOREINFO, > > > > VIR_DOMAIN_FEATURE_LAST > > } virDomainFeature; > >diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c > >index 7cb091056..44a2833a7 100644 > >--- a/src/qemu/qemu_capabilities.c > >+++ b/src/qemu/qemu_capabilities.c > >@@ -443,6 +443,7 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST, > > /* 270 */ > > "vxhs", > > "virtio-blk.num-queues", > >+ "vmcoreinfo", > > ); > > > > > >@@ -1670,6 +1671,7 @@ struct virQEMUCapsStringFlags virQEMUCapsObjectTypes[] > >= { > > { "pcie-root-port", QEMU_CAPS_DEVICE_PCIE_ROOT_PORT }, > > { "qemu-xhci", QEMU_CAPS_DEVICE_QEMU_XHCI }, > > { "spapr-pci-host-bridge", QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE }, > >+ { "vmcoreinfo", QEMU_CAPS_DEVICE_VMCOREINFO }, > > }; > > > > static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsVirtioBalloon[] > > = { > >diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h > >index cacc2b77e..0cd9755a8 100644 > >--- a/src/qemu/qemu_capabilities.h > >+++ b/src/qemu/qemu_capabilities.h > >@@ -429,6 +429,7 @@ typedef enum { > > /* 270 */ > > QEMU_CAPS_VXHS, /* -drive file.driver=vxhs via query-qmp-schema */ > > QEMU_CAPS_VIRTIO_BLK_NUM_QUEUES, /* virtio-blk-*.num-queues */ > >+ QEMU_CAPS_DEVICE_VMCOREINFO, /* -device vmcoreinfo */ > > > > QEMU_CAPS_LAST /* this must always be the last item */ > > } virQEMUCapsFlags; > >diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c > >index 8708b79ed..b903b27b9 100644 > >--- a/src/qemu/qemu_command.c > >+++ b/src/qemu/qemu_command.c > >@@ -9727,6 +9727,29 @@ qemuBuildTPMCommandLine(virCommandPtr cmd, > > } > > > > > >+static int > >+qemuBuildVMCoreInfoCommandLine(virCommandPtr cmd, > >+ const virDomainDef *def, > >+ virQEMUCapsPtr qemuCaps) > >+{ > >+ virTristateSwitch vmci = def->features[VIR_DOMAIN_FEATURE_VMCOREINFO]; > >+ > >+ if (vmci != VIR_TRISTATE_SWITCH_ON) { > >+ return 0; > >+ } > >+ > >+ if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VMCOREINFO)) { > >+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", > >+ _("vmcoreinfo is not available " > >+ "with this QEMU binary")); > >+ return -1; > >+ } > >+ > >+ virCommandAddArgList(cmd, "-device", "vmcoreinfo", NULL); > >+ return 0; > >+} > >+ > >+ > > static int > > qemuBuildPanicCommandLine(virCommandPtr cmd, > > const virDomainDef *def, > >@@ -10146,6 +10169,9 @@ qemuBuildCommandLine(virQEMUDriverPtr driver, > > if (qemuBuildNVRAMCommandLine(cmd, def, qemuCaps) < 0) > > goto error; > > > >+ if (qemuBuildVMCoreInfoCommandLine(cmd, def, qemuCaps) < 0) > >+ goto error; > >+ > > if (snapshot) > > virCommandAddArgList(cmd, "-loadvm", snapshot->def->name, NULL); > > > >diff --git a/tests/qemuxml2argvdata/qemuxml2argv-vmcoreinfo.args > >b/tests/qemuxml2argvdata/qemuxml2argv-vmcoreinfo.args > >new file mode 100644 > >index 000000000..772e5a071 > >--- /dev/null > >+++ b/tests/qemuxml2argvdata/qemuxml2argv-vmcoreinfo.args > >@@ -0,0 +1,25 @@ > >+LC_ALL=C \ > >+PATH=/bin \ > >+HOME=/home/test \ > >+USER=test \ > >+LOGNAME=test \ > >+QEMU_AUDIO_DRV=none \ > >+/usr/bin/qemu-system-i686 \ > >+-name QEMUGuest1 \ > >+-S \ > >+-M pc \ > >+-m 214 \ > >+-smp 1,sockets=1,cores=1,threads=1 \ > >+-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ > >+-nographic \ > >+-nodefaults \ > >+-chardev > >socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/monitor.sock,\ > >+server,nowait \ > >+-mon chardev=charmonitor,id=monitor,mode=readline \ > >+-no-acpi \ > >+-boot c \ > >+-usb \ > >+-drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-ide0-0-0 \ > >+-device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 \ > >+-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3 \ > >+-device vmcoreinfo > >diff --git a/tests/qemuxml2argvdata/qemuxml2argv-vmcoreinfo.xml > >b/tests/qemuxml2argvdata/qemuxml2argv-vmcoreinfo.xml > >new file mode 100644 > >index 000000000..f8e586531 > >--- /dev/null > >+++ b/tests/qemuxml2argvdata/qemuxml2argv-vmcoreinfo.xml > >@@ -0,0 +1,28 @@ > >+<domain type='qemu'> > >+ <name>QEMUGuest1</name> > >+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> > >+ <memory unit='KiB'>219100</memory> > >+ <currentMemory unit='KiB'>219100</currentMemory> > >+ <vcpu placement='static'>1</vcpu> > >+ <os> > >+ <type arch='i686' machine='pc'>hvm</type> > >+ <boot dev='hd'/> > >+ </os> > >+ <features> > >+ <vmcoreinfo/> > >+ </features> > >+ <clock offset='utc'/> > >+ <on_poweroff>destroy</on_poweroff> > >+ <on_reboot>restart</on_reboot> > >+ <on_crash>destroy</on_crash> > >+ <devices> > >+ <emulator>/usr/bin/qemu-system-i686</emulator> > >+ <disk type='block' device='disk'> > >+ <source dev='/dev/HostVG/QEMUGuest1'/> > >+ <target dev='hda' bus='ide'/> > >+ <address type='drive' controller='0' bus='0' target='0' unit='0'/> > >+ </disk> > >+ <controller type='ide' index='0'/> > >+ <memballoon model='virtio'/> > >+ </devices> > >+</domain> > >diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c > >index 2e07b85aa..7b9b846ef 100644 > >--- a/tests/qemuxml2argvtest.c > >+++ b/tests/qemuxml2argvtest.c > >@@ -2810,6 +2810,7 @@ mymain(void) > > DO_TEST_PARSE_ERROR("cpu-cache-emulate-l2", QEMU_CAPS_KVM); > > DO_TEST_PARSE_ERROR("cpu-cache-passthrough3", QEMU_CAPS_KVM); > > DO_TEST_PARSE_ERROR("cpu-cache-passthrough-l3", QEMU_CAPS_KVM); > >+ DO_TEST("vmcoreinfo", QEMU_CAPS_DEVICE_VMCOREINFO); > > > > DO_TEST("user-aliases", QEMU_CAPS_KVM, QEMU_CAPS_DEVICE_CIRRUS_VGA, > > QEMU_CAPS_OBJECT_MEMORY_FILE, QEMU_CAPS_PIIX_DISABLE_S3, > >diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-vmcoreinfo.xml > >b/tests/qemuxml2xmloutdata/qemuxml2xmlout-vmcoreinfo.xml > >new file mode 100644 > >index 000000000..a3922d630 > >--- /dev/null > >+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-vmcoreinfo.xml > >@@ -0,0 +1,38 @@ > >+<domain type='qemu'> > >+ <name>QEMUGuest1</name> > >+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> > >+ <memory unit='KiB'>219100</memory> > >+ <currentMemory unit='KiB'>219100</currentMemory> > >+ <vcpu placement='static'>1</vcpu> > >+ <os> > >+ <type arch='i686' machine='pc'>hvm</type> > >+ <boot dev='hd'/> > >+ </os> > >+ <features> > >+ <vmcoreinfo/> > >+ </features> > >+ <clock offset='utc'/> > >+ <on_poweroff>destroy</on_poweroff> > >+ <on_reboot>restart</on_reboot> > >+ <on_crash>destroy</on_crash> > >+ <devices> > >+ <emulator>/usr/bin/qemu-system-i686</emulator> > >+ <disk type='block' device='disk'> > >+ <source dev='/dev/HostVG/QEMUGuest1'/> > >+ <target dev='hda' bus='ide'/> > >+ <address type='drive' controller='0' bus='0' target='0' unit='0'/> > >+ </disk> > >+ <controller type='ide' index='0'> > >+ <address type='pci' domain='0x0000' bus='0x00' slot='0x01' > >function='0x1'/> > >+ </controller> > >+ <controller type='usb' index='0'> > >+ <address type='pci' domain='0x0000' bus='0x00' slot='0x01' > >function='0x2'/> > >+ </controller> > >+ <controller type='pci' index='0' model='pci-root'/> > >+ <input type='mouse' bus='ps2'/> > >+ <input type='keyboard' bus='ps2'/> > >+ <memballoon model='virtio'> > >+ <address type='pci' domain='0x0000' bus='0x00' slot='0x03' > >function='0x0'/> > >+ </memballoon> > >+ </devices> > >+</domain> > >diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c > >index 5a282e5ff..9a7d460e5 100644 > >--- a/tests/qemuxml2xmltest.c > >+++ b/tests/qemuxml2xmltest.c > >@@ -1260,6 +1260,7 @@ mymain(void) > > DO_TEST("cpu-check-default-none2", NONE); > > DO_TEST("cpu-check-default-partial", NONE); > > DO_TEST("cpu-check-default-partial2", NONE); > >+ DO_TEST("vmcoreinfo", NONE); > > > > DO_TEST("smartcard-host", NONE); > > DO_TEST("smartcard-host-certificates", NONE); > >-- > >2.15.0.rc0.40.gaefcc5f6f > > > >-- > >libvir-list mailing list > >libvir-list@redhat.com > >https://www.redhat.com/mailman/listinfo/libvir-list > -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
On Thu, Nov 16, 2017 at 09:27:52AM -0500, Marc-André Lureau wrote: >Hi > >----- Original Message ----- >> On Mon, Nov 06, 2017 at 01:09:09PM +0100, marcandre.lureau@redhat.com wrote: >> >From: Marc-André Lureau <marcandre.lureau@redhat.com> >> > >> >Starting from qemu 2.11, the `-device vmcoreinfo` will create a fw_cfg >> >entry for a guest to store dump details, necessary to process kernel >> >dump with KASLR enabled and providing additional kernel details. >> > >> >Since the device is a singleton and shouldn't use additional hardware >> >resources, I decided to map this to a <feature> element in the libvirt >> >domain XML. Feel free to argue and decide if it is better to have it >> >under <devices> instead. >> > >> >> So is this similar to -fw_cfg name=etc/vmcoreinfo,file=X but in this case it >> is >> not backed by a file, but collected by QEMU itself? > >correct > would you mind adding a tiny detail about that into the commit message? >> >> I'm OK with this being a feature. > >Should I split the commit or can I resubmit like this without RFC? > It would be nice to have this in news.xml, so if you don't mind resending with the second patch adding it to docs/news.xml, I'd be glad.-- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
© 2016 - 2025 Red Hat, Inc.