* [PATCH 0/5] isa-serial: acpi: declare shared IRQs for COM1/3 and COM2/4
@ 2026-02-27 13:44 Mark Cave-Ayland
2026-02-27 13:44 ` [PATCH 1/5] hw/acpi/aml-build.c: add aml_irq() representing the 3-byte IRQ descriptor Mark Cave-Ayland
` (4 more replies)
0 siblings, 5 replies; 11+ messages in thread
From: Mark Cave-Ayland @ 2026-02-27 13:44 UTC (permalink / raw)
To: mst, imammedo, anisinha, pbonzini, marcandre.lureau,
marcel.apfelbaum, qemu-devel
From Windows 8.1 onwards ISA serial IRQs cannot be shared when ACPI Revision
5.0 is used in the FACP table. The reason for this is that if a 2-byte IRQ
Descriptor is used then the interrupt is considered to be high true, edge
sensitive, non-shareable. Since legacy serial ports COM1/3 and COM2/4 share
an IRQ then if more than 2 serial ports are added, Windows indicates a
conflict in Device Manager and these combinations cannot be used together.
Add a new 3-byte IRQ Descriptor to the _CRS resource indicating that the
ISA serial IRQ is low true, edge sensitive and shareable, along with a
corresponding _PRS resource so that the legacy serial ports also appear
at a fixed address. This enables all 4 legacy serial ports to be used in
Windows without conflict.
Tested on Windows 11 with 4 instances of -serial on the command line and copying
data simultaneously across serial ports COM1/3 and COM2/4. Note that with this
series applied, if extra ISA serial ports are added to an existing VM then it is
necessary to go to Device Manager, select "Add legacy hardware" from the
"Action" menu, and then reboot the VM for the serial ports to be detected
correctly without Device Manager indicating a conflict.
Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
Mark Cave-Ayland (5):
hw/acpi/aml-build.c: add aml_irq() representing the 3-byte IRQ
descriptor
hw/acpi/aml-build.c: add AML functions for
StartDependentFn/EndDependentFn
tests/acpi: allow DSDT acpi table changes
hw/char/serial-isa.c: declare IRQ as shared in ACPI IRQ descriptor
tests: data: update x86 ACPI tables
include/hw/acpi/aml-build.h | 4 ++
hw/acpi/aml-build-stub.c | 16 +++++++
hw/acpi/aml-build.c | 40 ++++++++++++++++++
hw/char/serial-isa.c | 23 +++++++++-
hw/i386/pc.c | 4 +-
tests/data/acpi/x86/microvm/DSDT | Bin 365 -> 393 bytes
tests/data/acpi/x86/microvm/DSDT.ioapic2 | Bin 365 -> 393 bytes
tests/data/acpi/x86/microvm/DSDT.pcie | Bin 2985 -> 3013 bytes
tests/data/acpi/x86/microvm/DSDT.rtc | Bin 404 -> 432 bytes
tests/data/acpi/x86/microvm/DSDT.usb | Bin 414 -> 442 bytes
tests/data/acpi/x86/pc/DSDT | Bin 8598 -> 8626 bytes
tests/data/acpi/x86/pc/DSDT.acpierst | Bin 8509 -> 8537 bytes
tests/data/acpi/x86/pc/DSDT.acpihmat | Bin 9923 -> 9951 bytes
tests/data/acpi/x86/pc/DSDT.bridge | Bin 15469 -> 15497 bytes
tests/data/acpi/x86/pc/DSDT.cphp | Bin 9062 -> 9090 bytes
tests/data/acpi/x86/pc/DSDT.dimmpxm | Bin 10252 -> 10280 bytes
tests/data/acpi/x86/pc/DSDT.hpbridge | Bin 8549 -> 8577 bytes
tests/data/acpi/x86/pc/DSDT.hpbrroot | Bin 5087 -> 5115 bytes
tests/data/acpi/x86/pc/DSDT.ipmikcs | Bin 8670 -> 8698 bytes
tests/data/acpi/x86/pc/DSDT.memhp | Bin 9957 -> 9985 bytes
tests/data/acpi/x86/pc/DSDT.nohpet | Bin 8456 -> 8484 bytes
tests/data/acpi/x86/pc/DSDT.numamem | Bin 8604 -> 8632 bytes
tests/data/acpi/x86/pc/DSDT.roothp | Bin 12391 -> 12419 bytes
tests/data/acpi/x86/q35/DSDT | Bin 8427 -> 8455 bytes
tests/data/acpi/x86/q35/DSDT.acpierst | Bin 8444 -> 8472 bytes
tests/data/acpi/x86/q35/DSDT.acpihmat | Bin 9752 -> 9780 bytes
.../data/acpi/x86/q35/DSDT.acpihmat-generic-x | Bin 12637 -> 12665 bytes
.../acpi/x86/q35/DSDT.acpihmat-noinitiator | Bin 8706 -> 8734 bytes
tests/data/acpi/x86/q35/DSDT.applesmc | Bin 8473 -> 8501 bytes
tests/data/acpi/x86/q35/DSDT.bridge | Bin 12040 -> 12068 bytes
tests/data/acpi/x86/q35/DSDT.core-count | Bin 12985 -> 13013 bytes
tests/data/acpi/x86/q35/DSDT.core-count2 | Bin 33842 -> 33870 bytes
tests/data/acpi/x86/q35/DSDT.cphp | Bin 8891 -> 8919 bytes
tests/data/acpi/x86/q35/DSDT.cxl | Bin 13218 -> 13246 bytes
tests/data/acpi/x86/q35/DSDT.dimmpxm | Bin 10081 -> 10109 bytes
tests/data/acpi/x86/q35/DSDT.ipmibt | Bin 8502 -> 8530 bytes
tests/data/acpi/x86/q35/DSDT.ipmismbus | Bin 8515 -> 8543 bytes
tests/data/acpi/x86/q35/DSDT.ivrs | Bin 8444 -> 8472 bytes
tests/data/acpi/x86/q35/DSDT.memhp | Bin 9786 -> 9814 bytes
tests/data/acpi/x86/q35/DSDT.mmio64 | Bin 9557 -> 9585 bytes
tests/data/acpi/x86/q35/DSDT.multi-bridge | Bin 13280 -> 13308 bytes
tests/data/acpi/x86/q35/DSDT.noacpihp | Bin 8289 -> 8317 bytes
tests/data/acpi/x86/q35/DSDT.nohpet | Bin 8285 -> 8313 bytes
tests/data/acpi/x86/q35/DSDT.numamem | Bin 8433 -> 8461 bytes
tests/data/acpi/x86/q35/DSDT.pvpanic-isa | Bin 8528 -> 8556 bytes
tests/data/acpi/x86/q35/DSDT.thread-count | Bin 12985 -> 13013 bytes
tests/data/acpi/x86/q35/DSDT.thread-count2 | Bin 33842 -> 33870 bytes
tests/data/acpi/x86/q35/DSDT.tis.tpm12 | Bin 9033 -> 9061 bytes
tests/data/acpi/x86/q35/DSDT.tis.tpm2 | Bin 9059 -> 9087 bytes
tests/data/acpi/x86/q35/DSDT.type4-count | Bin 18661 -> 18689 bytes
tests/data/acpi/x86/q35/DSDT.viot | Bin 14684 -> 14712 bytes
tests/data/acpi/x86/q35/DSDT.xapic | Bin 35790 -> 35818 bytes
52 files changed, 85 insertions(+), 2 deletions(-)
--
2.43.0
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 1/5] hw/acpi/aml-build.c: add aml_irq() representing the 3-byte IRQ descriptor
2026-02-27 13:44 [PATCH 0/5] isa-serial: acpi: declare shared IRQs for COM1/3 and COM2/4 Mark Cave-Ayland
@ 2026-02-27 13:44 ` Mark Cave-Ayland
2026-02-27 13:44 ` [PATCH 2/5] hw/acpi/aml-build.c: add AML functions for StartDependentFn/EndDependentFn Mark Cave-Ayland
` (3 subsequent siblings)
4 siblings, 0 replies; 11+ messages in thread
From: Mark Cave-Ayland @ 2026-02-27 13:44 UTC (permalink / raw)
To: mst, imammedo, anisinha, pbonzini, marcandre.lureau,
marcel.apfelbaum, qemu-devel
The existing aml_interrupt() uses the Extended Interrupt Descriptor to store
the interrupt information, however newer Windows will only parse the
standard IRQ Descriptor when enumerating ISA serial ports.
Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
---
include/hw/acpi/aml-build.h | 2 ++
hw/acpi/aml-build-stub.c | 6 ++++++
hw/acpi/aml-build.c | 25 +++++++++++++++++++++++++
3 files changed, 33 insertions(+)
diff --git a/include/hw/acpi/aml-build.h b/include/hw/acpi/aml-build.h
index f38e129719..3394253b9e 100644
--- a/include/hw/acpi/aml-build.h
+++ b/include/hw/acpi/aml-build.h
@@ -342,6 +342,8 @@ Aml *aml_io(AmlIODecode dec, uint16_t min_base, uint16_t max_base,
Aml *aml_operation_region(const char *name, AmlRegionSpace rs,
Aml *offset, uint32_t len);
Aml *aml_irq_no_flags(uint8_t irq);
+Aml *aml_irq(uint8_t irq, AmlLevelAndEdge level_and_edge,
+ AmlActiveHighAndLow high_and_low, AmlShared shared);
Aml *aml_named_field(const char *name, unsigned length);
Aml *aml_reserved_field(unsigned length);
Aml *aml_local(int num);
diff --git a/hw/acpi/aml-build-stub.c b/hw/acpi/aml-build-stub.c
index 89a8fec4af..3180c7c962 100644
--- a/hw/acpi/aml-build-stub.c
+++ b/hw/acpi/aml-build-stub.c
@@ -67,6 +67,12 @@ Aml *aml_irq_no_flags(uint8_t irq)
return NULL;
}
+Aml *aml_irq(uint8_t irq, AmlLevelAndEdge level_and_edge,
+ AmlActiveHighAndLow high_and_low, AmlShared shared)
+{
+ return NULL;
+}
+
Aml *aml_interrupt(AmlConsumerAndProducer con_and_pro,
AmlLevelAndEdge level_and_edge,
AmlActiveHighAndLow high_and_low, AmlShared shared,
diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c
index ea1c415b21..b07b0133c2 100644
--- a/hw/acpi/aml-build.c
+++ b/hw/acpi/aml-build.c
@@ -1058,6 +1058,31 @@ Aml *aml_irq_no_flags(uint8_t irq)
return var;
}
+/*
+ * ACPI 1.0b: 6.4.2.1.1 ASL Macro for IRQ Descriptor
+ *
+ * More verbose description at:
+ * ACPI 5.0: 19.5.63 IRQ (Interrupt Resource Descriptor Macro)
+ * 6.4.2.1 IRQ Descriptor
+ */
+Aml *aml_irq(uint8_t irq, AmlLevelAndEdge level_and_edge,
+ AmlActiveHighAndLow high_and_low, AmlShared shared)
+{
+ uint16_t irq_mask;
+ Aml *var = aml_alloc();
+ uint8_t irq_flags = level_and_edge | (high_and_low << 3) |
+ (shared << 4);
+
+ assert(irq < 16);
+ build_append_byte(var->buf, 0x23); /* IRQ descriptor 3 byte form */
+
+ irq_mask = 1U << irq;
+ build_append_byte(var->buf, irq_mask & 0xFF); /* IRQ mask bits[7:0] */
+ build_append_byte(var->buf, irq_mask >> 8); /* IRQ mask bits[15:8] */
+ build_append_byte(var->buf, irq_flags); /* IRQ flags */
+ return var;
+}
+
/* ACPI 1.0b: 16.2.5.4 Type 2 Opcodes Encoding: DefLNot */
Aml *aml_lnot(Aml *arg)
{
--
2.43.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 2/5] hw/acpi/aml-build.c: add AML functions for StartDependentFn/EndDependentFn
2026-02-27 13:44 [PATCH 0/5] isa-serial: acpi: declare shared IRQs for COM1/3 and COM2/4 Mark Cave-Ayland
2026-02-27 13:44 ` [PATCH 1/5] hw/acpi/aml-build.c: add aml_irq() representing the 3-byte IRQ descriptor Mark Cave-Ayland
@ 2026-02-27 13:44 ` Mark Cave-Ayland
2026-02-27 13:44 ` [PATCH 3/5] tests/acpi: allow DSDT acpi table changes Mark Cave-Ayland
` (2 subsequent siblings)
4 siblings, 0 replies; 11+ messages in thread
From: Mark Cave-Ayland @ 2026-02-27 13:44 UTC (permalink / raw)
To: mst, imammedo, anisinha, pbonzini, marcandre.lureau,
marcel.apfelbaum, qemu-devel
These functions are required to generate a suitable _PRS entry for the
ISA serial ports.
Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
---
include/hw/acpi/aml-build.h | 2 ++
hw/acpi/aml-build-stub.c | 10 ++++++++++
hw/acpi/aml-build.c | 15 +++++++++++++++
3 files changed, 27 insertions(+)
diff --git a/include/hw/acpi/aml-build.h b/include/hw/acpi/aml-build.h
index 3394253b9e..6043eeee41 100644
--- a/include/hw/acpi/aml-build.h
+++ b/include/hw/acpi/aml-build.h
@@ -415,6 +415,8 @@ Aml *aml_derefof(Aml *arg);
Aml *aml_sizeof(Aml *arg);
Aml *aml_concatenate(Aml *source1, Aml *source2, Aml *target);
Aml *aml_object_type(Aml *object);
+Aml *aml_start_dependent_function(uint8_t compat, uint8_t config);
+Aml *aml_end_dependent_function(void);
void build_append_int_noprefix(GArray *table, uint64_t value, int size);
diff --git a/hw/acpi/aml-build-stub.c b/hw/acpi/aml-build-stub.c
index 3180c7c962..cf2f34ddb1 100644
--- a/hw/acpi/aml-build-stub.c
+++ b/hw/acpi/aml-build-stub.c
@@ -107,3 +107,13 @@ Aml *aml_buffer(int buffer_size, uint8_t *byte_list)
{
return NULL;
}
+
+Aml *aml_start_dependent_function(uint8_t compat, uint8_t config)
+{
+ return NULL;
+}
+
+Aml *aml_end_dependent_function(void)
+{
+ return NULL;
+}
diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c
index b07b0133c2..0b9498a4e9 100644
--- a/hw/acpi/aml-build.c
+++ b/hw/acpi/aml-build.c
@@ -1729,6 +1729,21 @@ Aml *aml_object_type(Aml *object)
return var;
}
+/* ACPI 1.0b: 6.4.2.3.1 ASL Macro for StartDependentFn */
+Aml *aml_start_dependent_function(uint8_t compat, uint8_t config)
+{
+ Aml *var = aml_opcode(0x031 /* StartDependentFn */);
+ build_append_byte(var->buf, 0); /* Good compat, Good config */
+ return var;
+}
+
+/* ACPI 1.0b: 6.4.2.4.1 ASL Macro for EndDependentFn */
+Aml *aml_end_dependent_function(void)
+{
+ Aml *var = aml_opcode(0x038 /* StartDependentFn */);
+ return var;
+}
+
void acpi_table_begin(AcpiTable *desc, GArray *array)
{
--
2.43.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 3/5] tests/acpi: allow DSDT acpi table changes
2026-02-27 13:44 [PATCH 0/5] isa-serial: acpi: declare shared IRQs for COM1/3 and COM2/4 Mark Cave-Ayland
2026-02-27 13:44 ` [PATCH 1/5] hw/acpi/aml-build.c: add aml_irq() representing the 3-byte IRQ descriptor Mark Cave-Ayland
2026-02-27 13:44 ` [PATCH 2/5] hw/acpi/aml-build.c: add AML functions for StartDependentFn/EndDependentFn Mark Cave-Ayland
@ 2026-02-27 13:44 ` Mark Cave-Ayland
2026-02-27 13:44 ` [PATCH 4/5] hw/char/serial-isa.c: declare IRQ as shared in ACPI IRQ descriptor Mark Cave-Ayland
2026-02-27 13:44 ` [PATCH 5/5] tests: data: update x86 ACPI tables Mark Cave-Ayland
4 siblings, 0 replies; 11+ messages in thread
From: Mark Cave-Ayland @ 2026-02-27 13:44 UTC (permalink / raw)
To: mst, imammedo, anisinha, pbonzini, marcandre.lureau,
marcel.apfelbaum, qemu-devel
Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
---
tests/qtest/bios-tables-test-allowed-diff.h | 47 +++++++++++++++++++++
1 file changed, 47 insertions(+)
diff --git a/tests/qtest/bios-tables-test-allowed-diff.h b/tests/qtest/bios-tables-test-allowed-diff.h
index dfb8523c8b..cef44135bc 100644
--- a/tests/qtest/bios-tables-test-allowed-diff.h
+++ b/tests/qtest/bios-tables-test-allowed-diff.h
@@ -1 +1,48 @@
/* List of comma-separated changed AML files to ignore */
+"tests/data/acpi/x86/pc/DSDT",
+"tests/data/acpi/x86/pc/DSDT.bridge",
+"tests/data/acpi/x86/pc/DSDT.ipmikcs",
+"tests/data/acpi/x86/pc/DSDT.cphp",
+"tests/data/acpi/x86/pc/DSDT.numamem",
+"tests/data/acpi/x86/pc/DSDT.nohpet",
+"tests/data/acpi/x86/pc/DSDT.memhp",
+"tests/data/acpi/x86/pc/DSDT.dimmpxm",
+"tests/data/acpi/x86/pc/DSDT.acpihmat",
+"tests/data/acpi/x86/pc/DSDT.acpierst",
+"tests/data/acpi/x86/pc/DSDT.roothp",
+"tests/data/acpi/x86/pc/DSDT.hpbridge",
+"tests/data/acpi/x86/pc/DSDT.hpbrroot",
+"tests/data/acpi/x86/q35/DSDT",
+"tests/data/acpi/x86/q35/DSDT.tis.tpm2",
+"tests/data/acpi/x86/q35/DSDT.tis.tpm12",
+"tests/data/acpi/x86/q35/DSDT.bridge",
+"tests/data/acpi/x86/q35/DSDT.noacpihp",
+"tests/data/acpi/x86/q35/DSDT.multi-bridge",
+"tests/data/acpi/x86/q35/DSDT.ipmibt",
+"tests/data/acpi/x86/q35/DSDT.cphp",
+"tests/data/acpi/x86/q35/DSDT.numamem",
+"tests/data/acpi/x86/q35/DSDT.nohpet",
+"tests/data/acpi/x86/q35/DSDT.acpihmat-noinitiator",
+"tests/data/acpi/x86/q35/DSDT.acpihmat-generic-x",
+"tests/data/acpi/x86/q35/DSDT.memhp",
+"tests/data/acpi/x86/q35/DSDT.dimmpxm",
+"tests/data/acpi/x86/q35/DSDT.acpihmat",
+"tests/data/acpi/x86/q35/DSDT.mmio64",
+"tests/data/acpi/x86/q35/DSDT.acpierst",
+"tests/data/acpi/x86/q35/DSDT.applesmc",
+"tests/data/acpi/x86/q35/DSDT.pvpanic-isa",
+"tests/data/acpi/x86/q35/DSDT.ivrs",
+"tests/data/acpi/x86/q35/DSDT.type4-count",
+"tests/data/acpi/x86/q35/DSDT.core-count",
+"tests/data/acpi/x86/q35/DSDT.core-count2",
+"tests/data/acpi/x86/q35/DSDT.thread-count",
+"tests/data/acpi/x86/q35/DSDT.thread-count2",
+"tests/data/acpi/x86/q35/DSDT.viot",
+"tests/data/acpi/x86/q35/DSDT.cxl",
+"tests/data/acpi/x86/q35/DSDT.ipmismbus",
+"tests/data/acpi/x86/q35/DSDT.xapic",
+"tests/data/acpi/x86/microvm/DSDT",
+"tests/data/acpi/x86/microvm/DSDT.usb",
+"tests/data/acpi/x86/microvm/DSDT.rtc",
+"tests/data/acpi/x86/microvm/DSDT.ioapic2",
+"tests/data/acpi/x86/microvm/DSDT.pcie",
--
2.43.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 4/5] hw/char/serial-isa.c: declare IRQ as shared in ACPI IRQ descriptor
2026-02-27 13:44 [PATCH 0/5] isa-serial: acpi: declare shared IRQs for COM1/3 and COM2/4 Mark Cave-Ayland
` (2 preceding siblings ...)
2026-02-27 13:44 ` [PATCH 3/5] tests/acpi: allow DSDT acpi table changes Mark Cave-Ayland
@ 2026-02-27 13:44 ` Mark Cave-Ayland
2026-03-04 11:22 ` Igor Mammedov
2026-02-27 13:44 ` [PATCH 5/5] tests: data: update x86 ACPI tables Mark Cave-Ayland
4 siblings, 1 reply; 11+ messages in thread
From: Mark Cave-Ayland @ 2026-02-27 13:44 UTC (permalink / raw)
To: mst, imammedo, anisinha, pbonzini, marcandre.lureau,
marcel.apfelbaum, qemu-devel
From Windows 8.1 onwards ISA serial IRQs cannot be shared when ACPI Revision
5.0 is used in the FACP table. The reason for this is that if a 2-byte IRQ
Descriptor is used then the interrupt is considered to be high true, edge
sensitive, non-shareable. Since legacy serial ports COM1/3 and COM2/4 share
an IRQ then if more than 2 serial ports are added, Windows indicates a
conflict in Device Manager and these combinations cannot be used together.
Add a new 3-byte IRQ Descriptor to the _CRS resource indicating that the
ISA serial IRQ is low true, edge sensitive and shareable, along with a
corresponding _PRS resource so that the legacy serial ports also appear
at a fixed address. This enables all 4 legacy serial ports to be used in
Windows without conflict.
Finally add a new x-acpi-shared-irq property to disable the ACPI IRQ descriptor
changes for older PC machine types, and add it to the pc_compat_10_2[] array.
Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
---
hw/char/serial-isa.c | 23 ++++++++++++++++++++++-
hw/i386/pc.c | 4 +++-
2 files changed, 25 insertions(+), 2 deletions(-)
diff --git a/hw/char/serial-isa.c b/hw/char/serial-isa.c
index a4be0492c5..1662da86bd 100644
--- a/hw/char/serial-isa.c
+++ b/hw/char/serial-isa.c
@@ -28,6 +28,7 @@
#include "qemu/module.h"
#include "system/system.h"
#include "hw/acpi/acpi_aml_interface.h"
+#include "hw/acpi/aml-build.h"
#include "hw/char/serial.h"
#include "hw/char/serial-isa.h"
#include "hw/isa/isa.h"
@@ -43,6 +44,7 @@ struct ISASerialState {
uint32_t index;
uint32_t iobase;
uint32_t isairq;
+ bool acpi_shared_irq;
SerialState state;
};
@@ -92,7 +94,12 @@ static void serial_isa_build_aml(AcpiDevAmlIf *adev, Aml *scope)
crs = aml_resource_template();
aml_append(crs, aml_io(AML_DECODE16, isa->iobase, isa->iobase, 0x00, 0x08));
- aml_append(crs, aml_irq_no_flags(isa->isairq));
+ if (isa->acpi_shared_irq) {
+ aml_append(crs, aml_irq(isa->isairq, AML_EDGE, AML_ACTIVE_LOW,
+ AML_SHARED));
+ } else {
+ aml_append(crs, aml_irq_no_flags(isa->isairq));
+ }
dev = aml_device("COM%d", isa->index + 1);
aml_append(dev, aml_name_decl("_HID", aml_eisaid("PNP0501")));
@@ -100,6 +107,18 @@ static void serial_isa_build_aml(AcpiDevAmlIf *adev, Aml *scope)
aml_append(dev, aml_name_decl("_STA", aml_int(0xf)));
aml_append(dev, aml_name_decl("_CRS", crs));
+ if (isa->acpi_shared_irq) {
+ Aml *prs = aml_resource_template();
+
+ aml_append(prs, aml_start_dependent_function(0, 0));
+ aml_append(prs, aml_io(AML_DECODE16, isa->iobase, isa->iobase, 0x00,
+ 0x08));
+ aml_append(prs, aml_irq(isa->isairq, AML_EDGE, AML_ACTIVE_LOW,
+ AML_SHARED));
+ aml_append(prs, aml_end_dependent_function());
+ aml_append(dev, aml_name_decl("_PRS", prs));
+ }
+
aml_append(scope, dev);
}
@@ -117,6 +136,8 @@ static const Property serial_isa_properties[] = {
DEFINE_PROP_UINT32("index", ISASerialState, index, -1),
DEFINE_PROP_UINT32("iobase", ISASerialState, iobase, -1),
DEFINE_PROP_UINT32("irq", ISASerialState, isairq, -1),
+ DEFINE_PROP_BOOL("x-acpi-shared-irq", ISASerialState, acpi_shared_irq,
+ true),
};
static void serial_isa_class_initfn(ObjectClass *klass, const void *data)
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 0dd3fd01d9..c0335b05ba 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -82,7 +82,9 @@
{ "qemu64-" TYPE_X86_CPU, "model-id", "QEMU Virtual CPU version " v, },\
{ "athlon-" TYPE_X86_CPU, "model-id", "QEMU Virtual CPU version " v, },
-GlobalProperty pc_compat_10_2[] = {};
+GlobalProperty pc_compat_10_2[] = {
+ { "isa-serial", "x-acpi-shared-irq", "false" },
+};
const size_t pc_compat_10_2_len = G_N_ELEMENTS(pc_compat_10_2);
GlobalProperty pc_compat_10_1[] = {
--
2.43.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 5/5] tests: data: update x86 ACPI tables
2026-02-27 13:44 [PATCH 0/5] isa-serial: acpi: declare shared IRQs for COM1/3 and COM2/4 Mark Cave-Ayland
` (3 preceding siblings ...)
2026-02-27 13:44 ` [PATCH 4/5] hw/char/serial-isa.c: declare IRQ as shared in ACPI IRQ descriptor Mark Cave-Ayland
@ 2026-02-27 13:44 ` Mark Cave-Ayland
4 siblings, 0 replies; 11+ messages in thread
From: Mark Cave-Ayland @ 2026-02-27 13:44 UTC (permalink / raw)
To: mst, imammedo, anisinha, pbonzini, marcandre.lureau,
marcel.apfelbaum, qemu-devel
Update the x86 ACPI tables to reflect the IRQ descriptor changes for ISA serial
ports:
Device (COM1)
{
Name (_HID, EisaId ("PNP0501") /* 16550A-compatible COM Serial Port */) // _HID: Hardware ID
Name (_UID, One) // _UID: Unique ID
Name (_STA, 0x0F) // _STA: Status
Name (_CRS, ResourceTemplate () // _CRS: Current Resource Settings
{
IO (Decode16,
0x03F8, // Range Minimum
0x03F8, // Range Maximum
0x00, // Alignment
0x08, // Length
)
- IRQNoFlags ()
+ IRQ (Edge, ActiveLow, Shared, )
{4}
})
+ Name (_PRS, ResourceTemplate () // _PRS: Possible Resource Settings
+ {
+ StartDependentFn (0x00, 0x00)
+ {
+ IO (Decode16,
+ 0x03F8, // Range Minimum
+ 0x03F8, // Range Maximum
+ 0x00, // Alignment
+ 0x08, // Length
+ )
+ IRQ (Edge, ActiveLow, Shared, )
+ {4}
+ }
+ EndDependentFn ()
+ })
}
Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
---
tests/qtest/bios-tables-test-allowed-diff.h | 47 ------------------
tests/data/acpi/x86/microvm/DSDT | Bin 365 -> 393 bytes
tests/data/acpi/x86/microvm/DSDT.ioapic2 | Bin 365 -> 393 bytes
tests/data/acpi/x86/microvm/DSDT.pcie | Bin 2985 -> 3013 bytes
tests/data/acpi/x86/microvm/DSDT.rtc | Bin 404 -> 432 bytes
tests/data/acpi/x86/microvm/DSDT.usb | Bin 414 -> 442 bytes
tests/data/acpi/x86/pc/DSDT | Bin 8598 -> 8626 bytes
tests/data/acpi/x86/pc/DSDT.acpierst | Bin 8509 -> 8537 bytes
tests/data/acpi/x86/pc/DSDT.acpihmat | Bin 9923 -> 9951 bytes
tests/data/acpi/x86/pc/DSDT.bridge | Bin 15469 -> 15497 bytes
tests/data/acpi/x86/pc/DSDT.cphp | Bin 9062 -> 9090 bytes
tests/data/acpi/x86/pc/DSDT.dimmpxm | Bin 10252 -> 10280 bytes
tests/data/acpi/x86/pc/DSDT.hpbridge | Bin 8549 -> 8577 bytes
tests/data/acpi/x86/pc/DSDT.hpbrroot | Bin 5087 -> 5115 bytes
tests/data/acpi/x86/pc/DSDT.ipmikcs | Bin 8670 -> 8698 bytes
tests/data/acpi/x86/pc/DSDT.memhp | Bin 9957 -> 9985 bytes
tests/data/acpi/x86/pc/DSDT.nohpet | Bin 8456 -> 8484 bytes
tests/data/acpi/x86/pc/DSDT.numamem | Bin 8604 -> 8632 bytes
tests/data/acpi/x86/pc/DSDT.roothp | Bin 12391 -> 12419 bytes
tests/data/acpi/x86/q35/DSDT | Bin 8427 -> 8455 bytes
tests/data/acpi/x86/q35/DSDT.acpierst | Bin 8444 -> 8472 bytes
tests/data/acpi/x86/q35/DSDT.acpihmat | Bin 9752 -> 9780 bytes
.../data/acpi/x86/q35/DSDT.acpihmat-generic-x | Bin 12637 -> 12665 bytes
.../acpi/x86/q35/DSDT.acpihmat-noinitiator | Bin 8706 -> 8734 bytes
tests/data/acpi/x86/q35/DSDT.applesmc | Bin 8473 -> 8501 bytes
tests/data/acpi/x86/q35/DSDT.bridge | Bin 12040 -> 12068 bytes
tests/data/acpi/x86/q35/DSDT.core-count | Bin 12985 -> 13013 bytes
tests/data/acpi/x86/q35/DSDT.core-count2 | Bin 33842 -> 33870 bytes
tests/data/acpi/x86/q35/DSDT.cphp | Bin 8891 -> 8919 bytes
tests/data/acpi/x86/q35/DSDT.cxl | Bin 13218 -> 13246 bytes
tests/data/acpi/x86/q35/DSDT.dimmpxm | Bin 10081 -> 10109 bytes
tests/data/acpi/x86/q35/DSDT.ipmibt | Bin 8502 -> 8530 bytes
tests/data/acpi/x86/q35/DSDT.ipmismbus | Bin 8515 -> 8543 bytes
tests/data/acpi/x86/q35/DSDT.ivrs | Bin 8444 -> 8472 bytes
tests/data/acpi/x86/q35/DSDT.memhp | Bin 9786 -> 9814 bytes
tests/data/acpi/x86/q35/DSDT.mmio64 | Bin 9557 -> 9585 bytes
tests/data/acpi/x86/q35/DSDT.multi-bridge | Bin 13280 -> 13308 bytes
tests/data/acpi/x86/q35/DSDT.noacpihp | Bin 8289 -> 8317 bytes
tests/data/acpi/x86/q35/DSDT.nohpet | Bin 8285 -> 8313 bytes
tests/data/acpi/x86/q35/DSDT.numamem | Bin 8433 -> 8461 bytes
tests/data/acpi/x86/q35/DSDT.pvpanic-isa | Bin 8528 -> 8556 bytes
tests/data/acpi/x86/q35/DSDT.thread-count | Bin 12985 -> 13013 bytes
tests/data/acpi/x86/q35/DSDT.thread-count2 | Bin 33842 -> 33870 bytes
tests/data/acpi/x86/q35/DSDT.tis.tpm12 | Bin 9033 -> 9061 bytes
tests/data/acpi/x86/q35/DSDT.tis.tpm2 | Bin 9059 -> 9087 bytes
tests/data/acpi/x86/q35/DSDT.type4-count | Bin 18661 -> 18689 bytes
tests/data/acpi/x86/q35/DSDT.viot | Bin 14684 -> 14712 bytes
tests/data/acpi/x86/q35/DSDT.xapic | Bin 35790 -> 35818 bytes
48 files changed, 47 deletions(-)
diff --git a/tests/qtest/bios-tables-test-allowed-diff.h b/tests/qtest/bios-tables-test-allowed-diff.h
index cef44135bc..dfb8523c8b 100644
--- a/tests/qtest/bios-tables-test-allowed-diff.h
+++ b/tests/qtest/bios-tables-test-allowed-diff.h
@@ -1,48 +1 @@
/* List of comma-separated changed AML files to ignore */
-"tests/data/acpi/x86/pc/DSDT",
-"tests/data/acpi/x86/pc/DSDT.bridge",
-"tests/data/acpi/x86/pc/DSDT.ipmikcs",
-"tests/data/acpi/x86/pc/DSDT.cphp",
-"tests/data/acpi/x86/pc/DSDT.numamem",
-"tests/data/acpi/x86/pc/DSDT.nohpet",
-"tests/data/acpi/x86/pc/DSDT.memhp",
-"tests/data/acpi/x86/pc/DSDT.dimmpxm",
-"tests/data/acpi/x86/pc/DSDT.acpihmat",
-"tests/data/acpi/x86/pc/DSDT.acpierst",
-"tests/data/acpi/x86/pc/DSDT.roothp",
-"tests/data/acpi/x86/pc/DSDT.hpbridge",
-"tests/data/acpi/x86/pc/DSDT.hpbrroot",
-"tests/data/acpi/x86/q35/DSDT",
-"tests/data/acpi/x86/q35/DSDT.tis.tpm2",
-"tests/data/acpi/x86/q35/DSDT.tis.tpm12",
-"tests/data/acpi/x86/q35/DSDT.bridge",
-"tests/data/acpi/x86/q35/DSDT.noacpihp",
-"tests/data/acpi/x86/q35/DSDT.multi-bridge",
-"tests/data/acpi/x86/q35/DSDT.ipmibt",
-"tests/data/acpi/x86/q35/DSDT.cphp",
-"tests/data/acpi/x86/q35/DSDT.numamem",
-"tests/data/acpi/x86/q35/DSDT.nohpet",
-"tests/data/acpi/x86/q35/DSDT.acpihmat-noinitiator",
-"tests/data/acpi/x86/q35/DSDT.acpihmat-generic-x",
-"tests/data/acpi/x86/q35/DSDT.memhp",
-"tests/data/acpi/x86/q35/DSDT.dimmpxm",
-"tests/data/acpi/x86/q35/DSDT.acpihmat",
-"tests/data/acpi/x86/q35/DSDT.mmio64",
-"tests/data/acpi/x86/q35/DSDT.acpierst",
-"tests/data/acpi/x86/q35/DSDT.applesmc",
-"tests/data/acpi/x86/q35/DSDT.pvpanic-isa",
-"tests/data/acpi/x86/q35/DSDT.ivrs",
-"tests/data/acpi/x86/q35/DSDT.type4-count",
-"tests/data/acpi/x86/q35/DSDT.core-count",
-"tests/data/acpi/x86/q35/DSDT.core-count2",
-"tests/data/acpi/x86/q35/DSDT.thread-count",
-"tests/data/acpi/x86/q35/DSDT.thread-count2",
-"tests/data/acpi/x86/q35/DSDT.viot",
-"tests/data/acpi/x86/q35/DSDT.cxl",
-"tests/data/acpi/x86/q35/DSDT.ipmismbus",
-"tests/data/acpi/x86/q35/DSDT.xapic",
-"tests/data/acpi/x86/microvm/DSDT",
-"tests/data/acpi/x86/microvm/DSDT.usb",
-"tests/data/acpi/x86/microvm/DSDT.rtc",
-"tests/data/acpi/x86/microvm/DSDT.ioapic2",
-"tests/data/acpi/x86/microvm/DSDT.pcie",
diff --git a/tests/data/acpi/x86/microvm/DSDT b/tests/data/acpi/x86/microvm/DSDT
index f477668f2ee80241e47b340ad4a30f5480df2049..00de0ad89cd77d5316a0d483233256d51cb6113e 100644
GIT binary patch
delta 75
zcmaFM)XB`{66_Mv$;iOKw0a_!G?TOFM0GPJKbDDcikgC4eC~`tn13)ca3~8fNLDg%
V#0LZg3yN?F8ZsbDSWN7F004}M5kLR{
delta 47
zcmeBVe#^w=66_L^%gDgMBsh^vn#o;wqPiKQ(ZqN~J^?OXcg7#gKbRRflmr+iu6zIh
D{Fn<t
diff --git a/tests/data/acpi/x86/microvm/DSDT.ioapic2 b/tests/data/acpi/x86/microvm/DSDT.ioapic2
index e5924a49962e0cff4228bcfc77ebcf48cb4a2219..1a8511fff04b2aa7a7d603e0c44c9eec96deeb1a 100644
GIT binary patch
delta 75
zcmaFM)XB`{66_Mv$;iOKlsb`1n#oyoqPiKAAIrozMNL62K6l0+%s-eJIFtn#Br6#>
V;sb($1x2_74H=LnEGG6o004X25c&WB
delta 47
zcmeBVe#^w=66_L^%gDgMbb2C}G?TmVM0GPpqlxi~d;(m&?u<W}e=sv}C<!o3T=@V1
D6rl_I
diff --git a/tests/data/acpi/x86/microvm/DSDT.pcie b/tests/data/acpi/x86/microvm/DSDT.pcie
index b646a05551c1ed902413a462442346ce246f8675..4e74e11087671b5e9a683d100e0289d758aeaa9a 100644
GIT binary patch
delta 76
zcmZ1}epH;xCD<k8C^rKGQ}aYFX(s<26V=U_{8%Q&DQXIG@wqepVE)0(z@aR_AX&-4
W5g!l~EGWVyXvlypVX?7Sh8qCXyAhQD
delta 48
zcmX>qzEYgaCD<ioB{u^D(~pT<(oD|VC#st<8cmE><P+fHb!Ys+{DYZ+LrH*P<4PHB
E07x1PmH+?%
diff --git a/tests/data/acpi/x86/microvm/DSDT.rtc b/tests/data/acpi/x86/microvm/DSDT.rtc
index e375473b5f033d374dd2a64a9f814fd16c3e262f..a5ac3ded5fd05301beeeca5962457eba121879b3 100644
GIT binary patch
delta 76
zcmbQjyn&g^CD<io10w?iQ{_Z1X(li6iRxxdek>E?6g368_}m$PF#lj?;7}G|kgR0j
Whz|$~78KzUG-N=Qu-Mqk&IkaF)euzx
delta 48
zcmdnMJcXIdCD<io3L^sp)BTBD(oBA$6V=TajV8t`@(FP9x-<S@{=v+^p(MbtaV0w=
E03e17RsaA1
diff --git a/tests/data/acpi/x86/microvm/DSDT.usb b/tests/data/acpi/x86/microvm/DSDT.usb
index d63fd84620a2689120b32262f964e6a098d71632..d6d5767a328da92135c8b3b29fd21741c043c088 100644
GIT binary patch
delta 76
zcmbQoyo;I3CD<io7b61$)9#5}(o8NA6V=U_{8%Q&DQXIG@wqepVE)0(z@aR_AX&-4
W5g!l~EGWVyXvlypVX?7SkP!f-K@hqC
delta 48
zcmdnRJdc^nCD<io9wP$-lj1}!X(kV`iRxyIMib)|`2@Il-5Gx{|6pd|P!eF+xKfZ2
E01N&Ky8r+H
diff --git a/tests/data/acpi/x86/pc/DSDT b/tests/data/acpi/x86/pc/DSDT
index 6ea2d36d138daffb59a8636759078500adc58f24..6ae57a6612442d3125fcc9564a311f9570ce8cdb 100644
GIT binary patch
delta 110
zcmbQ{yvdo%CD<iolOh8HW7|fq?LzXdFJj_@o#F+2p9eU58bmj72OAi~bHqEk1TjQ6
zImvE*AQa8W<i|4EMnq9lkc-cq@dxt{W(E#r0S3uR29EfEpkP4}E<r;EWC@GS*&^D!
E0NXtrTmS$7
delta 82
zcmdnwJk6QQCD<ionj!-O<M)kR+lAykpT)!nJH-n)J_~U6G>C5E4mL1|=ZJT731WzD
ma+BWtKq#7#(P*-*h$5c=7q2_x59S}t3>-=V44d0Uw0Qw09T!~y
diff --git a/tests/data/acpi/x86/pc/DSDT.acpierst b/tests/data/acpi/x86/pc/DSDT.acpierst
index d8c173aa613f51b1c76ea7b9dee19e899cba240d..4702f2bd9024b057b4f664d9a6a661c0fb1b90bb 100644
GIT binary patch
delta 110
zcmdn%bkm8;CD<h-Qjvjy@!UqP?LzWCk7DA3o#F*t9tAji8bmj72OAi~bHqEk1TjQ6
zImvE*AQa8W<i|4EMnq9lkc-cq@dxt{W(E#r0S3uR29EfEpkP4}E<r;EWC@GS*&>&C
E0PwUOFaQ7m
delta 82
zcmccVwAYEtCD<jzR*`{$(S9S>b|HC(hcWTNPVoXB4+5M$4WgU4gAEMgIpQ5%f*7Kk
m+@v=@5Q=7GG@5KHqR1z}#p}-agZT$D1Ba3T!{&C8OFRJb1s5>@
diff --git a/tests/data/acpi/x86/pc/DSDT.acpihmat b/tests/data/acpi/x86/pc/DSDT.acpihmat
index ba363d6af76af728b7c88bbaf47f7e0ea3dcb41f..3b5fe4b3500884ba70b37575bd3d8523c9055f11 100644
GIT binary patch
delta 110
zcmX@?d*7GKCD<k8z8V7qqw_|tC*tz1FJj_@o#F+2p9eU58bmj72OAi~bHqEk1TjQ6
zImvG3m563!@?)8tDXFL_$i?T*_=EWeGXsaR0E1*D14n#7P_Uo~m!Kg7vV_Iv8Isz(
E0P@2ef&c&j
delta 82
zcmccbd)SxDCD<k8uo?pc<CcwFPsHUtpT)!nJH-n)J_~U6G>C5E4mL1|=ZJT731WzD
ma+BW7D-q4eXf!!XQjt%9i`Sj;2lEeR1`Z_whRs_fwRr(QB^QGL
diff --git a/tests/data/acpi/x86/pc/DSDT.bridge b/tests/data/acpi/x86/pc/DSDT.bridge
index b68302363cb24181988d6e3dceb04a0946838d5e..9410b0b379e62f38fd85120efdb50eada6f20685 100644
GIT binary patch
delta 111
zcmaD`(OJpm66_MvX~V$4xOgMib|J;iex{iCV5fM2hJL01XHSFZChlMZgLsa3N0%Um
z=q4xG&5wkl8JYZ8CfkW9Y6^1kxikJ?{=v+^p)9~4S;@c=9}pBQD8eOZ$bc+iu{c*m
F0{{nT9JT-e
delta 83
zcmeCId|Scg66_L^Ys0|6$hwhhyO3gUFH=l>uv5H1OD|J^v!_9H6L+wIK|Dviqe~D&
nbd#I(=0`%&jEqK;?L`#%1h{zJ8GkVUU}oS@5@1-|DWU-Y1Kk$4
diff --git a/tests/data/acpi/x86/pc/DSDT.cphp b/tests/data/acpi/x86/pc/DSDT.cphp
index 20688edf2da41146ece4faa4141517408a42870c..7f33f7b8a6b1c8ace8773374b0a7a2628a25f0ca 100644
GIT binary patch
delta 110
zcmaFn*5uCR66_Mvq|Cs;_;VvyyNJB&i<tOer+5M1=K;>12GLF2!3GBL9Py4WK@8DN
zPO_Ufh(t3o`LRsq5mVF@<l=K@{K5Q#nSn!DfI+g7fg?U3C|FR0OVE%3S;AtowU{<9
E0N`pI5C8xG
delta 82
zcmZp2f9A&J66_L^rp&;=n6;6sT}0mVSxkJeQ@nuVvjAsLgXkviU;~4Aj(A6xAcp8B
mH|fnAM4}lPjVAMoDe?($@wzkqVE)0(z@a3-usK{zn->7-R~8Wf
diff --git a/tests/data/acpi/x86/pc/DSDT.dimmpxm b/tests/data/acpi/x86/pc/DSDT.dimmpxm
index 8d4be05d2c71ca8de6d732d3e48e0e323143160c..7e753e5189c98fbbf29a0bb00ea0eb275fddfc37 100644
GIT binary patch
delta 124
zcmeAPSP{VG66_M9p~1kwxNIYrt|XW1i<tOer+5M1=aU^Jg_)dWH-||^Gy3?kIQ#n=
za>RRhy6`w&U}fZp5A}2blEER4T>KpI&OyO~f?Ry=j6axvFf(u{3ouAlGH}EP0EI=k
Q1PvLGB`h{Sl+xw}0M4Wx-v9sr
delta 67
zcmZ1x&=bJr66_Mfqrt$yD87+PSCY%~SxkJeQ@nuVv&oK<!c1<`o5Lid85xZxZ<bP=
XJYR~H^9S<}W(E!=0fx<grL=hgbSe^?
diff --git a/tests/data/acpi/x86/pc/DSDT.hpbridge b/tests/data/acpi/x86/pc/DSDT.hpbridge
index 2b5b885b862a2fe8bc4a24446400dccf685dab85..5c19ea87c93288525db3be0660debb3a86580a67 100644
GIT binary patch
delta 110
zcmaFr)acCR66_MvsK~&;xN9TVb|HC}r!n!tPVoXhPXe4h4WgU4gAEMgIpQ5%f*7Kk
zoMbmY5Q=7G@?)87BciA&$i?T*_=EWeGXsaR0E1*D14n#7P_Uo~m!Kg7vV_IvY>{6)
E0OvFvLI3~&
delta 82
zcmZp4e(J>K66_L^s>r~=sJ)SEyO6xc<Cyqhr+5K}#{tfs2GLF2!3GBL9Py4WK@8DN
mZql0{2t_k88cntpQREZg;&o^I!Tf`nfkR1vVRO64FCGBuXBR^N
diff --git a/tests/data/acpi/x86/pc/DSDT.hpbrroot b/tests/data/acpi/x86/pc/DSDT.hpbrroot
index cc6f26a3f8fe85f34a8acb5432bab3cf4d3ab1f6..00e04ed0c0e4ee094fd3f541c7aa0987fc573e03 100644
GIT binary patch
delta 110
zcmcbw{#%{PCD<k8w=e?(<Ijy;Jc9DBdNJ|APVoZ1x&h9f2GLF2!3GBL9Py4WK@8DN
zPO_U#1)~|6{8%PW6jIa_<l=K@{K5Q#nSn!DfI+g7fg?U3C|FR0OVE%3S;AuT0U>!t
E0CcDuCIA2c
delta 110
zcmeyZeqWu-CD<k8zAys=W7bA49zl6eotXGwr+5KJod9P~gXkviU;~4Aj(A6xAcp8B
zH|fo$g3*iyM$Z1eh8*!8o-RC&7g!lN;zK=MfMjrpBNsnMymL^npa2)IJL3=LAIuCK
NN&*a<?+D2=0sv468*u;t
diff --git a/tests/data/acpi/x86/pc/DSDT.ipmikcs b/tests/data/acpi/x86/pc/DSDT.ipmikcs
index 052a84e294eee4ecef9a36341493f841caf887a5..9c86a694d6b1a990415676943972820b51be49f0 100644
GIT binary patch
delta 110
zcmccT{L7ikCD<k8mm&iLBhyB%?LzXtZ(`zuo#F*t-vl^&8bmj72OAi~bHqEk1TjQ6
zc`0swAhei~$&Y1ni-@A8AQzuI;}7N^%nTgL0t}Ls3>@(RLBWC|T!MxS$PyNtH;ZWV
F0stt59i0FG
delta 82
zcmV-Y0ImP}L*7FQL{mgm-XQ=00duhmw-O&g>s((`LSGO`>QF;TFk6BPQ!p@J2wy=&
oQUF_mP9L-25~BeDGLwZAAr24<4Mzd^1NZ{~2qF*wv(FSO4Oi+Io&W#<
diff --git a/tests/data/acpi/x86/pc/DSDT.memhp b/tests/data/acpi/x86/pc/DSDT.memhp
index 7efc12a46cb87c0684b7d880b2cc94d302744e03..4088448de942d92da3e7ce6e1afe1240e025efd7 100644
GIT binary patch
delta 110
zcmaFr+vvyT66_MfsLsH^7`c&)O+w!FMNE9KQ@nuh^8ja0gXkviU;~4Aj(A6xAcp8B
zC)v&V648uIek_x_B^5OVx%k`}e=z@GX5dg3V34e2;D`?h3KkUM5;SB$may2oOH!K`
E07=Fh2><{9
delta 82
zcmZqld+N*O66_N4RE>dw@$^P6HVJvpXEE`?PVoYc&jOr14WgU4gAEMgIpQ5%f*7Kk
m+@v?_OGGm=8cptzROA!j;&o^I!Tf`nfkR1vVe>UfZC(HiJQoT8
diff --git a/tests/data/acpi/x86/pc/DSDT.nohpet b/tests/data/acpi/x86/pc/DSDT.nohpet
index 7eedfcd64ebd0193744864b4f6cbead35c7c3ab2..20bb27753446e9c344d798955cc1d708f9a399bd 100644
GIT binary patch
delta 110
zcmeBhTH?gz66_M9qR7C&=)aLmQ%K(RMNE9KQ@nuh^8ja0gXkviU;~4Aj(A6xAcp8B
zC)v$GLeY#&ek_yM2`g#}a`Cw{{$T#W%)p^6z#v)4z!4u16f7vhC1}WiEMc+vuCO*Q
E07dB=KL7v#
delta 82
zcmZ4D)ZxVC66_Mfp~%3%cwi%!rjWenvzYi`r+5L!X93Qh2GLF2!3GBL9Py4WK@8DN
mZql2BgrXT4jV7-bR^$`l;&o^I!Tf`nfkR1vVe?O6ZC(Jpvlc)A
diff --git a/tests/data/acpi/x86/pc/DSDT.numamem b/tests/data/acpi/x86/pc/DSDT.numamem
index 910b4952a0757025cfed1c60416d16054e70846f..c42cffe4153e486bf25112210d378d6e937f1125 100644
GIT binary patch
delta 124
zcmbQ^yu+ExCD<iohav+5qtHgKy+T~BFJj_@o#F+2pHIFhB+TR_yZM<=G^39ni?hG4
zAxFH2rwfnc1y)9m_)t$5AQ>Fu$i>eQ?;I2?D9FX<&iI4*2QveQvH*i*B?Cu%08m(j
QOVE%3S;As-p@=pw0A~6g{{R30
delta 67
zcmV-J0KEUWL!3hjL{mgmoFM=J0fVs$y%GvZ=3HM>LSGO;=9AG969PsXv*r?80Rb|T
ZLlhyCFBAm{_yhO@00<%w0JDu0D-G1A6VCtu
diff --git a/tests/data/acpi/x86/pc/DSDT.roothp b/tests/data/acpi/x86/pc/DSDT.roothp
index 45d3dbe1b69143a956b4f829913ca47f07134741..b1c55ec9849025ae03b2257df66861302922e87b 100644
GIT binary patch
delta 112
zcmaE!(45HS66_MvY{0<4D72AlyO3h<1;&{8V5fM2mJ5sl&YlL*P29l-2Jsy6jxIqA
z(M?XWn;!{9Gcx(HOtuqI)D-06b7%a){DYZ+Ls@`9vXX%#J|HMqP=rg+kO5i3Vsoy@
GFKGb#lpS0E
delta 84
zcmZope4fDN66_L^Zot66*u0TzyO3hzdB&LdV5fM2j&qCw&YlL*P29l-2Jsy6jxIqA
o(M@jBn;!{9Gcp=Ywii+46X4=?XZ*qZgPDOtNq}K<r^qj9073Q`T>t<8
diff --git a/tests/data/acpi/x86/q35/DSDT b/tests/data/acpi/x86/q35/DSDT
index 377e880175f6f11101548c0c64da61b5aee00bd9..71f6650fda935bf42b2331f16a953a6a0097baf7 100644
GIT binary patch
delta 94
zcmaFu*zUyT66_MfuE@Z^n6!~gUY^TQHYPsUDPF)+X0oxoJ(HW*<P!P!OnxkrQxp_6
o1-ba#8GkVUU}oS@7GRL9WZ;Mo2nrSy;Sw}tK$ftWJXs+E06ljV^Z)<=
delta 66
zcmZp7dhN*N66_N4T7iLq@#sb_d3i2Z>6rLnr+5KhsmaFj_Do(PlS|~^Ga5}!RZ!#;
W;No>>{K5Q#nSnz|fMN1_g$Mw7ZxQtX
diff --git a/tests/data/acpi/x86/q35/DSDT.acpierst b/tests/data/acpi/x86/q35/DSDT.acpierst
index 026bfdfebf66c1803f158ac8c115eb5f49b5cb19..6fe24b49fb447f7f4fbaf693976089fa1bfbf019 100644
GIT binary patch
delta 94
zcmez4IKzp{CD<iILXm-ik!d5BygZkaTugkhQ@nte>||s4046uF$*uD5nfzELmntY~
o3UcweGyY)y!OXy+EWjXH$-ogG5ELvZ!X;?PfGlA#d5J;<06oPP4*&oF
delta 66
zcmbQ?^v99QCD<k8j{*Y&W9mjOd3i23nV9%sr+5KB>B+|O0Zd*ZlUwEAGa5}UQ&8j+
W;No>>{K5Q#nSnz|fMN0hg$Mw6wh|Bk
diff --git a/tests/data/acpi/x86/q35/DSDT.acpihmat b/tests/data/acpi/x86/q35/DSDT.acpihmat
index f1b8483d8da21dd57f3e5e7a1e4eb787df2c38ac..59d9547d7533dc49d11fe363fa3a7596ae6c7a46 100644
GIT binary patch
delta 94
zcmbQ?v&DzYCD<jzM2&%gQGO$rj|!KgY)pKxQ@ntu%;W?WdnPxr$qQB9Gx@Pho~Wv*
oDagg=&iI4*2QveQvH*i*B?Cu%Kv1xt2$!HC1G0q0<O8Y^0AjKh%m4rY
delta 94
zcmdnuGsB0=CD<iILXClev2i1pj|!KobWD7(Q@nt$)Z_#ednPZD$qQB98yGqJ`x<h@
xdw9C=I9_07<cJUTbODmVA&y-99P!RU!GZ!@yzY!Yn13)ca3~2dOunNU0RWT_7z6+S
diff --git a/tests/data/acpi/x86/q35/DSDT.acpihmat-generic-x b/tests/data/acpi/x86/q35/DSDT.acpihmat-generic-x
index a7731403f460a235bf705770a1547dafeee069ab..a6e26f3c0b8265a31343791d3fbbcefb0f5fb8d4 100644
GIT binary patch
delta 95
zcmcbc^fQUeCD<jT(vX3H@yJH5b-G->#xe21PVoY+#+wi6u4ZI%6Pui`|DMT@WpccM
qqNX4hpF86Z<{!)q9LfR=l9db`@c}`>f+Adkh78CO7L)r7&I15hi5d|A
delta 67
zcmV-J0KEVCV%=g2L{mgmT`>Rv0X4A-t}O~dGF)F%LSGO`F|)!gs{sN^6q9c+?*THC
ZU@##L5DE=P0r&&>0{{pj5CD^^Fwev;6cPXc
diff --git a/tests/data/acpi/x86/q35/DSDT.acpihmat-noinitiator b/tests/data/acpi/x86/q35/DSDT.acpihmat-noinitiator
index cb4995de7e33cd9f2d134ec96651d217873d6944..f678a3a6a66b3d2bb27939ba34cd5fde7f6045c1 100644
GIT binary patch
delta 94
zcmZp2ndidg66_Kpr^LX(cyl9{nF5!iY)pKxQ@ntu%w#VGdnPxr$=wR?nfzELS1T%N
o3UcweGyY)y!OXy+EWjXH$-ogG5ELvZ!X;?PfGlA#d6i-W0A*Yjt^fc4
delta 66
zcmbQ|(&WPB66_Mfq{P6$XuXlkOo7W)Iwn5YDPF)=YO<GtJ(HKn<Zgxcj7F1d6czad
WxOm+ee=z@GX5df~V3>SNF#-T1wh*rX
diff --git a/tests/data/acpi/x86/q35/DSDT.applesmc b/tests/data/acpi/x86/q35/DSDT.applesmc
index 92c8fdb6cbb8ae8bdf5ede9679eea92486eaf372..60876d83a3ecf01b9aa568a151fe6208a9f387b3 100644
GIT binary patch
delta 123
zcmbQ~wAG2rCD<jzRFQ#!(Rm}6ygZk`d`x_>Q@nt?{A6Q!dnOmj%_Z`(j6QxW&i=lJ
z9Pu8WE<BDGSQ$CuLp@!9WN?Th7e7b5b5O9LAQzuI;}7N^%nTgL0t}Ls3>@(RKw%Ls
OK|=;)35&@G6(RueZ5!DD
delta 66
zcmdn$G}DR8CD<iIQjvjyamz+7d3i2pxtRE1r+5Kx*~!N8_Dmk)n@i+n85xZxPgYQz
WT(7{&`GfffGXsZ`0K??F3K0N4auHzw
diff --git a/tests/data/acpi/x86/q35/DSDT.bridge b/tests/data/acpi/x86/q35/DSDT.bridge
index 957b3ad90c787616eac212865bce0a19a5ac1e6e..8675a79e865082cc64b281500133e31c7cc733cf 100644
GIT binary patch
delta 95
zcmeB(TN20R66_M9qR+s<n7@%rUY^VSdrW+=Q@nuxx6Q`#PkEW##3oDWzGw1dnari9
ps42+B=g#<p`3Exthq3^JWF-Sfd_YjJpa_?sAp^36#bisp^8n!!7)1a8
delta 67
zcmZ1y*Ad6%66_Mfq0hj;_+TTKygZlp*O>TVr+5M9ubYkKpYk$!iA<K#ea~n#nOjeh
XPk@Wpo$&|r4`v1qB>{%Xp?c>5sk9SD
diff --git a/tests/data/acpi/x86/q35/DSDT.core-count b/tests/data/acpi/x86/q35/DSDT.core-count
index 50ca91b065d9a2ba95f97d01856865f0e7c615f6..640fce6f24f3939f9f39fa18df3ed19621149a6f 100644
GIT binary patch
delta 122
zcmdm)dNq~HCD<k8su2SN<L!-HZw<H{Wn<!lo#F*NWhOHk+B3O{O?EPT@8ief?C)#H
z5%1yY!sB>>m60Pp)YAn>28TFu@pHsG2L%fXa`Cw{{$T#W%)p^6z#v)4z!4t+6c*tU
OG-N=Qu$Y`^6afG!R34ZB
delta 65
zcmcbbx-*r_CD<iorx61KqwPknw+39U(lPPDPVoZ1Qj-}C?U}qpCOa9vXEd5@Y@|3@
V-iVd+2lEeR1`Z_whRL-?5dew#5`+K%
diff --git a/tests/data/acpi/x86/q35/DSDT.core-count2 b/tests/data/acpi/x86/q35/DSDT.core-count2
index f460be2bf74ae512db8f24418b42e8cf2a56202d..f826dedf41f442df14860a0995cd9337e656327e 100644
GIT binary patch
delta 96
zcmdng!E~;JiOVI}CB(0Vfq_wHBUf4zm!oV<e6UlzfTzslswR6TH?hgPo8B||u}ogw
qtf(o-#pllWgZT$D1BbEzgJdNGM|?m~u%HN+pdkaYgvI1r%@F`Y_ZnFM
delta 68
zcmX@t!L+G^iOVI}CB&$Ofq}7aBUf4zm#cJ4e6UlzfUnf#swR6TFOkW+o8B`TO<vQi
Y$S1(X>(2Ot`3Exthmrup<ZsOp0N^wgS^xk5
diff --git a/tests/data/acpi/x86/q35/DSDT.cphp b/tests/data/acpi/x86/q35/DSDT.cphp
index 7c87d41d03fcfd2b5b82f2581f16de6bc0bb10bf..f1cf0eb7a7575dc8e525fec3e3409ebbc68eed04 100644
GIT binary patch
delta 94
zcmdn(dfk=FCD<k8x)K8e<F$=k?-jTlWn<!lo#F*NWhOH#+B3O{O?FXy&*aB4*+fZE
oQ;>_#o$&|r4`v1qWdR1sN(PSjfS_PO5iUVP24o3~$;nC)0MyzSc>n+a
delta 66
zcmccay4#h@CD<iow-N&bqs2z9_X=FD(lPPDPVoZ1Qj?h#?U}qpCc7xUXEd5@s-(y#
Wz{Ts%_=EWeGXsZ`0K?>Zr3e6Z5)pa;
diff --git a/tests/data/acpi/x86/q35/DSDT.cxl b/tests/data/acpi/x86/q35/DSDT.cxl
index da86b25f51b550ab20771111cb0a2bc49e713186..4163929b38f60749a3f3a81b0ff4fc79c9f99d91 100644
GIT binary patch
delta 94
zcmZ3KzAv52CD<iopD_ai<MfSOTMW6J<zwQ5o#F+&<tCpnOk{Eso2+g0p2?48vb3?H
orXUxeJL3=LAIuCK$^s0Ml?)v50YSlnB3y!o49F4|lf8^10P_+U0RR91
delta 66
zcmdm&z9^l`CD<iokud`U<Ijy;TMW6}Wn<!lo#F-jWhS36Ol0yBnXGN}p3!KsjIko0
W02i-2;}7N^%nTe#0t}PWj3WTIf)fG&
diff --git a/tests/data/acpi/x86/q35/DSDT.dimmpxm b/tests/data/acpi/x86/q35/DSDT.dimmpxm
index a2d812e5a23a3ce7739789246b342e703f8c96c0..65a581e0935f4bf0bc737c9967d409d72d684010 100644
GIT binary patch
delta 94
zcmaFp_t%fhCD<jTR-J)?v3VocR8=lV*_ilXr+5KRnaL|v?U~%fCcjdB&*aB4`IefZ
orXUxeJL3=LAIuCK$^s0Ml?)v50YSlnB3y!o49F4|lR4ER02R3yg8%>k
delta 66
zcmV-I0KNbHPT@`pL{mgmVJ83p0p+m@l_d&A8(d#gLSGO~8k4CdKLSb=lj<e!0Wy=@
YCLs<G3JpgA_yhO@00<%w0FxyrSi~q3ga7~l
diff --git a/tests/data/acpi/x86/q35/DSDT.ipmibt b/tests/data/acpi/x86/q35/DSDT.ipmibt
index 43ac1bd693d1b3f67d2a9e89ccaf8a56656df22d..301bf6b20ff6fa561a4bd3456ee00b7052834631 100644
GIT binary patch
delta 95
zcmdnybjgX!CD<h-NRfeov3(<#ygZkWVoZFnQ@ntS;$&ladnQNe%_Z_yj7)wklh-RK
pY6^1kxikJ?{=v+^p)9~4S;@c=9}pBQD8eOZ$bc+iG5MZC1ORDF7K{J@
delta 67
zcmccQw9SdjCD<jzOp$?s@yA9kd3i1eg_!tYr+5Jm`N_ue_Drsln@i-a7#WQwZ%|O=
X6X4=?XZ*qZgPDOtNq}MUFNFvIWy%qa
diff --git a/tests/data/acpi/x86/q35/DSDT.ipmismbus b/tests/data/acpi/x86/q35/DSDT.ipmismbus
index 1b998820d46e522b3129e42a867ed691c1f83e8f..81fec3eda54f8aab5e9df55ac86c9c0496547e96 100644
GIT binary patch
delta 94
zcmX@?bl-`~CD<h-UXg);k$oeVygZkuQcQfXQ@ntq(qv<KdnPxr$tCjdnfzELrzj|D
o3UcweGyY)y!OXy+EWjXH$-ogG5ELvZ!X;?PfGlA#d9uO=08<whg#Z8m
delta 66
zcmccbbl8c@CD<jzS&@N(F>@oAygZk$LQH(HQ@nty!enE4dnPZD$tCjd8I2~VDk$;^
WaPhh`{$T#W%)p@}z%Y5e!Uh0P)e(jO
diff --git a/tests/data/acpi/x86/q35/DSDT.ivrs b/tests/data/acpi/x86/q35/DSDT.ivrs
index 026bfdfebf66c1803f158ac8c115eb5f49b5cb19..6fe24b49fb447f7f4fbaf693976089fa1bfbf019 100644
GIT binary patch
delta 94
zcmez4IKzp{CD<iILXm-ik!d5BygZkaTugkhQ@nte>||s4046uF$*uD5nfzELmntY~
o3UcweGyY)y!OXy+EWjXH$-ogG5ELvZ!X;?PfGlA#d5J;<06oPP4*&oF
delta 66
zcmbQ?^v99QCD<k8j{*Y&W9mjOd3i23nV9%sr+5KB>B+|O0Zd*ZlUwEAGa5}UQ&8j+
W;No>>{K5Q#nSnz|fMN0hg$Mw6wh|Bk
diff --git a/tests/data/acpi/x86/q35/DSDT.memhp b/tests/data/acpi/x86/q35/DSDT.memhp
index 7346125d23fb3174c0ce678a2cdf2fdc77c4a9fa..d951a2266be9137c7432351d261a5f5288d32b6b 100644
GIT binary patch
delta 94
zcmdnxbIpg#CD<h-OpSqo(QG4Eo(h+vY)pKxQ@ntu%;Y8&dnPxr$%j?mGx@Ph-mI#q
oDagg=&iI4*2QveQvH*i*B?Cu%Kv1xt2$!HC1G0q0<VUIz0Itv%^8f$<
delta 65
zcmV-H0KWg$Ou9@8L{mgmIwk-B0hqB0ZX^mt8(d#gLSGO~8k2$~KLSb=lfxwM0Wy=c
XB_WfbB?Sri1NZ{~2qF*wll~=GhGi4o
diff --git a/tests/data/acpi/x86/q35/DSDT.mmio64 b/tests/data/acpi/x86/q35/DSDT.mmio64
index 15a291dbfb62e6ceb0249e02eb25b319744e351f..70b5a223ebb1370f6a5328afb83b443dd63eebab 100644
GIT binary patch
delta 94
zcmccW_0fyVCD<jTP?dp!@%u)u3S}-QxtRE1r+5J`*~vZ10ZeXUlkX|NXYym2d`?AC
oQ;>_#o$&|r4`v1qWdR1sN(PSjfS_PO5iUVP24o3~$$wQM02>S$bpQYW
delta 66
zcmez9b=8Z@CD<h-RF#2&F>)hUg)*0$OiX;RQ@ntm^yD7p046Vy$@i4sGa5}kucF8&
Wz{Ts%_=EWeGXsZ`0K;TS)d&ERQxbOo
diff --git a/tests/data/acpi/x86/q35/DSDT.multi-bridge b/tests/data/acpi/x86/q35/DSDT.multi-bridge
index 889a9040d950dd08980408d57f1037a5fc20c961..2987980a2caa9129f1747277352f33403e4852ad 100644
GIT binary patch
delta 125
zcmaEm{wJNwCD<k8k1+!SW9CLKd3o-BUB;OBV5fM2Hr>r8@;-u0Zeo+04Bq?ru{itt
z8gj&Yc)IX7USMV9h!6F20g}NXj$Hg4@y<cPf`VLp?u<W}e=sv}C<`!1Rx)tJ2LOdd
RxC9LukR>cOFEq4g0sw*^A5{PV
delta 68
zcmey9{ve&pCD<k8fiVLE<E@Qc^77oxI*c*#!A|i4UD}&X<b4F0yhJ898N6pSnp|wC
YI62;smGcMl4`v1qB>{%bdkyWG0Q+bZzW@LL
diff --git a/tests/data/acpi/x86/q35/DSDT.noacpihp b/tests/data/acpi/x86/q35/DSDT.noacpihp
index 780616774f97a2d7305faf9e9a9d12afeb0e2fa2..dfb62b7823740c606bab9215bcad03707b42b72e 100644
GIT binary patch
delta 95
zcmaFp@YjLMCD<jTR)K+m(QG4Ei7c1DeoTC@Q@nt?{^kzZTt+50vB}@%-ZS~JOnxq}
ps42+B=g#<p`3Exthq3^JWF-Sfd_YjJpa_?sAp^36#bhxBZvY5u7)Ag9
delta 67
zcmezC@X&$FCD<h-QGtPhars8B5?L;1y_oo5r+5Kx-OU}cxr|I+B9p(%y=OF<{6b!l
XPk@Wpo$&|r4`v1qB>{%XMhe~ly=xOk
diff --git a/tests/data/acpi/x86/q35/DSDT.nohpet b/tests/data/acpi/x86/q35/DSDT.nohpet
index 0f862ab2938e0e11aa8335630fad389095b37edd..8546756638fd47768527253defa9a7a8ee941436 100644
GIT binary patch
delta 94
zcmccX@Y8|ICD<jTQh|YiQD-C9L^&=;*_ilXr+5KRnaNA#?3vueCO?yV&*aB4`I@|<
orXUxeJL3=LAIuCK$^s0Ml?)v50YSlnB3y!o49F4|lUWra0N-5~#sB~S
delta 66
zcmezAaMyv$CD<h-R)K+mv2P>SL^&>3>6rLnr+5KhsmV*_?3uhoCO?yV&uBFHy1XKv
W02i-2;}7N^%nTe#0t}NC6(RtkND{{Y
diff --git a/tests/data/acpi/x86/q35/DSDT.numamem b/tests/data/acpi/x86/q35/DSDT.numamem
index df8edc05b69ecd1331973b16e534b44616b50f58..0485e0bb61ca2ada9b55f3687db890a9b19b06d7 100644
GIT binary patch
delta 94
zcmez9*z3gQ66_MftH{8>_--SYsyvsYY)pKxQ@ntu%w$V>dnPxr$yM_2nfzELXDKLZ
o3UcweGyY)y!OXy+EWjXH$-ogG5ELvZ!X;?PfGlA#d8R@H0Ciy&umAu6
delta 66
zcmeBm`sm2z66_N4QGtPhF>oW7syvsgbWD7(Q@nt$)MQI}dnPZD$yM_28I2}qD=6{_
WaPhh`{$T#W%)p@}z%Y5MLIeP5cM-7w
diff --git a/tests/data/acpi/x86/q35/DSDT.pvpanic-isa b/tests/data/acpi/x86/q35/DSDT.pvpanic-isa
index da3ce12787c28e555b6ba5eacb26275bdd4587f1..e94f3edb5d4126943fdc904804385ae16e6357c8 100644
GIT binary patch
delta 95
zcmccM^u~$HCD<h-N0EVnk!>TFygZkia!h=%Q@ntm(qv<KdnRw0%_Z_7j7)wklTRur
pY6^1kxikJ?{=v+^p)9~4S;@c=9}pBQD8eOZ$bc+iG5Lo=1ORJt7P$Zb
delta 67
zcmaFkbis+sCD<h-K#_rgv3w(!ygZkeVoZFnQ@nta;$&ladnSLW%_Z_7jEqK;Pbnz!
X32^bcGyY)y!OXy+B)~9PL@@#YV{j0=
diff --git a/tests/data/acpi/x86/q35/DSDT.thread-count b/tests/data/acpi/x86/q35/DSDT.thread-count
index 50ca91b065d9a2ba95f97d01856865f0e7c615f6..640fce6f24f3939f9f39fa18df3ed19621149a6f 100644
GIT binary patch
delta 122
zcmdm)dNq~HCD<k8su2SN<L!-HZw<H{Wn<!lo#F*NWhOHk+B3O{O?EPT@8ief?C)#H
z5%1yY!sB>>m60Pp)YAn>28TFu@pHsG2L%fXa`Cw{{$T#W%)p^6z#v)4z!4t+6c*tU
OG-N=Qu$Y`^6afG!R34ZB
delta 65
zcmcbbx-*r_CD<iorx61KqwPknw+39U(lPPDPVoZ1Qj-}C?U}qpCOa9vXEd5@Y@|3@
V-iVd+2lEeR1`Z_whRL-?5dew#5`+K%
diff --git a/tests/data/acpi/x86/q35/DSDT.thread-count2 b/tests/data/acpi/x86/q35/DSDT.thread-count2
index f460be2bf74ae512db8f24418b42e8cf2a56202d..f826dedf41f442df14860a0995cd9337e656327e 100644
GIT binary patch
delta 96
zcmdng!E~;JiOVI}CB(0Vfq_wHBUf4zm!oV<e6UlzfTzslswR6TH?hgPo8B||u}ogw
qtf(o-#pllWgZT$D1BbEzgJdNGM|?m~u%HN+pdkaYgvI1r%@F`Y_ZnFM
delta 68
zcmX@t!L+G^iOVI}CB&$Ofq}7aBUf4zm#cJ4e6UlzfUnf#swR6TFOkW+o8B`TO<vQi
Y$S1(X>(2Ot`3Exthmrup<ZsOp0N^wgS^xk5
diff --git a/tests/data/acpi/x86/q35/DSDT.tis.tpm12 b/tests/data/acpi/x86/q35/DSDT.tis.tpm12
index 67ebd7c158759221b801ecb67d8562d92fa219d5..39e7953ebf133590b027ebcca825aa8e9db7059a 100644
GIT binary patch
delta 106
zcmX@<_SB8bCD<h-RhfZ-aq>nkZFw$dr<nL)r+5Kx$I15c_Dmkun;YaEnFah<oc(<b
zIpRG$U3eTXurf}5FE6I%&iI4*2QveQvH*i*B?Cu%Kv1xt2$!HC1G0q0<c~@b0PBDo
A2mk;8
delta 66
zcmaFrcG8W@CD<jzQ<;H*@#{t|ZFw$thnV<ar+5K>`^on5_DnvOn;YaEnHh~HA68PF
Wyk3cw^9S<}W(E!=0fx!E$`JsM>JpCt
diff --git a/tests/data/acpi/x86/q35/DSDT.tis.tpm2 b/tests/data/acpi/x86/q35/DSDT.tis.tpm2
index c6b58472157d575e2625557d1346586be06b927c..fc6029618e322bea49d25e0ab558743adc64244b 100644
GIT binary patch
delta 95
zcmaFt_TP=mCD<jTUYUV`(QYG`wmg@wb4+}&Q@nty^JIH@dnPB_%?<L=%uIePlkX@g
pY6^1kxikJ?{=v+^p)9~4S;@c=9}pBQD8eOZ$bc+iF_~LA0sy#(7UKW_
delta 67
zcmezG_SlWfCD<h-S($->as5UvZFw$7r<nL)r+5KR$I15c_DpWpn;Yb#nHh~H-&IoN
X6X4=?XZ*qZgPDOtNq}Lpx^e^nl<^Vd
diff --git a/tests/data/acpi/x86/q35/DSDT.type4-count b/tests/data/acpi/x86/q35/DSDT.type4-count
index 17a64adb2055ad3168754ca121bf29851d2ee496..404d08434f0eb361dd1750de5f73d806790d03a4 100644
GIT binary patch
delta 96
zcmaDlk+E?SBbQ6CO9-PU0|Vptja-uMT#m9a@xe~<0-iFHb=~cm+{7m5xxZ)fW0@T1
qp{Oay#pllWgZT$D1BbEzgJdNGM|?m~u%HN+pdkaYgvI1uj|c$KFBj_o
delta 68
zcmZpi#Q1a~BbQ6COUP3X1_s8cja-uMT&~hF@xe~<0=`m{b=~cmyhJAFxxZ&LnjG(;
Y$S1(X>(2Ot`3Exthmrup<dq%~0HvA|>;M1&
diff --git a/tests/data/acpi/x86/q35/DSDT.viot b/tests/data/acpi/x86/q35/DSDT.viot
index 6eb30e8f4b2c54e4789c649475adff356c8c58a4..343e360d15b34033e87b3a40045062070c2e7b92 100644
GIT binary patch
delta 94
zcmcap^rMK&CD<jT!jgf3QEelak2#mCVoZFnQ@nt$!sG<=W+peW$xqGSGx@PhzG|VU
oDagg=&iI4*2QveQvH*i*B?Cu%Kv1xt2$!HC1G0q0WERT^01m(yegFUf
delta 66
zcmexSbf<{RCD<h-#*%@7ar#CsA9F5G`Iz`%r+5KJ`N;|9%}ib*lb@QuXEd68%|ek+
WfQ#3i@dxt{W(E!=0fxy6mJtBJ1rvV&
diff --git a/tests/data/acpi/x86/q35/DSDT.xapic b/tests/data/acpi/x86/q35/DSDT.xapic
index 111bb041dc0d114351add07c040dde61643d157a..91b62897533b7d77ad807c1d659e59bc30bd3785 100644
GIT binary patch
delta 96
zcmX>%o$1wdCN7s?mylQ83=E7K8@ZUexEy6;;)9*y1w3UYi*?yExrt2<?|RSV$1>Ty
qTTxSxi_e|$2lEeR1`cHb2FXeWj`)C}U_lWsK|=;)35&^P-4OskC>eqP
delta 68
zcmaDgo$1_kCN7s?mymPa3=E828@ZUexLl=U;)9*y1$?C@i*?yEd5KI8?|RQ@G})tD
Ykxzh&*PZbP^ABbQ4kZDG$&<Px0O)-bg8%>k
--
2.43.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH 4/5] hw/char/serial-isa.c: declare IRQ as shared in ACPI IRQ descriptor
2026-02-27 13:44 ` [PATCH 4/5] hw/char/serial-isa.c: declare IRQ as shared in ACPI IRQ descriptor Mark Cave-Ayland
@ 2026-03-04 11:22 ` Igor Mammedov
2026-03-04 14:36 ` Mark Cave-Ayland
0 siblings, 1 reply; 11+ messages in thread
From: Igor Mammedov @ 2026-03-04 11:22 UTC (permalink / raw)
To: Mark Cave-Ayland
Cc: mst, anisinha, pbonzini, marcandre.lureau, marcel.apfelbaum,
qemu-devel
On Fri, 27 Feb 2026 13:44:58 +0000
Mark Cave-Ayland <mark.caveayland@nutanix.com> wrote:
> From Windows 8.1 onwards ISA serial IRQs cannot be shared when ACPI Revision
> 5.0 is used in the FACP table. The reason for this is that if a 2-byte IRQ
> Descriptor is used then the interrupt is considered to be high true, edge
> sensitive, non-shareable. Since legacy serial ports COM1/3 and COM2/4 share
> an IRQ then if more than 2 serial ports are added, Windows indicates a
> conflict in Device Manager and these combinations cannot be used together.
>
> Add a new 3-byte IRQ Descriptor to the _CRS resource indicating that the
> ISA serial IRQ is low true, edge sensitive and shareable, along with a
> corresponding _PRS resource so that the legacy serial ports also appear
> at a fixed address. This enables all 4 legacy serial ports to be used in
> Windows without conflict.
What happens if we just replace aml_irq_no_flags() with aml_irq()
(without compat knob and _PRS)
wrt _PRS could you elaborate some more why it's needed and what happens
if it doesn't exists?
>
> Finally add a new x-acpi-shared-irq property to disable the ACPI IRQ descriptor
> changes for older PC machine types, and add it to the pc_compat_10_2[] array.
>
> Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
> ---
> hw/char/serial-isa.c | 23 ++++++++++++++++++++++-
> hw/i386/pc.c | 4 +++-
> 2 files changed, 25 insertions(+), 2 deletions(-)
>
> diff --git a/hw/char/serial-isa.c b/hw/char/serial-isa.c
> index a4be0492c5..1662da86bd 100644
> --- a/hw/char/serial-isa.c
> +++ b/hw/char/serial-isa.c
> @@ -28,6 +28,7 @@
> #include "qemu/module.h"
> #include "system/system.h"
> #include "hw/acpi/acpi_aml_interface.h"
> +#include "hw/acpi/aml-build.h"
> #include "hw/char/serial.h"
> #include "hw/char/serial-isa.h"
> #include "hw/isa/isa.h"
> @@ -43,6 +44,7 @@ struct ISASerialState {
> uint32_t index;
> uint32_t iobase;
> uint32_t isairq;
> + bool acpi_shared_irq;
> SerialState state;
> };
>
> @@ -92,7 +94,12 @@ static void serial_isa_build_aml(AcpiDevAmlIf *adev, Aml *scope)
>
> crs = aml_resource_template();
> aml_append(crs, aml_io(AML_DECODE16, isa->iobase, isa->iobase, 0x00, 0x08));
> - aml_append(crs, aml_irq_no_flags(isa->isairq));
> + if (isa->acpi_shared_irq) {
> + aml_append(crs, aml_irq(isa->isairq, AML_EDGE, AML_ACTIVE_LOW,
> + AML_SHARED));
> + } else {
> + aml_append(crs, aml_irq_no_flags(isa->isairq));
> + }
>
> dev = aml_device("COM%d", isa->index + 1);
> aml_append(dev, aml_name_decl("_HID", aml_eisaid("PNP0501")));
> @@ -100,6 +107,18 @@ static void serial_isa_build_aml(AcpiDevAmlIf *adev, Aml *scope)
> aml_append(dev, aml_name_decl("_STA", aml_int(0xf)));
> aml_append(dev, aml_name_decl("_CRS", crs));
>
> + if (isa->acpi_shared_irq) {
> + Aml *prs = aml_resource_template();
> +
> + aml_append(prs, aml_start_dependent_function(0, 0));
> + aml_append(prs, aml_io(AML_DECODE16, isa->iobase, isa->iobase, 0x00,
> + 0x08));
> + aml_append(prs, aml_irq(isa->isairq, AML_EDGE, AML_ACTIVE_LOW,
> + AML_SHARED));
> + aml_append(prs, aml_end_dependent_function());
> + aml_append(dev, aml_name_decl("_PRS", prs));
> + }
> +
> aml_append(scope, dev);
> }
>
> @@ -117,6 +136,8 @@ static const Property serial_isa_properties[] = {
> DEFINE_PROP_UINT32("index", ISASerialState, index, -1),
> DEFINE_PROP_UINT32("iobase", ISASerialState, iobase, -1),
> DEFINE_PROP_UINT32("irq", ISASerialState, isairq, -1),
> + DEFINE_PROP_BOOL("x-acpi-shared-irq", ISASerialState, acpi_shared_irq,
> + true),
> };
>
> static void serial_isa_class_initfn(ObjectClass *klass, const void *data)
> diff --git a/hw/i386/pc.c b/hw/i386/pc.c
> index 0dd3fd01d9..c0335b05ba 100644
> --- a/hw/i386/pc.c
> +++ b/hw/i386/pc.c
> @@ -82,7 +82,9 @@
> { "qemu64-" TYPE_X86_CPU, "model-id", "QEMU Virtual CPU version " v, },\
> { "athlon-" TYPE_X86_CPU, "model-id", "QEMU Virtual CPU version " v, },
>
> -GlobalProperty pc_compat_10_2[] = {};
> +GlobalProperty pc_compat_10_2[] = {
> + { "isa-serial", "x-acpi-shared-irq", "false" },
> +};
> const size_t pc_compat_10_2_len = G_N_ELEMENTS(pc_compat_10_2);
>
> GlobalProperty pc_compat_10_1[] = {
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 4/5] hw/char/serial-isa.c: declare IRQ as shared in ACPI IRQ descriptor
2026-03-04 11:22 ` Igor Mammedov
@ 2026-03-04 14:36 ` Mark Cave-Ayland
2026-03-05 12:49 ` Igor Mammedov
0 siblings, 1 reply; 11+ messages in thread
From: Mark Cave-Ayland @ 2026-03-04 14:36 UTC (permalink / raw)
To: Igor Mammedov
Cc: mst, anisinha, pbonzini, marcandre.lureau, marcel.apfelbaum,
qemu-devel
On 04/03/2026 11:22, Igor Mammedov wrote:
> On Fri, 27 Feb 2026 13:44:58 +0000
> Mark Cave-Ayland <mark.caveayland@nutanix.com> wrote:
>
>> From Windows 8.1 onwards ISA serial IRQs cannot be shared when ACPI Revision
>> 5.0 is used in the FACP table. The reason for this is that if a 2-byte IRQ
>> Descriptor is used then the interrupt is considered to be high true, edge
>> sensitive, non-shareable. Since legacy serial ports COM1/3 and COM2/4 share
>> an IRQ then if more than 2 serial ports are added, Windows indicates a
>> conflict in Device Manager and these combinations cannot be used together.
>>
>> Add a new 3-byte IRQ Descriptor to the _CRS resource indicating that the
>> ISA serial IRQ is low true, edge sensitive and shareable, along with a
>> corresponding _PRS resource so that the legacy serial ports also appear
>> at a fixed address. This enables all 4 legacy serial ports to be used in
>> Windows without conflict.
>
> What happens if we just replace aml_irq_no_flags() with aml_irq()
> (without compat knob and _PRS)
>
> wrt _PRS could you elaborate some more why it's needed and what happens
> if it doesn't exists?
Good question. I based the implementation on the technote from Microchip
at https://ww1.microchip.com/downloads/en/DeviceDoc/00001879A.pdf and
found that it worked fine here on Windows 11.
My concern from deviating from the document would be that any changes
would work fine on Windows 11, but then fail on older versions of Windows.
I can try and locate a copy of Windows 8.1 internally if you still think
that is worth pursuing?
>> Finally add a new x-acpi-shared-irq property to disable the ACPI IRQ descriptor
>> changes for older PC machine types, and add it to the pc_compat_10_2[] array.
>>
>> Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
>> ---
>> hw/char/serial-isa.c | 23 ++++++++++++++++++++++-
>> hw/i386/pc.c | 4 +++-
>> 2 files changed, 25 insertions(+), 2 deletions(-)
>>
>> diff --git a/hw/char/serial-isa.c b/hw/char/serial-isa.c
>> index a4be0492c5..1662da86bd 100644
>> --- a/hw/char/serial-isa.c
>> +++ b/hw/char/serial-isa.c
>> @@ -28,6 +28,7 @@
>> #include "qemu/module.h"
>> #include "system/system.h"
>> #include "hw/acpi/acpi_aml_interface.h"
>> +#include "hw/acpi/aml-build.h"
>> #include "hw/char/serial.h"
>> #include "hw/char/serial-isa.h"
>> #include "hw/isa/isa.h"
>> @@ -43,6 +44,7 @@ struct ISASerialState {
>> uint32_t index;
>> uint32_t iobase;
>> uint32_t isairq;
>> + bool acpi_shared_irq;
>> SerialState state;
>> };
>>
>> @@ -92,7 +94,12 @@ static void serial_isa_build_aml(AcpiDevAmlIf *adev, Aml *scope)
>>
>> crs = aml_resource_template();
>> aml_append(crs, aml_io(AML_DECODE16, isa->iobase, isa->iobase, 0x00, 0x08));
>> - aml_append(crs, aml_irq_no_flags(isa->isairq));
>> + if (isa->acpi_shared_irq) {
>> + aml_append(crs, aml_irq(isa->isairq, AML_EDGE, AML_ACTIVE_LOW,
>> + AML_SHARED));
>> + } else {
>> + aml_append(crs, aml_irq_no_flags(isa->isairq));
>> + }
>>
>> dev = aml_device("COM%d", isa->index + 1);
>> aml_append(dev, aml_name_decl("_HID", aml_eisaid("PNP0501")));
>> @@ -100,6 +107,18 @@ static void serial_isa_build_aml(AcpiDevAmlIf *adev, Aml *scope)
>> aml_append(dev, aml_name_decl("_STA", aml_int(0xf)));
>> aml_append(dev, aml_name_decl("_CRS", crs));
>>
>> + if (isa->acpi_shared_irq) {
>> + Aml *prs = aml_resource_template();
>> +
>> + aml_append(prs, aml_start_dependent_function(0, 0));
>> + aml_append(prs, aml_io(AML_DECODE16, isa->iobase, isa->iobase, 0x00,
>> + 0x08));
>> + aml_append(prs, aml_irq(isa->isairq, AML_EDGE, AML_ACTIVE_LOW,
>> + AML_SHARED));
>> + aml_append(prs, aml_end_dependent_function());
>> + aml_append(dev, aml_name_decl("_PRS", prs));
>> + }
>> +
>> aml_append(scope, dev);
>> }
>>
>> @@ -117,6 +136,8 @@ static const Property serial_isa_properties[] = {
>> DEFINE_PROP_UINT32("index", ISASerialState, index, -1),
>> DEFINE_PROP_UINT32("iobase", ISASerialState, iobase, -1),
>> DEFINE_PROP_UINT32("irq", ISASerialState, isairq, -1),
>> + DEFINE_PROP_BOOL("x-acpi-shared-irq", ISASerialState, acpi_shared_irq,
>> + true),
>> };
>>
>> static void serial_isa_class_initfn(ObjectClass *klass, const void *data)
>> diff --git a/hw/i386/pc.c b/hw/i386/pc.c
>> index 0dd3fd01d9..c0335b05ba 100644
>> --- a/hw/i386/pc.c
>> +++ b/hw/i386/pc.c
>> @@ -82,7 +82,9 @@
>> { "qemu64-" TYPE_X86_CPU, "model-id", "QEMU Virtual CPU version " v, },\
>> { "athlon-" TYPE_X86_CPU, "model-id", "QEMU Virtual CPU version " v, },
>>
>> -GlobalProperty pc_compat_10_2[] = {};
>> +GlobalProperty pc_compat_10_2[] = {
>> + { "isa-serial", "x-acpi-shared-irq", "false" },
>> +};
>> const size_t pc_compat_10_2_len = G_N_ELEMENTS(pc_compat_10_2);
>>
>> GlobalProperty pc_compat_10_1[] = {
ATB,
Mark.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 4/5] hw/char/serial-isa.c: declare IRQ as shared in ACPI IRQ descriptor
2026-03-04 14:36 ` Mark Cave-Ayland
@ 2026-03-05 12:49 ` Igor Mammedov
2026-03-09 12:24 ` Mark Cave-Ayland
0 siblings, 1 reply; 11+ messages in thread
From: Igor Mammedov @ 2026-03-05 12:49 UTC (permalink / raw)
To: Mark Cave-Ayland
Cc: mst, anisinha, pbonzini, marcandre.lureau, marcel.apfelbaum,
qemu-devel
On Wed, 4 Mar 2026 14:36:14 +0000
Mark Cave-Ayland <mark.caveayland@nutanix.com> wrote:
> On 04/03/2026 11:22, Igor Mammedov wrote:
>
> > On Fri, 27 Feb 2026 13:44:58 +0000
> > Mark Cave-Ayland <mark.caveayland@nutanix.com> wrote:
> >
> >> From Windows 8.1 onwards ISA serial IRQs cannot be shared when ACPI Revision
> >> 5.0 is used in the FACP table. The reason for this is that if a 2-byte IRQ
> >> Descriptor is used then the interrupt is considered to be high true, edge
> >> sensitive, non-shareable. Since legacy serial ports COM1/3 and COM2/4 share
> >> an IRQ then if more than 2 serial ports are added, Windows indicates a
> >> conflict in Device Manager and these combinations cannot be used together.
> >>
> >> Add a new 3-byte IRQ Descriptor to the _CRS resource indicating that the
> >> ISA serial IRQ is low true, edge sensitive and shareable, along with a
> >> corresponding _PRS resource so that the legacy serial ports also appear
> >> at a fixed address. This enables all 4 legacy serial ports to be used in
> >> Windows without conflict.
> >
> > What happens if we just replace aml_irq_no_flags() with aml_irq()
> > (without compat knob and _PRS)
> >
> > wrt _PRS could you elaborate some more why it's needed and what happens
> > if it doesn't exists?
>
> Good question. I based the implementation on the technote from Microchip
> at https://ww1.microchip.com/downloads/en/DeviceDoc/00001879A.pdf and
> found that it worked fine here on Windows 11.
>
> My concern from deviating from the document would be that any changes
> would work fine on Windows 11, but then fail on older versions of Windows.
>
> I can try and locate a copy of Windows 8.1 internally if you still think
> that is worth pursuing?
with _CRS present, I don't think we need _PRS especially in absence of _SRS
and means to actually changes used IRQs/IO.
What I'd like to avoid is adding not needed code and compat logic
if it's possible.
The later unfortunately achievable only by tedious testing of
the change with older Windows versions (the older it is,
the more loose spec interperetation).
>
> >> Finally add a new x-acpi-shared-irq property to disable the ACPI IRQ descriptor
> >> changes for older PC machine types, and add it to the pc_compat_10_2[] array.
> >>
> >> Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
> >> ---
> >> hw/char/serial-isa.c | 23 ++++++++++++++++++++++-
> >> hw/i386/pc.c | 4 +++-
> >> 2 files changed, 25 insertions(+), 2 deletions(-)
> >>
> >> diff --git a/hw/char/serial-isa.c b/hw/char/serial-isa.c
> >> index a4be0492c5..1662da86bd 100644
> >> --- a/hw/char/serial-isa.c
> >> +++ b/hw/char/serial-isa.c
> >> @@ -28,6 +28,7 @@
> >> #include "qemu/module.h"
> >> #include "system/system.h"
> >> #include "hw/acpi/acpi_aml_interface.h"
> >> +#include "hw/acpi/aml-build.h"
> >> #include "hw/char/serial.h"
> >> #include "hw/char/serial-isa.h"
> >> #include "hw/isa/isa.h"
> >> @@ -43,6 +44,7 @@ struct ISASerialState {
> >> uint32_t index;
> >> uint32_t iobase;
> >> uint32_t isairq;
> >> + bool acpi_shared_irq;
> >> SerialState state;
> >> };
> >>
> >> @@ -92,7 +94,12 @@ static void serial_isa_build_aml(AcpiDevAmlIf *adev, Aml *scope)
> >>
> >> crs = aml_resource_template();
> >> aml_append(crs, aml_io(AML_DECODE16, isa->iobase, isa->iobase, 0x00, 0x08));
> >> - aml_append(crs, aml_irq_no_flags(isa->isairq));
> >> + if (isa->acpi_shared_irq) {
> >> + aml_append(crs, aml_irq(isa->isairq, AML_EDGE, AML_ACTIVE_LOW,
> >> + AML_SHARED));
> >> + } else {
> >> + aml_append(crs, aml_irq_no_flags(isa->isairq));
> >> + }
> >>
> >> dev = aml_device("COM%d", isa->index + 1);
> >> aml_append(dev, aml_name_decl("_HID", aml_eisaid("PNP0501")));
> >> @@ -100,6 +107,18 @@ static void serial_isa_build_aml(AcpiDevAmlIf *adev, Aml *scope)
> >> aml_append(dev, aml_name_decl("_STA", aml_int(0xf)));
> >> aml_append(dev, aml_name_decl("_CRS", crs));
> >>
> >> + if (isa->acpi_shared_irq) {
> >> + Aml *prs = aml_resource_template();
> >> +
> >> + aml_append(prs, aml_start_dependent_function(0, 0));
> >> + aml_append(prs, aml_io(AML_DECODE16, isa->iobase, isa->iobase, 0x00,
> >> + 0x08));
> >> + aml_append(prs, aml_irq(isa->isairq, AML_EDGE, AML_ACTIVE_LOW,
> >> + AML_SHARED));
> >> + aml_append(prs, aml_end_dependent_function());
> >> + aml_append(dev, aml_name_decl("_PRS", prs));
> >> + }
> >> +
> >> aml_append(scope, dev);
> >> }
> >>
> >> @@ -117,6 +136,8 @@ static const Property serial_isa_properties[] = {
> >> DEFINE_PROP_UINT32("index", ISASerialState, index, -1),
> >> DEFINE_PROP_UINT32("iobase", ISASerialState, iobase, -1),
> >> DEFINE_PROP_UINT32("irq", ISASerialState, isairq, -1),
> >> + DEFINE_PROP_BOOL("x-acpi-shared-irq", ISASerialState, acpi_shared_irq,
> >> + true),
> >> };
> >>
> >> static void serial_isa_class_initfn(ObjectClass *klass, const void *data)
> >> diff --git a/hw/i386/pc.c b/hw/i386/pc.c
> >> index 0dd3fd01d9..c0335b05ba 100644
> >> --- a/hw/i386/pc.c
> >> +++ b/hw/i386/pc.c
> >> @@ -82,7 +82,9 @@
> >> { "qemu64-" TYPE_X86_CPU, "model-id", "QEMU Virtual CPU version " v, },\
> >> { "athlon-" TYPE_X86_CPU, "model-id", "QEMU Virtual CPU version " v, },
> >>
> >> -GlobalProperty pc_compat_10_2[] = {};
> >> +GlobalProperty pc_compat_10_2[] = {
> >> + { "isa-serial", "x-acpi-shared-irq", "false" },
> >> +};
> >> const size_t pc_compat_10_2_len = G_N_ELEMENTS(pc_compat_10_2);
> >>
> >> GlobalProperty pc_compat_10_1[] = {
>
>
> ATB,
>
> Mark.
>
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 4/5] hw/char/serial-isa.c: declare IRQ as shared in ACPI IRQ descriptor
2026-03-05 12:49 ` Igor Mammedov
@ 2026-03-09 12:24 ` Mark Cave-Ayland
2026-03-10 12:41 ` Igor Mammedov
0 siblings, 1 reply; 11+ messages in thread
From: Mark Cave-Ayland @ 2026-03-09 12:24 UTC (permalink / raw)
To: Igor Mammedov
Cc: mst, anisinha, pbonzini, marcandre.lureau, marcel.apfelbaum,
qemu-devel
On 05/03/2026 12:49, Igor Mammedov wrote:
> On Wed, 4 Mar 2026 14:36:14 +0000
> Mark Cave-Ayland <mark.caveayland@nutanix.com> wrote:
>
>> On 04/03/2026 11:22, Igor Mammedov wrote:
>>
>>> On Fri, 27 Feb 2026 13:44:58 +0000
>>> Mark Cave-Ayland <mark.caveayland@nutanix.com> wrote:
>>>
>>>> From Windows 8.1 onwards ISA serial IRQs cannot be shared when ACPI Revision
>>>> 5.0 is used in the FACP table. The reason for this is that if a 2-byte IRQ
>>>> Descriptor is used then the interrupt is considered to be high true, edge
>>>> sensitive, non-shareable. Since legacy serial ports COM1/3 and COM2/4 share
>>>> an IRQ then if more than 2 serial ports are added, Windows indicates a
>>>> conflict in Device Manager and these combinations cannot be used together.
>>>>
>>>> Add a new 3-byte IRQ Descriptor to the _CRS resource indicating that the
>>>> ISA serial IRQ is low true, edge sensitive and shareable, along with a
>>>> corresponding _PRS resource so that the legacy serial ports also appear
>>>> at a fixed address. This enables all 4 legacy serial ports to be used in
>>>> Windows without conflict.
>>>
>>> What happens if we just replace aml_irq_no_flags() with aml_irq()
>>> (without compat knob and _PRS)
>>>
>>> wrt _PRS could you elaborate some more why it's needed and what happens
>>> if it doesn't exists?
>>
>> Good question. I based the implementation on the technote from Microchip
>> at https://urldefense.proofpoint.com/v2/url?u=https-3A__ww1.microchip.com_downloads_en_DeviceDoc_00001879A.pdf&d=DwICAg&c=s883GpUCOChKOHiocYtGcg&r=c23RpsaH4D2MKyD3EPJTDa0BAxz6tV8aUJqVSoytEiY&m=Nx9ld5Tg6QCayccyKhC9WQbm1DwiJT2Ja3jlwtlv8RkPFaZcU_oTHCkJZetgQLfd&s=k-ubK6tfBDM7A3BN_S3lNy3s-SJGR0fU9O5oj-GWF3A&e= and
>> found that it worked fine here on Windows 11.
>>
>> My concern from deviating from the document would be that any changes
>> would work fine on Windows 11, but then fail on older versions of Windows.
>>
>> I can try and locate a copy of Windows 8.1 internally if you still think
>> that is worth pursuing?
>
> with _CRS present, I don't think we need _PRS especially in absence of _SRS
> and means to actually changes used IRQs/IO.
>
> What I'd like to avoid is adding not needed code and compat logic
> if it's possible.
> The later unfortunately achievable only by tedious testing of
> the change with older Windows versions (the older it is,
> the more loose spec interperetation).
I've done some more experiments with both Windows 8.1 and Windows 11,
and I can confirm that the _PRS isn't needed for Device Manager to
detect and configure the serial ports for both OSs.
However it seems that indicating a shared interrupt with aml_irq() *IS*
required for Device Manager to detect all 4 serial ports without conflict.
I think it would be fine to unconditionally replace aml_irq_no_flags()
with aml_irq() in this case, however since the ACPI tables visible to
the guest OS will have changed, wouldn't this still require a machine
compatibility property? Or do we not care because Windows will almost
certainly insist on a reboot for changes to legacy hardware regardless.
ATB,
Mark.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 4/5] hw/char/serial-isa.c: declare IRQ as shared in ACPI IRQ descriptor
2026-03-09 12:24 ` Mark Cave-Ayland
@ 2026-03-10 12:41 ` Igor Mammedov
0 siblings, 0 replies; 11+ messages in thread
From: Igor Mammedov @ 2026-03-10 12:41 UTC (permalink / raw)
To: Mark Cave-Ayland
Cc: mst, anisinha, pbonzini, marcandre.lureau, marcel.apfelbaum,
qemu-devel
On Mon, 9 Mar 2026 12:24:47 +0000
Mark Cave-Ayland <mark.caveayland@nutanix.com> wrote:
> On 05/03/2026 12:49, Igor Mammedov wrote:
>
> > On Wed, 4 Mar 2026 14:36:14 +0000
> > Mark Cave-Ayland <mark.caveayland@nutanix.com> wrote:
> >
> >> On 04/03/2026 11:22, Igor Mammedov wrote:
> >>
> >>> On Fri, 27 Feb 2026 13:44:58 +0000
> >>> Mark Cave-Ayland <mark.caveayland@nutanix.com> wrote:
> >>>
> >>>> From Windows 8.1 onwards ISA serial IRQs cannot be shared when ACPI Revision
> >>>> 5.0 is used in the FACP table. The reason for this is that if a 2-byte IRQ
> >>>> Descriptor is used then the interrupt is considered to be high true, edge
> >>>> sensitive, non-shareable. Since legacy serial ports COM1/3 and COM2/4 share
> >>>> an IRQ then if more than 2 serial ports are added, Windows indicates a
> >>>> conflict in Device Manager and these combinations cannot be used together.
> >>>>
> >>>> Add a new 3-byte IRQ Descriptor to the _CRS resource indicating that the
> >>>> ISA serial IRQ is low true, edge sensitive and shareable, along with a
> >>>> corresponding _PRS resource so that the legacy serial ports also appear
> >>>> at a fixed address. This enables all 4 legacy serial ports to be used in
> >>>> Windows without conflict.
> >>>
> >>> What happens if we just replace aml_irq_no_flags() with aml_irq()
> >>> (without compat knob and _PRS)
> >>>
> >>> wrt _PRS could you elaborate some more why it's needed and what happens
> >>> if it doesn't exists?
> >>
> >> Good question. I based the implementation on the technote from Microchip
> >> at https://urldefense.proofpoint.com/v2/url?u=https-3A__ww1.microchip.com_downloads_en_DeviceDoc_00001879A.pdf&d=DwICAg&c=s883GpUCOChKOHiocYtGcg&r=c23RpsaH4D2MKyD3EPJTDa0BAxz6tV8aUJqVSoytEiY&m=Nx9ld5Tg6QCayccyKhC9WQbm1DwiJT2Ja3jlwtlv8RkPFaZcU_oTHCkJZetgQLfd&s=k-ubK6tfBDM7A3BN_S3lNy3s-SJGR0fU9O5oj-GWF3A&e= and
> >> found that it worked fine here on Windows 11.
> >>
> >> My concern from deviating from the document would be that any changes
> >> would work fine on Windows 11, but then fail on older versions of Windows.
> >>
> >> I can try and locate a copy of Windows 8.1 internally if you still think
> >> that is worth pursuing?
> >
> > with _CRS present, I don't think we need _PRS especially in absence of _SRS
> > and means to actually changes used IRQs/IO.
> >
> > What I'd like to avoid is adding not needed code and compat logic
> > if it's possible.
> > The later unfortunately achievable only by tedious testing of
> > the change with older Windows versions (the older it is,
> > the more loose spec interperetation).
>
> I've done some more experiments with both Windows 8.1 and Windows 11,
> and I can confirm that the _PRS isn't needed for Device Manager to
> detect and configure the serial ports for both OSs.
>
> However it seems that indicating a shared interrupt with aml_irq() *IS*
> required for Device Manager to detect all 4 serial ports without conflict.
>
> I think it would be fine to unconditionally replace aml_irq_no_flags()
> with aml_irq() in this case, however since the ACPI tables visible to
> the guest OS will have changed, wouldn't this still require a machine
> compatibility property? Or do we not care because Windows will almost
> certainly insist on a reboot for changes to legacy hardware regardless.
usually we do not do compat for ACPItables changes,
unless it introduces breaking change.
drawback of such approach is that sometimes we have to fix it afterwards
in stable when an issue is found.
But on positive side we won't drown out in compat kobs.
considering it is not default config and was broken before,
fixing it without compat knob should be fine.
>
> ATB,
>
> Mark.
>
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2026-03-10 12:42 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-02-27 13:44 [PATCH 0/5] isa-serial: acpi: declare shared IRQs for COM1/3 and COM2/4 Mark Cave-Ayland
2026-02-27 13:44 ` [PATCH 1/5] hw/acpi/aml-build.c: add aml_irq() representing the 3-byte IRQ descriptor Mark Cave-Ayland
2026-02-27 13:44 ` [PATCH 2/5] hw/acpi/aml-build.c: add AML functions for StartDependentFn/EndDependentFn Mark Cave-Ayland
2026-02-27 13:44 ` [PATCH 3/5] tests/acpi: allow DSDT acpi table changes Mark Cave-Ayland
2026-02-27 13:44 ` [PATCH 4/5] hw/char/serial-isa.c: declare IRQ as shared in ACPI IRQ descriptor Mark Cave-Ayland
2026-03-04 11:22 ` Igor Mammedov
2026-03-04 14:36 ` Mark Cave-Ayland
2026-03-05 12:49 ` Igor Mammedov
2026-03-09 12:24 ` Mark Cave-Ayland
2026-03-10 12:41 ` Igor Mammedov
2026-02-27 13:44 ` [PATCH 5/5] tests: data: update x86 ACPI tables Mark Cave-Ayland
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.