Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package qemu for openSUSE:Factory checked in at 2021-07-05 22:22:32 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/qemu (Old) and /work/SRC/openSUSE:Factory/.qemu.new.2625 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "qemu" Mon Jul 5 22:22:32 2021 rev:207 rq:903796 version:unknown Changes: -------- --- /work/SRC/openSUSE:Factory/qemu/qemu.changes 2021-06-18 10:13:35.805979215 +0200 +++ /work/SRC/openSUSE:Factory/.qemu.new.2625/qemu.changes 2021-07-05 22:22:44.913829392 +0200 @@ -1,0 +2,44 @@ +Sat Jul 3 00:14:31 UTC 2021 - Jos?? Ricardo Ziviani <[email protected]> + +- Fix qemu-supportconfig network-manager verification + +------------------------------------------------------------------- +Thu Jul 1 20:15:02 UTC 2021 - Jos?? Ricardo Ziviani <[email protected]> + +- Fix stable issues found in upstream: + hmp-Fix-loadvm-to-resume-the-VM-on-succe.patch + hw-block-nvme-align-with-existing-style.patch + hw-nvme-fix-missing-check-for-PMR-capabi.patch + hw-nvme-fix-pin-based-interrupt-behavior.patch + linux-user-aarch64-Enable-hwcap-for-RND-.patch + qemu-config-load-modules-when-instantiat.patch + qemu-config-parse-configuration-files-to.patch + qemu-config-use-qemu_opts_from_qdict.patch + runstate-Initialize-Error-to-NULL.patch + target-i386-Exit-tb-after-wrmsr.patch + tcg-Allocate-sufficient-storage-in-temp_.patch + tcg-sparc-Fix-temp_allocate_frame-vs-spa.patch + vhost-vdpa-don-t-initialize-backend_feat.patch + vl-allow-not-specifying-size-in-m-when-u.patch + vl-Fix-an-assert-failure-in-error-path.patch + vl-plug-object-back-into-readconfig.patch + vl-plumb-keyval-based-options-into-readc.patch + x86-acpi-use-offset-instead-of-pointer-w.patch + +------------------------------------------------------------------- +Thu Jul 1 19:15:34 UTC 2021 - Jos?? Ricardo Ziviani <[email protected]> + +- Update qemu-supportconfig plugin + +------------------------------------------------------------------- +Fri Jun 25 13:51:35 UTC 2021 - Jos?? Ricardo Ziviani <[email protected]> + +- Fix an update-alternative warning when removing qemu-skiboot package + bsc#1178678 + +------------------------------------------------------------------- +Wed Jun 23 21:51:52 UTC 2021 - Jos?? Ricardo Ziviani <[email protected]> + +- Use doc directive to build QEMU documentation + +------------------------------------------------------------------- New: ---- hmp-Fix-loadvm-to-resume-the-VM-on-succe.patch hw-block-nvme-align-with-existing-style.patch hw-nvme-fix-missing-check-for-PMR-capabi.patch hw-nvme-fix-pin-based-interrupt-behavior.patch linux-user-aarch64-Enable-hwcap-for-RND-.patch qemu-config-load-modules-when-instantiat.patch qemu-config-parse-configuration-files-to.patch qemu-config-use-qemu_opts_from_qdict.patch runstate-Initialize-Error-to-NULL.patch target-i386-Exit-tb-after-wrmsr.patch tcg-Allocate-sufficient-storage-in-temp_.patch tcg-sparc-Fix-temp_allocate_frame-vs-spa.patch vhost-vdpa-don-t-initialize-backend_feat.patch vl-Fix-an-assert-failure-in-error-path.patch vl-allow-not-specifying-size-in-m-when-u.patch vl-plug-object-back-into-readconfig.patch vl-plumb-keyval-based-options-into-readc.patch x86-acpi-use-offset-instead-of-pointer-w.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ qemu.spec ++++++ --- /var/tmp/diff_new_pack.1BYFaJ/_old 2021-07-05 22:22:46.973813452 +0200 +++ /var/tmp/diff_new_pack.1BYFaJ/_new 2021-07-05 22:22:46.977813421 +0200 @@ -202,6 +202,24 @@ Patch00067: vhost-user-gpu-abstract-vg_cleanup_mappi.patch Patch00068: target-sh4-Return-error-if-CPUClass-get_.patch Patch00069: tcg-arm-Fix-tcg_out_op-function-signatur.patch +Patch00070: x86-acpi-use-offset-instead-of-pointer-w.patch +Patch00071: linux-user-aarch64-Enable-hwcap-for-RND-.patch +Patch00072: target-i386-Exit-tb-after-wrmsr.patch +Patch00073: vl-allow-not-specifying-size-in-m-when-u.patch +Patch00074: qemu-config-load-modules-when-instantiat.patch +Patch00075: hmp-Fix-loadvm-to-resume-the-VM-on-succe.patch +Patch00076: qemu-config-parse-configuration-files-to.patch +Patch00077: vl-plumb-keyval-based-options-into-readc.patch +Patch00078: vl-plug-object-back-into-readconfig.patch +Patch00079: vhost-vdpa-don-t-initialize-backend_feat.patch +Patch00080: vl-Fix-an-assert-failure-in-error-path.patch +Patch00081: qemu-config-use-qemu_opts_from_qdict.patch +Patch00082: runstate-Initialize-Error-to-NULL.patch +Patch00083: tcg-sparc-Fix-temp_allocate_frame-vs-spa.patch +Patch00084: tcg-Allocate-sufficient-storage-in-temp_.patch +Patch00085: hw-block-nvme-align-with-existing-style.patch +Patch00086: hw-nvme-fix-missing-check-for-PMR-capabi.patch +Patch00087: hw-nvme-fix-pin-based-interrupt-behavior.patch # Patches applied in roms/seabios/: Patch01000: seabios-use-python2-explicitly-as-needed.patch Patch01001: seabios-switch-to-python3-as-needed.patch @@ -304,6 +322,7 @@ %ifarch x86_64 BuildRequires: pkgconfig(libpmem) %endif +BuildRequires: pkgconfig(jack) BuildRequires: pkgconfig(libpng) BuildRequires: pkgconfig(libpulse) %if 0%{?with_rbd} @@ -572,6 +591,16 @@ %description audio-pa This package contains a module for Pulse Audio based audio support for QEMU. +%package audio-jack +Summary: JACK based audio support for QEMU +Group: System/Emulators/PC +Version: %{qemuver} +Release: 0 +%{qemu_module_conflicts} + +%description audio-jack +This package contains a module for JACK based audio support for QEMU. + %package audio-spice Summary: Spice based audio support for QEMU Group: System/Emulators/PC @@ -980,6 +1009,7 @@ BuildRequires: bc BuildRequires: qemu-arm = %{qemuver} BuildRequires: qemu-audio-alsa = %{qemuver} +BuildRequires: qemu-audio-jack = %{qemuver} BuildRequires: qemu-audio-pa = %{qemuver} BuildRequires: qemu-audio-spice = %{qemuver} BuildRequires: qemu-block-curl = %{qemuver} @@ -1105,6 +1135,24 @@ %patch00067 -p1 %patch00068 -p1 %patch00069 -p1 +%patch00070 -p1 +%patch00071 -p1 +%patch00072 -p1 +%patch00073 -p1 +%patch00074 -p1 +%patch00075 -p1 +%patch00076 -p1 +%patch00077 -p1 +%patch00078 -p1 +%patch00079 -p1 +%patch00080 -p1 +%patch00081 -p1 +%patch00082 -p1 +%patch00083 -p1 +%patch00084 -p1 +%patch00085 -p1 +%patch00086 -p1 +%patch00087 -p1 %patch01000 -p1 %patch01001 -p1 %patch01002 -p1 @@ -1260,7 +1308,7 @@ --enable-slirp=system \ --enable-pie \ --enable-docs \ - --audio-drv-list="pa alsa" \ + --audio-drv-list="pa alsa jack" \ --enable-attr \ --disable-auth-pam \ --enable-bochs \ @@ -1721,14 +1769,14 @@ %endif %find_lang %name install -d -m 0755 %{buildroot}%_datadir/%name/firmware -install -d -m 0755 %{buildroot}%_libexecdir/supportconfig/plugins +install -d -m 0755 %{buildroot}/usr/lib/supportconfig/plugins install -d -m 0755 %{buildroot}%_sysconfdir/%name/firmware install -D -m 0644 %{SOURCE4} %{buildroot}%_sysconfdir/%name/bridge.conf install -D -m 0755 %{SOURCE3} %{buildroot}%_datadir/%name/qemu-ifup install -D -p -m 0644 %{SOURCE8} %{buildroot}/usr/lib/udev/rules.d/80-qemu-ga.rules install -D -m 0755 scripts/analyze-migration.py %{buildroot}%_bindir/analyze-migration.py install -D -m 0755 scripts/vmstate-static-checker.py %{buildroot}%_bindir/vmstate-static-checker.py -install -D -m 0755 %{SOURCE9} %{buildroot}%_libexecdir/supportconfig/plugins/%name +install -D -m 0755 %{SOURCE9} %{buildroot}/usr/lib/supportconfig/plugins/%name install -D -m 0644 %{SOURCE10} %{buildroot}%_docdir/qemu-arm/supported.txt install -D -m 0644 %{SOURCE11} %{buildroot}%_docdir/qemu-ppc/supported.txt install -D -m 0644 %{SOURCE12} %{buildroot}%_docdir/qemu-x86/supported.txt @@ -1854,7 +1902,7 @@ update-alternatives --install \ %{_datadir}/%name/skiboot.lid skiboot.lid %{_datadir}/%name/skiboot.lid.qemu 15 -%postun skiboot +%preun skiboot if [ ! -f %{_datadir}/%name/skiboot.lid.qemu ] ; then update-alternatives --remove skiboot.lid %{_datadir}/%name/skiboot.lid.qemu fi @@ -1897,7 +1945,7 @@ %_datadir/%name/trace-events-all %dir %_datadir/%name/vhost-user %_datadir/%name/vhost-user/50-qemu-virtiofsd.json -%dir %_docdir/%name/_static +%doc %_docdir/%name/_static %dir %_docdir/%name/devel %dir %_docdir/%name/interop %dir %_docdir/%name/specs @@ -1910,21 +1958,6 @@ %dir %_docdir/%name/tools %dir %_docdir/%name/user %_docdir/%name/.buildinfo -%_docdir/%name/_static/alabaster.css -%_docdir/%name/_static/basic.css -%_docdir/%name/_static/custom.css -%_docdir/%name/_static/doctools.js -%_docdir/%name/_static/documentation_options.js -%_docdir/%name/_static/file.png -%_docdir/%name/_static/jquery-* -%_docdir/%name/_static/jquery.js -%_docdir/%name/_static/language_data.js -%_docdir/%name/_static/minus.png -%_docdir/%name/_static/plus.png -%_docdir/%name/_static/pygments.css -%_docdir/%name/_static/searchtools.js -%_docdir/%name/_static/underscore-* -%_docdir/%name/_static/underscore.js %_docdir/%name/devel/atomics.html %_docdir/%name/devel/bitops.html %_docdir/%name/devel/block-coroutine-wrapper.html @@ -2075,9 +2108,6 @@ %_docdir/%name/tools/virtiofsd.html %_docdir/%name/user/index.html %_docdir/%name/user/main.html -%dir %_libexecdir/supportconfig -%dir %_libexecdir/supportconfig/plugins -%_libexecdir/supportconfig/plugins/%name %_mandir/man1/%name.1.gz %_mandir/man1/qemu-storage-daemon.1.gz %_mandir/man1/virtiofsd.1.gz @@ -2088,6 +2118,9 @@ %_mandir/man7/qemu-storage-daemon-qmp-ref.7.gz %dir %_sysconfdir/%name %dir %_sysconfdir/%name/firmware +%dir /usr/lib/supportconfig +%dir /usr/lib/supportconfig/plugins +/usr/lib/supportconfig/plugins/%name %if %{kvm_available} %ifarch s390x %{_prefix}/lib/modules-load.d/kvm.conf @@ -2196,6 +2229,11 @@ %dir %_libdir/%name %_libdir/%name/audio-pa.so +%files audio-jack +%defattr(-, root, root) +%dir %_libdir/%name +%_libdir/%name/audio-jack.so + %files audio-spice %defattr(-, root, root) %dir %_datadir/%name/forsplits ++++++ bundles.tar.xz ++++++ Binary files old/609d7596524ab204ccd71ef42c9eee4c7c338ea4.bundle and new/609d7596524ab204ccd71ef42c9eee4c7c338ea4.bundle differ ++++++ hmp-Fix-loadvm-to-resume-the-VM-on-succe.patch ++++++ From: Kevin Wolf <[email protected]> Date: Tue, 11 May 2021 18:31:51 +0200 Subject: hmp: Fix loadvm to resume the VM on success instead of failure Git-commit: c53cd04e70641fdf9410aac40c617d074047b3e1 Commit f61fe11aa6f broke hmp_loadvm() by adding an incorrect negation when converting from 0/-errno return values to a bool value. The result is that loadvm resumes the VM now if it failed and keeps it stopped if it failed. Fix it to restore the old behaviour and do it the other way around. Fixes: f61fe11aa6f7f8f0ffe4ddaa56a8108f3ab57854 Cc: [email protected] Reported-by: Yanhui Ma <[email protected]> Signed-off-by: Kevin Wolf <[email protected]> Message-Id: <[email protected]> Reviewed-by: Dr. David Alan Gilbert <[email protected]> Signed-off-by: Dr. David Alan Gilbert <[email protected]> Signed-off-by: Jose R. Ziviani <[email protected]> --- monitor/hmp-cmds.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c index 0ad5b774778d4634e8b506881d3f..cc15d9b6ee32264406c890b83866 100644 --- a/monitor/hmp-cmds.c +++ b/monitor/hmp-cmds.c @@ -1133,7 +1133,7 @@ void hmp_loadvm(Monitor *mon, const QDict *qdict) vm_stop(RUN_STATE_RESTORE_VM); - if (!load_snapshot(name, NULL, false, NULL, &err) && saved_vm_running) { + if (load_snapshot(name, NULL, false, NULL, &err) && saved_vm_running) { vm_start(); } hmp_handle_error(mon, err); ++++++ hw-block-nvme-align-with-existing-style.patch ++++++ From: Gollu Appalanaidu <[email protected]> Date: Fri, 16 Apr 2021 09:22:28 +0530 Subject: hw/block/nvme: align with existing style Git-commit: 312c3531bba416e589f106db8c8241fc6e7e6332 While QEMU coding style prefers lowercase hexadecimals in constants, the NVMe subsystem uses the format from the NVMe specifications in comments, i.e. 'h' suffix instead of '0x' prefix. Fix this up across the code base. Signed-off-by: Gollu Appalanaidu <[email protected]> [k.jensen: updated message; added conversion in a couple of missing comments] Signed-off-by: Klaus Jensen <[email protected]> Signed-off-by: Jose R. Ziviani <[email protected]> --- hw/block/nvme-ns.c | 2 +- hw/block/nvme.c | 67 +++++++++++++++++++++++++------------------- include/block/nvme.h | 10 +++---- 3 files changed, 44 insertions(+), 35 deletions(-) diff --git a/hw/block/nvme-ns.c b/hw/block/nvme-ns.c index 7bb618f18209d93bc0ddac6474e4..a0895614d9c36590c6969a6c3a58 100644 --- a/hw/block/nvme-ns.c +++ b/hw/block/nvme-ns.c @@ -303,7 +303,7 @@ static void nvme_ns_init_zoned(NvmeNamespace *ns) id_ns_z = g_malloc0(sizeof(NvmeIdNsZoned)); - /* MAR/MOR are zeroes-based, 0xffffffff means no limit */ + /* MAR/MOR are zeroes-based, FFFFFFFFFh means no limit */ id_ns_z->mar = cpu_to_le32(ns->params.max_active_zones - 1); id_ns_z->mor = cpu_to_le32(ns->params.max_open_zones - 1); id_ns_z->zoc = 0; diff --git a/hw/block/nvme.c b/hw/block/nvme.c index ba90053b63ed4884deb98d62b6d6..58185c8a17bfa3b84643733bc558 100644 --- a/hw/block/nvme.c +++ b/hw/block/nvme.c @@ -12,10 +12,19 @@ * Reference Specs: http://www.nvmexpress.org, 1.4, 1.3, 1.2, 1.1, 1.0e * * https://nvmexpress.org/developers/nvme-specification/ - */ - -/** - * Usage: add options: + * + * + * Notes on coding style + * --------------------- + * While QEMU coding style prefers lowercase hexadecimals in constants, the + * NVMe subsystem use thes format from the NVMe specifications in the comments + * (i.e. 'h' suffix instead of '0x' prefix). + * + * Usage + * ----- + * See docs/system/nvme.rst for extensive documentation. + * + * Add options: * -drive file=<file>,if=none,id=<drive_id> * -device nvme-subsys,id=<subsys_id>,nqn=<nqn_id> * -device nvme,serial=<serial>,id=<bus_name>, \ @@ -3618,18 +3627,18 @@ static uint16_t nvme_io_cmd(NvmeCtrl *n, NvmeRequest *req) /* * In the base NVM command set, Flush may apply to all namespaces - * (indicated by NSID being set to 0xFFFFFFFF). But if that feature is used + * (indicated by NSID being set to FFFFFFFFh). But if that feature is used * along with TP 4056 (Namespace Types), it may be pretty screwed up. * - * If NSID is indeed set to 0xFFFFFFFF, we simply cannot associate the + * If NSID is indeed set to FFFFFFFFh, we simply cannot associate the * opcode with a specific command since we cannot determine a unique I/O - * command set. Opcode 0x0 could have any other meaning than something + * command set. Opcode 0h could have any other meaning than something * equivalent to flushing and say it DOES have completely different - * semantics in some other command set - does an NSID of 0xFFFFFFFF then + * semantics in some other command set - does an NSID of FFFFFFFFh then * mean "for all namespaces, apply whatever command set specific command - * that uses the 0x0 opcode?" Or does it mean "for all namespaces, apply - * whatever command that uses the 0x0 opcode if, and only if, it allows - * NSID to be 0xFFFFFFFF"? + * that uses the 0h opcode?" Or does it mean "for all namespaces, apply + * whatever command that uses the 0h opcode if, and only if, it allows NSID + * to be FFFFFFFFh"? * * Anyway (and luckily), for now, we do not care about this since the * device only supports namespace types that includes the NVM Flush command @@ -3945,7 +3954,7 @@ static uint16_t nvme_changed_nslist(NvmeCtrl *n, uint8_t rae, uint32_t buf_len, NVME_CHANGED_NSID_SIZE) { /* * If more than 1024 namespaces, the first entry in the log page should - * be set to 0xffffffff and the others to 0 as spec. + * be set to FFFFFFFFh and the others to 0 as spec. */ if (i == ARRAY_SIZE(nslist)) { memset(nslist, 0x0, sizeof(nslist)); @@ -4343,7 +4352,7 @@ static uint16_t nvme_identify_nslist(NvmeCtrl *n, NvmeRequest *req, trace_pci_nvme_identify_nslist(min_nsid); /* - * Both 0xffffffff (NVME_NSID_BROADCAST) and 0xfffffffe are invalid values + * Both FFFFFFFFh (NVME_NSID_BROADCAST) and FFFFFFFFEh are invalid values * since the Active Namespace ID List should return namespaces with ids * *higher* than the NSID specified in the command. This is also specified * in the spec (NVM Express v1.3d, Section 5.15.4). @@ -4390,7 +4399,7 @@ static uint16_t nvme_identify_nslist_csi(NvmeCtrl *n, NvmeRequest *req, trace_pci_nvme_identify_nslist_csi(min_nsid, c->csi); /* - * Same as in nvme_identify_nslist(), 0xffffffff/0xfffffffe are invalid. + * Same as in nvme_identify_nslist(), FFFFFFFFh/FFFFFFFFEh are invalid. */ if (min_nsid >= NVME_NSID_BROADCAST - 1) { return NVME_INVALID_NSID | NVME_DNR; @@ -4457,7 +4466,7 @@ static uint16_t nvme_identify_ns_descr_list(NvmeCtrl *n, NvmeRequest *req) /* * Because the NGUID and EUI64 fields are 0 in the Identify Namespace data - * structure, a Namespace UUID (nidt = 0x3) must be reported in the + * structure, a Namespace UUID (nidt = 3h) must be reported in the * Namespace Identification Descriptor. Add the namespace UUID here. */ ns_descrs->uuid.hdr.nidt = NVME_NIDT_UUID; @@ -4606,7 +4615,7 @@ static uint16_t nvme_get_feature(NvmeCtrl *n, NvmeRequest *req) /* * The Reservation Notification Mask and Reservation Persistence * features require a status code of Invalid Field in Command when - * NSID is 0xFFFFFFFF. Since the device does not support those + * NSID is FFFFFFFFh. Since the device does not support those * features we can always return Invalid Namespace or Format as we * should do for all other features. */ @@ -4858,15 +4867,15 @@ static uint16_t nvme_set_feature(NvmeCtrl *n, NvmeRequest *req) } /* - * NVMe v1.3, Section 5.21.1.7: 0xffff is not an allowed value for NCQR + * NVMe v1.3, Section 5.21.1.7: FFFFh is not an allowed value for NCQR * and NSQR. */ if ((dw11 & 0xffff) == 0xffff || ((dw11 >> 16) & 0xffff) == 0xffff) { return NVME_INVALID_FIELD | NVME_DNR; } - trace_pci_nvme_setfeat_numq((dw11 & 0xFFFF) + 1, - ((dw11 >> 16) & 0xFFFF) + 1, + trace_pci_nvme_setfeat_numq((dw11 & 0xffff) + 1, + ((dw11 >> 16) & 0xffff) + 1, n->params.max_ioqpairs, n->params.max_ioqpairs); req->cqe.result = cpu_to_le32((n->params.max_ioqpairs - 1) | @@ -5504,7 +5513,7 @@ static void nvme_write_bar(NvmeCtrl *n, hwaddr offset, uint64_t data, n->bar.cc = data; } break; - case 0x1C: /* CSTS */ + case 0x1c: /* CSTS */ if (data & (1 << 4)) { NVME_GUEST_ERR(pci_nvme_ub_mmiowr_ssreset_w1c_unsupported, "attempted to W1C CSTS.NSSRO" @@ -5516,7 +5525,7 @@ static void nvme_write_bar(NvmeCtrl *n, hwaddr offset, uint64_t data, } break; case 0x20: /* NSSR */ - if (data == 0x4E564D65) { + if (data == 0x4e564d65) { trace_pci_nvme_ub_mmiowr_ssreset_unsupported(); } else { /* The spec says that writes of other values have no effect */ @@ -5586,11 +5595,11 @@ static void nvme_write_bar(NvmeCtrl *n, hwaddr offset, uint64_t data, n->bar.cmbmsc = (n->bar.cmbmsc & 0xffffffff) | (data << 32); return; - case 0xE00: /* PMRCAP */ + case 0xe00: /* PMRCAP */ NVME_GUEST_ERR(pci_nvme_ub_mmiowr_pmrcap_readonly, "invalid write to PMRCAP register, ignored"); return; - case 0xE04: /* PMRCTL */ + case 0xe04: /* PMRCTL */ n->bar.pmrctl = data; if (NVME_PMRCTL_EN(data)) { memory_region_set_enabled(&n->pmr.dev->mr, true); @@ -5601,19 +5610,19 @@ static void nvme_write_bar(NvmeCtrl *n, hwaddr offset, uint64_t data, n->pmr.cmse = false; } return; - case 0xE08: /* PMRSTS */ + case 0xe08: /* PMRSTS */ NVME_GUEST_ERR(pci_nvme_ub_mmiowr_pmrsts_readonly, "invalid write to PMRSTS register, ignored"); return; - case 0xE0C: /* PMREBS */ + case 0xe0C: /* PMREBS */ NVME_GUEST_ERR(pci_nvme_ub_mmiowr_pmrebs_readonly, "invalid write to PMREBS register, ignored"); return; - case 0xE10: /* PMRSWTP */ + case 0xe10: /* PMRSWTP */ NVME_GUEST_ERR(pci_nvme_ub_mmiowr_pmrswtp_readonly, "invalid write to PMRSWTP register, ignored"); return; - case 0xE14: /* PMRMSCL */ + case 0xe14: /* PMRMSCL */ if (!NVME_CAP_PMRS(n->bar.cap)) { return; } @@ -5633,7 +5642,7 @@ static void nvme_write_bar(NvmeCtrl *n, hwaddr offset, uint64_t data, } return; - case 0xE18: /* PMRMSCU */ + case 0xe18: /* PMRMSCU */ if (!NVME_CAP_PMRS(n->bar.cap)) { return; } @@ -5675,7 +5684,7 @@ static uint64_t nvme_mmio_read(void *opaque, hwaddr addr, unsigned size) * from PMRSTS should ensure prior writes * made it to persistent media */ - if (addr == 0xE08 && + if (addr == 0xe08 && (NVME_PMRCAP_PMRWBM(n->bar.pmrcap) & 0x02)) { memory_region_msync(&n->pmr.dev->mr, 0, n->pmr.dev->size); } diff --git a/include/block/nvme.h b/include/block/nvme.h index 4ac926fbc687fbbd40215b5c91ad..0739e0d6651d4c98e39e24ea2028 100644 --- a/include/block/nvme.h +++ b/include/block/nvme.h @@ -848,8 +848,8 @@ enum NvmeStatusCodes { NVME_FW_REQ_SUSYSTEM_RESET = 0x0110, NVME_NS_ALREADY_ATTACHED = 0x0118, NVME_NS_PRIVATE = 0x0119, - NVME_NS_NOT_ATTACHED = 0x011A, - NVME_NS_CTRL_LIST_INVALID = 0x011C, + NVME_NS_NOT_ATTACHED = 0x011a, + NVME_NS_CTRL_LIST_INVALID = 0x011c, NVME_CONFLICTING_ATTRS = 0x0180, NVME_INVALID_PROT_INFO = 0x0181, NVME_WRITE_TO_RO = 0x0182, @@ -1409,9 +1409,9 @@ typedef enum NvmeZoneState { NVME_ZONE_STATE_IMPLICITLY_OPEN = 0x02, NVME_ZONE_STATE_EXPLICITLY_OPEN = 0x03, NVME_ZONE_STATE_CLOSED = 0x04, - NVME_ZONE_STATE_READ_ONLY = 0x0D, - NVME_ZONE_STATE_FULL = 0x0E, - NVME_ZONE_STATE_OFFLINE = 0x0F, + NVME_ZONE_STATE_READ_ONLY = 0x0d, + NVME_ZONE_STATE_FULL = 0x0e, + NVME_ZONE_STATE_OFFLINE = 0x0f, } NvmeZoneState; static inline void _nvme_check_size(void) ++++++ hw-nvme-fix-missing-check-for-PMR-capabi.patch ++++++ From: Klaus Jensen <[email protected]> Date: Mon, 7 Jun 2021 11:47:57 +0200 Subject: hw/nvme: fix missing check for PMR capability Git-commit: 2b02aabc9d02f9e95946cf639f546bb61f1721b7 Qiang Liu reported that an access on an unknown address is triggered in memory_region_set_enabled because a check on CAP.PMRS is missing for the PMRCTL register write when no PMR is configured. Cc: [email protected] Fixes: 75c3c9de961d ("hw/block/nvme: disable PMR at boot up") Resolves: https://gitlab.com/qemu-project/qemu/-/issues/362 Signed-off-by: Klaus Jensen <[email protected]> Reviewed-by: Keith Busch <[email protected]> Signed-off-by: Jose R. Ziviani <[email protected]> --- hw/block/nvme.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/hw/block/nvme.c b/hw/block/nvme.c index 58185c8a17bfa3b84643733bc558..73f4516174776782f237193e29fc 100644 --- a/hw/block/nvme.c +++ b/hw/block/nvme.c @@ -5600,6 +5600,10 @@ static void nvme_write_bar(NvmeCtrl *n, hwaddr offset, uint64_t data, "invalid write to PMRCAP register, ignored"); return; case 0xe04: /* PMRCTL */ + if (!NVME_CAP_PMRS(n->bar.cap)) { + return; + } + n->bar.pmrctl = data; if (NVME_PMRCTL_EN(data)) { memory_region_set_enabled(&n->pmr.dev->mr, true); ++++++ hw-nvme-fix-pin-based-interrupt-behavior.patch ++++++ From: Klaus Jensen <[email protected]> Date: Thu, 17 Jun 2021 20:55:42 +0200 Subject: hw/nvme: fix pin-based interrupt behavior (again) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Git-commit: 83d7ed5c570d4c1d5163951b3057cac2ae7da4ff Jakub noticed[1] that, when using pin-based interrupts, the device will unconditionally deasssert when any CQEs are acknowledged. However, the pin should not be deasserted if other completion queues still holds unacknowledged CQEs. The bug is an artifact of commit ca247d35098d ("hw/block/nvme: fix pin-based interrupt behavior") which fixed one bug but introduced another. This is the third time someone tries to fix pin-based interrupts (see commit 5e9aa92eb1a5 ("hw/block: Fix pin-based interrupt behaviour of NVMe"))... Third time's the charm, so fix it, again, by keeping track of how many CQs have unacknowledged CQEs and only deassert when all are cleared. [1]: <[email protected]> Cc: [email protected] Fixes: ca247d35098d ("hw/block/nvme: fix pin-based interrupt behavior") Reported-by: Jakub Jerm???? <[email protected]> Signed-off-by: Klaus Jensen <[email protected]> Reviewed-by: Keith Busch <[email protected]> Signed-off-by: Jose R. Ziviani <[email protected]> --- hw/block/nvme.c | 18 +++++++++++++++++- hw/block/nvme.h | 1 + 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/hw/block/nvme.c b/hw/block/nvme.c index 73f4516174776782f237193e29fc..b63c511018ad6ca95400e5bb51ff 100644 --- a/hw/block/nvme.c +++ b/hw/block/nvme.c @@ -469,7 +469,9 @@ static void nvme_irq_deassert(NvmeCtrl *n, NvmeCQueue *cq) return; } else { assert(cq->vector < 32); - n->irq_status &= ~(1 << cq->vector); + if (!n->cq_pending) { + n->irq_status &= ~(1 << cq->vector); + } nvme_irq_check(n); } } @@ -1262,6 +1264,7 @@ static void nvme_post_cqes(void *opaque) NvmeCQueue *cq = opaque; NvmeCtrl *n = cq->ctrl; NvmeRequest *req, *next; + bool pending = cq->head != cq->tail; int ret; QTAILQ_FOREACH_SAFE(req, &cq->req_list, entry, next) { @@ -1291,6 +1294,10 @@ static void nvme_post_cqes(void *opaque) QTAILQ_INSERT_TAIL(&sq->req_list, req, entry); } if (cq->tail != cq->head) { + if (cq->irq_enabled && !pending) { + n->cq_pending++; + } + nvme_irq_assert(n, cq); } } @@ -4102,6 +4109,11 @@ static uint16_t nvme_del_cq(NvmeCtrl *n, NvmeRequest *req) trace_pci_nvme_err_invalid_del_cq_notempty(qid); return NVME_INVALID_QUEUE_DEL; } + + if (cq->irq_enabled && cq->tail != cq->head) { + n->cq_pending--; + } + nvme_irq_deassert(n, cq); trace_pci_nvme_del_cq(qid); nvme_free_cq(cq, n); @@ -5779,6 +5791,10 @@ static void nvme_process_db(NvmeCtrl *n, hwaddr addr, int val) } if (cq->tail == cq->head) { + if (cq->irq_enabled) { + n->cq_pending--; + } + nvme_irq_deassert(n, cq); } } else { diff --git a/hw/block/nvme.h b/hw/block/nvme.h index 5d05ec368f7a993f71d3d9ed9809..d216e5674dce294b318c3955a94f 100644 --- a/hw/block/nvme.h +++ b/hw/block/nvme.h @@ -171,6 +171,7 @@ typedef struct NvmeCtrl { uint32_t max_q_ents; uint8_t outstanding_aers; uint32_t irq_status; + int cq_pending; uint64_t host_timestamp; /* Timestamp sent by the host */ uint64_t timestamp_set_qemu_clock_ms; /* QEMU clock time */ uint64_t starttime_ms; ++++++ linux-user-aarch64-Enable-hwcap-for-RND-.patch ++++++ From: Richard Henderson <[email protected]> Date: Tue, 27 Apr 2021 14:41:08 -0700 Subject: linux-user/aarch64: Enable hwcap for RND, BTI, and MTE Git-commit: 68948d18224b93361e2880e2946ab268d0c650d7 These three features are already enabled by TCG, but are missing their hwcap bits. Update HWCAP2 from linux v5.12. Cc: [email protected] (for 6.0.1) Buglink: https://bugs.launchpad.net/bugs/1926044 Signed-off-by: Richard Henderson <[email protected]> Message-id: [email protected] Signed-off-by: Peter Maydell <[email protected]> Signed-off-by: Jose R. Ziviani <[email protected]> --- linux-user/elfload.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/linux-user/elfload.c b/linux-user/elfload.c index c6731013fde2a8c206be1dd8553f..fc9c4f12be92bd4eec03e9e7803f 100644 --- a/linux-user/elfload.c +++ b/linux-user/elfload.c @@ -586,6 +586,16 @@ enum { ARM_HWCAP2_A64_SVESM4 = 1 << 6, ARM_HWCAP2_A64_FLAGM2 = 1 << 7, ARM_HWCAP2_A64_FRINT = 1 << 8, + ARM_HWCAP2_A64_SVEI8MM = 1 << 9, + ARM_HWCAP2_A64_SVEF32MM = 1 << 10, + ARM_HWCAP2_A64_SVEF64MM = 1 << 11, + ARM_HWCAP2_A64_SVEBF16 = 1 << 12, + ARM_HWCAP2_A64_I8MM = 1 << 13, + ARM_HWCAP2_A64_BF16 = 1 << 14, + ARM_HWCAP2_A64_DGH = 1 << 15, + ARM_HWCAP2_A64_RNG = 1 << 16, + ARM_HWCAP2_A64_BTI = 1 << 17, + ARM_HWCAP2_A64_MTE = 1 << 18, }; #define ELF_HWCAP get_elf_hwcap() @@ -640,6 +650,9 @@ static uint32_t get_elf_hwcap2(void) GET_FEATURE_ID(aa64_dcpodp, ARM_HWCAP2_A64_DCPODP); GET_FEATURE_ID(aa64_condm_5, ARM_HWCAP2_A64_FLAGM2); GET_FEATURE_ID(aa64_frint, ARM_HWCAP2_A64_FRINT); + GET_FEATURE_ID(aa64_rndr, ARM_HWCAP2_A64_RNG); + GET_FEATURE_ID(aa64_bti, ARM_HWCAP2_A64_BTI); + GET_FEATURE_ID(aa64_mte, ARM_HWCAP2_A64_MTE); return hwcaps; } ++++++ qemu-config-load-modules-when-instantiat.patch ++++++ From: Paolo Bonzini <[email protected]> Date: Tue, 18 May 2021 09:08:17 -0400 Subject: qemu-config: load modules when instantiating option groups Git-commit: 632a8873500d27022c584256afc11e57e2418b94 Right now the SPICE module is special cased to be loaded when processing of the -spice command line option. However, the spice option group can also be brought in via -readconfig, in which case the module is not loaded. Add a generic hook to load modules that provide a QemuOpts group, and use it for the "spice" and "iscsi" groups. Fixes: #194 Fixes: https://bugs.launchpad.net/qemu/+bug/1910696 Cc: [email protected] Signed-off-by: Paolo Bonzini <[email protected]> Signed-off-by: Jose R. Ziviani <[email protected]> --- include/qemu/config-file.h | 2 +- softmmu/vl.c | 21 +++++++++++++++++---- stubs/meson.build | 1 + stubs/module-opts.c | 6 ++++++ util/qemu-config.c | 1 + 5 files changed, 26 insertions(+), 5 deletions(-) diff --git a/include/qemu/config-file.h b/include/qemu/config-file.h index 8d3e53ae4d439cb50b34f0845495..0500b3668d8042013963930d4a12 100644 --- a/include/qemu/config-file.h +++ b/include/qemu/config-file.h @@ -1,7 +1,7 @@ #ifndef QEMU_CONFIG_FILE_H #define QEMU_CONFIG_FILE_H - +void qemu_load_module_for_opts(const char *group); QemuOptsList *qemu_find_opts(const char *group); QemuOptsList *qemu_find_opts_err(const char *group, Error **errp); QemuOpts *qemu_find_opts_singleton(const char *group); diff --git a/softmmu/vl.c b/softmmu/vl.c index 1b9b067ecad6fb392bb34f61fe77..bb3e6821e844d3f87cbc628b922f 100644 --- a/softmmu/vl.c +++ b/softmmu/vl.c @@ -2614,6 +2614,23 @@ void qmp_x_exit_preconfig(Error **errp) } } +#ifdef CONFIG_MODULES +void qemu_load_module_for_opts(const char *group) +{ + static bool spice_tried; + if (g_str_equal(group, "spice") && !spice_tried) { + ui_module_load_one("spice-core"); + spice_tried = true; + } + + static bool iscsi_tried; + if (g_str_equal(group, "iscsi") && !iscsi_tried) { + block_module_load_one("iscsi"); + iscsi_tried = true; + } +} +#endif + void qemu_init(int argc, char **argv, char **envp) { QemuOpts *opts; @@ -3384,10 +3401,6 @@ void qemu_init(int argc, char **argv, char **envp) break; case QEMU_OPTION_spice: olist = qemu_find_opts_err("spice", NULL); - if (!olist) { - ui_module_load_one("spice-core"); - olist = qemu_find_opts("spice"); - } if (!olist) { error_report("spice support is disabled"); exit(1); diff --git a/stubs/meson.build b/stubs/meson.build index be6f6d609e58de2a4c4c83d9002b..5555b69103baba363483e047af06 100644 --- a/stubs/meson.build +++ b/stubs/meson.build @@ -22,6 +22,7 @@ stub_ss.add(files('isa-bus.c')) stub_ss.add(files('is-daemonized.c')) stub_ss.add(when: 'CONFIG_LINUX_AIO', if_true: files('linux-aio.c')) stub_ss.add(files('migr-blocker.c')) +stub_ss.add(files('module-opts.c')) stub_ss.add(files('monitor.c')) stub_ss.add(files('monitor-core.c')) stub_ss.add(files('pci-bus.c')) diff --git a/stubs/module-opts.c b/stubs/module-opts.c new file mode 100644 index 0000000000000000000000000000000000000000..a7d0e4ad6eada291cfd0376ff58ce5efcdb76d08 --- /dev/null +++ b/stubs/module-opts.c @@ -0,0 +1,6 @@ +#include "qemu/osdep.h" +#include "qemu/config-file.h" + +void qemu_load_module_for_opts(const char *group) +{ +} diff --git a/util/qemu-config.c b/util/qemu-config.c index 670bd6ebcaaa414137af63c62bb9..34974c4b47d61bdcefa203b1c9fc 100644 --- a/util/qemu-config.c +++ b/util/qemu-config.c @@ -16,6 +16,7 @@ static QemuOptsList *find_list(QemuOptsList **lists, const char *group, { int i; + qemu_load_module_for_opts(group); for (i = 0; lists[i] != NULL; i++) { if (strcmp(lists[i]->name, group) == 0) break; ++++++ qemu-config-parse-configuration-files-to.patch ++++++ From: Paolo Bonzini <[email protected]> Date: Mon, 24 May 2021 06:57:50 -0400 Subject: qemu-config: parse configuration files to a QDict Git-commit: 37701411397c7b7d709ae92abd347cc593940ee5 Change the parser to put the values into a QDict and pass them to a callback. qemu_config_parse's QemuOpts creation is itself turned into a callback function. This is useful for -readconfig to support keyval-based options; getting a QDict from the parser removes a roundtrip from QDict to QemuOpts and then back to QDict. Unfortunately there is a disadvantage in that semantic errors will point to the last line of the group, because the entries of the QDict do not have a location attached. Cc: Kevin Wolf <[email protected]> Cc: Markus Armbruster <[email protected]> Cc: [email protected] Signed-off-by: Paolo Bonzini <[email protected]> Message-Id: <[email protected]> Signed-off-by: Paolo Bonzini <[email protected]> Signed-off-by: Jose R. Ziviani <[email protected]> --- include/qemu/config-file.h | 7 ++- softmmu/vl.c | 4 +- util/qemu-config.c | 98 ++++++++++++++++++++++++++------------ 3 files changed, 76 insertions(+), 33 deletions(-) diff --git a/include/qemu/config-file.h b/include/qemu/config-file.h index 0500b3668d8042013963930d4a12..f6054233212a5b4735a95b5dd78e 100644 --- a/include/qemu/config-file.h +++ b/include/qemu/config-file.h @@ -1,6 +1,8 @@ #ifndef QEMU_CONFIG_FILE_H #define QEMU_CONFIG_FILE_H +typedef void QEMUConfigCB(const char *group, QDict *qdict, void *opaque, Error **errp); + void qemu_load_module_for_opts(const char *group); QemuOptsList *qemu_find_opts(const char *group); QemuOptsList *qemu_find_opts_err(const char *group, Error **errp); @@ -14,7 +16,10 @@ void qemu_config_write(FILE *fp); int qemu_config_parse(FILE *fp, QemuOptsList **lists, const char *fname, Error **errp); -int qemu_read_config_file(const char *filename, Error **errp); +/* A default callback for qemu_read_config_file(). */ +void qemu_config_do_parse(const char *group, QDict *qdict, void *opaque, Error **errp); + +int qemu_read_config_file(const char *filename, QEMUConfigCB *f, Error **errp); /* Parse QDict options as a replacement for a config file (allowing multiple enumerated (0..(n-1)) configuration "sections") */ diff --git a/softmmu/vl.c b/softmmu/vl.c index bb3e6821e844d3f87cbc628b922f..5c7e7570f627a54eb22f668dceb0 100644 --- a/softmmu/vl.c +++ b/softmmu/vl.c @@ -2120,7 +2120,7 @@ static void qemu_read_default_config_file(Error **errp) int ret; g_autofree char *file = get_relocated_path(CONFIG_QEMU_CONFDIR "/qemu.conf"); - ret = qemu_read_config_file(file, errp); + ret = qemu_read_config_file(file, qemu_config_do_parse, errp); if (ret < 0) { if (ret == -ENOENT) { error_free(*errp); @@ -3397,7 +3397,7 @@ void qemu_init(int argc, char **argv, char **envp) qemu_plugin_opt_parse(optarg, &plugin_list); break; case QEMU_OPTION_readconfig: - qemu_read_config_file(optarg, &error_fatal); + qemu_read_config_file(optarg, qemu_config_do_parse, &error_fatal); break; case QEMU_OPTION_spice: olist = qemu_find_opts_err("spice", NULL); diff --git a/util/qemu-config.c b/util/qemu-config.c index 34974c4b47d61bdcefa203b1c9fc..374f3bc4600c1c3b989638583494 100644 --- a/util/qemu-config.c +++ b/util/qemu-config.c @@ -2,6 +2,7 @@ #include "block/qdict.h" /* for qdict_extract_subqdict() */ #include "qapi/error.h" #include "qapi/qapi-commands-misc.h" +#include "qapi/qmp/qerror.h" #include "qapi/qmp/qdict.h" #include "qapi/qmp/qlist.h" #include "qemu/error-report.h" @@ -351,19 +352,19 @@ void qemu_config_write(FILE *fp) } /* Returns number of config groups on success, -errno on error */ -int qemu_config_parse(FILE *fp, QemuOptsList **lists, const char *fname, Error **errp) +static int qemu_config_foreach(FILE *fp, QEMUConfigCB *cb, void *opaque, + const char *fname, Error **errp) { - char line[1024], group[64], id[64], arg[64], value[1024]; + char line[1024], prev_group[64], group[64], arg[64], value[1024]; Location loc; - QemuOptsList *list = NULL; Error *local_err = NULL; - QemuOpts *opts = NULL; + QDict *qdict = NULL; int res = -EINVAL, lno = 0; int count = 0; loc_push_none(&loc); while (fgets(line, sizeof(line), fp) != NULL) { - loc_set_file(fname, ++lno); + ++lno; if (line[0] == '\n') { /* skip empty lines */ continue; @@ -372,39 +373,39 @@ int qemu_config_parse(FILE *fp, QemuOptsList **lists, const char *fname, Error * /* comment */ continue; } - if (sscanf(line, "[%63s \"%63[^\"]\"]", group, id) == 2) { - /* group with id */ - list = find_list(lists, group, &local_err); - if (local_err) { - error_propagate(errp, local_err); - goto out; + if (line[0] == '[') { + QDict *prev = qdict; + if (sscanf(line, "[%63s \"%63[^\"]\"]", group, value) == 2) { + qdict = qdict_new(); + qdict_put_str(qdict, "id", value); + count++; + } else if (sscanf(line, "[%63[^]]]", group) == 1) { + qdict = qdict_new(); + count++; } - opts = qemu_opts_create(list, id, 1, NULL); - count++; - continue; - } - if (sscanf(line, "[%63[^]]]", group) == 1) { - /* group without id */ - list = find_list(lists, group, &local_err); - if (local_err) { - error_propagate(errp, local_err); - goto out; + if (qdict != prev) { + if (prev) { + cb(prev_group, prev, opaque, &local_err); + qobject_unref(prev); + if (local_err) { + error_propagate(errp, local_err); + goto out; + } + } + strcpy(prev_group, group); + continue; } - opts = qemu_opts_create(list, NULL, 0, &error_abort); - count++; - continue; } + loc_set_file(fname, lno); value[0] = '\0'; if (sscanf(line, " %63s = \"%1023[^\"]\"", arg, value) == 2 || sscanf(line, " %63s = \"\"", arg) == 1) { /* arg = value */ - if (opts == NULL) { + if (qdict == NULL) { error_setg(errp, "no group defined"); goto out; } - if (!qemu_opt_set(opts, arg, value, errp)) { - goto out; - } + qdict_put_str(qdict, arg, value); continue; } error_setg(errp, "parse error"); @@ -417,11 +418,48 @@ int qemu_config_parse(FILE *fp, QemuOptsList **lists, const char *fname, Error * } res = count; out: + if (qdict) { + cb(group, qdict, opaque, errp); + qobject_unref(qdict); + } loc_pop(&loc); return res; } -int qemu_read_config_file(const char *filename, Error **errp) +void qemu_config_do_parse(const char *group, QDict *qdict, void *opaque, Error **errp) +{ + QemuOptsList **lists = opaque; + const char *id = qdict_get_try_str(qdict, "id"); + QemuOptsList *list; + QemuOpts *opts; + const QDictEntry *unrecognized; + + list = find_list(lists, group, errp); + if (!list) { + return; + } + + opts = qemu_opts_create(list, id, 1, errp); + if (!opts) { + return; + } + if (!qemu_opts_absorb_qdict(opts, qdict, errp)) { + qemu_opts_del(opts); + return; + } + unrecognized = qdict_first(qdict); + if (unrecognized) { + error_setg(errp, QERR_INVALID_PARAMETER, unrecognized->key); + qemu_opts_del(opts); + } +} + +int qemu_config_parse(FILE *fp, QemuOptsList **lists, const char *fname, Error **errp) +{ + return qemu_config_foreach(fp, qemu_config_do_parse, lists, fname, errp); +} + +int qemu_read_config_file(const char *filename, QEMUConfigCB *cb, Error **errp) { FILE *f = fopen(filename, "r"); int ret; @@ -431,7 +469,7 @@ int qemu_read_config_file(const char *filename, Error **errp) return -errno; } - ret = qemu_config_parse(f, vm_config_groups, filename, errp); + ret = qemu_config_foreach(f, cb, vm_config_groups, filename, errp); fclose(f); return ret; } ++++++ qemu-config-use-qemu_opts_from_qdict.patch ++++++ From: Paolo Bonzini <[email protected]> Date: Wed, 9 Jun 2021 14:34:35 +0200 Subject: qemu-config: use qemu_opts_from_qdict Git-commit: e7d85d955a7a3405934a104f35228aae1d338a6d Using qemu_opts_absorb_qdict, and then checking for any leftover options, is redundant because there is already a function that does the same, qemu_opts_from_qdict. qemu_opts_from_qdict consumes the whole dictionary and therefore can just return an error message if an option fails to validate. This also fixes a bug, because the "id" entry was retrieved in qemu_config_do_parse and then left there by qemu_opts_absorb_qdict. As a result, it was reported as an unrecognized option. Reported-by: Markus Armbruster <[email protected]> Reviewed-by: Markus Armbruster <[email protected]> Fixes: 3770141139 ("qemu-config: parse configuration files to a QDict") Cc: [email protected] Signed-off-by: Paolo Bonzini <[email protected]> Signed-off-by: Jose R. Ziviani <[email protected]> --- util/qemu-config.c | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/util/qemu-config.c b/util/qemu-config.c index 374f3bc4600c1c3b989638583494..84ee6dc4ea58014ad7d7ca8d83a2 100644 --- a/util/qemu-config.c +++ b/util/qemu-config.c @@ -429,29 +429,14 @@ out: void qemu_config_do_parse(const char *group, QDict *qdict, void *opaque, Error **errp) { QemuOptsList **lists = opaque; - const char *id = qdict_get_try_str(qdict, "id"); QemuOptsList *list; - QemuOpts *opts; - const QDictEntry *unrecognized; list = find_list(lists, group, errp); if (!list) { return; } - opts = qemu_opts_create(list, id, 1, errp); - if (!opts) { - return; - } - if (!qemu_opts_absorb_qdict(opts, qdict, errp)) { - qemu_opts_del(opts); - return; - } - unrecognized = qdict_first(qdict); - if (unrecognized) { - error_setg(errp, QERR_INVALID_PARAMETER, unrecognized->key); - qemu_opts_del(opts); - } + qemu_opts_from_qdict(list, qdict, errp); } int qemu_config_parse(FILE *fp, QemuOptsList **lists, const char *fname, Error **errp) ++++++ qemu-supportconfig ++++++ --- /var/tmp/diff_new_pack.1BYFaJ/_old 2021-07-05 22:22:47.393810202 +0200 +++ /var/tmp/diff_new_pack.1BYFaJ/_new 2021-07-05 22:22:47.397810171 +0200 @@ -31,7 +31,7 @@ fi else echo "package $thisrpm is not installed" - ret=1 + ret=1 fi echo return $ret @@ -56,6 +56,8 @@ # basic system information plugin_command "uname -r" plugin_command "lscpu" +plugin_command "lspci -v" +plugin_command "lsscsi" plugin_command "kvm_stat -1" plugin_command "lsmod | grep ^kvm" for MODULE in `lsmod | grep ^kvm | cut -d ' ' -f 1`; do @@ -64,14 +66,15 @@ plugin_command "ps -ef | grep qemu" # list contents of common config and image directories -plugin_command "ls -alR /var/lib/kvm/images/" +plugin_command "ls -alR /var/lib/libvirt/images/" # network-related info often useful for debugging -if [ systemctl is-enabled NetworkManager.service 2>&1 > /dev/null ]; then +nm_enabled=$(systemctl is-enabled NetworkManager.service > /dev/null 2>&1; echo $?) +if [ $nm_enabled -eq 0 ]; then echo "NOTE: NetworkManager should not be enabled on a KVM host" fi -plugin_command "route -n" -plugin_command "arp -v" +plugin_command "ip route list" +plugin_command "ip neigh list" plugin_command "ip link show type bridge" plugin_command "bridge link show" ++++++ qemu.spec.in ++++++ --- /var/tmp/diff_new_pack.1BYFaJ/_old 2021-07-05 22:22:47.425809954 +0200 +++ /var/tmp/diff_new_pack.1BYFaJ/_new 2021-07-05 22:22:47.425809954 +0200 @@ -214,6 +214,7 @@ %ifarch x86_64 BuildRequires: pkgconfig(libpmem) %endif +BuildRequires: pkgconfig(jack) BuildRequires: pkgconfig(libpng) BuildRequires: pkgconfig(libpulse) %if 0%{?with_rbd} @@ -482,6 +483,16 @@ %description audio-pa This package contains a module for Pulse Audio based audio support for QEMU. +%package audio-jack +Summary: JACK based audio support for QEMU +Group: System/Emulators/PC +Version: %{qemuver} +Release: 0 +%{qemu_module_conflicts} + +%description audio-jack +This package contains a module for JACK based audio support for QEMU. + %package audio-spice Summary: Spice based audio support for QEMU Group: System/Emulators/PC @@ -891,6 +902,7 @@ BuildRequires: qemu-arm = %{qemuver} BuildRequires: qemu-audio-alsa = %{qemuver} BuildRequires: qemu-audio-pa = %{qemuver} +BuildRequires: qemu-audio-jack = %{qemuver} BuildRequires: qemu-audio-spice = %{qemuver} BuildRequires: qemu-block-curl = %{qemuver} BuildRequires: qemu-block-dmg = %{qemuver} @@ -1081,7 +1093,7 @@ --enable-slirp=system \ --enable-pie \ --enable-docs \ - --audio-drv-list="pa alsa" \ + --audio-drv-list="pa alsa jack" \ --enable-attr \ --disable-auth-pam \ --enable-bochs \ @@ -1542,14 +1554,14 @@ %endif %find_lang %name install -d -m 0755 %{buildroot}%_datadir/%name/firmware -install -d -m 0755 %{buildroot}%_libexecdir/supportconfig/plugins +install -d -m 0755 %{buildroot}/usr/lib/supportconfig/plugins install -d -m 0755 %{buildroot}%_sysconfdir/%name/firmware install -D -m 0644 %{SOURCE4} %{buildroot}%_sysconfdir/%name/bridge.conf install -D -m 0755 %{SOURCE3} %{buildroot}%_datadir/%name/qemu-ifup install -D -p -m 0644 %{SOURCE8} %{buildroot}/usr/lib/udev/rules.d/80-qemu-ga.rules install -D -m 0755 scripts/analyze-migration.py %{buildroot}%_bindir/analyze-migration.py install -D -m 0755 scripts/vmstate-static-checker.py %{buildroot}%_bindir/vmstate-static-checker.py -install -D -m 0755 %{SOURCE9} %{buildroot}%_libexecdir/supportconfig/plugins/%name +install -D -m 0755 %{SOURCE9} %{buildroot}/usr/lib/supportconfig/plugins/%name install -D -m 0644 %{SOURCE10} %{buildroot}%_docdir/qemu-arm/supported.txt install -D -m 0644 %{SOURCE11} %{buildroot}%_docdir/qemu-ppc/supported.txt install -D -m 0644 %{SOURCE12} %{buildroot}%_docdir/qemu-x86/supported.txt @@ -1675,7 +1687,7 @@ update-alternatives --install \ %{_datadir}/%name/skiboot.lid skiboot.lid %{_datadir}/%name/skiboot.lid.qemu 15 -%postun skiboot +%preun skiboot if [ ! -f %{_datadir}/%name/skiboot.lid.qemu ] ; then update-alternatives --remove skiboot.lid %{_datadir}/%name/skiboot.lid.qemu fi @@ -1718,7 +1730,7 @@ %_datadir/%name/trace-events-all %dir %_datadir/%name/vhost-user %_datadir/%name/vhost-user/50-qemu-virtiofsd.json -%dir %_docdir/%name/_static +%doc %_docdir/%name/_static %dir %_docdir/%name/devel %dir %_docdir/%name/interop %dir %_docdir/%name/specs @@ -1731,21 +1743,6 @@ %dir %_docdir/%name/tools %dir %_docdir/%name/user %_docdir/%name/.buildinfo -%_docdir/%name/_static/alabaster.css -%_docdir/%name/_static/basic.css -%_docdir/%name/_static/custom.css -%_docdir/%name/_static/doctools.js -%_docdir/%name/_static/documentation_options.js -%_docdir/%name/_static/file.png -%_docdir/%name/_static/jquery-* -%_docdir/%name/_static/jquery.js -%_docdir/%name/_static/language_data.js -%_docdir/%name/_static/minus.png -%_docdir/%name/_static/plus.png -%_docdir/%name/_static/pygments.css -%_docdir/%name/_static/searchtools.js -%_docdir/%name/_static/underscore-* -%_docdir/%name/_static/underscore.js %_docdir/%name/devel/atomics.html %_docdir/%name/devel/bitops.html %_docdir/%name/devel/block-coroutine-wrapper.html @@ -1896,9 +1893,6 @@ %_docdir/%name/tools/virtiofsd.html %_docdir/%name/user/index.html %_docdir/%name/user/main.html -%dir %_libexecdir/supportconfig -%dir %_libexecdir/supportconfig/plugins -%_libexecdir/supportconfig/plugins/%name %_mandir/man1/%name.1.gz %_mandir/man1/qemu-storage-daemon.1.gz %_mandir/man1/virtiofsd.1.gz @@ -1909,6 +1903,9 @@ %_mandir/man7/qemu-storage-daemon-qmp-ref.7.gz %dir %_sysconfdir/%name %dir %_sysconfdir/%name/firmware +%dir /usr/lib/supportconfig +%dir /usr/lib/supportconfig/plugins +/usr/lib/supportconfig/plugins/%name %if %{kvm_available} %ifarch s390x %{_prefix}/lib/modules-load.d/kvm.conf @@ -2017,6 +2014,11 @@ %dir %_libdir/%name %_libdir/%name/audio-pa.so +%files audio-jack +%defattr(-, root, root) +%dir %_libdir/%name +%_libdir/%name/audio-jack.so + %files audio-spice %defattr(-, root, root) %dir %_datadir/%name/forsplits ++++++ runstate-Initialize-Error-to-NULL.patch ++++++ From: Peng Liang <[email protected]> Date: Thu, 10 Jun 2021 21:17:29 +0800 Subject: runstate: Initialize Error * to NULL MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Git-commit: 6e1da3d305499d3907f3c7f6638243e2e09b5085 Based on the description of error_setg(), the local variable err in qemu_init_subsystems() should be initialized to NULL. Fixes: efd7ab22fb ("vl: extract qemu_init_subsystems") Cc: [email protected] Signed-off-by: Peng Liang <[email protected]> Message-Id: <[email protected]> Reviewed-by: Daniel P. Berrang?? <[email protected]> Signed-off-by: Paolo Bonzini <[email protected]> Signed-off-by: Jose R. Ziviani <[email protected]> --- softmmu/runstate.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/softmmu/runstate.c b/softmmu/runstate.c index ce8977c6a29c939ac5890b170031..54713100c2eacc4ee616905b732d 100644 --- a/softmmu/runstate.c +++ b/softmmu/runstate.c @@ -746,7 +746,7 @@ static void qemu_run_exit_notifiers(void) void qemu_init_subsystems(void) { - Error *err; + Error *err = NULL; os_set_line_buffering(); ++++++ target-i386-Exit-tb-after-wrmsr.patch ++++++ From: Richard Henderson <[email protected]> Date: Fri, 14 May 2021 10:13:37 -0500 Subject: target/i386: Exit tb after wrmsr Git-commit: 244843b757220c432e0e9ae8d2210218c034730d At minimum, wrmsr can change efer, which affects HF_LMA. Cc: [email protected] Signed-off-by: Richard Henderson <[email protected]> Reviewed-by: Paolo Bonzini <[email protected]> Message-Id: <[email protected]> Signed-off-by: Jose R. Ziviani <[email protected]> --- target/i386/tcg/translate.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index 880bc455612aa9757a065723206e..6b713b4fff7c466bd864d4af5792 100644 --- a/target/i386/tcg/translate.c +++ b/target/i386/tcg/translate.c @@ -7198,6 +7198,8 @@ static target_ulong disas_insn(DisasContext *s, CPUState *cpu) gen_helper_rdmsr(cpu_env); } else { gen_helper_wrmsr(cpu_env); + gen_jmp_im(s, s->pc - s->cs_base); + gen_eob(s); } } break; ++++++ tcg-Allocate-sufficient-storage-in-temp_.patch ++++++ From: Richard Henderson <[email protected]> Date: Fri, 18 Jun 2021 21:53:27 -0700 Subject: tcg: Allocate sufficient storage in temp_allocate_frame MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Git-commit: c1c091948ae4a73c1a80b5005f6204d0e665ce52 This function should have been updated for vector types when they were introduced. Fixes: d2fd745fe8b Resolves: https://gitlab.com/qemu-project/qemu/-/issues/367 Cc: [email protected] Tested-by: Stefan Weil <[email protected]> Reviewed-by: Philippe Mathieu-Daud?? <[email protected]> Signed-off-by: Richard Henderson <[email protected]> Signed-off-by: Jose R. Ziviani <[email protected]> --- tcg/tcg.c | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/tcg/tcg.c b/tcg/tcg.c index a9cf55531e2b9ae06d5d852cc563..21d65969beb7cc4d34c2b321c7b3 100644 --- a/tcg/tcg.c +++ b/tcg/tcg.c @@ -3489,17 +3489,38 @@ static void check_regs(TCGContext *s) static void temp_allocate_frame(TCGContext *s, TCGTemp *ts) { - if (s->current_frame_offset + (tcg_target_long)sizeof(tcg_target_long) > - s->frame_end) { - tcg_abort(); + intptr_t off, size, align; + + switch (ts->type) { + case TCG_TYPE_I32: + size = align = 4; + break; + case TCG_TYPE_I64: + case TCG_TYPE_V64: + size = align = 8; + break; + case TCG_TYPE_V128: + size = align = 16; + break; + case TCG_TYPE_V256: + /* Note that we do not require aligned storage for V256. */ + size = 32, align = 16; + break; + default: + g_assert_not_reached(); } - ts->mem_offset = s->current_frame_offset; + + assert(align <= TCG_TARGET_STACK_ALIGN); + off = ROUND_UP(s->current_frame_offset, align); + assert(off + size <= s->frame_end); + s->current_frame_offset = off + size; + + ts->mem_offset = off; #if defined(__sparc__) ts->mem_offset += TCG_TARGET_STACK_BIAS; #endif ts->mem_base = s->frame_temp; ts->mem_allocated = 1; - s->current_frame_offset += sizeof(tcg_target_long); } static void temp_load(TCGContext *, TCGTemp *, TCGRegSet, TCGRegSet, TCGRegSet); ++++++ tcg-sparc-Fix-temp_allocate_frame-vs-spa.patch ++++++ From: Richard Henderson <[email protected]> Date: Fri, 18 Jun 2021 16:49:26 -0700 Subject: tcg/sparc: Fix temp_allocate_frame vs sparc stack bias MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Git-commit: 9defd1bdfb0f2ddb3ca9863e39577f3a9929d58c We should not be aligning the offset in temp_allocate_frame, because the odd offset produces an aligned address in the end. Instead, pass the logical offset into tcg_set_frame and add the stack bias last. Cc: [email protected] Reviewed-by: Philippe Mathieu-Daud?? <[email protected]> Signed-off-by: Richard Henderson <[email protected]> Signed-off-by: Jose R. Ziviani <[email protected]> --- tcg/sparc/tcg-target.c.inc | 16 ++++++++++------ tcg/tcg.c | 9 +++------ 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/tcg/sparc/tcg-target.c.inc b/tcg/sparc/tcg-target.c.inc index 3d50f985c6cde71a5d2928db1f4f..c046d1cc6098c0a148fde7a8d7a9 100644 --- a/tcg/sparc/tcg-target.c.inc +++ b/tcg/sparc/tcg-target.c.inc @@ -987,14 +987,18 @@ static void tcg_target_qemu_prologue(TCGContext *s) { int tmp_buf_size, frame_size; - /* The TCG temp buffer is at the top of the frame, immediately - below the frame pointer. */ + /* + * The TCG temp buffer is at the top of the frame, immediately + * below the frame pointer. Use the logical (aligned) offset here; + * the stack bias is applied in temp_allocate_frame(). + */ tmp_buf_size = CPU_TEMP_BUF_NLONGS * (int)sizeof(long); - tcg_set_frame(s, TCG_REG_I6, TCG_TARGET_STACK_BIAS - tmp_buf_size, - tmp_buf_size); + tcg_set_frame(s, TCG_REG_I6, -tmp_buf_size, tmp_buf_size); - /* TCG_TARGET_CALL_STACK_OFFSET includes the stack bias, but is - otherwise the minimal frame usable by callees. */ + /* + * TCG_TARGET_CALL_STACK_OFFSET includes the stack bias, but is + * otherwise the minimal frame usable by callees. + */ frame_size = TCG_TARGET_CALL_STACK_OFFSET - TCG_TARGET_STACK_BIAS; frame_size += TCG_STATIC_CALL_ARGS_SIZE + tmp_buf_size; frame_size += TCG_TARGET_STACK_ALIGN - 1; diff --git a/tcg/tcg.c b/tcg/tcg.c index 1fbe0b686d57361ed698c4ab5e5c..a9cf55531e2b9ae06d5d852cc563 100644 --- a/tcg/tcg.c +++ b/tcg/tcg.c @@ -3489,17 +3489,14 @@ static void check_regs(TCGContext *s) static void temp_allocate_frame(TCGContext *s, TCGTemp *ts) { -#if !(defined(__sparc__) && TCG_TARGET_REG_BITS == 64) - /* Sparc64 stack is accessed with offset of 2047 */ - s->current_frame_offset = (s->current_frame_offset + - (tcg_target_long)sizeof(tcg_target_long) - 1) & - ~(sizeof(tcg_target_long) - 1); -#endif if (s->current_frame_offset + (tcg_target_long)sizeof(tcg_target_long) > s->frame_end) { tcg_abort(); } ts->mem_offset = s->current_frame_offset; +#if defined(__sparc__) + ts->mem_offset += TCG_TARGET_STACK_BIAS; +#endif ts->mem_base = s->frame_temp; ts->mem_allocated = 1; s->current_frame_offset += sizeof(tcg_target_long); ++++++ vhost-vdpa-don-t-initialize-backend_feat.patch ++++++ From: Jason Wang <[email protected]> Date: Wed, 2 Jun 2021 11:31:26 +0800 Subject: vhost-vdpa: don't initialize backend_features Git-commit: c33f23a419f95da16ab4faaf08be635c89b96ff0 We used to initialize backend_features during vhost_vdpa_init() regardless whether or not it was supported by vhost. This will lead the unsupported features like VIRTIO_F_IN_ORDER to be included and set to the vhost-vdpa during vhost_dev_start. Because the VIRTIO_F_IN_ORDER is not supported by vhost-vdpa so it won't be advertised to guest which will break the datapath. Fix this by not initializing the backend_features, so the acked_features could be built only from guest features via vhost_net_ack_features(). Fixes: 108a64818e69b ("vhost-vdpa: introduce vhost-vdpa backend") Cc: [email protected] Cc: Gautam Dawar <[email protected]> Signed-off-by: Jason Wang <[email protected]> Signed-off-by: Jose R. Ziviani <[email protected]> --- hw/virtio/vhost-vdpa.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/hw/virtio/vhost-vdpa.c b/hw/virtio/vhost-vdpa.c index 01d2101d0976fdd8e407a32ec9db..5fe43a4eb5c48148085b62901ff6 100644 --- a/hw/virtio/vhost-vdpa.c +++ b/hw/virtio/vhost-vdpa.c @@ -275,15 +275,12 @@ static void vhost_vdpa_add_status(struct vhost_dev *dev, uint8_t status) static int vhost_vdpa_init(struct vhost_dev *dev, void *opaque) { struct vhost_vdpa *v; - uint64_t features; assert(dev->vhost_ops->backend_type == VHOST_BACKEND_TYPE_VDPA); trace_vhost_vdpa_init(dev, opaque); v = opaque; v->dev = dev; dev->opaque = opaque ; - vhost_vdpa_call(dev, VHOST_GET_FEATURES, &features); - dev->backend_features = features; v->listener = vhost_vdpa_memory_listener; v->msg_type = VHOST_IOTLB_MSG_V2; ++++++ vl-Fix-an-assert-failure-in-error-path.patch ++++++ From: Zhenzhong Duan <[email protected]> Date: Thu, 10 Jun 2021 16:47:41 +0800 Subject: vl: Fix an assert failure in error path Git-commit: 38f71349c7c4969bc14da4da1c70b8cc4078d596 Based on the description of error_setg(), the local variable err in qemu_maybe_daemonize() should be initialized to NULL. Without fix, the uninitialized *errp triggers assert failure which doesn't show much valuable information. Before the fix: qemu-system-x86_64: ../util/error.c:59: error_setv: Assertion `*errp == NULL' failed. After fix: qemu-system-x86_64: cannot create PID file: Cannot open pid file: Permission denied Signed-off-by: Zhenzhong Duan <[email protected]> Message-Id: <[email protected]> Cc: [email protected] Fixes: 0546c0609c ("vl: split various early command line options to a separate function", 2020-12-10) Signed-off-by: Paolo Bonzini <[email protected]> Signed-off-by: Jose R. Ziviani <[email protected]> --- softmmu/vl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/softmmu/vl.c b/softmmu/vl.c index 8cb68f21b9f2a5cf159295169ed0..8a0ab39d81b1108826526bf3fc9a 100644 --- a/softmmu/vl.c +++ b/softmmu/vl.c @@ -2509,7 +2509,7 @@ static void qemu_process_help_options(void) static void qemu_maybe_daemonize(const char *pid_file) { - Error *err; + Error *err = NULL; os_daemonize(); rcu_disable_atfork(); ++++++ vl-allow-not-specifying-size-in-m-when-u.patch ++++++ From: Paolo Bonzini <[email protected]> Date: Mon, 17 May 2021 10:13:01 -0400 Subject: vl: allow not specifying size in -m when using -M memory-backend Git-commit: d349f92f78d26db2805ca39a7745cc70affea021 Starting in QEMU 6.0's commit f5c9fcb82d ("vl: separate qemu_create_machine", 2020-12-10), a function have_custom_ram_size() replaced the return value of set_memory_options(). The purpose of the return value was to record the presence of "-m size", and if it was not there, change the default RAM size to the size of the memory backend passed with "-M memory-backend". With that commit, however, have_custom_ram_size() is now queried only after set_memory_options has stored the fixed-up RAM size in QemuOpts for "future use". This was actually the only future use of the fixed-up RAM size, so remove that code and fix the bug. Cc: [email protected] Fixes: f5c9fcb82d ("vl: separate qemu_create_machine", 2020-12-10) Signed-off-by: Paolo Bonzini <[email protected]> Signed-off-by: Jose R. Ziviani <[email protected]> --- softmmu/vl.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/softmmu/vl.c b/softmmu/vl.c index 07ade8e5ccd2934a69b82bcaabae..1b9b067ecad6fb392bb34f61fe77 100644 --- a/softmmu/vl.c +++ b/softmmu/vl.c @@ -2026,8 +2026,6 @@ static void set_memory_options(MachineClass *mc) exit(EXIT_FAILURE); } - /* store value for the future use */ - qemu_opt_set_number(opts, "size", ram_size, &error_abort); maxram_size = ram_size; if (qemu_opt_get(opts, "maxmem")) { ++++++ vl-plug-object-back-into-readconfig.patch ++++++ From: Paolo Bonzini <[email protected]> Date: Mon, 24 May 2021 06:57:52 -0400 Subject: vl: plug -object back into -readconfig Git-commit: 49e987695a1873a769a823604f9065aa88e00c55 Commit bc2f4fcb1d ("qom: move user_creatable_add_opts logic to vl.c and QAPIfy it", 2021-03-19) switched the creation of objects from qemu_opts_foreach to a bespoke QTAILQ in preparation for supporting JSON syntax in -object. Unfortunately in doing so it lost support for [object] stanzas in configuration files and also for "-set object.ID.KEY=VAL". The latter is hard to re-establish and probably best solved by deprecating -set. This patch uses the infrastructure introduced by the previous two patches in order to parse QOM objects correctly from configuration files. Cc: Markus Armbruster <[email protected]> Cc: [email protected] Reviewed-by: Kevin Wolf <[email protected]> Signed-off-by: Paolo Bonzini <[email protected]> Message-Id: <[email protected]> Signed-off-by: Paolo Bonzini <[email protected]> Signed-off-by: Jose R. Ziviani <[email protected]> --- softmmu/vl.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/softmmu/vl.c b/softmmu/vl.c index 4cdbe9232a6429b6f9a195336149..8cb68f21b9f2a5cf159295169ed0 100644 --- a/softmmu/vl.c +++ b/softmmu/vl.c @@ -1710,9 +1710,15 @@ static void object_option_foreach_add(bool (*type_opt_predicate)(const char *)) } } +static void object_option_add_visitor(Visitor *v) +{ + ObjectOption *opt = g_new0(ObjectOption, 1); + visit_type_ObjectOptions(v, NULL, &opt->opts, &error_fatal); + QTAILQ_INSERT_TAIL(&object_opts, opt, next); +} + static void object_option_parse(const char *optarg) { - ObjectOption *opt; QemuOpts *opts; const char *type; Visitor *v; @@ -1740,11 +1746,8 @@ static void object_option_parse(const char *optarg) v = opts_visitor_new(opts); } - opt = g_new0(ObjectOption, 1); - visit_type_ObjectOptions(v, NULL, &opt->opts, &error_fatal); + object_option_add_visitor(v); visit_free(v); - - QTAILQ_INSERT_TAIL(&object_opts, opt, next); } /* @@ -2121,13 +2124,22 @@ static int global_init_func(void *opaque, QemuOpts *opts, Error **errp) */ static bool is_qemuopts_group(const char *group) { + if (g_str_equal(group, "object")) { + return false; + } return true; } static void qemu_record_config_group(const char *group, QDict *dict, bool from_json, Error **errp) { - abort(); + if (g_str_equal(group, "object")) { + Visitor *v = qobject_input_visitor_new_keyval(QOBJECT(dict)); + object_option_add_visitor(v); + visit_free(v); + } else { + abort(); + } } /* ++++++ vl-plumb-keyval-based-options-into-readc.patch ++++++ From: Paolo Bonzini <[email protected]> Date: Mon, 24 May 2021 06:57:51 -0400 Subject: vl: plumb keyval-based options into -readconfig Git-commit: c0d4aa82f895af67cbf7772324e05605e22b4162 Let -readconfig support parsing command line options into QDict or QemuOpts. This will be used to add back support for objects in -readconfig. Cc: Markus Armbruster <[email protected]> Cc: [email protected] Reviewed-by: Kevin Wolf <[email protected]> Signed-off-by: Paolo Bonzini <[email protected]> Message-Id: <[email protected]> Signed-off-by: Paolo Bonzini <[email protected]> Signed-off-by: Jose R. Ziviani <[email protected]> --- include/block/qdict.h | 2 - include/qapi/qmp/qdict.h | 3 ++ softmmu/vl.c | 83 ++++++++++++++++++++++++++++------------ 3 files changed, 62 insertions(+), 26 deletions(-) diff --git a/include/block/qdict.h b/include/block/qdict.h index d8cb502d7db3d687eb4701804db0..ced2acfb92a080d9fc4ad52517fa 100644 --- a/include/block/qdict.h +++ b/include/block/qdict.h @@ -20,8 +20,6 @@ void qdict_join(QDict *dest, QDict *src, bool overwrite); void qdict_extract_subqdict(QDict *src, QDict **dst, const char *start); void qdict_array_split(QDict *src, QList **dst); int qdict_array_entries(QDict *src, const char *subqdict); -QObject *qdict_crumple(const QDict *src, Error **errp); -void qdict_flatten(QDict *qdict); typedef struct QDictRenames { const char *from; diff --git a/include/qapi/qmp/qdict.h b/include/qapi/qmp/qdict.h index 9934539c1b73590e626ab8adc774..d5b5430e21a90afdf93a5e46df72 100644 --- a/include/qapi/qmp/qdict.h +++ b/include/qapi/qmp/qdict.h @@ -64,4 +64,7 @@ const char *qdict_get_try_str(const QDict *qdict, const char *key); QDict *qdict_clone_shallow(const QDict *src); +QObject *qdict_crumple(const QDict *src, Error **errp); +void qdict_flatten(QDict *qdict); + #endif /* QDICT_H */ diff --git a/softmmu/vl.c b/softmmu/vl.c index 5c7e7570f627a54eb22f668dceb0..4cdbe9232a6429b6f9a195336149 100644 --- a/softmmu/vl.c +++ b/softmmu/vl.c @@ -123,6 +123,7 @@ #include "qapi/qapi-commands-misc.h" #include "qapi/qapi-visit-qom.h" #include "qapi/qapi-commands-ui.h" +#include "qapi/qmp/qdict.h" #include "qapi/qmp/qerror.h" #include "sysemu/iothread.h" #include "qemu/guest-random.h" @@ -2114,13 +2115,53 @@ static int global_init_func(void *opaque, QemuOpts *opts, Error **errp) return 0; } +/* + * Return whether configuration group @group is stored in QemuOpts, or + * recorded as one or more QDicts by qemu_record_config_group. + */ +static bool is_qemuopts_group(const char *group) +{ + return true; +} + +static void qemu_record_config_group(const char *group, QDict *dict, + bool from_json, Error **errp) +{ + abort(); +} + +/* + * Parse non-QemuOpts config file groups, pass the rest to + * qemu_config_do_parse. + */ +static void qemu_parse_config_group(const char *group, QDict *qdict, + void *opaque, Error **errp) +{ + QObject *crumpled; + if (is_qemuopts_group(group)) { + qemu_config_do_parse(group, qdict, opaque, errp); + return; + } + + crumpled = qdict_crumple(qdict, errp); + if (!crumpled) { + return; + } + if (qobject_type(crumpled) != QTYPE_QDICT) { + assert(qobject_type(crumpled) == QTYPE_QLIST); + error_setg(errp, "Lists cannot be at top level of a configuration section"); + return; + } + qemu_record_config_group(group, qobject_to(QDict, crumpled), false, errp); +} + static void qemu_read_default_config_file(Error **errp) { ERRP_GUARD(); int ret; g_autofree char *file = get_relocated_path(CONFIG_QEMU_CONFDIR "/qemu.conf"); - ret = qemu_read_config_file(file, qemu_config_do_parse, errp); + ret = qemu_read_config_file(file, qemu_parse_config_group, errp); if (ret < 0) { if (ret == -ENOENT) { error_free(*errp); @@ -2129,9 +2170,8 @@ static void qemu_read_default_config_file(Error **errp) } } -static int qemu_set_option(const char *str) +static void qemu_set_option(const char *str, Error **errp) { - Error *local_err = NULL; char group[64], id[64], arg[64]; QemuOptsList *list; QemuOpts *opts; @@ -2139,27 +2179,23 @@ static int qemu_set_option(const char *str) rc = sscanf(str, "%63[^.].%63[^.].%63[^=]%n", group, id, arg, &offset); if (rc < 3 || str[offset] != '=') { - error_report("can't parse: \"%s\"", str); - return -1; + error_setg(errp, "can't parse: \"%s\"", str); + return; } - list = qemu_find_opts(group); - if (list == NULL) { - return -1; + if (!is_qemuopts_group(group)) { + error_setg(errp, "-set is not supported with %s", group); + } else { + list = qemu_find_opts_err(group, errp); + if (list) { + opts = qemu_opts_find(list, id); + if (!opts) { + error_setg(errp, "there is no %s \"%s\" defined", group, id); + return; + } + qemu_opt_set(opts, arg, str + offset + 1, errp); + } } - - opts = qemu_opts_find(list, id); - if (!opts) { - error_report("there is no %s \"%s\" defined", - list->name, id); - return -1; - } - - if (!qemu_opt_set(opts, arg, str + offset + 1, &local_err)) { - error_report_err(local_err); - return -1; - } - return 0; } static void user_register_global_props(void) @@ -2764,8 +2800,7 @@ void qemu_init(int argc, char **argv, char **envp) } break; case QEMU_OPTION_set: - if (qemu_set_option(optarg) != 0) - exit(1); + qemu_set_option(optarg, &error_fatal); break; case QEMU_OPTION_global: if (qemu_global_option(optarg) != 0) @@ -3397,7 +3432,7 @@ void qemu_init(int argc, char **argv, char **envp) qemu_plugin_opt_parse(optarg, &plugin_list); break; case QEMU_OPTION_readconfig: - qemu_read_config_file(optarg, qemu_config_do_parse, &error_fatal); + qemu_read_config_file(optarg, qemu_parse_config_group, &error_fatal); break; case QEMU_OPTION_spice: olist = qemu_find_opts_err("spice", NULL); ++++++ x86-acpi-use-offset-instead-of-pointer-w.patch ++++++ From: Igor Mammedov <[email protected]> Date: Wed, 14 Apr 2021 04:43:56 -0400 Subject: x86: acpi: use offset instead of pointer when using build_header() Git-commit: bb9feea43179ef8aba2c0a9cc1e670cb049ba90e Do the same as in commit (4d027afeb3a97 Virt: ACPI: fix qemu assert due to re-assigned table data address) for remaining tables that happen to use saved at the beginning pointer to build header to avoid assert when table_data is relocated due to implicit re-size. In this case user is trying to start Windows 10 and getting assert at hw/acpi/bios-linker-loader.c:239: bios_linker_loader_add_checksum: Assertion `start_offset < file->blob->len' failed. Fixes: https://bugs.launchpad.net/bugs/1923497 Signed-off-by: Igor Mammedov <[email protected]> Message-Id: <[email protected]> Cc: [email protected], [email protected] Reviewed-by: Michael S. Tsirkin <[email protected]> Signed-off-by: Michael S. Tsirkin <[email protected]> Signed-off-by: Jose R. Ziviani <[email protected]> --- hw/acpi/aml-build.c | 15 +++++++++------ hw/i386/acpi-build.c | 8 ++++++-- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c index d33ce8954aa6b51788c443e5c6a9..f0035d2b4a183363e0b162b2e5b0 100644 --- a/hw/acpi/aml-build.c +++ b/hw/acpi/aml-build.c @@ -1830,6 +1830,7 @@ build_rsdt(GArray *table_data, BIOSLinker *linker, GArray *table_offsets, int i; unsigned rsdt_entries_offset; AcpiRsdtDescriptorRev1 *rsdt; + int rsdt_start = table_data->len; const unsigned table_data_len = (sizeof(uint32_t) * table_offsets->len); const unsigned rsdt_entry_size = sizeof(rsdt->table_offset_entry[0]); const size_t rsdt_len = sizeof(*rsdt) + table_data_len; @@ -1846,7 +1847,8 @@ build_rsdt(GArray *table_data, BIOSLinker *linker, GArray *table_offsets, ACPI_BUILD_TABLE_FILE, ref_tbl_offset); } build_header(linker, table_data, - (void *)rsdt, "RSDT", rsdt_len, 1, oem_id, oem_table_id); + (void *)(table_data->data + rsdt_start), + "RSDT", rsdt_len, 1, oem_id, oem_table_id); } /* Build xsdt table */ @@ -1857,6 +1859,7 @@ build_xsdt(GArray *table_data, BIOSLinker *linker, GArray *table_offsets, int i; unsigned xsdt_entries_offset; AcpiXsdtDescriptorRev2 *xsdt; + int xsdt_start = table_data->len; const unsigned table_data_len = (sizeof(uint64_t) * table_offsets->len); const unsigned xsdt_entry_size = sizeof(xsdt->table_offset_entry[0]); const size_t xsdt_len = sizeof(*xsdt) + table_data_len; @@ -1873,7 +1876,8 @@ build_xsdt(GArray *table_data, BIOSLinker *linker, GArray *table_offsets, ACPI_BUILD_TABLE_FILE, ref_tbl_offset); } build_header(linker, table_data, - (void *)xsdt, "XSDT", xsdt_len, 1, oem_id, oem_table_id); + (void *)(table_data->data + xsdt_start), + "XSDT", xsdt_len, 1, oem_id, oem_table_id); } void build_srat_memory(AcpiSratMemoryAffinity *numamem, uint64_t base, @@ -2053,10 +2057,9 @@ void build_tpm2(GArray *table_data, BIOSLinker *linker, GArray *tcpalog, uint64_t control_area_start_address; TPMIf *tpmif = tpm_find(); uint32_t start_method; - void *tpm2_ptr; tpm2_start = table_data->len; - tpm2_ptr = acpi_data_push(table_data, sizeof(AcpiTableHeader)); + acpi_data_push(table_data, sizeof(AcpiTableHeader)); /* Platform Class */ build_append_int_noprefix(table_data, TPM2_ACPI_CLASS_CLIENT, 2); @@ -2095,8 +2098,8 @@ void build_tpm2(GArray *table_data, BIOSLinker *linker, GArray *tcpalog, log_addr_offset, 8, ACPI_BUILD_TPMLOG_FILE, 0); build_header(linker, table_data, - tpm2_ptr, "TPM2", table_data->len - tpm2_start, 4, oem_id, - oem_table_id); + (void *)(table_data->data + tpm2_start), + "TPM2", table_data->len - tpm2_start, 4, oem_id, oem_table_id); } Aml *build_crs(PCIHostState *host, CrsRangeSet *range_set, uint32_t io_offset, diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c index de98750aeff6bdec266a85c38357..daaf8f473e99ca28f03360f4ff7a 100644 --- a/hw/i386/acpi-build.c +++ b/hw/i386/acpi-build.c @@ -1816,6 +1816,7 @@ build_hpet(GArray *table_data, BIOSLinker *linker, const char *oem_id, const char *oem_table_id) { Acpi20Hpet *hpet; + int hpet_start = table_data->len; hpet = acpi_data_push(table_data, sizeof(*hpet)); /* Note timer_block_id value must be kept in sync with value advertised by @@ -1824,13 +1825,15 @@ build_hpet(GArray *table_data, BIOSLinker *linker, const char *oem_id, hpet->timer_block_id = cpu_to_le32(0x8086a201); hpet->addr.address = cpu_to_le64(HPET_BASE); build_header(linker, table_data, - (void *)hpet, "HPET", sizeof(*hpet), 1, oem_id, oem_table_id); + (void *)(table_data->data + hpet_start), + "HPET", sizeof(*hpet), 1, oem_id, oem_table_id); } static void build_tpm_tcpa(GArray *table_data, BIOSLinker *linker, GArray *tcpalog, const char *oem_id, const char *oem_table_id) { + int tcpa_start = table_data->len; Acpi20Tcpa *tcpa = acpi_data_push(table_data, sizeof *tcpa); unsigned log_addr_size = sizeof(tcpa->log_area_start_address); unsigned log_addr_offset = @@ -1849,7 +1852,8 @@ build_tpm_tcpa(GArray *table_data, BIOSLinker *linker, GArray *tcpalog, ACPI_BUILD_TPMLOG_FILE, 0); build_header(linker, table_data, - (void *)tcpa, "TCPA", sizeof(*tcpa), 2, oem_id, oem_table_id); + (void *)(table_data->data + tcpa_start), + "TCPA", sizeof(*tcpa), 2, oem_id, oem_table_id); } #define HOLE_640K_START (640 * KiB)
