Accepting request 903710 from home:jziviani:branches:Virtualization
- 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 - Update qemu-supportconfig plugin - Fix an update-alternative warning when removing qemu-skiboot package bsc#1178678 OBS-URL: https://build.opensuse.org/request/show/903710 OBS-URL: https://build.opensuse.org/package/show/Virtualization/qemu?expand=0&rev=660
This commit is contained in:
parent
3a904253e8
commit
eb86ba78e5
@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:5b6d904ec52cc144da72b58e2a01929d6b9d57987c49d265d2c92ba5785c3adb
|
||||
size 49932
|
||||
oid sha256:14c73ceb03c53d00c3e40c4274d169800e2d03a9c3b22c3c5553b261ee61818e
|
||||
size 73624
|
||||
|
37
hmp-Fix-loadvm-to-resume-the-VM-on-succe.patch
Normal file
37
hmp-Fix-loadvm-to-resume-the-VM-on-succe.patch
Normal file
@ -0,0 +1,37 @@
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
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: qemu-stable@nongnu.org
|
||||
Reported-by: Yanhui Ma <yama@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-Id: <20210511163151.45167-1-kwolf@redhat.com>
|
||||
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
Signed-off-by: Jose R. Ziviani <jziviani@suse.de>
|
||||
---
|
||||
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);
|
255
hw-block-nvme-align-with-existing-style.patch
Normal file
255
hw-block-nvme-align-with-existing-style.patch
Normal file
@ -0,0 +1,255 @@
|
||||
From: Gollu Appalanaidu <anaidu.gollu@samsung.com>
|
||||
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 <anaidu.gollu@samsung.com>
|
||||
[k.jensen: updated message; added conversion in a couple of missing comments]
|
||||
Signed-off-by: Klaus Jensen <k.jensen@samsung.com>
|
||||
Signed-off-by: Jose R. Ziviani <jziviani@suse.de>
|
||||
---
|
||||
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)
|
35
hw-nvme-fix-missing-check-for-PMR-capabi.patch
Normal file
35
hw-nvme-fix-missing-check-for-PMR-capabi.patch
Normal file
@ -0,0 +1,35 @@
|
||||
From: Klaus Jensen <k.jensen@samsung.com>
|
||||
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: qemu-stable@nongnu.org
|
||||
Fixes: 75c3c9de961d ("hw/block/nvme: disable PMR at boot up")
|
||||
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/362
|
||||
Signed-off-by: Klaus Jensen <k.jensen@samsung.com>
|
||||
Reviewed-by: Keith Busch <kbusch@kernel.org>
|
||||
Signed-off-by: Jose R. Ziviani <jziviani@suse.de>
|
||||
---
|
||||
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);
|
105
hw-nvme-fix-pin-based-interrupt-behavior.patch
Normal file
105
hw-nvme-fix-pin-based-interrupt-behavior.patch
Normal file
@ -0,0 +1,105 @@
|
||||
From: Klaus Jensen <k.jensen@samsung.com>
|
||||
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]: <20210610114624.304681-1-jakub.jermar@kernkonzept.com>
|
||||
|
||||
Cc: qemu-stable@nongnu.org
|
||||
Fixes: ca247d35098d ("hw/block/nvme: fix pin-based interrupt behavior")
|
||||
Reported-by: Jakub Jermář <jakub.jermar@kernkonzept.com>
|
||||
Signed-off-by: Klaus Jensen <k.jensen@samsung.com>
|
||||
Reviewed-by: Keith Busch <kbusch@kernel.org>
|
||||
Signed-off-by: Jose R. Ziviani <jziviani@suse.de>
|
||||
---
|
||||
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;
|
50
linux-user-aarch64-Enable-hwcap-for-RND-.patch
Normal file
50
linux-user-aarch64-Enable-hwcap-for-RND-.patch
Normal file
@ -0,0 +1,50 @@
|
||||
From: Richard Henderson <richard.henderson@linaro.org>
|
||||
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: qemu-stable@nongnu.org (for 6.0.1)
|
||||
Buglink: https://bugs.launchpad.net/bugs/1926044
|
||||
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
|
||||
Message-id: 20210427214108.88503-1-richard.henderson@linaro.org
|
||||
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
Signed-off-by: Jose R. Ziviani <jziviani@suse.de>
|
||||
---
|
||||
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;
|
||||
}
|
115
qemu-config-load-modules-when-instantiat.patch
Normal file
115
qemu-config-load-modules-when-instantiat.patch
Normal file
@ -0,0 +1,115 @@
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
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: qemu-stable@nongnu.org
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Signed-off-by: Jose R. Ziviani <jziviani@suse.de>
|
||||
---
|
||||
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;
|
237
qemu-config-parse-configuration-files-to.patch
Normal file
237
qemu-config-parse-configuration-files-to.patch
Normal file
@ -0,0 +1,237 @@
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
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 <kwolf@redhat.com>
|
||||
Cc: Markus Armbruster <armbru@redhat.com>
|
||||
Cc: qemu-stable@nongnu.org
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Message-Id: <20210524105752.3318299-2-pbonzini@redhat.com>
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Signed-off-by: Jose R. Ziviani <jziviani@suse.de>
|
||||
---
|
||||
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;
|
||||
}
|
60
qemu-config-use-qemu_opts_from_qdict.patch
Normal file
60
qemu-config-use-qemu_opts_from_qdict.patch
Normal file
@ -0,0 +1,60 @@
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
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 <armbru@redhat.com>
|
||||
Reviewed-by: Markus Armbruster <armbru@redhat.com>
|
||||
Fixes: 3770141139 ("qemu-config: parse configuration files to a QDict")
|
||||
Cc: qemu-stable@nongnu.org
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Signed-off-by: Jose R. Ziviani <jziviani@suse.de>
|
||||
---
|
||||
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)
|
@ -31,7 +31,7 @@ rpm_verify() {
|
||||
fi
|
||||
else
|
||||
echo "package $thisrpm is not installed"
|
||||
ret=1
|
||||
ret=1
|
||||
fi
|
||||
echo
|
||||
return $ret
|
||||
@ -56,6 +56,8 @@ fi
|
||||
# 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,14 @@ done
|
||||
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
|
||||
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"
|
||||
|
||||
|
34
qemu.changes
34
qemu.changes
@ -1,3 +1,37 @@
|
||||
-------------------------------------------------------------------
|
||||
Thu Jul 1 20:15:02 UTC 2021 - José Ricardo Ziviani <jose.ziviani@suse.com>
|
||||
|
||||
- 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 <jose.ziviani@suse.com>
|
||||
|
||||
- Update qemu-supportconfig plugin
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Fri Jun 25 13:51:35 UTC 2021 - José Ricardo Ziviani <jose.ziviani@suse.com>
|
||||
|
||||
- Fix an update-alternative warning when removing qemu-skiboot package
|
||||
bsc#1178678
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Wed Jun 23 21:51:52 UTC 2021 - José Ricardo Ziviani <jose.ziviani@suse.com>
|
||||
|
||||
|
48
qemu.spec
48
qemu.spec
@ -202,6 +202,24 @@ Patch00066: vhost-user-gpu-fix-OOB-write-in-virgl_cm.patch
|
||||
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
|
||||
@ -1117,6 +1135,24 @@ This package records qemu testsuite results and represents successful testing.
|
||||
%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
|
||||
@ -1733,14 +1769,14 @@ done
|
||||
%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
|
||||
@ -1866,7 +1902,7 @@ fi
|
||||
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
|
||||
@ -2072,9 +2108,6 @@ fi
|
||||
%_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
|
||||
@ -2085,6 +2118,9 @@ fi
|
||||
%_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
|
||||
|
12
qemu.spec.in
12
qemu.spec.in
@ -1554,14 +1554,14 @@ done
|
||||
%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
|
||||
@ -1687,7 +1687,7 @@ fi
|
||||
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
|
||||
@ -1893,9 +1893,6 @@ fi
|
||||
%_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
|
||||
@ -1906,6 +1903,9 @@ fi
|
||||
%_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
|
||||
|
36
runstate-Initialize-Error-to-NULL.patch
Normal file
36
runstate-Initialize-Error-to-NULL.patch
Normal file
@ -0,0 +1,36 @@
|
||||
From: Peng Liang <liangpeng10@huawei.com>
|
||||
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: qemu-stable@nongnu.org
|
||||
Signed-off-by: Peng Liang <liangpeng10@huawei.com>
|
||||
Message-Id: <20210610131729.3906565-1-liangpeng10@huawei.com>
|
||||
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Signed-off-by: Jose R. Ziviani <jziviani@suse.de>
|
||||
---
|
||||
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();
|
||||
|
30
target-i386-Exit-tb-after-wrmsr.patch
Normal file
30
target-i386-Exit-tb-after-wrmsr.patch
Normal file
@ -0,0 +1,30 @@
|
||||
From: Richard Henderson <richard.henderson@linaro.org>
|
||||
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: qemu-stable@nongnu.org
|
||||
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
|
||||
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Message-Id: <20210514151342.384376-46-richard.henderson@linaro.org>
|
||||
Signed-off-by: Jose R. Ziviani <jziviani@suse.de>
|
||||
---
|
||||
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;
|
71
tcg-Allocate-sufficient-storage-in-temp_.patch
Normal file
71
tcg-Allocate-sufficient-storage-in-temp_.patch
Normal file
@ -0,0 +1,71 @@
|
||||
From: Richard Henderson <richard.henderson@linaro.org>
|
||||
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: qemu-stable@nongnu.org
|
||||
Tested-by: Stefan Weil <sw@weilnetz.de>
|
||||
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
|
||||
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
|
||||
Signed-off-by: Jose R. Ziviani <jziviani@suse.de>
|
||||
---
|
||||
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);
|
77
tcg-sparc-Fix-temp_allocate_frame-vs-spa.patch
Normal file
77
tcg-sparc-Fix-temp_allocate_frame-vs-spa.patch
Normal file
@ -0,0 +1,77 @@
|
||||
From: Richard Henderson <richard.henderson@linaro.org>
|
||||
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: qemu-stable@nongnu.org
|
||||
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
|
||||
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
|
||||
Signed-off-by: Jose R. Ziviani <jziviani@suse.de>
|
||||
---
|
||||
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);
|
46
vhost-vdpa-don-t-initialize-backend_feat.patch
Normal file
46
vhost-vdpa-don-t-initialize-backend_feat.patch
Normal file
@ -0,0 +1,46 @@
|
||||
From: Jason Wang <jasowang@redhat.com>
|
||||
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: qemu-stable@nongnu.org
|
||||
Cc: Gautam Dawar <gdawar@xilinx.com>
|
||||
Signed-off-by: Jason Wang <jasowang@redhat.com>
|
||||
Signed-off-by: Jose R. Ziviani <jziviani@suse.de>
|
||||
---
|
||||
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;
|
||||
|
41
vl-Fix-an-assert-failure-in-error-path.patch
Normal file
41
vl-Fix-an-assert-failure-in-error-path.patch
Normal file
@ -0,0 +1,41 @@
|
||||
From: Zhenzhong Duan <zhenzhong.duan@intel.com>
|
||||
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 <zhenzhong.duan@intel.com>
|
||||
Message-Id: <20210610084741.456260-1-zhenzhong.duan@intel.com>
|
||||
Cc: qemu-stable@nongnu.org
|
||||
Fixes: 0546c0609c ("vl: split various early command line options to a separate function", 2020-12-10)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Signed-off-by: Jose R. Ziviani <jziviani@suse.de>
|
||||
---
|
||||
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();
|
41
vl-allow-not-specifying-size-in-m-when-u.patch
Normal file
41
vl-allow-not-specifying-size-in-m-when-u.patch
Normal file
@ -0,0 +1,41 @@
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
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: qemu-stable@nongnu.org
|
||||
Fixes: f5c9fcb82d ("vl: separate qemu_create_machine", 2020-12-10)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Signed-off-by: Jose R. Ziviani <jziviani@suse.de>
|
||||
---
|
||||
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")) {
|
87
vl-plug-object-back-into-readconfig.patch
Normal file
87
vl-plug-object-back-into-readconfig.patch
Normal file
@ -0,0 +1,87 @@
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
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 <armbru@redhat.com>
|
||||
Cc: qemu-stable@nongnu.org
|
||||
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Message-Id: <20210524105752.3318299-4-pbonzini@redhat.com>
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Signed-off-by: Jose R. Ziviani <jziviani@suse.de>
|
||||
---
|
||||
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();
|
||||
+ }
|
||||
}
|
||||
|
||||
/*
|
187
vl-plumb-keyval-based-options-into-readc.patch
Normal file
187
vl-plumb-keyval-based-options-into-readc.patch
Normal file
@ -0,0 +1,187 @@
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
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 <armbru@redhat.com>
|
||||
Cc: qemu-stable@nongnu.org
|
||||
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Message-Id: <20210524105752.3318299-3-pbonzini@redhat.com>
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Signed-off-by: Jose R. Ziviani <jziviani@suse.de>
|
||||
---
|
||||
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);
|
130
x86-acpi-use-offset-instead-of-pointer-w.patch
Normal file
130
x86-acpi-use-offset-instead-of-pointer-w.patch
Normal file
@ -0,0 +1,130 @@
|
||||
From: Igor Mammedov <imammedo@redhat.com>
|
||||
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 <imammedo@redhat.com>
|
||||
Message-Id: <20210414084356.3792113-1-imammedo@redhat.com>
|
||||
Cc: mst@redhat.com, qemu-stable@nongnu.org
|
||||
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Signed-off-by: Jose R. Ziviani <jziviani@suse.de>
|
||||
---
|
||||
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)
|
Loading…
Reference in New Issue
Block a user