mirror of
https://git.proxmox.com/git/pve-qemu
synced 2025-08-18 07:28:10 +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>
97 lines
3.9 KiB
Diff
97 lines
3.9 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Igor Mammedov <imammedo@redhat.com>
|
|
Date: Wed, 15 Jan 2025 13:53:41 +0100
|
|
Subject: [PATCH] pci: acpi: Windows 'PCI Label Id' bug workaround
|
|
|
|
Current versions of Windows call _DSM(func=7) regardless
|
|
of whether it is supported or not. It leads to NICs having bogus
|
|
'PCI Label Id = 0', where none should be set at all.
|
|
|
|
Also presence of 'PCI Label Id' triggers another Windows bug
|
|
on localized versions that leads to hangs. The later bug is fixed
|
|
in latest updates for 'Windows Server' but not in consumer
|
|
versions of Windows (and there is no plans to fix it
|
|
as far as I'm aware).
|
|
|
|
Given it's easy, implement Microsoft suggested workaround
|
|
(return invalid Package) so that affected Windows versions
|
|
could boot on QEMU.
|
|
This would effectvely remove bogus 'PCI Label Id's on NICs,
|
|
but MS teem confirmed that flipping 'PCI Label Id' should not
|
|
change 'Network Connection' ennumeration, so it should be safe
|
|
for QEMU to change _DSM without any compat code.
|
|
|
|
Smoke tested with WinXP and WS2022
|
|
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/774
|
|
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
|
|
Message-Id: <20250115125342.3883374-3-imammedo@redhat.com>
|
|
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
|
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
|
(cherry picked from commit 0b053391985abcc40b16ac8fc4a7f6588d1d95c1)
|
|
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
|
|
---
|
|
hw/i386/acpi-build.c | 33 +++++++++++++++++++++++----------
|
|
1 file changed, 23 insertions(+), 10 deletions(-)
|
|
|
|
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
|
|
index 9fcc2897b8..f7b961e04c 100644
|
|
--- a/hw/i386/acpi-build.c
|
|
+++ b/hw/i386/acpi-build.c
|
|
@@ -654,6 +654,7 @@ static Aml *aml_pci_pdsm(void)
|
|
Aml *acpi_index = aml_local(2);
|
|
Aml *zero = aml_int(0);
|
|
Aml *one = aml_int(1);
|
|
+ Aml *not_supp = aml_int(0xFFFFFFFF);
|
|
Aml *func = aml_arg(2);
|
|
Aml *params = aml_arg(4);
|
|
Aml *bnum = aml_derefof(aml_index(params, aml_int(0)));
|
|
@@ -678,7 +679,7 @@ static Aml *aml_pci_pdsm(void)
|
|
*/
|
|
ifctx1 = aml_if(aml_lnot(
|
|
aml_or(aml_equal(acpi_index, zero),
|
|
- aml_equal(acpi_index, aml_int(0xFFFFFFFF)), NULL)
|
|
+ aml_equal(acpi_index, not_supp), NULL)
|
|
));
|
|
{
|
|
/* have supported functions */
|
|
@@ -704,18 +705,30 @@ static Aml *aml_pci_pdsm(void)
|
|
{
|
|
Aml *pkg = aml_package(2);
|
|
|
|
- aml_append(pkg, zero);
|
|
- /*
|
|
- * optional, if not impl. should return null string
|
|
- */
|
|
- aml_append(pkg, aml_string("%s", ""));
|
|
- aml_append(ifctx, aml_store(pkg, ret));
|
|
-
|
|
aml_append(ifctx, aml_store(aml_call2("AIDX", bnum, sunum), acpi_index));
|
|
+ aml_append(ifctx, aml_store(pkg, ret));
|
|
/*
|
|
- * update acpi-index to actual value
|
|
+ * Windows calls func=7 without checking if it's available,
|
|
+ * as workaround Microsoft has suggested to return invalid for func7
|
|
+ * Package, so return 2 elements package but only initialize elements
|
|
+ * when acpi_index is supported and leave them uninitialized, which
|
|
+ * leads elements to being Uninitialized ObjectType and should trip
|
|
+ * Windows into discarding result as an unexpected and prevent setting
|
|
+ * bogus 'PCI Label' on the device.
|
|
*/
|
|
- aml_append(ifctx, aml_store(acpi_index, aml_index(ret, zero)));
|
|
+ ifctx1 = aml_if(aml_lnot(aml_lor(
|
|
+ aml_equal(acpi_index, zero), aml_equal(acpi_index, not_supp)
|
|
+ )));
|
|
+ {
|
|
+ aml_append(ifctx1, aml_store(acpi_index, aml_index(ret, zero)));
|
|
+ /*
|
|
+ * optional, if not impl. should return null string
|
|
+ */
|
|
+ aml_append(ifctx1, aml_store(aml_string("%s", ""),
|
|
+ aml_index(ret, one)));
|
|
+ }
|
|
+ aml_append(ifctx, ifctx1);
|
|
+
|
|
aml_append(ifctx, aml_return(ret));
|
|
}
|
|
|