mirror of
https://git.proxmox.com/git/pve-qemu
synced 2025-08-18 23:28:49 +00:00

Most notabbly, there now is an upstream workaround for the "Windows PCI Label bug" [0] and the revert of QEMU commit 44d975ef34 ("x86: acpi: workaround Windows not handling name references in Package properly") can be dropped. Pick up some other fixes already merged in current master, for emulation as well as x86(_64) KVM, some PCI/USB fixes and a pair of regression fixes for the net subsystem. [0]: https://gitlab.com/qemu-project/qemu/-/issues/774 Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
83 lines
3.1 KiB
Diff
83 lines
3.1 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Richard Henderson <richard.henderson@linaro.org>
|
|
Date: Sat, 7 Dec 2024 18:14:45 +0000
|
|
Subject: [PATCH] tcg: Reset free_temps before tcg_optimize
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
When allocating new temps during tcg_optmize, do not re-use
|
|
any EBB temps that were used within the TB. We do not have
|
|
any idea what span of the TB in which the temp was live.
|
|
|
|
Introduce tcg_temp_ebb_reset_freed and use before tcg_optimize,
|
|
as well as replacing the equivalent in plugin_gen_inject and
|
|
tcg_func_start.
|
|
|
|
Cc: qemu-stable@nongnu.org
|
|
Fixes: fb04ab7ddd8 ("tcg/optimize: Lower TCG_COND_TST{EQ,NE} if unsupported")
|
|
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2711
|
|
Reported-by: wannacu <wannacu2049@gmail.com>
|
|
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
|
|
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
|
|
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
|
|
(cherry picked from commit 04e006ab36a8565b92d4e21dd346367fbade7d74)
|
|
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
|
|
---
|
|
accel/tcg/plugin-gen.c | 2 +-
|
|
include/tcg/tcg-temp-internal.h | 6 ++++++
|
|
tcg/tcg.c | 5 ++++-
|
|
3 files changed, 11 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/accel/tcg/plugin-gen.c b/accel/tcg/plugin-gen.c
|
|
index 0f47bfbb48..1ef075552c 100644
|
|
--- a/accel/tcg/plugin-gen.c
|
|
+++ b/accel/tcg/plugin-gen.c
|
|
@@ -275,7 +275,7 @@ static void plugin_gen_inject(struct qemu_plugin_tb *plugin_tb)
|
|
* that might be live within the existing opcode stream.
|
|
* The simplest solution is to release them all and create new.
|
|
*/
|
|
- memset(tcg_ctx->free_temps, 0, sizeof(tcg_ctx->free_temps));
|
|
+ tcg_temp_ebb_reset_freed(tcg_ctx);
|
|
|
|
QTAILQ_FOREACH_SAFE(op, &tcg_ctx->ops, link, next) {
|
|
switch (op->opc) {
|
|
diff --git a/include/tcg/tcg-temp-internal.h b/include/tcg/tcg-temp-internal.h
|
|
index 44192c55a9..98f91e68b7 100644
|
|
--- a/include/tcg/tcg-temp-internal.h
|
|
+++ b/include/tcg/tcg-temp-internal.h
|
|
@@ -42,4 +42,10 @@ TCGv_i64 tcg_temp_ebb_new_i64(void);
|
|
TCGv_ptr tcg_temp_ebb_new_ptr(void);
|
|
TCGv_i128 tcg_temp_ebb_new_i128(void);
|
|
|
|
+/* Forget all freed EBB temps, so that new allocations produce new temps. */
|
|
+static inline void tcg_temp_ebb_reset_freed(TCGContext *s)
|
|
+{
|
|
+ memset(s->free_temps, 0, sizeof(s->free_temps));
|
|
+}
|
|
+
|
|
#endif /* TCG_TEMP_FREE_H */
|
|
diff --git a/tcg/tcg.c b/tcg/tcg.c
|
|
index 0babae1b88..4578b185be 100644
|
|
--- a/tcg/tcg.c
|
|
+++ b/tcg/tcg.c
|
|
@@ -1489,7 +1489,7 @@ void tcg_func_start(TCGContext *s)
|
|
s->nb_temps = s->nb_globals;
|
|
|
|
/* No temps have been previously allocated for size or locality. */
|
|
- memset(s->free_temps, 0, sizeof(s->free_temps));
|
|
+ tcg_temp_ebb_reset_freed(s);
|
|
|
|
/* No constant temps have been previously allocated. */
|
|
for (int i = 0; i < TCG_TYPE_COUNT; ++i) {
|
|
@@ -6120,6 +6120,9 @@ int tcg_gen_code(TCGContext *s, TranslationBlock *tb, uint64_t pc_start)
|
|
}
|
|
#endif
|
|
|
|
+ /* Do not reuse any EBB that may be allocated within the TB. */
|
|
+ tcg_temp_ebb_reset_freed(s);
|
|
+
|
|
tcg_optimize(s);
|
|
|
|
reachable_code_pass(s);
|