Skip to content

Conversation

@glitzflitz
Copy link

@glitzflitz glitzflitz commented Dec 31, 2025

Background

As per #695
currently propolis relies on edk2-stable202105 version of EDK2 OVMF to provide the ACPI tables to the guest as it was the last version that has included static tables.
Another limitation is the guest only sees whatever OVMF decided to generate rather than what the hypervisor knows about the virtual/emulated hardware.

In newer versions, OVMF expects the VMM to generate a set of ACPI tables and expose them via the fw_cfg table-loader interface. Being able to generate ACPI tables also unlocks other opportunities for features like being able to chose which tables and control methods to expose, PCIe host bridge and switch emulation, supporting native PCIe hotplug etc.

This PR addresses that limitation and adds mechanism to let propolis generate its own ACPI tables.

Implementation

Oveview

The series starts with implementing fw_cfg's table-loader mechanism to enable passing static tables to guest firmware(OVMF). Then the basic static tables like RSDT, XSDT and RSDP etc are added.
After that we reach to second milestone that is generating the AML bytecode. This where some technical decision need to be made after evaluating different options and tradeoffs along with use case for how to go about generating bytecode without introducing too much complexity.
At the end everything is wired up to switch to using propolis generated tables.

Details

The fw_cfg Interface

QEMU's fw_cfg interface provides a mechanism for the hypervisor to expose files to guest firmware. Propolis already had basic fw_cfg support for the e820 memory map and bootrom. The ACPI implementation builds on that foundation.

OVMF expects three specific fw_cfg files for ACPI tables:

etc/acpi/tables    Combined ACPI table data
etc/acpi/rsdp      Root System Description Pointer
etc/table-loader   Linker/loader commands

The table-loader file contains a sequence of fixed-size commands that instruct OVMF to allocate memory, patch pointer fields and compute checksums. This is necessary because the tables contain absolute addresses that are only known after OVMF allocates memory for them.

In the proposed implementation in Add fw_cfg table-loader helpers for ACPI table generation , TableLoader generates three command types:

ALLOCATE - reserves memory for a fw_cfg file with specified alignment in a given zone

ADD_POINTER - patches an address field in one file to point at another file's allocated location. The command specifies source file, destination file, offset within source and pointer size

ADD_CHECKSUM - computes a checksum over a byte range and writes it to a specified offset. ACPI tables use a simple byte sum that must equal zero.

The commands are used in Prepare the ACPI tables for generation

Static Table Generation

The simpler static tables that don't require AML bytecode are implemented first.

There are some minor differences between tables generated here and old tables from https://github.com/oxidecomputer/edk2.

AML generation and usage

The DSDT contains AML bytecode for describing devices, methods and resources. AML has a hierarchical structure with scopes containing devices which contain named objects and methods. The encoding uses variable length packages.

Possible approaches

QEMU uses a C based approach with GArray buffers. Each AML construct is a function returning an Aml pointer that must be explicitly appended to its parent. The design is flexible but also has caveats for example, forgetting manual aml_append call silently drops content and there is no type safety around what can be nested. Since we are not bound my limitations of C and have borrow checker with us, we can do better.

crosvm defines a single Aml trait with many implementing types. Each construct is a separate struct collecting children in a Vec. The usage pattern is usually a macro followed by to_aml_bytes() which recursively serializes the tree. Although this provides strong typing, its bit more complex and requires constructing the entire tree in memory before serialization. Package lengths use a two pass approach of first measuring then writing.

Firecracker also follows a same pattern to crosvm with trait methods along with some additional error handling.

acpi_tables crate used by cloud-hypervisor: uses a dual trait design to split the problem into two traits: Aml for things that can be serialized and AmlSink as the destination. The sink abstraction is nice because the same tree can write to a Vec or feed a checksum calculator without changing the serialization code. Its structurally similar to crosvm and the same two pass length encoding which gets bit complex when building nested hierarchies.

Approach in this series

Introduce AML bytecode generation adds RAII guards that automatically finalize package lengths when dropped.
The core abstraction is an AmlBuilder that owns a single byte buffer plus guard types for Scope, Device and Method. Each guard holds a mutable borrow on the builder so we have compile time scope safety through the borrow checker. This way its impossible to miss closing any scope.
Also using single buffer from AmlBuilder avoids the overhead of dynamic dispatch as in crosvm and acpi_tables approach.

Guards borrow the builder mutably and write content directly to its buffer. When a guard is created it writes the opcode, reserves 4 bytes for the package length (the maximum encoding size) and writes the name. When the guard drops it calculates the actual package length, encodes it in 1-4 bytes and splices out the unused reserved bytes.

Usage looks like

let mut builder = AmlBuilder::new();
{
    let mut sb = builder.scope("\\_SB_");
    {
        let mut pci0 = sb.device("PCI0");
        pci0.name("_HID", &EisaId::from_str("PNP0A08"));
    }  // DeviceGuard drops
}  // ScopeGuard drops
let aml = builder.finish();

which looks structurally similar to ASL code that is compiled to AML bytecode.
The conditional content is simply an if statement due to RAII guards which avoids complexity of Option wrappers as needed in other cases mentioned above. The limitation in this design is that its less composable. There is no easy way to return a "partial device tree" from a function or store AML fragments for later use.

Note about Package Length Encoding

The ACPI specification Section 20.2.4 defines a variable length encoding for package sizes. A package length includes itself in the count which creates a circular dependency: the length must be known to encode it but the encoding affects the length. That is why two pass approach is often used as done by others.

The implementation in Introduce AML bytecode generation, simply reserves max 4 bytes when opening any scope and splices in the actual encoded length when the scope closes. This produces minimal output with a single pass through the data.

I'd be open to new ideas or going with another approach mentioned above as well :)

DsdtGenerator Trait

The DsdtGenerator trait introduced in Generate DSDT with PCIe host bridge, enables device emulators to implement their ACPI descriptions to the DSDT. Devices can expose themselves in the DSDT by implementing the DsdtGenerator trait and wiring it up through Lifecycle::as_dsdt_generator().

The trait has two methods:

  • dsdt_scope() - returns SystemBus or PciRoot depending on where the device belongs in the ACPI namespace
  • generate_dsdt() - receives a ScopeGuard and emits the device's AML (HID, resources, methods, etc.)

During DSDT construction, build_dsdt_aml() iterates over all registered generators and invokes them within the appropriate scope.

See Add PS/2 controller in DSDT and [Add Qemu pvpanic device to DSDT for a minimal example. The Qemu pvpanic device declares device PEVT with HID QEMU0001 and a single I/O port resource. The pattern is the same for LpcUart and the PS/2 controller.

This keeps ACPI bits of device co-located with the device implementation rather than requiring a central place that knows about every device's resources and lets device own its ACPI description.

Wiring up new tables

  • Wire up ACPI table generation via fw_cfg
    The new table generation is controlled by a native_acpi_tables flag in the Board spec. Newly launched VMs have this set to true and get new generated tables via fw_cfg. VMs migrating from older propolis versions won't have this field in their spec so it defaults to false and they keep using OVMF tables.
    So existing VMs can safely migrate to propolis generated tables without any guest visible changes to their ACPI tables. Only VMs launched with new version of propolis will use the new tables.

Future scope

Being able to generate ACPI tables now opens up several opportunities

CPU hotplug

The MADT generation could be extended to support processor hotplug by including Processor Local APIC entries for potential CPUs along with corresponding _MAT methods and processor container devices in the DSDT.

Memory hotplug

Memory hotplug requires adding memory device objects under _SB scope with _HID of PNP0C80. Each memory region would need _CRS , _STA and _EJ0 methods. Propolis could signal memory add/remove via ACPI notifications. This would enable dynamic memory ballooning and live resizing of guest RAM.

PCIe Native Hotplug

The _OSC method added in this series can be easily extended to report support for PCIe capabilities to the guest. Once propolis implements the hotplug controller logic, native PCIe hotplug can be enabled by updating the _OSC return value and adding the necessary _EJ0 and notification methods.

PCIe topology emulation

With DSDT generation, PCIe topologies with multiple host birdges and PCIe swicthes can be properly described to the guest. This would involve adding additional _BBN methods and extending the PCI routing tables for downstream ports.This would increase the number of devices that can be attached to guest.

NUMA topology

For guests that benefit from memory locality awareness, SRAT and SLIT tables can be added following the same pattern as other static tables.

Testing

Testing

This is the dmesg of linux when using new tables. Now the standard OVMF bootrom can be used.

[    0.000000] BIOS-provided physical RAM map:
[    0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009ffff] usable
[    0.000000] BIOS-e820: [mem 0x0000000000100000-0x00000000beafffff] usable
[    0.000000] BIOS-e820: [mem 0x00000000beb00000-0x00000000bedfffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000bee00000-0x00000000bf8ecfff] usable
[    0.000000] BIOS-e820: [mem 0x00000000bf8ed000-0x00000000bfb6cfff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000bfb6d000-0x00000000bfb7efff] ACPI data
[    0.000000] BIOS-e820: [mem 0x00000000bfb7f000-0x00000000bfbfefff] ACPI NVS
[    0.000000] BIOS-e820: [mem 0x00000000bfbff000-0x00000000bffdffff] usable
[    0.000000] BIOS-e820: [mem 0x00000000bffe0000-0x00000000bfffffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000ffe00000-0x00000000ffffffff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000100000000-0x000000013fffffff] usable

[    0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009ffff] usable
...
[    0.000000] NX (Execute Disable) protection: active
[    0.000000] APIC: Static calls initialized
[    0.000000] efi: EFI v2.7 by EDK II
[    0.000000] efi: SMBIOS=0xbf9a9000 ACPI=0xbfb7e000 ACPI 2.0=0xbfb7e014 MEMATTR=0xbe3e9418 INITRD=0xbe303f98
[    0.000000] SMBIOS 2.7 present.
[    0.000000] DMI: Oxide OxVM, BIOS v0.8 The Aftermath 30, 3185 YOLD
...
[    0.000000] ACPI: RSDP 0x00000000BFB7E014 000024 (v02 OXIDE )
[    0.000000] ACPI: XSDT 0x00000000BFB7D0E8 00004C (v01 OXIDE  PROPOLIS 00000001      01000013)
[    0.000000] ACPI: FACP 0x00000000BFB7B000 000114 (v06 OXIDE  PROPOLIS 00000001 OXDE 00000001)
[    0.000000] ACPI: DSDT 0x00000000BFB7C000 000902 (v02 OXIDE  PROPOLIS 00000001 OXDE 00000001)
[    0.000000] ACPI: FACS 0x00000000BFBFC000 000040
[    0.000000] ACPI: APIC 0x00000000BFB7A000 000072 (v05 OXIDE  PROPOLIS 00000001 OXDE 00000001)
[    0.000000] ACPI: MCFG 0x00000000BFB79000 00003C (v01 OXIDE  PROPOLIS 00000001 OXDE 00000001)
[    0.000000] ACPI: HPET 0x00000000BFB78000 000038 (v01 OXIDE  PROPOLIS 00000001 OXDE 00000001)
[    0.000000] ACPI: BGRT 0x00000000BFB77000 000038 (v01 INTEL  EDK2     00000002      01000013)
[    0.000000] ACPI: Reserving FACP table memory at [mem 0xbfb7b000-0xbfb7b113]
[    0.000000] ACPI: Reserving DSDT table memory at [mem 0xbfb7c000-0xbfb7c901]
[    0.000000] ACPI: Reserving FACS table memory at [mem 0xbfbfc000-0xbfbfc03f]
[    0.000000] ACPI: Reserving APIC table memory at [mem 0xbfb7a000-0xbfb7a071]
[    0.000000] ACPI: Reserving MCFG table memory at [mem 0xbfb79000-0xbfb7903b]
[    0.000000] ACPI: Reserving HPET table memory at [mem 0xbfb78000-0xbfb78037]
[    0.000000] ACPI: Reserving BGRT table memory at [mem 0xbfb77000-0xbfb77037]

  • Now we can easily use HPET in the guest. There are TSC calibration failures which were there when using OVMF as well
[    0.000000] ACPI: Core revision 20250404
[    0.000000] clocksource: hpet: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 113919999973 ns
[    0.000000] APIC: Switch to symmetric I/O mode setup
[    0.000000] ..TIMER: vector=0x30 apic1=0 pin1=2 apic2=-1 pin2=-1
[    0.008000] tsc: Unable to calibrate against PIT
[    0.008000] tsc: HPET/PMTIMER calibration failed
[    0.008000] tsc: Marking TSC unstable due to could not calculate TSC khz

  • We also have support for PCIe ECAM to use PCIe host bridges
[    0.356000] PCI: ECAM [mem 0xe0000000-0xefffffff] (base 0xe0000000) for domain 0000 [bus 00-ff]
[    0.356000] PCI: ECAM [mem 0xe0000000-0xefffffff] reserved as ACPI motherboard resource
[    0.356000] PCI: Using host bridge windows from ACPI; if necessary, use "pci=nocrs" and report a bug
[    0.356000] PCI: Using E820 reservations for host bridge windows

  • The GlobalLock is not supported by propolis yet so the warning appears with OVMF tables as well
    [ 0.332000] ACPI Error: Could not enable GlobalLock event (20250404/evxfevnt-182)
    [ 0.342000] ACPI Warning: Could not enable fixed event - GlobalLock (1) (20250404/evxface-618)
    [ 0.342000] ACPI Error: No response from Global Lock hardware, disabling lock (20250404/evglock-63)
- Support for power state 

[ 0.355000] ACPI: PM: (supports S0 S3 S4 S5)


- Support for _OSC which enables use PCIe host bridges and PCIe Native Hotplugging in future

[ 0.357000] acpi PNP0A08:00: _OSC: OS supports [ExtendedConfig ASPM ClockPM Segments MSI EDR HPX-Type3]
[ 0.357000] acpi PNP0A08:00: _OSC: platform does not support [PCIeHotplug SHPCHotplug PME AER PCIeCapability]
[ 0.357000] acpi PNP0A08:00: _OSC: not requesting control; platform does not support [PCIeCapability]
[ 0.357000] acpi PNP0A08:00: _OSC: OS requested [PCIeHotplug SHPCHotplug PME AER PCIeCapability LTR DPC]
[ 0.357000] acpi PNP0A08:00: _OSC: platform willing to grant [LTR DPC]
[ 0.357000] acpi PNP0A08:00: _OSC: platform retains control of PCIe features (AE_SUPPORT)
[ 0.358000] PCI host bridge to bus 0000:00
[ 0.358000] pci_bus 0000:00: root bus resource [io 0x1000-0xffff window]
[ 0.358000] pci_bus 0000:00: root bus resource [mem 0xc0000000-0xdfffffff window]
[ 0.358000] pci_bus 0000:00: root bus resource [mem 0xf0000000-0xfbffffff window]


- HPET from bhyve could be used

[ 2.619000] hpet0: at MMIO 0xfed00000, IRQs 2, 8, 0, 0, 0, 0, 0, 0
[ 2.619000] hpet0: 8 comparators, 32-bit 16.777216 MHz counter
[ 2.627000] clocksource: Switched to clocksource hpet

- PS/2 keyboard is also supported. Note that support can be easily extended to PS/2 mouse and AUX port but to maintain same behaviour as OVMF table only keyboard is exposed for now

[ 3.164245] i8042: PNP: PS/2 Controller [PNP0303:KBD] at 0x60,0x64 irq 1
[ 3.164245] i8042: PNP: PS/2 appears to have AUX port disabled, if this is incorrect please boot with i8042.nopnp
[ 3.168498] serio: i8042 KBD port at 0x60,0x64 irq 1
[ 3.174797] input: AT Translated Set 2 keyboard as /devices/platform/i8042/serio0/input/input1

- Then some more errors due to https://github.com/oxidecomputer/propolis/issues/837

[ 3.185245] ACPI Error: Could not enable RealTimeClock event (20250404/evxfevnt-182)
[ 3.200380] ACPI Warning: Could not enable fixed event - RealTimeClock (4) (20250404/evxface-618)


- Windows server 2022 installation ISO boots as well.
- </details>

<details>
<summary>OVMF ACPI table dump</summary>

TABLE_INDEX:
APIC bytes=144 sha256=5b8e87bc4f3c8fb6da2b9a9d4a12ed3c12118e668c0a3cc42a583c20fd3f16c4 src=/sys/firmware/acpi/tables/APIC
BGRT bytes=56 sha256=17a30d09fe6b270c0b87256bfdbfb369a810d922b77b4a74de6c59a7f1d09468 src=/sys/firmware/acpi/tables/BGRT
DSDT bytes=3362 sha256=554a3f16c21736b8981025683125d5d0d004392c371babc4931ceaa7c6327173 src=/sys/firmware/acpi/tables/DSDT
FACP bytes=244 sha256=0938ac1fde9bc13bac0a4d316bdc18e6447bce45deea35316b1d47d2f9df3c17 src=/sys/firmware/acpi/tables/FACP
FACS bytes=64 sha256=3fb3115e2c3c626603dbb20ab49825295d952f171ed7901a7f464cead2f40800 src=/sys/firmware/acpi/tables/FACS
SSDT bytes=87 sha256=2e1df636f59bf1f98f9a7820a86d22792c16d10d5defd869a300866a319dcdfe src=/sys/firmware/acpi/tables/SSDT

================================================================
TABLE: APIC
SRC: /sys/firmware/acpi/tables/APIC
READ: OK
BYTES: 144
SHA256: 5b8e87bc4f3c8fb6da2b9a9d4a12ed3c12118e668c0a3cc42a583c20fd3f16c4

DECOMPILE: OK (normalized ASL follows)
---- ASL (normalized) ----

[000h 0000 004h] Signature : "APIC" [Multiple APIC Description Table (MADT)]
[004h 0004 004h] Table Length : 00000090
[008h 0008 001h] Revision : 01
[009h 0009 001h] Checksum : D5
[00Ah 0010 006h] Oem ID : "OVMF "
[010h 0016 008h] Oem Table ID : "OVMFEDK2"
[018h 0024 004h] Oem Revision : 20130221
[01Ch 0028 004h] Asl Compiler ID : "OVMF"
[020h 0032 004h] Asl Compiler Revision : 00000099

[024h 0036 004h] Local Apic Address : FEE00000
[028h 0040 004h] Flags (decoded below) : 00000001
PC-AT Compatibility : 1

[02Ch 0044 001h] Subtable Type : 00 [Processor Local APIC]
[02Dh 0045 001h] Length : 08
[02Eh 0046 001h] Processor ID : 00
[02Fh 0047 001h] Local Apic ID : 00
[030h 0048 004h] Flags (decoded below) : 00000001
Processor Enabled : 1
Runtime Online Capable : 0

[034h 0052 001h] Subtable Type : 00 [Processor Local APIC]
[035h 0053 001h] Length : 08
[036h 0054 001h] Processor ID : 01
[037h 0055 001h] Local Apic ID : 01
[038h 0056 004h] Flags (decoded below) : 00000001
Processor Enabled : 1
Runtime Online Capable : 0

[03Ch 0060 001h] Subtable Type : 00 [Processor Local APIC]
[03Dh 0061 001h] Length : 08
[03Eh 0062 001h] Processor ID : 02
[03Fh 0063 001h] Local Apic ID : 02
[040h 0064 004h] Flags (decoded below) : 00000001
Processor Enabled : 1
Runtime Online Capable : 0

[044h 0068 001h] Subtable Type : 00 [Processor Local APIC]
[045h 0069 001h] Length : 08
[046h 0070 001h] Processor ID : 03
[047h 0071 001h] Local Apic ID : 03
[048h 0072 004h] Flags (decoded below) : 00000001
Processor Enabled : 1
Runtime Online Capable : 0

[04Ch 0076 001h] Subtable Type : 01 [I/O APIC]
[04Dh 0077 001h] Length : 0C
[04Eh 0078 001h] I/O Apic ID : 04
[04Fh 0079 001h] Reserved : 00
[050h 0080 004h] Address : FEC00000
[054h 0084 004h] Interrupt : 00000000

[058h 0088 001h] Subtable Type : 02 [Interrupt Source Override]
[059h 0089 001h] Length : 0A
[05Ah 0090 001h] Bus : 00
[05Bh 0091 001h] Source : 00
[05Ch 0092 004h] Interrupt : 00000002
[060h 0096 002h] Flags (decoded below) : 0000
Polarity : 0
Trigger Mode : 0

[062h 0098 001h] Subtable Type : 02 [Interrupt Source Override]
[063h 0099 001h] Length : 0A
[064h 0100 001h] Bus : 00
[065h 0101 001h] Source : 05
[066h 0102 004h] Interrupt : 00000005
[06Ah 0106 002h] Flags (decoded below) : 000D
Polarity : 1
Trigger Mode : 3

[06Ch 0108 001h] Subtable Type : 02 [Interrupt Source Override]
[06Dh 0109 001h] Length : 0A
[06Eh 0110 001h] Bus : 00
[06Fh 0111 001h] Source : 09
[070h 0112 004h] Interrupt : 00000009
[074h 0116 002h] Flags (decoded below) : 000D
Polarity : 1
Trigger Mode : 3

[076h 0118 001h] Subtable Type : 02 [Interrupt Source Override]
[077h 0119 001h] Length : 0A
[078h 0120 001h] Bus : 00
[079h 0121 001h] Source : 0A
[07Ah 0122 004h] Interrupt : 0000000A
[07Eh 0126 002h] Flags (decoded below) : 000D
Polarity : 1
Trigger Mode : 3

[080h 0128 001h] Subtable Type : 02 [Interrupt Source Override]
[081h 0129 001h] Length : 0A
[082h 0130 001h] Bus : 00
[083h 0131 001h] Source : 0B
[084h 0132 004h] Interrupt : 0000000B
[088h 0136 002h] Flags (decoded below) : 000D
Polarity : 1
Trigger Mode : 3

[08Ah 0138 001h] Subtable Type : 04 [Local APIC NMI]
[08Bh 0139 001h] Length : 06
[08Ch 0140 001h] Processor ID : FF
[08Dh 0141 002h] Flags (decoded below) : 0000
Polarity : 0
Trigger Mode : 0
[08Fh 0143 001h] Interrupt Input LINT : 01

Raw Table Data: Length 144 (0x90)

0000: 41 50 49 43 90 00 00 00 01 D5 4F 56 4D 46 20 20  // APIC......OVMF
0010: 4F 56 4D 46 45 44 4B 32 21 02 13 20 4F 56 4D 46  // OVMFEDK2!.. OVMF
0020: 99 00 00 00 00 00 E0 FE 01 00 00 00 00 08 00 00  // ................
0030: 01 00 00 00 00 08 01 01 01 00 00 00 00 08 02 02  // ................
0040: 01 00 00 00 00 08 03 03 01 00 00 00 01 0C 04 00  // ................
0050: 00 00 C0 FE 00 00 00 00 02 0A 00 00 02 00 00 00  // ................
0060: 00 00 02 0A 00 05 05 00 00 00 0D 00 02 0A 00 09  // ................
0070: 09 00 00 00 0D 00 02 0A 00 0A 0A 00 00 00 0D 00  // ................
0080: 02 0A 00 0B 0B 00 00 00 0D 00 04 06 FF 00 00 01  // ................

================================================================
TABLE: BGRT
SRC: /sys/firmware/acpi/tables/BGRT
READ: OK
BYTES: 56
SHA256: 17a30d09fe6b270c0b87256bfdbfb369a810d922b77b4a74de6c59a7f1d09468

DECOMPILE: OK (normalized ASL follows)
---- ASL (normalized) ----

[000h 0000 004h] Signature : "BGRT" [Boot Graphics Resource Table]
[004h 0004 004h] Table Length : 00000038
[008h 0008 001h] Revision : 01
[009h 0009 001h] Checksum : 75
[00Ah 0010 006h] Oem ID : "INTEL "
[010h 0016 008h] Oem Table ID : "EDK2 "
[018h 0024 004h] Oem Revision : 00000002
[01Ch 0028 004h] Asl Compiler ID : " "
[020h 0032 004h] Asl Compiler Revision : 01000013

[024h 0036 002h] Version : 0001
[026h 0038 001h] Status (decoded below) : 01
Displayed : 1
Orientation Offset : 0
[027h 0039 001h] Image Type : 00
[028h 0040 008h] Image Address : 00000000BE035018
[030h 0048 004h] Image OffsetX : 0000012F
[034h 0052 004h] Image OffsetY : 0000010F

Raw Table Data: Length 56 (0x38)

0000: 42 47 52 54 38 00 00 00 01 75 49 4E 54 45 4C 20  // BGRT8....uINTEL
0010: 45 44 4B 32 20 20 20 20 02 00 00 00 20 20 20 20  // EDK2    ....
0020: 13 00 00 01 01 00 01 00 18 50 03 BE 00 00 00 00  // .........P......
0030: 2F 01 00 00 0F 01 00 00                          // /.......

================================================================
TABLE: DSDT
SRC: /sys/firmware/acpi/tables/DSDT
READ: OK
BYTES: 3362
SHA256: 554a3f16c21736b8981025683125d5d0d004392c371babc4931ceaa7c6327173

DECOMPILE: OK (normalized ASL follows)
---- ASL (normalized) ----
DefinitionBlock ("", "DSDT", 1, "INTEL ", "OVMF ", 0x00000004)
{
/*
* iASL Warning: There was 1 external control method found during
* disassembly, but only 0 were resolved (1 unresolved). Additional
* ACPI tables may be required to properly disassemble the code. This
* resulting disassembler output file may not compile because the
* disassembler did not know how many arguments to assign to the
* unresolved methods. Note: SSDTs can be dynamically loaded at
* runtime and may or may not be available via the host OS.
*
* In addition, the -fe option can be used to specify a file containing
* control method external declarations with the associated method
* argument counts. Each line of the file must be of the form:
* External (, MethodObj, )
* Invocation:
* iasl -fe refs.txt -d dsdt.aml
*
* The following methods were unresolved and many not compile properly
* because the disassembler had to guess at the number of arguments
* required for each:
*/
External (SB.PCI0._CRS.FWDT, OpRegionObj)
External (FWDT, MethodObj) // Warning: Unknown method, guessing 7 arguments

Name (_S0, Package (0x04)  // _S0_: S0 System State
{
    0x05,
    Zero,
    Zero,
    Zero
})
Name (_S5, Package (0x04)  // _S5_: S5 System State
{
    Zero,
    Zero,
    Zero,
    Zero
})
Scope (_SB)
{
    Device (PCI0)
    {
        Name (_HID, EisaId ("PNP0A03") /* PCI Bus */)  // _HID: Hardware ID
        Name (_ADR, Zero)  // _ADR: Address
        Name (_BBN, Zero)  // _BBN: BIOS Bus Number
        Name (_UID, Zero)  // _UID: Unique ID
        Name (CRES, ResourceTemplate ()
        {
            WordBusNumber (ResourceProducer, MinFixed, MaxFixed, PosDecode,
                0x0000,             // Granularity
                0x0000,             // Range Minimum
                0x00FF,             // Range Maximum
                0x0000,             // Translation Offset
                0x0100,             // Length
                ,, )
            IO (Decode16,
                0x0CF8,             // Range Minimum
                0x0CF8,             // Range Maximum
                0x01,               // Alignment
                0x08,               // Length
                )
            WordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange,
                0x0000,             // Granularity
                0x0000,             // Range Minimum
                0x0CF7,             // Range Maximum
                0x0000,             // Translation Offset
                0x0CF8,             // Length
                ,, , TypeStatic, DenseTranslation)
            WordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange,
                0x0000,             // Granularity
                0x0D00,             // Range Minimum
                0xFFFF,             // Range Maximum
                0x0000,             // Translation Offset
                0xF300,             // Length
                ,, , TypeStatic, DenseTranslation)
            DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite,
                0x00000000,         // Granularity
                0x000A0000,         // Range Minimum
                0x000BFFFF,         // Range Maximum
                0x00000000,         // Translation Offset
                0x00020000,         // Length
                ,, , AddressRangeMemory, TypeStatic)
            DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, NonCacheable, ReadWrite,
                0x00000000,         // Granularity
                0xF8000000,         // Range Minimum
                0xFFFBFFFF,         // Range Maximum
                0x00000000,         // Translation Offset
                0x07FC0000,         // Length
                ,, _Y00, AddressRangeMemory, TypeStatic)
        })
        Name (CR64, ResourceTemplate ()
        {
            QWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite,
                0x0000000000000000, // Granularity
                0x0000008000000000, // Range Minimum
                0x00000FFFFFFFFFFF, // Range Maximum
                0x0000000000000000, // Translation Offset
                0x00000F8000000000, // Length
                ,, _Y01, AddressRangeMemory, TypeStatic)
        })
        Method (_CRS, 0, Serialized)  // _CRS: Current Resource Settings
        {
            Field (FWDT, QWordAcc, NoLock, Preserve)
            {
                P0S,    64,
                P0E,    64,
                P0L,    64,
                P1S,    64,
                P1E,    64,
                P1L,    64
            }

            Field (FWDT, DWordAcc, NoLock, Preserve)
            {
                P0SL,   32,
                P0SH,   32,
                P0EL,   32,
                P0EH,   32,
                P0LL,   32,
                P0LH,   32,
                P1SL,   32,
                P1SH,   32,
                P1EL,   32,
                P1EH,   32,
                P1LL,   32,
                P1LH,   32
            }

            CreateDWordField (CRES, \_SB.PCI0._Y00._MIN, PS32)  // _MIN: Minimum Base Address
            CreateDWordField (CRES, \_SB.PCI0._Y00._MAX, PE32)  // _MAX: Maximum Base Address
            CreateDWordField (CRES, \_SB.PCI0._Y00._LEN, PL32)  // _LEN: Length
            PS32 = P0SL /* \_SB_.PCI0._CRS.P0SL */
            PE32 = P0EL /* \_SB_.PCI0._CRS.P0EL */
            PL32 = P0LL /* \_SB_.PCI0._CRS.P0LL */
            If (((P1SL == Zero) && (P1SH == Zero)))
            {
                Return (CRES) /* \_SB_.PCI0.CRES */
            }
            Else
            {
                CreateQWordField (CR64, \_SB.PCI0._Y01._MIN, PS64)  // _MIN: Minimum Base Address
                CreateQWordField (CR64, \_SB.PCI0._Y01._MAX, PE64)  // _MAX: Maximum Base Address
                CreateQWordField (CR64, \_SB.PCI0._Y01._LEN, PL64)  // _LEN: Length
                PS64 = P1S /* \_SB_.PCI0._CRS.P1S_ */
                PE64 = P1E /* \_SB_.PCI0._CRS.P1E_ */
                PL64 = P1L /* \_SB_.PCI0._CRS.P1L_ */
                ConcatenateResTemplate (CRES, CR64, Local0)
                Return (Local0)
            }
        }

        Method (_PRT, 0, NotSerialized)  // _PRT: PCI Routing Table
        {
            Return (Package (0x40)
            {
                Package (0x04)
                {
                    0xFFFF,
                    Zero,
                    ^LPC.LNKD,
                    Zero
                },

                Package (0x04)
                {
                    0xFFFF,
                    One,
                    ^LPC.LNKA,
                    Zero
                },

                Package (0x04)
                {
                    0xFFFF,
                    0x02,
                    ^LPC.LNKB,
                    Zero
                },

                Package (0x04)
                {
                    0xFFFF,
                    0x03,
                    ^LPC.LNKC,
                    Zero
                },

                Package (0x04)
                {
                    0x0001FFFF,
                    Zero,
                    ^LPC.LNKS,
                    Zero
                },

                Package (0x04)
                {
                    0x0001FFFF,
                    One,
                    ^LPC.LNKB,
                    Zero
                },

                Package (0x04)
                {
                    0x0001FFFF,
                    0x02,
                    ^LPC.LNKC,
                    Zero
                },

                Package (0x04)
                {
                    0x0001FFFF,
                    0x03,
                    ^LPC.LNKD,
                    Zero
                },

                Package (0x04)
                {
                    0x0002FFFF,
                    Zero,
                    ^LPC.LNKB,
                    Zero
                },

                Package (0x04)
                {
                    0x0002FFFF,
                    One,
                    ^LPC.LNKC,
                    Zero
                },

                Package (0x04)
                {
                    0x0002FFFF,
                    0x02,
                    ^LPC.LNKD,
                    Zero
                },

                Package (0x04)
                {
                    0x0002FFFF,
                    0x03,
                    ^LPC.LNKA,
                    Zero
                },

                Package (0x04)
                {
                    0x0003FFFF,
                    Zero,
                    ^LPC.LNKC,
                    Zero
                },

                Package (0x04)
                {
                    0x0003FFFF,
                    One,
                    ^LPC.LNKD,
                    Zero
                },

                Package (0x04)
                {
                    0x0003FFFF,
                    0x02,
                    ^LPC.LNKA,
                    Zero
                },

                Package (0x04)
                {
                    0x0003FFFF,
                    0x03,
                    ^LPC.LNKB,
                    Zero
                },

                Package (0x04)
                {
                    0x0004FFFF,
                    Zero,
                    ^LPC.LNKD,
                    Zero
                },

                Package (0x04)
                {
                    0x0004FFFF,
                    One,
                    ^LPC.LNKA,
                    Zero
                },

                Package (0x04)
                {
                    0x0004FFFF,
                    0x02,
                    ^LPC.LNKB,
                    Zero
                },

                Package (0x04)
                {
                    0x0004FFFF,
                    0x03,
                    ^LPC.LNKC,
                    Zero
                },

                Package (0x04)
                {
                    0x0005FFFF,
                    Zero,
                    ^LPC.LNKA,
                    Zero
                },

                Package (0x04)
                {
                    0x0005FFFF,
                    One,
                    ^LPC.LNKB,
                    Zero
                },

                Package (0x04)
                {
                    0x0005FFFF,
                    0x02,
                    ^LPC.LNKC,
                    Zero
                },

                Package (0x04)
                {
                    0x0005FFFF,
                    0x03,
                    ^LPC.LNKD,
                    Zero
                },

                Package (0x04)
                {
                    0x0006FFFF,
                    Zero,
                    ^LPC.LNKB,
                    Zero
                },

                Package (0x04)
                {
                    0x0006FFFF,
                    One,
                    ^LPC.LNKC,
                    Zero
                },

                Package (0x04)
                {
                    0x0006FFFF,
                    0x02,
                    ^LPC.LNKD,
                    Zero
                },

                Package (0x04)
                {
                    0x0006FFFF,
                    0x03,
                    ^LPC.LNKA,
                    Zero
                },

                Package (0x04)
                {
                    0x0007FFFF,
                    Zero,
                    ^LPC.LNKC,
                    Zero
                },

                Package (0x04)
                {
                    0x0007FFFF,
                    One,
                    ^LPC.LNKD,
                    Zero
                },

                Package (0x04)
                {
                    0x0007FFFF,
                    0x02,
                    ^LPC.LNKA,
                    Zero
                },

                Package (0x04)
                {
                    0x0007FFFF,
                    0x03,
                    ^LPC.LNKB,
                    Zero
                },

                Package (0x04)
                {
                    0x0008FFFF,
                    Zero,
                    ^LPC.LNKD,
                    Zero
                },

                Package (0x04)
                {
                    0x0008FFFF,
                    One,
                    ^LPC.LNKA,
                    Zero
                },

                Package (0x04)
                {
                    0x0008FFFF,
                    0x02,
                    ^LPC.LNKB,
                    Zero
                },

                Package (0x04)
                {
                    0x0008FFFF,
                    0x03,
                    ^LPC.LNKC,
                    Zero
                },

                Package (0x04)
                {
                    0x0009FFFF,
                    Zero,
                    ^LPC.LNKA,
                    Zero
                },

                Package (0x04)
                {
                    0x0009FFFF,
                    One,
                    ^LPC.LNKB,
                    Zero
                },

                Package (0x04)
                {
                    0x0009FFFF,
                    0x02,
                    ^LPC.LNKC,
                    Zero
                },

                Package (0x04)
                {
                    0x0009FFFF,
                    0x03,
                    ^LPC.LNKD,
                    Zero
                },

                Package (0x04)
                {
                    0x000AFFFF,
                    Zero,
                    ^LPC.LNKB,
                    Zero
                },

                Package (0x04)
                {
                    0x000AFFFF,
                    One,
                    ^LPC.LNKC,
                    Zero
                },

                Package (0x04)
                {
                    0x000AFFFF,
                    0x02,
                    ^LPC.LNKD,
                    Zero
                },

                Package (0x04)
                {
                    0x000AFFFF,
                    0x03,
                    ^LPC.LNKA,
                    Zero
                },

                Package (0x04)
                {
                    0x000BFFFF,
                    Zero,
                    ^LPC.LNKC,
                    Zero
                },

                Package (0x04)
                {
                    0x000BFFFF,
                    One,
                    ^LPC.LNKD,
                    Zero
                },

                Package (0x04)
                {
                    0x000BFFFF,
                    0x02,
                    ^LPC.LNKA,
                    Zero
                },

                Package (0x04)
                {
                    0x000BFFFF,
                    0x03,
                    ^LPC.LNKB,
                    Zero
                },

                Package (0x04)
                {
                    0x000CFFFF,
                    Zero,
                    ^LPC.LNKD,
                    Zero
                },

                Package (0x04)
                {
                    0x000CFFFF,
                    One,
                    ^LPC.LNKA,
                    Zero
                },

                Package (0x04)
                {
                    0x000CFFFF,
                    0x02,
                    ^LPC.LNKB,
                    Zero
                },

                Package (0x04)
                {
                    0x000CFFFF,
                    0x03,
                    ^LPC.LNKC,
                    Zero
                },

                Package (0x04)
                {
                    0x000DFFFF,
                    Zero,
                    ^LPC.LNKA,
                    Zero
                },

                Package (0x04)
                {
                    0x000DFFFF,
                    One,
                    ^LPC.LNKB,
                    Zero
                },

                Package (0x04)
                {
                    0x000DFFFF,
                    0x02,
                    ^LPC.LNKC,
                    Zero
                },

                Package (0x04)
                {
                    0x000DFFFF,
                    0x03,
                    ^LPC.LNKD,
                    Zero
                },

                Package (0x04)
                {
                    0x000EFFFF,
                    Zero,
                    ^LPC.LNKB,
                    Zero
                },

                Package (0x04)
                {
                    0x000EFFFF,
                    One,
                    ^LPC.LNKC,
                    Zero
                },

                Package (0x04)
                {
                    0x000EFFFF,
                    0x02,
                    ^LPC.LNKD,
                    Zero
                },

                Package (0x04)
                {
                    0x000EFFFF,
                    0x03,
                    ^LPC.LNKA,
                    Zero
                },

                Package (0x04)
                {
                    0x000FFFFF,
                    Zero,
                    ^LPC.LNKC,
                    Zero
                },

                Package (0x04)
                {
                    0x000FFFFF,
                    One,
                    ^LPC.LNKD,
                    Zero
                },

                Package (0x04)
                {
                    0x000FFFFF,
                    0x02,
                    ^LPC.LNKA,
                    Zero
                },

                Package (0x04)
                {
                    0x000FFFFF,
                    0x03,
                    ^LPC.LNKB,
                    Zero
                }
            })
        }

        Device (LPC)
        {
            Name (_ADR, 0x00010000)  // _ADR: Address
            Device (LNKS)
            {
                Name (_HID, EisaId ("PNP0C0F") /* PCI Interrupt Link Device */)  // _HID: Hardware ID
                Name (_UID, Zero)  // _UID: Unique ID
                Name (_STA, 0x0B)  // _STA: Status
                Method (_SRS, 1, NotSerialized)  // _SRS: Set Resource Settings
                {
                }

                Method (_DIS, 0, NotSerialized)  // _DIS: Disable Device
                {
                }

                Name (_PRS, ResourceTemplate ()  // _PRS: Possible Resource Settings
                {
                    Interrupt (ResourceConsumer, Level, ActiveHigh, Shared, ,, )
                    {
                        0x00000009,
                    }
                })
                Method (_CRS, 0, NotSerialized)  // _CRS: Current Resource Settings
                {
                    Return (_PRS) /* \_SB_.PCI0.LPC_.LNKS._PRS */
                }
            }

            OperationRegion (PRR0, PCI_Config, 0x60, 0x04)
            Field (PRR0, AnyAcc, NoLock, Preserve)
            {
                PIRA,   8,
                PIRB,   8,
                PIRC,   8,
                PIRD,   8
            }

            Method (PSTA, 1, NotSerialized)
            {
                If ((Arg0 & 0x80))
                {
                    Return (0x09)
                }
                Else
                {
                    Return (0x0B)
                }
            }

            Method (PCRS, 1, Serialized)
            {
                Name (BUF0, ResourceTemplate ()
                {
                    Interrupt (ResourceConsumer, Level, ActiveHigh, Shared, ,, _Y02)
                    {
                        0x00000000,
                    }
                })
                CreateDWordField (BUF0, \_SB.PCI0.LPC.PCRS._Y02._INT, IRQW)  // _INT: Interrupts
                If (!(Arg0 & 0x80))
                {
                    IRQW = Arg0
                }

                Return (BUF0) /* \_SB_.PCI0.LPC_.PCRS.BUF0 */
            }

            Name (PPRS, ResourceTemplate ()
            {
                Interrupt (ResourceConsumer, Level, ActiveHigh, Shared, ,, )
                {
                    0x00000005,
                    0x0000000A,
                    0x0000000B,
                }
            })
            Device (LNKA)
            {
                Name (_HID, EisaId ("PNP0C0F") /* PCI Interrupt Link Device */)  // _HID: Hardware ID
                Name (_UID, One)  // _UID: Unique ID
                Method (_STA, 0, NotSerialized)  // _STA: Status
                {
                    Return (PSTA (PIRA))
                }

                Method (_DIS, 0, NotSerialized)  // _DIS: Disable Device
                {
                    PIRA |= 0x80
                }

                Method (_CRS, 0, NotSerialized)  // _CRS: Current Resource Settings
                {
                    Return (PCRS (PIRA))
                }

                Method (_PRS, 0, NotSerialized)  // _PRS: Possible Resource Settings
                {
                    Return (PPRS) /* \_SB_.PCI0.LPC_.PPRS */
                }

                Method (_SRS, 1, NotSerialized)  // _SRS: Set Resource Settings
                {
                    CreateDWordField (Arg0, 0x05, IRQW)
                    PIRA = IRQW /* \_SB_.PCI0.LPC_.LNKA._SRS.IRQW */
                }
            }

            Device (LNKB)
            {
                Name (_HID, EisaId ("PNP0C0F") /* PCI Interrupt Link Device */)  // _HID: Hardware ID
                Name (_UID, 0x02)  // _UID: Unique ID
                Method (_STA, 0, NotSerialized)  // _STA: Status
                {
                    Return (PSTA (PIRB))
                }

                Method (_DIS, 0, NotSerialized)  // _DIS: Disable Device
                {
                    PIRB |= 0x80
                }

                Method (_CRS, 0, NotSerialized)  // _CRS: Current Resource Settings
                {
                    Return (PCRS (PIRB))
                }

                Method (_PRS, 0, NotSerialized)  // _PRS: Possible Resource Settings
                {
                    Return (PPRS) /* \_SB_.PCI0.LPC_.PPRS */
                }

                Method (_SRS, 1, NotSerialized)  // _SRS: Set Resource Settings
                {
                    CreateDWordField (Arg0, 0x05, IRQW)
                    PIRB = IRQW /* \_SB_.PCI0.LPC_.LNKB._SRS.IRQW */
                }
            }

            Device (LNKC)
            {
                Name (_HID, EisaId ("PNP0C0F") /* PCI Interrupt Link Device */)  // _HID: Hardware ID
                Name (_UID, 0x03)  // _UID: Unique ID
                Method (_STA, 0, NotSerialized)  // _STA: Status
                {
                    Return (PSTA (PIRC))
                }

                Method (_DIS, 0, NotSerialized)  // _DIS: Disable Device
                {
                    PIRC |= 0x80
                }

                Method (_CRS, 0, NotSerialized)  // _CRS: Current Resource Settings
                {
                    Return (PCRS (PIRC))
                }

                Method (_PRS, 0, NotSerialized)  // _PRS: Possible Resource Settings
                {
                    Return (PPRS) /* \_SB_.PCI0.LPC_.PPRS */
                }

                Method (_SRS, 1, NotSerialized)  // _SRS: Set Resource Settings
                {
                    CreateDWordField (Arg0, 0x05, IRQW)
                    PIRC = IRQW /* \_SB_.PCI0.LPC_.LNKC._SRS.IRQW */
                }
            }

            Device (LNKD)
            {
                Name (_HID, EisaId ("PNP0C0F") /* PCI Interrupt Link Device */)  // _HID: Hardware ID
                Name (_UID, 0x04)  // _UID: Unique ID
                Method (_STA, 0, NotSerialized)  // _STA: Status
                {
                    Return (PSTA (PIRD))
                }

                Method (_DIS, 0, NotSerialized)  // _DIS: Disable Device
                {
                    PIRD |= 0x80
                }

                Method (_CRS, 0, NotSerialized)  // _CRS: Current Resource Settings
                {
                    Return (PCRS (PIRD))
                }

                Method (_PRS, 0, NotSerialized)  // _PRS: Possible Resource Settings
                {
                    Return (PPRS) /* \_SB_.PCI0.LPC_.PPRS */
                }

                Method (_SRS, 1, NotSerialized)  // _SRS: Set Resource Settings
                {
                    CreateDWordField (Arg0, 0x05, IRQW)
                    PIRD = IRQW /* \_SB_.PCI0.LPC_.LNKD._SRS.IRQW */
                }
            }

            Device (PIC)
            {
                Name (_HID, EisaId ("PNP0000") /* 8259-compatible Programmable Interrupt Controller */)  // _HID: Hardware ID
                Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
                {
                    IO (Decode16,
                        0x0020,             // Range Minimum
                        0x0020,             // Range Maximum
                        0x00,               // Alignment
                        0x02,               // Length
                        )
                    IO (Decode16,
                        0x00A0,             // Range Minimum
                        0x00A0,             // Range Maximum
                        0x00,               // Alignment
                        0x02,               // Length
                        )
                    IO (Decode16,
                        0x04D0,             // Range Minimum
                        0x04D0,             // Range Maximum
                        0x00,               // Alignment
                        0x02,               // Length
                        )
                    IRQNoFlags ()
                        {2}
                })
            }

            Device (DMAC)
            {
                Name (_HID, EisaId ("PNP0200") /* PC-class DMA Controller */)  // _HID: Hardware ID
                Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
                {
                    IO (Decode16,
                        0x0000,             // Range Minimum
                        0x0000,             // Range Maximum
                        0x00,               // Alignment
                        0x10,               // Length
                        )
                    IO (Decode16,
                        0x0081,             // Range Minimum
                        0x0081,             // Range Maximum
                        0x00,               // Alignment
                        0x03,               // Length
                        )
                    IO (Decode16,
                        0x0087,             // Range Minimum
                        0x0087,             // Range Maximum
                        0x00,               // Alignment
                        0x01,               // Length
                        )
                    IO (Decode16,
                        0x0089,             // Range Minimum
                        0x0089,             // Range Maximum
                        0x00,               // Alignment
                        0x03,               // Length
                        )
                    IO (Decode16,
                        0x008F,             // Range Minimum
                        0x008F,             // Range Maximum
                        0x00,               // Alignment
                        0x01,               // Length
                        )
                    IO (Decode16,
                        0x00C0,             // Range Minimum
                        0x00C0,             // Range Maximum
                        0x00,               // Alignment
                        0x20,               // Length
                        )
                    DMA (Compatibility, NotBusMaster, Transfer8, )
                        {4}
                })
            }

            Device (TMR)
            {
                Name (_HID, EisaId ("PNP0100") /* PC-class System Timer */)  // _HID: Hardware ID
                Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
                {
                    IO (Decode16,
                        0x0040,             // Range Minimum
                        0x0040,             // Range Maximum
                        0x00,               // Alignment
                        0x04,               // Length
                        )
                    IRQNoFlags ()
                        {0}
                })
            }

            Device (RTC)
            {
                Name (_HID, EisaId ("PNP0B00") /* AT Real-Time Clock */)  // _HID: Hardware ID
                Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
                {
                    IO (Decode16,
                        0x0070,             // Range Minimum
                        0x0070,             // Range Maximum
                        0x00,               // Alignment
                        0x02,               // Length
                        )
                    IRQNoFlags ()
                        {8}
                })
            }

            Device (SPKR)
            {
                Name (_HID, EisaId ("PNP0800") /* Microsoft Sound System Compatible Device */)  // _HID: Hardware ID
                Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
                {
                    IO (Decode16,
                        0x0061,             // Range Minimum
                        0x0061,             // Range Maximum
                        0x01,               // Alignment
                        0x01,               // Length
                        )
                })
            }

            Device (FPU)
            {
                Name (_HID, EisaId ("PNP0C04") /* x87-compatible Floating Point Processing Unit */)  // _HID: Hardware ID
                Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
                {
                    IO (Decode16,
                        0x00F0,             // Range Minimum
                        0x00F0,             // Range Maximum
                        0x00,               // Alignment
                        0x10,               // Length
                        )
                    IRQNoFlags ()
                        {13}
                })
            }

            Device (XTRA)
            {
                Name (_HID, EisaId ("PNP0C02") /* PNP Motherboard Resources */)  // _HID: Hardware ID
                Name (_UID, One)  // _UID: Unique ID
                Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
                {
                    IO (Decode16,
                        0x0010,             // Range Minimum
                        0x0010,             // Range Maximum
                        0x00,               // Alignment
                        0x10,               // Length
                        )
                    IO (Decode16,
                        0x0022,             // Range Minimum
                        0x0022,             // Range Maximum
                        0x00,               // Alignment
                        0x1E,               // Length
                        )
                    IO (Decode16,
                        0x0044,             // Range Minimum
                        0x0044,             // Range Maximum
                        0x00,               // Alignment
                        0x1C,               // Length
                        )
                    IO (Decode16,
                        0x0062,             // Range Minimum
                        0x0062,             // Range Maximum
                        0x00,               // Alignment
                        0x02,               // Length
                        )
                    IO (Decode16,
                        0x0065,             // Range Minimum
                        0x0065,             // Range Maximum
                        0x00,               // Alignment
                        0x0B,               // Length
                        )
                    IO (Decode16,
                        0x0072,             // Range Minimum
                        0x0072,             // Range Maximum
                        0x00,               // Alignment
                        0x0E,               // Length
                        )
                    IO (Decode16,
                        0x0080,             // Range Minimum
                        0x0080,             // Range Maximum
                        0x00,               // Alignment
                        0x01,               // Length
                        )
                    IO (Decode16,
                        0x0084,             // Range Minimum
                        0x0084,             // Range Maximum
                        0x00,               // Alignment
                        0x03,               // Length
                        )
                    IO (Decode16,
                        0x0088,             // Range Minimum
                        0x0088,             // Range Maximum
                        0x00,               // Alignment
                        0x01,               // Length
                        )
                    IO (Decode16,
                        0x008C,             // Range Minimum
                        0x008C,             // Range Maximum
                        0x00,               // Alignment
                        0x03,               // Length
                        )
                    IO (Decode16,
                        0x0090,             // Range Minimum
                        0x0090,             // Range Maximum
                        0x00,               // Alignment
                        0x10,               // Length
                        )
                    IO (Decode16,
                        0x00A2,             // Range Minimum
                        0x00A2,             // Range Maximum
                        0x00,               // Alignment
                        0x1E,               // Length
                        )
                    IO (Decode16,
                        0x00E0,             // Range Minimum
                        0x00E0,             // Range Maximum
                        0x00,               // Alignment
                        0x10,               // Length
                        )
                    IO (Decode16,
                        0x01E0,             // Range Minimum
                        0x01E0,             // Range Maximum
                        0x00,               // Alignment
                        0x10,               // Length
                        )
                    IO (Decode16,
                        0x0160,             // Range Minimum
                        0x0160,             // Range Maximum
                        0x00,               // Alignment
                        0x10,               // Length
                        )
                    IO (Decode16,
                        0x0370,             // Range Minimum
                        0x0370,             // Range Maximum
                        0x00,               // Alignment
                        0x02,               // Length
                        )
                    IO (Decode16,
                        0x0402,             // Range Minimum
                        0x0402,             // Range Maximum
                        0x00,               // Alignment
                        0x01,               // Length
                        )
                    IO (Decode16,
                        0x0440,             // Range Minimum
                        0x0440,             // Range Maximum
                        0x00,               // Alignment
                        0x10,               // Length
                        )
                    IO (Decode16,
                        0xAFE0,             // Range Minimum
                        0xAFE0,             // Range Maximum
                        0x00,               // Alignment
                        0x04,               // Length
                        )
                    IO (Decode16,
                        0xB000,             // Range Minimum
                        0xB000,             // Range Maximum
                        0x00,               // Alignment
                        0x40,               // Length
                        )
                    Memory32Fixed (ReadOnly,
                        0xFEC00000,         // Address Base
                        0x00001000,         // Address Length
                        )
                    Memory32Fixed (ReadOnly,
                        0xFEE00000,         // Address Base
                        0x00100000,         // Address Length
                        )
                })
            }

            Device (PS2K)
            {
                Name (_HID, EisaId ("PNP0303") /* IBM Enhanced Keyboard (101/102-key, PS/2 Mouse) */)  // _HID: Hardware ID
                Name (_CID, EisaId ("PNP030B"))  // _CID: Compatible ID
                Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
                {
                    IO (Decode16,
                        0x0060,             // Range Minimum
                        0x0060,             // Range Maximum
                        0x00,               // Alignment
                        0x01,               // Length
                        )
                    IO (Decode16,
                        0x0064,             // Range Minimum
                        0x0064,             // Range Maximum
                        0x00,               // Alignment
                        0x01,               // Length
                        )
                    IRQNoFlags ()
                        {1}
                })
            }

            Device (UAR1)
            {
                Name (_HID, EisaId ("PNP0501") /* 16550A-compatible COM Serial Port */)  // _HID: Hardware ID
                Name (_DDN, "COM1")  // _DDN: DOS Device Name
                Name (_UID, One)  // _UID: Unique ID
                Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
                {
                    IO (Decode16,
                        0x03F8,             // Range Minimum
                        0x03F8,             // Range Maximum
                        0x01,               // Alignment
                        0x08,               // Length
                        )
                    IRQ (Edge, ActiveHigh, Exclusive, )
                        {4}
                })
            }

            Device (UAR2)
            {
                Name (_HID, EisaId ("PNP0501") /* 16550A-compatible COM Serial Port */)  // _HID: Hardware ID
                Name (_DDN, "COM2")  // _DDN: DOS Device Name
                Name (_UID, 0x02)  // _UID: Unique ID
                Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
                {
                    IO (Decode16,
                        0x02F8,             // Range Minimum
                        0x02F8,             // Range Maximum
                        0x01,               // Alignment
                        0x08,               // Length
                        )
                    IRQ (Edge, ActiveHigh, Exclusive, )
                        {3}
                })
            }

            Device (PEVT)
            {
                Name (_HID, "QEMU0001")  // _HID: Hardware ID
                Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
                {
                    IO (Decode16,
                        0x0505,             // Range Minimum
                        0x0505,             // Range Maximum
                        0x01,               // Alignment
                        0x01,               // Length
                        )
                })
                OperationRegion (PEOR, SystemIO, 0x0505, One)
                Field (PEOR, ByteAcc, NoLock, Preserve)
                {
                    PEPT,   8
                }

                Name (_STA, 0x0F)  // _STA: Status
                Method (RDPT, 0, NotSerialized)
                {
                    Local0 = PEPT /* \_SB_.PCI0.LPC_.PEVT.PEPT */
                    Return (Local0)
                }

                Method (WRPT, 1, NotSerialized)
                {
                    PEPT = Arg0
                }
            }
        }
    }
}

}

================================================================
TABLE: FACP
SRC: /sys/firmware/acpi/tables/FACP
READ: OK
BYTES: 244
SHA256: 0938ac1fde9bc13bac0a4d316bdc18e6447bce45deea35316b1d47d2f9df3c17

DECOMPILE: OK (normalized ASL follows)
---- ASL (normalized) ----

[000h 0000 004h] Signature : "FACP" [Fixed ACPI Description Table (FADT)]
[004h 0004 004h] Table Length : 000000F4
[008h 0008 001h] Revision : 03
[009h 0009 001h] Checksum : 05
[00Ah 0010 006h] Oem ID : "OVMF "
[010h 0016 008h] Oem Table ID : "OVMFEDK2"
[018h 0024 004h] Oem Revision : 20130221
[01Ch 0028 004h] Asl Compiler ID : "OVMF"
[020h 0032 004h] Asl Compiler Revision : 00000099

[024h 0036 004h] FACS Address : BFBFE000
[028h 0040 004h] DSDT Address : BFB7A000
[02Ch 0044 001h] Model : 00
[02Dh 0045 001h] PM Profile : 00 [Unspecified]
[02Eh 0046 002h] SCI Interrupt : 0009
[030h 0048 004h] SMI Command Port : 000000B2
[034h 0052 001h] ACPI Enable Value : F1
[035h 0053 001h] ACPI Disable Value : F0
[036h 0054 001h] S4BIOS Command : 00
[037h 0055 001h] P-State Control : 00
[038h 0056 004h] PM1A Event Block Address : 0000B000
[03Ch 0060 004h] PM1B Event Block Address : 00000000
[040h 0064 004h] PM1A Control Block Address : 0000B004
[044h 0068 004h] PM1B Control Block Address : 00000000
[048h 0072 004h] PM2 Control Block Address : 00000000
[04Ch 0076 004h] PM Timer Block Address : 0000B008
[050h 0080 004h] GPE0 Block Address : 0000AFE0
[054h 0084 004h] GPE1 Block Address : 00000000
[058h 0088 001h] PM1 Event Block Length : 04
[059h 0089 001h] PM1 Control Block Length : 02
[05Ah 0090 001h] PM2 Control Block Length : 00
[05Bh 0091 001h] PM Timer Block Length : 04
[05Ch 0092 001h] GPE0 Block Length : 04
[05Dh 0093 001h] GPE1 Block Length : 00
[05Eh 0094 001h] GPE1 Base Offset : 00
[05Fh 0095 001h] _CST Support : 00
[060h 0096 002h] C2 Latency : 0065
[062h 0098 002h] C3 Latency : 03E9
[064h 0100 002h] CPU Cache Size : 0000
[066h 0102 002h] Cache Flush Stride : 0000
[068h 0104 001h] Duty Cycle Offset : 00
[069h 0105 001h] Duty Cycle Width : 00
[06Ah 0106 001h] RTC Day Alarm Index : 00
[06Bh 0107 001h] RTC Month Alarm Index : 00
[06Ch 0108 001h] RTC Century Index : 00
[06Dh 0109 002h] Boot Flags (decoded below) : 0000
Legacy Devices Supported (V2) : 0
8042 Present on ports 60/64 (V2) : 0
VGA Not Present (V4) : 0
MSI Not Supported (V4) : 0
PCIe ASPM Not Supported (V4) : 0
CMOS RTC Not Present (V5) : 0
[06Fh 0111 001h] Reserved : 00
[070h 0112 004h] Flags (decoded below) : 000005A5
WBINVD instruction is operational (V1) : 1
WBINVD flushes all caches (V1) : 0
All CPUs support C1 (V1) : 1
C2 works on MP system (V1) : 0
Control Method Power Button (V1) : 0
Control Method Sleep Button (V1) : 1
RTC wake not in fixed reg space (V1) : 0
RTC can wake system from S4 (V1) : 1
32-bit PM Timer (V1) : 1
Docking Supported (V1) : 0
Reset Register Supported (V2) : 1
Sealed Case (V3) : 0
Headless - No Video (V3) : 0
Use native instr after SLP_TYPx (V3) : 0
PCIEXP_WAK Bits Supported (V4) : 0
Use Platform Timer (V4) : 0
RTC_STS valid on S4 wake (V4) : 0
Remote Power-on capable (V4) : 0
Use APIC Cluster Model (V4) : 0
Use APIC Physical Destination Mode (V4) : 0
Hardware Reduced (V5) : 0
Low Power S0 Idle (V5) : 0

[074h 0116 00Ch] Reset Register : [Generic Address Structure]
[074h 0116 001h] Space ID : 01 [SystemIO]
[075h 0117 001h] Bit Width : 08
[076h 0118 001h] Bit Offset : 00
[077h 0119 001h] Encoded Access Width : 00 [Undefined/Legacy]
[078h 0120 008h] Address : 0000000000000CF9

[080h 0128 001h] Value to cause reset : 06
[081h 0129 002h] ARM Flags (decoded below) : 0000
PSCI Compliant : 0
Must use HVC for PSCI : 0

[083h 0131 001h] FADT Minor Revision : 00
[084h 0132 008h] FACS Address : 0000000000000000
[08Ch 0140 008h] DSDT Address : 00000000BFB7A000
[094h 0148 00Ch] PM1A Event Block : [Generic Address Structure]
[094h 0148 001h] Space ID : 01 [SystemIO]
[095h 0149 001h] Bit Width : 20
[096h 0150 001h] Bit Offset : 00
[097h 0151 001h] Encoded Access Width : 00 [Undefined/Legacy]
[098h 0152 008h] Address : 000000000000B000

[0A0h 0160 00Ch] PM1B Event Block : [Generic Address Structure]
[0A0h 0160 001h] Space ID : 00 [SystemMemory]
[0A1h 0161 001h] Bit Width : 00
[0A2h 0162 001h] Bit Offset : 00
[0A3h 0163 001h] Encoded Access Width : 00 [Undefined/Legacy]
[0A4h 0164 008h] Address : 0000000000000000

[0ACh 0172 00Ch] PM1A Control Block : [Generic Address Structure]
[0ACh 0172 001h] Space ID : 01 [SystemIO]
[0ADh 0173 001h] Bit Width : 10
[0AEh 0174 001h] Bit Offset : 00
[0AFh 0175 001h] Encoded Access Width : 00 [Undefined/Legacy]
[0B0h 0176 008h] Address : 000000000000B004

[0B8h 0184 00Ch] PM1B Control Block : [Generic Address Structure]
[0B8h 0184 001h] Space ID : 00 [SystemMemory]
[0B9h 0185 001h] Bit Width : 00
[0BAh 0186 001h] Bit Offset : 00
[0BBh 0187 001h] Encoded Access Width : 00 [Undefined/Legacy]
[0BCh 0188 008h] Address : 0000000000000000

[0C4h 0196 00Ch] PM2 Control Block : [Generic Address Structure]
[0C4h 0196 001h] Space ID : 00 [SystemMemory]
[0C5h 0197 001h] Bit Width : 00
[0C6h 0198 001h] Bit Offset : 00
[0C7h 0199 001h] Encoded Access Width : 00 [Undefined/Legacy]
[0C8h 0200 008h] Address : 0000000000000000

[0D0h 0208 00Ch] PM Timer Block : [Generic Address Structure]
[0D0h 0208 001h] Space ID : 01 [SystemIO]
[0D1h 0209 001h] Bit Width : 20
[0D2h 0210 001h] Bit Offset : 00
[0D3h 0211 001h] Encoded Access Width : 00 [Undefined/Legacy]
[0D4h 0212 008h] Address : 000000000000B008

[0DCh 0220 00Ch] GPE0 Block : [Generic Address Structure]
[0DCh 0220 001h] Space ID : 01 [SystemIO]
[0DDh 0221 001h] Bit Width : 20
[0DEh 0222 001h] Bit Offset : 00
[0DFh 0223 001h] Encoded Access Width : 00 [Undefined/Legacy]
[0E0h 0224 008h] Address : 000000000000AFE0

[0E8h 0232 00Ch] GPE1 Block : [Generic Address Structure]
[0E8h 0232 001h] Space ID : 00 [SystemMemory]
[0E9h 0233 001h] Bit Width : 00
[0EAh 0234 001h] Bit Offset : 00
[0EBh 0235 001h] Encoded Access Width : 00 [Undefined/Legacy]
[0ECh 0236 008h] Address : 0000000000000000

Raw Table Data: Length 244 (0xF4)

0000: 46 41 43 50 F4 00 00 00 03 05 4F 56 4D 46 20 20  // FACP......OVMF
0010: 4F 56 4D 46 45 44 4B 32 21 02 13 20 4F 56 4D 46  // OVMFEDK2!.. OVMF
0020: 99 00 00 00 00 E0 BF BF 00 A0 B7 BF 00 00 09 00  // ................
0030: B2 00 00 00 F1 F0 00 00 00 B0 00 00 00 00 00 00  // ................
0040: 04 B0 00 00 00 00 00 00 00 00 00 00 08 B0 00 00  // ................
0050: E0 AF 00 00 00 00 00 00 04 02 00 04 04 00 00 00  // ................
0060: 65 00 E9 03 00 00 00 00 00 00 00 00 00 00 00 00  // e...............
0070: A5 05 00 00 01 08 00 00 F9 0C 00 00 00 00 00 00  // ................
0080: 06 00 00 00 00 00 00 00 00 00 00 00 00 A0 B7 BF  // ................
0090: 00 00 00 00 01 20 00 00 00 B0 00 00 00 00 00 00  // ..... ..........
00A0: 00 00 00 00 00 00 00 00 00 00 00 00 01 10 00 00  // ................
00B0: 04 B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00  // ................
00C0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  // ................
00D0: 01 20 00 00 08 B0 00 00 00 00 00 00 01 20 00 00  // . ........... ..
00E0: E0 AF 00 00 00 00 00 00 00 00 00 00 00 00 00 00  // ................
00F0: 00 00 00 00                                      // ....

================================================================
TABLE: FACS
SRC: /sys/firmware/acpi/tables/FACS
READ: OK
BYTES: 64
SHA256: 3fb3115e2c3c626603dbb20ab49825295d952f171ed7901a7f464cead2f40800

DECOMPILE: OK (normalized ASL follows)
---- ASL (normalized) ----

[000h 0000 004h] Signature : "FACS"
[004h 0004 004h] Length : 00000040
[008h 0008 004h] Hardware Signature : 00000000
[00Ch 0012 004h] 32 Firmware Waking Vector : 00000000
[010h 0016 004h] Global Lock : 00000000
[014h 0020 004h] Flags (decoded below) : 00000000
S4BIOS Support Present : 0
64-bit Wake Supported (V2) : 0
[018h 0024 008h] 64 Firmware Waking Vector : 0000000000000000
[020h 0032 001h] Version : 00
[021h 0033 003h] Reserved : 000000
[024h 0036 004h] OspmFlags (decoded below) : 00000000
64-bit Wake Env Required (V2) : 0

Raw Table Data: Length 64 (0x40)

0000: 46 41 43 53 40 00 00 00 00 00 00 00 00 00 00 00  // FACS@...........
0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  // ................
0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  // ................
0030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  // ................

================================================================
TABLE: SSDT
SRC: /sys/firmware/acpi/tables/SSDT
READ: OK
BYTES: 87
SHA256: 2e1df636f59bf1f98f9a7820a86d22792c16d10d5defd869a300866a319dcdfe

DECOMPILE: OK (normalized ASL follows)
---- ASL (normalized) ----
DefinitionBlock ("", "SSDT", 1, "REDHAT", "OVMF ", 0x00000001)
{
OperationRegion (FWDT, SystemMemory, 0xBFB6C018, 0x00000030)
Name (_S3, Package (0x04) // S3: S3 System State
{
0x01,
0x00,
0x00,
0x00
})
Name (_S4, Package (0x04) // S4: S4 System State
{
0x02,
0x00,
0x00,
0x00
})
}

</details>

<details>

<summary>New ACPI table dump</summary>

TABLE_INDEX:
APIC bytes=114 sha256=e04b7d5735e8f5efb3e0d597770740e5d38896de73e230027428ed09019ed981 src=/sys/firmware/acpi/tables/APIC
BGRT bytes=56 sha256=e224f1e75dcbbf3eaa258330c9b281e1c93385ccac3852a7c08b935366a4a24a src=/sys/firmware/acpi/tables/BGRT
DSDT bytes=2306 sha256=35461a97b98d3205647fd7bd5300de52953858f6ba6d1b4d0b8f3cf49904d311 src=/sys/firmware/acpi/tables/DSDT
FACP bytes=276 sha256=ee6d002f9e95946a9a1290b74663e8a93eff52367ac73786cc9da6caa29c9a3d src=/sys/firmware/acpi/tables/FACP
FACS bytes=64 sha256=8a2f3c6d08a637005f7be37885075749128a34fb49e941a47c82848fcd15fdda src=/sys/firmware/acpi/tables/FACS
HPET bytes=56 sha256=8cfeba212a9d4efea534a5d8b12ad4b25e2129d2db54ca56590af22c6c90037c src=/sys/firmware/acpi/tables/HPET
MCFG bytes=60 sha256=9cfbdf24e38ea501f1b557d021de9ee6c1f0f5e187e4ec4d07b1b9100037862a src=/sys/firmware/acpi/tables/MCFG

================================================================
TABLE: APIC
SRC: /sys/firmware/acpi/tables/APIC
READ: OK
BYTES: 114
SHA256: e04b7d5735e8f5efb3e0d597770740e5d38896de73e230027428ed09019ed981

DECOMPILE: OK (normalized ASL follows)
---- ASL (normalized) ----

[000h 0000 004h] Signature : "APIC" [Multiple APIC Description Table (MADT)]
[004h 0004 004h] Table Length : 00000072
[008h 0008 001h] Revision : 05
[009h 0009 001h] Checksum : 2C
[00Ah 0010 006h] Oem ID : "OXIDE"
[010h 0016 008h] Oem Table ID : "PROPOLIS"
[018h 0024 004h] Oem Revision : 00000001
[01Ch 0028 004h] Asl Compiler ID : "OXDE"
[020h 0032 004h] Asl Compiler Revision : 00000001

[024h 0036 004h] Local Apic Address : FEE00000
[028h 0040 004h] Flags (decoded below) : 00000001
PC-AT Compatibility : 1

[02Ch 0044 001h] Subtable Type : 00 [Processor Local APIC]
[02Dh 0045 001h] Length : 08
[02Eh 0046 001h] Processor ID : 00
[02Fh 0047 001h] Local Apic ID : 00
[030h 0048 004h] Flags (decoded below) : 00000001
Processor Enabled : 1
Runtime Online Capable : 0

[034h 0052 001h] Subtable Type : 00 [Processor Local APIC]
[035h 0053 001h] Length : 08
[036h 0054 001h] Processor ID : 01
[037h 0055 001h] Local Apic ID : 01
[038h 0056 004h] Flags (decoded below) : 00000001
Processor Enabled : 1
Runtime Online Capable : 0

[03Ch 0060 001h] Subtable Type : 00 [Processor Local APIC]
[03Dh 0061 001h] Length : 08
[03Eh 0062 001h] Processor ID : 02
[03Fh 0063 001h] Local Apic ID : 02
[040h 0064 004h] Flags (decoded below) : 00000001
Processor Enabled : 1
Runtime Online Capable : 0

[044h 0068 001h] Subtable Type : 00 [Processor Local APIC]
[045h 0069 001h] Length : 08
[046h 0070 001h] Processor ID : 03
[047h 0071 001h] Local Apic ID : 03
[048h 0072 004h] Flags (decoded below) : 00000001
Processor Enabled : 1
Runtime Online Capable : 0

[04Ch 0076 001h] Subtable Type : 01 [I/O APIC]
[04Dh 0077 001h] Length : 0C
[04Eh 0078 001h] I/O Apic ID : 00
[04Fh 0079 001h] Reserved : 00
[050h 0080 004h] Address : FEC00000
[054h 0084 004h] Interrupt : 00000000

[058h 0088 001h] Subtable Type : 02 [Interrupt Source Override]
[059h 0089 001h] Length : 0A
[05Ah 0090 001h] Bus : 00
[05Bh 0091 001h] Source : 00
[05Ch 0092 004h] Interrupt : 00000002
[060h 0096 002h] Flags (decoded below) : 0000
Polarity : 0
Trigger Mode : 0

[062h 0098 001h] Subtable Type : 02 [Interrupt Source Override]
[063h 0099 001h] Length : 0A
[064h 0100 001h] Bus : 00
[065h 0101 001h] Source : 09
[066h 0102 004h] Interrupt : 00000009
[06Ah 0106 002h] Flags (decoded below) : 000D
Polarity : 1
Trigger Mode : 3

[06Ch 0108 001h] Subtable Type : 04 [Local APIC NMI]
[06Dh 0109 001h] Length : 06
[06Eh 0110 001h] Processor ID : FF
[06Fh 0111 002h] Flags (decoded below) : 0000
Polarity : 0
Trigger Mode : 0
[071h 0113 001h] Interrupt Input LINT : 01

Raw Table Data: Length 114 (0x72)

0000: 41 50 49 43 72 00 00 00 05 2C 4F 58 49 44 45 00  // APICr....,OXIDE.
0010: 50 52 4F 50 4F 4C 49 53 01 00 00 00 4F 58 44 45  // PROPOLIS....OXDE
0020: 01 00 00 00 00 00 E0 FE 01 00 00 00 00 08 00 00  // ................
0030: 01 00 00 00 00 08 01 01 01 00 00 00 00 08 02 02  // ................
0040: 01 00 00 00 00 08 03 03 01 00 00 00 01 0C 00 00  // ................
0050: 00 00 C0 FE 00 00 00 00 02 0A 00 00 02 00 00 00  // ................
0060: 00 00 02 0A 00 09 09 00 00 00 0D 00 04 06 FF 00  // ................
0070: 00 01                                            // ..

================================================================
TABLE: BGRT
SRC: /sys/firmware/acpi/tables/BGRT
READ: OK
BYTES: 56
SHA256: e224f1e75dcbbf3eaa258330c9b281e1c93385ccac3852a7c08b935366a4a24a

DECOMPILE: OK (normalized ASL follows)
---- ASL (normalized) ----

[000h 0000 004h] Signature : "BGRT" [Boot Graphics Resource Table]
[004h 0004 004h] Table Length : 00000038
[008h 0008 001h] Revision : 01
[009h 0009 001h] Checksum : 58
[00Ah 0010 006h] Oem ID : "INTEL "
[010h 0016 008h] Oem Table ID : "EDK2 "
[018h 0024 004h] Oem Revision : 00000002
[01Ch 0028 004h] Asl Compiler ID : " "
[020h 0032 004h] Asl Compiler Revision : 01000013

[024h 0036 002h] Version : 0001
[026h 0038 001h] Status (decoded below) : 01
Displayed : 1
Orientation Offset : 0
[027h 0039 001h] Image Type : 00
[028h 0040 008h] Image Address : 00000000BE304018
[030h 0048 004h] Image OffsetX : 0000012F
[034h 0052 004h] Image OffsetY : 0000010F

Raw Table Data: Length 56 (0x38)

0000: 42 47 52 54 38 00 00 00 01 58 49 4E 54 45 4C 20  // BGRT8....XINTEL
0010: 45 44 4B 32 20 20 20 20 02 00 00 00 20 20 20 20  // EDK2    ....
0020: 13 00 00 01 01 00 01 00 18 40 30 BE 00 00 00 00  // .........@0.....
0030: 2F 01 00 00 0F 01 00 00                          // /.......

================================================================
TABLE: DSDT
SRC: /sys/firmware/acpi/tables/DSDT
READ: OK
BYTES: 2306
SHA256: 35461a97b98d3205647fd7bd5300de52953858f6ba6d1b4d0b8f3cf49904d311

DECOMPILE: OK (normalized ASL follows)
---- ASL (normalized) ----
DefinitionBlock ("", "DSDT", 2, "OXIDE", "PROPOLIS", 0x00000001)
{
Name (PICM, Zero)
Method (_PIC, 1, NotSerialized) // _PIC: Interrupt Model
{
PICM = Arg0
}

Name (\_S0, Package (0x04)  // _S0_: S0 System State
{
    0x05,
    0x05,
    Zero,
    Zero
})
Name (\_S3, Package (0x04)  // _S3_: S3 System State
{
    One,
    One,
    Zero,
    Zero
})
Name (\_S4, Package (0x04)  // _S4_: S4 System State
{
    0x06,
    0x06,
    Zero,
    Zero
})
Name (\_S5, Package (0x04)  // _S5_: S5 System State
{
    0x07,
    0x07,
    Zero,
    Zero
})
Scope (\_SB)
{
    Device (PCI0)
    {
        Name (_HID, EisaId ("PNP0A08") /* PCI Express Bus */)  // _HID: Hardware ID
        Name (_CID, EisaId ("PNP0A03") /* PCI Bus */)  // _CID: Compatible ID
        Name (_SEG, Zero)  // _SEG: PCI Segment
        Name (_UID, Zero)  // _UID: Unique ID
        Name (_ADR, Zero)  // _ADR: Address
        Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
        {
            WordBusNumber (ResourceProducer, MinNotFixed, MaxNotFixed, PosDecode,
                0x0000,             // Granularity
                0x0000,             // Range Minimum
                0x00FF,             // Range Maximum
                0x0000,             // Translation Offset
                0x0100,             // Length
                ,, )
            IO (Decode16,
                0x0CF8,             // Range Minimum
                0x0CF8,             // Range Maximum
                0x01,               // Alignment
                0x08,               // Length
                )
            WordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange,
                0x0000,             // Granularity
                0x1000,             // Range Minimum
                0xFFFF,             // Range Maximum
                0x0000,             // Translation Offset
                0xF000,             // Length
                ,, , TypeStatic, DenseTranslation)
            DWordMemory (ResourceProducer, PosDecode, MinNotFixed, MaxNotFixed, NonCacheable, ReadWrite,
                0x00000000,         // Granularity
                0xC0000000,         // Range Minimum
                0xDFFFFFFF,         // Range Maximum
                0x00000000,         // Translation Offset
                0x20000000,         // Length
                ,, , AddressRangeMemory, TypeStatic)
            DWordMemory (ResourceProducer, PosDecode, MinNotFixed, MaxNotFixed, NonCacheable, ReadWrite,
                0x00000000,         // Granularity
                0xF0000000,         // Range Minimum
                0xFBFFFFFF,         // Range Maximum
                0x00000000,         // Translation Offset
                0x0C000000,         // Length
                ,, , AddressRangeMemory, TypeStatic)
            QWordMemory (ResourceProducer, PosDecode, MinNotFixed, MaxNotFixed, NonCacheable, ReadWrite,
                0x0000000000000000, // Granularity
                0x0000000140000000, // Range Minimum
                0x000000FFFFFFFFFF, // Range Maximum
                0x0000000000000000, // Translation Offset
                0x000000FEC0000000, // Length
                ,, , AddressRangeMemory, TypeStatic)
        })
        Name (_PRT, Package (0x7C)  // _PRT: PCI Routing Table
        {
            Package (0x04)
            {
                0x0001FFFF,
                Zero,
                Zero,
                0x11
            },

            Package (0x04)
            {
                0x0001FFFF,
                One,
                Zero,
                0x12
            },

            Package (0x04)
            {
                0x0001FFFF,
                0x02,
                Zero,
                0x13
            },

            Package (0x04)
            {
                0x0001FFFF,
                0x03,
                Zero,
                0x10
            },

            Package (0x04)
            {
                0x0002FFFF,
                Zero,
                Zero,
                0x12
            },

            Package (0x04)
            {
                0x0002FFFF,
                One,
                Zero,
                0x13
            },

            Package (0x04)
            {
                0x0002FFFF,
                0x02,
                Zero,
                0x10
            },

            Package (0x04)
            {
                0x0002FFFF,
                0x03,
                Zero,
                0x11
            },

            Package (0x04)
            {
                0x0003FFFF,
                Zero,
                Zero,
                0x13
            },

            Package (0x04)
            {
                0x0003FFFF,
                One,
                Zero,
                0x10
            },

            Package (0x04)
            {
                0x0003FFFF,
                0x02,
                Zero,
                0x11
            },

            Package (0x04)
            {
                0x0003FFFF,
                0x03,
                Zero,
                0x12
            },

            Package (0x04)
            {
                0x0004FFFF,
                Zero,
                Zero,
                0x10
            },

            Package (0x04)
            {
                0x0004FFFF,
                One,
                Zero,
                0x11
            },

            Package (0x04)
            {
                0x0004FFFF,
                0x02,
                Zero,
                0x12
            },

            Package (0x04)
            {
                0x0004FFFF,
                0x03,
                Zero,
                0x13
            },

            Package (0x04)
            {
                0x0005FFFF,
                Zero,
                Zero,
                0x11
            },

            Package (0x04)
            {
                0x0005FFFF,
                One,
                Zero,
                0x12
            },

            Package (0x04)
            {
                0x0005FFFF,
                0x02,
                Zero,
                0x13
            },

            Package (0x04)
            {
                0x0005FFFF,
                0x03,
                Zero,
                0x10
            },

            Package (0x04)
            {
                0x0006FFFF,
                Zero,
                Zero,
                0x12
            },

            Package (0x04)
            {
                0x0006FFFF,
                One,
                Zero,
                0x13
            },

            Package (0x04)
            {
                0x0006FFFF,
                0x02,
                Zero,
                0x10
            },

            Package (0x04)
            {
                0x0006FFFF,
                0x03,
                Zero,
                0x11
            },

            Package (0x04)
            {
                0x0007FFFF,
                Zero,
                Zero,
                0x13
            },

            Package (0x04)
            {
                0x0007FFFF,
                One,
                Zero,
                0x10
            },

            Package (0x04)
            {
                0x0007FFFF,
                0x02,
                Zero,
                0x11
            },

            Package (0x04)
            {
                0x0007FFFF,
                0x03,
                Zero,
                0x12
            },

            Package (0x04)
            {
                0x0008FFFF,
                Zero,
                Zero,
                0x10
            },

            Package (0x04)
            {
                0x0008FFFF,
                One,
                Zero,
                0x11
            },

            Package (0x04)
            {
                0x0008FFFF,
                0x02,
                Zero,
                0x12
            },

            Package (0x04)
            {
                0x0008FFFF,
                0x03,
                Zero,
                0x13
            },

            Package (0x04)
            {
                0x0009FFFF,
                Zero,
                Zero,
                0x11
            },

            Package (0x04)
            {
                0x0009FFFF,
                One,
                Zero,
                0x12
            },

            Package (0x04)
            {
                0x0009FFFF,
                0x02,
                Zero,
                0x13
            },

            Package (0x04)
            {
                0x0009FFFF,
                0x03,
                Zero,
                0x10
            },

            Package (0x04)
            {
                0x000AFFFF,
                Zero,
                Zero,
                0x12
            },

            Package (0x04)
            {
                0x000AFFFF,
                One,
                Zero,
                0x13
            },

            Package (0x04)
            {
                0x000AFFFF,
                0x02,
                Zero,
                0x10
            },

            Package (0x04)
            {
                0x000AFFFF,
                0x03,
                Zero,
                0x11
            },

            Package (0x04)
            {
                0x000BFFFF,
                Zero,
                Zero,
                0x13
            },

            Package (0x04)
            {
                0x000BFFFF,
                One,
                Zero,
                0x10
            },

            Package (0x04)
            {
                0x000BFFFF,
                0x02,
                Zero,
                0x11
            },

            Package (0x04)
            {
                0x000BFFFF,
                0x03,
                Zero,
                0x12
            },

            Package (0x04)
            {
                0x000CFFFF,
                Zero,
                Zero,
                0x10
            },

            Package (0x04)
            {
                0x000CFFFF,
                One,
                Zero,
                0x11
            },

            Package (0x04)
            {
                0x000CFFFF,
                0x02,
                Zero,
                0x12
            },

            Package (0x04)
            {
                0x000CFFFF,
                0x03,
                Zero,
                0x13
            },

            Package (0x04)
            {
                0x000DFFFF,
                Zero,
                Zero,
                0x11
            },

            Package (0x04)
            {
                0x000DFFFF,
                One,
                Zero,
                0x12
            },

            Package (0x04)
            {
                0x000DFFFF,
                0x02,
                Zero,
                0x13
            },

            Package (0x04)
            {
                0x000DFFFF,
                0x03,
                Zero,
                0x10
            },

            Package (0x04)
            {
                0x000EFFFF,
                Zero,
                Zero,
                0x12
            },

            Package (0x04)
            {
                0x000EFFFF,
                One,
                Zero,
                0x13
            },

            Package (0x04)
            {
                0x000EFFFF,
                0x02,
                Zero,
                0x10
            },

            Package (0x04)
            {
                0x000EFFFF,
                0x03,
                Zero,
                0x11
            },

            Package (0x04)
            {
                0x000FFFFF,
                Zero,
                Zero,
                0x13
            },

            Package (0x04)
            {
                0x000FFFFF,
                One,
                Zero,
                0x10
            },

            Package (0x04)
            {
                0x000FFFFF,
                0x02,
                Zero,
                0x11
            },

            Package (0x04)
            {
                0x000FFFFF,
                0x03,
                Zero,
                0x12
            },

            Package (0x04)
            {
                0x0010FFFF,
                Zero,
                Zero,
                0x10
            },

            Package (0x04)
            {
                0x0010FFFF,
                One,
                Zero,
                0x11
            },

            Package (0x04)
            {
                0x0010FFFF,
                0x02,
                Zero,
                0x12
            },

            Package (0x04)
            {
                0x0010FFFF,
                0x03,
                Zero,
                0x13
            },

            Package (0x04)
            {
                0x0011FFFF,
                Zero,
                Zero,
                0x11
            },

            Package (0x04)
            {
                0x0011FFFF,
                One,
                Zero,
                0x12
            },

            Package (0x04)
            {
                0x0011FFFF,
                0x02,
                Zero,
                0x13
            },

            Package (0x04)
            {
                0x0011FFFF,
                0x03,
                Zero,
                0x10
            },

            Package (0x04)
            {
                0x0012FFFF,
                Zero,
                Zero,
                0x12
            },

            Package (0x04)
            {
                0x0012FFFF,
                One,
                Zero,
                0x13
            },

            Package (0x04)
            {
                0x0012FFFF,
                0x02,
                Zero,
                0x10
            },

            Package (0x04)
            {
                0x0012FFFF,
                0x03,
                Zero,
                0x11
            },

            Package (0x04)
            {
                0x0013FFFF,
                Zero,
                Zero,
                0x13
            },

            Package (0x04)
            {
                0x0013FFFF,
                One,
                Zero,
                0x10
            },

            Package (0x04)
            {
                0x0013FFFF,
                0x02,
                Zero,
                0x11
            },

            Package (0x04)
            {
                0x0013FFFF,
                0x03,
                Zero,
                0x12
            },

            Package (0x04)
            {
                0x0014FFFF,
                Zero,
                Zero,
                0x10
            },

            Package (0x04)
            {
                0x0014FFFF,
                One,
                Zero,
                0x11
            },

            Package (0x04)
            {
                0x0014FFFF,
                0x02,
                Zero,
                0x12
            },

            Package (0x04)
            {
                0x0014FFFF,
                0x03,
                Zero,
                0x13
            },

            Package (0x04)
            {
                0x0015FFFF,
                Zero,
                Zero,
                0x11
            },

            Package (0x04)
            {
                0x0015FFFF,
                One,
                Zero,
                0x12
            },

            Package (0x04)
            {
                0x0015FFFF,
                0x02,
                Zero,
                0x13
            },

            Package (0x04)
            {
                0x0015FFFF,
                0x03,
                Zero,
                0x10
            },

            Package (0x04)
            {
                0x0016FFFF,
                Zero,
                Zero,
                0x12
            },

            Package (0x04)
            {
                0x0016FFFF,
                One,
                Zero,
                0x13
            },

            Package (0x04)
            {
                0x0016FFFF,
                0x02,
                Zero,
                0x10
            },

            Package (0x04)
            {
                0x0016FFFF,
                0x03,
                Zero,
                0x11
            },

            Package (0x04)
            {
                0x0017FFFF,
                Zero,
                Zero,
                0x13
            },

            Package (0x04)
            {
                0x0017FFFF,
                One,
                Zero,
                0x10
            },

            Package (0x04)
            {
                0x0017FFFF,
                0x02,
                Zero,
                0x11
            },

            Package (0x04)
            {
                0x0017FFFF,
                0x03,
                Zero,
                0x12
            },

            Package (0x04)
            {
                0x0018FFFF,
                Zero,
                Zero,
                0x10
            },

            Package (0x04)
            {
                0x0018FFFF,
                One,
                Zero,
                0x11
            },

            Package (0x04)
            {
                0x0018FFFF,
                0x02,
                Zero,
                0x12
            },

            Package (0x04)
            {
                0x0018FFFF,
                0x03,
                Zero,
                0x13
            },

            Package (0x04)
            {
                0x0019FFFF,
                Zero,
                Zero,
                0x11
            },

            Package (0x04)
            {
                0x0019FFFF,
                One,
                Zero,
                0x12
            },

            Package (0x04)
            {
                0x0019FFFF,
                0x02,
                Zero,
                0x13
            },

            Package (0x04)
            {
                0x0019FFFF,
                0x03,
                Zero,
                0x10
            },

            Package (0x04)
            {
                0x001AFFFF,
                Zero,
                Zero,
                0x12
            },

            Package (0x04)
            {
                0x001AFFFF,
                One,
                Zero,
                0x13
            },

            Package (0x04)
            {
                0x001AFFFF,
                0x02,
                Zero,
                0x10
            },

            Package (0x04)
            {
                0x001AFFFF,
                0x03,
                Zero,
                0x11
            },

            Package (0x04)
            {
                0x001BFFFF,
                Zero,
                Zero,
                0x13
            },

            Package (0x04)
            {
                0x001BFFFF,
                One,
                Zero,
                0x10
            },

            Package (0x04)
            {
                0x001BFFFF,
                0x02,
                Zero,
                0x11
            },

            Package (0x04)
            {
                0x001BFFFF,
                0x03,
                Zero,
                0x12
            },

            Package (0x04)
            {
                0x001CFFFF,
                Zero,
                Zero,
                0x10
            },

            Package (0x04)
            {
                0x001CFFFF,
                One,
                Zero,
                0x11
            },

            Package (0x04)
            {
                0x001CFFFF,
                0x02,
                Zero,
                0x12
            },

            Package (0x04)
            {
                0x001CFFFF,
                0x03,
                Zero,
                0x13
            },

            Package (0x04)
            {
                0x001DFFFF,
                Zero,
                Zero,
                0x11
            },

            Package (0x04)
            {
                0x001DFFFF,
                One,
                Zero,
                0x12
            },

            Package (0x04)
            {
                0x001DFFFF,
                0x02,
                Zero,
                0x13
            },

            Package (0x04)
            {
                0x001DFFFF,
                0x03,
                Zero,
                0x10
            },

            Package (0x04)
            {
                0x001EFFFF,
                Zero,
                Zero,
                0x12
            },

            Package (0x04)
            {
                0x001EFFFF,
                One,
                Zero,
                0x13
            },

            Package (0x04)
            {
                0x001EFFFF,
                0x02,
                Zero,
                0x10
            },

            Package (0x04)
            {
                0x001EFFFF,
                0x03,
                Zero,
                0x11
            },

            Package (0x04)
            {
                0x001FFFFF,
                Zero,
                Zero,
                0x13
            },

            Package (0x04)
            {
                0x001FFFFF,
                One,
                Zero,
                0x10
            },

            Package (0x04)
            {
                0x001FFFFF,
                0x02,
                Zero,
                0x11
            },

            Package (0x04)
            {
                0x001FFFFF,
                0x03,
                Zero,
                0x12
            }
        })
        Name (SUPP, Zero)
        Method (_OSC, 4, NotSerialized)  // _OSC: Operating System Capabilities
        {
            CreateDWordField (Arg3, Zero, CDW1)
            CreateDWordField (Arg3, 0x04, CDW2)
            CreateDWordField (Arg3, 0x08, CDW3)
            If ((Arg0 == ToUUID ("33db4d5b-1ff7-401c-9657-7441c03dd766") /* PCI Host Bridge Device */))
            {
                SUPP = CDW2 /* \_SB_.PCI0._OSC.CDW2 */
                CDW3 &= 0xFFFFFFE0
            }
            Else
            {
                CDW1 |= 0x04
            }

            Return (Arg3)
        }
    }

    Device (MRES)
    {
        Name (_HID, EisaId ("PNP0C02") /* PNP Motherboard Resources */)  // _HID: Hardware ID
        Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
        {
            DWordMemory (ResourceProducer, PosDecode, MinNotFixed, MaxNotFixed, NonCacheable, ReadOnly,
                0x00000000,         // Granularity
                0xE0000000,         // Range Minimum
                0xEFFFFFFF,         // Range Maximum
                0x00000000,         // Translation Offset
                0x10000000,         // Length
                ,, , AddressRangeMemory, TypeStatic)
        })
    }

    Device (COM1)
    {
        Name (_HID, EisaId ("PNP0501") /* 16550A-compatible COM Serial Port */)  // _HID: Hardware ID
        Name (_UID, Zero)  // _UID: Unique ID
        Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
        {
            IO (Decode16,
                0x03F8,             // Range Minimum
                0x03F8,             // Range Maximum
                0x01,               // Alignment
                0x08,               // Length
                )
            IRQNoFlags ()
                {4}
        })
    }

    Device (COM2)
    {
        Name (_HID, EisaId ("PNP0501") /* 16550A-compatible COM Serial Port */)  // _HID: Hardware ID
        Name (_UID, One)  // _UID: Unique ID
        Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
        {
            IO (Decode16,
                0x02F8,             // Range Minimum
                0x02F8,             // Range Maximum
                0x01,               // Alignment
                0x08,               // Length
                )
            IRQNoFlags ()
                {3}
        })
    }

    Device (COM3)
    {
        Name (_HID, EisaId ("PNP0501") /* 16550A-compatible COM Serial Port */)  // _HID: Hardware ID
        Name (_UID, 0x02)  // _UID: Unique ID
        Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
        {
            IO (Decode16,
                0x03E8,             // Range Minimum
                0x03E8,             // Range Maximum
                0x01,               // Alignment
                0x08,               // Length
                )
            IRQNoFlags ()
                {4}
        })
    }

    Device (COM4)
    {
        Name (_HID, EisaId ("PNP0501") /* 16550A-compatible COM Serial Port */)  // _HID: Hardware ID
        Name (_UID, 0x03)  // _UID: Unique ID
        Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
        {
            IO (Decode16,
                0x02E8,             // Range Minimum
                0x02E8,             // Range Maximum
                0x01,               // Alignment
                0x08,               // Length
                )
            IRQNoFlags ()
                {3}
        })
    }

    Device (KBD)
    {
        Name (_HID, EisaId ("PNP0303") /* IBM Enhanced Keyboard (101/102-key, PS/2 Mouse) */)  // _HID: Hardware ID
        Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
        {
            IO (Decode16,
                0x0060,             // Range Minimum
                0x0060,             // Range Maximum
                0x01,               // Alignment
                0x01,               // Length
                )
            IO (Decode16,
                0x0064,             // Range Minimum
                0x0064,             // Range Maximum
                0x01,               // Alignment
                0x01,               // Length
                )
            IRQNoFlags ()
                {1}
        })
    }

    Device (PEVT)
    {
        Name (_HID, "QEMU0001")  // _HID: Hardware ID
        Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
        {
            IO (Decode16,
                0x0505,             // Range Minimum
                0x0505,             // Range Maximum
                0x01,               // Alignment
                0x01,               // Length
                )
        })
        Name (_STA, 0x0F)  // _STA: Status
    }
}

}

================================================================
TABLE: FACP
SRC: /sys/firmware/acpi/tables/FACP
READ: OK
BYTES: 276
SHA256: ee6d002f9e95946a9a1290b74663e8a93eff52367ac73786cc9da6caa29c9a3d

DECOMPILE: OK (normalized ASL follows)
---- ASL (normalized) ----

[000h 0000 004h] Signature : "FACP" [Fixed ACPI Description Table (FADT)]
[004h 0004 004h] Table Length : 00000114
[008h 0008 001h] Revision : 06
[009h 0009 001h] Checksum : 90
[00Ah 0010 006h] Oem ID : "OXIDE"
[010h 0016 008h] Oem Table ID : "PROPOLIS"
[018h 0024 004h] Oem Revision : 00000001
[01Ch 0028 004h] Asl Compiler ID : "OXDE"
[020h 0032 004h] Asl Compiler Revision : 00000001

[024h 0036 004h] FACS Address : BFBFC000
[028h 0040 004h] DSDT Address : BFB7C000
[02Ch 0044 001h] Model : 00
[02Dh 0045 001h] PM Profile : 00 [Unspecified]
[02Eh 0046 002h] SCI Interrupt : 0009
[030h 0048 004h] SMI Command Port : 00000000
[034h 0052 001h] ACPI Enable Value : 00
[035h 0053 001h] ACPI Disable Value : 00
[036h 0054 001h] S4BIOS Command : 00
[037h 0055 001h] P-State Control : 00
[038h 0056 004h] PM1A Event Block Address : 0000B000
[03Ch 0060 004h] PM1B Event Block Address : 00000000
[040h 0064 004h] PM1A Control Block Address : 0000B004
[044h 0068 004h] PM1B Control Block Address : 00000000
[048h 0072 004h] PM2 Control Block Address : 00000000
[04Ch 0076 004h] PM Timer Block Address : 0000B008
[050h 0080 004h] GPE0 Block Address : 00000000
[054h 0084 004h] GPE1 Block Address : 00000000
[058h 0088 001h] PM1 Event Block Length : 04
[059h 0089 001h] PM1 Control Block Length : 02
[05Ah 0090 001h] PM2 Control Block Length : 00
[05Bh 0091 001h] PM Timer Block Length : 04
[05Ch 0092 001h] GPE0 Block Length : 00
[05Dh 0093 001h] GPE1 Block Length : 00
[05Eh 0094 001h] GPE1 Base Offset : 00
[05Fh 0095 001h] _CST Support : 00
[060h 0096 002h] C2 Latency : 0000
[062h 0098 002h] C3 Latency : 0000
[064h 0100 002h] CPU Cache Size : 0000
[066h 0102 002h] Cache Flush Stride : 0000
[068h 0104 001h] Duty Cycle Offset : 00
[069h 0105 001h] Duty Cycle Width : 00
[06Ah 0106 001h] RTC Day Alarm Index : 00
[06Bh 0107 001h] RTC Month Alarm Index : 00
[06Ch 0108 001h] RTC Century Index : 00
[06Dh 0109 002h] Boot Flags (decoded below) : 0003
Legacy Devices Supported (V2) : 1
8042 Present on ports 60/64 (V2) : 1
VGA Not Present (V4) : 0
MSI Not Supported (V4) : 0
PCIe ASPM Not Supported (V4) : 0
CMOS RTC Not Present (V5) : 0
[06Fh 0111 001h] Reserved : 00
[070h 0112 004h] Flags (decoded below) : 00080525
WBINVD instruction is operational (V1) : 1
WBINVD flushes all caches (V1) : 0
All CPUs support C1 (V1) : 1
C2 works on MP system (V1) : 0
Control Method Power Button (V1) : 0
Control Method Sleep Button (V1) : 1
RTC wake not in fixed reg space (V1) : 0
RTC can wake system from S4 (V1) : 0
32-bit PM Timer (V1) : 1
Docking Supported (V1) : 0
Reset Register Supported (V2) : 1
Sealed Case (V3) : 0
Headless - No Video (V3) : 0
Use native instr after SLP_TYPx (V3) : 0
PCIEXP_WAK Bits Supported (V4) : 0
Use Platform Timer (V4) : 0
RTC_STS valid on S4 wake (V4) : 0
Remote Power-on capable (V4) : 0
Use APIC Cluster Model (V4) : 0
Use APIC Physical Destination Mode (V4) : 1
Hardware Reduced (V5) : 0
Low Power S0 Idle (V5) : 0

[074h 0116 00Ch] Reset Register : [Generic Address Structure]
[074h 0116 001h] Space ID : 01 [SystemIO]
[075h 0117 001h] Bit Width : 08
[076h 0118 001h] Bit Offset : 00
[077h 0119 001h] Encoded Access Width : 01 [Byte Access:8]
[078h 0120 008h] Address : 0000000000000CF9

[080h 0128 001h] Value to cause reset : 06
[081h 0129 002h] ARM Flags (decoded below) : 0000
PSCI Compliant : 0
Must use HVC for PSCI : 0

[083h 0131 001h] FADT Minor Revision : 05
[084h 0132 008h] FACS Address : 0000000000000000
[08Ch 0140 008h] DSDT Address : 00000000BFB7C000
[094h 0148 00Ch] PM1A Event Block : [Generic Address Structure]
[094h 0148 001h] Space ID : 01 [SystemIO]
[095h 0149 001h] Bit Width : 20
[096h 0150 001h] Bit Offset : 00
[097h 0151 001h] Encoded Access Width : 03 [DWord Access:32]
[098h 0152 008h] Address : 000000000000B000

[0A0h 0160 00Ch] PM1B Event Block : [Generic Address Structure]
[0A0h 0160 001h] Space ID : 00 [SystemMemory]
[0A1h 0161 001h] Bit Width : 00
[0A2h 0162 001h] Bit Offset : 00
[0A3h 0163 001h] Encoded Access Width : 00 [Undefined/Legacy]
[0A4h 0164 008h] Address : 0000000000000000

[0ACh 0172 00Ch] PM1A Control Block : [Generic Address Structure]
[0ACh 0172 001h] Space ID : 01 [SystemIO]
[0ADh 0173 001h] Bit Width : 10
[0AEh 0174 001h] Bit Offset : 00
[0AFh 0175 001h] Encoded Access Width : 02 [Word Access:16]
[0B0h 0176 008h] Address : 000000000000B004

[0B8h 0184 00Ch] PM1B Control Block : [Generic Address Structure]
[0B8h 0184 001h] Space ID : 00 [SystemMemory]
[0B9h 0185 001h] Bit Width : 00
[0BAh 0186 001h] Bit Offset : 00
[0BBh 0187 001h] Encoded Access Width : 00 [Undefined/Legacy]
[0BCh 0188 008h] Address : 0000000000000000

[0C4h 0196 00Ch] PM2 Control Block : [Generic Address Structure]
[0C4h 0196 001h] Space ID : 00 [SystemMemory]
[0C5h 0197 001h] Bit Width : 00
[0C6h 0198 001h] Bit Offset : 00
[0C7h 0199 001h] Encoded Access Width : 00 [Undefined/Legacy]
[0C8h 0200 008h] Address : 0000000000000000

[0D0h 0208 00Ch] PM Timer Block : [Generic Address Structure]
[0D0h 0208 001h] Space ID : 01 [SystemIO]
[0D1h 0209 001h] Bit Width : 20
[0D2h 0210 001h] Bit Offset : 00
[0D3h 0211 001h] Encoded Access Width : 03 [DWord Access:32]
[0D4h 0212 008h] Address : 000000000000B008

[0DCh 0220 00Ch] GPE0 Block : [Generic Address Structure]
[0DCh 0220 001h] Space ID : 00 [SystemMemory]
[0DDh 0221 001h] Bit Width : 00
[0DEh 0222 001h] Bit Offset : 00
[0DFh 0223 001h] Encoded Access Width : 00 [Undefined/Legacy]
[0E0h 0224 008h] Address : 0000000000000000

[0E8h 0232 00Ch] GPE1 Block : [Generic Address Structure]
[0E8h 0232 001h] Space ID : 00 [SystemMemory]
[0E9h 0233 001h] Bit Width : 00
[0EAh 0234 001h] Bit Offset : 00
[0EBh 0235 001h] Encoded Access Width : 00 [Undefined/Legacy]
[0ECh 0236 008h] Address : 0000000000000000

[0F4h 0244 00Ch] Sleep Control Register : [Generic Address Structure]
[0F4h 0244 001h] Space ID : 00 [SystemMemory]
[0F5h 0245 001h] Bit Width : 00
[0F6h 0246 001h] Bit Offset : 00
[0F7h 0247 001h] Encoded Access Width : 00 [Undefined/Legacy]
[0F8h 0248 008h] Address : 0000000000000000

[100h 0256 00Ch] Sleep Status Register : [Generic Address Structure]
[100h 0256 001h] Space ID : 00 [SystemMemory]
[101h 0257 001h] Bit Width : 00
[102h 0258 001h] Bit Offset : 00
[103h 0259 001h] Encoded Access Width : 00 [Undefined/Legacy]
[104h 0260 008h] Address : 0000000000000000

[10Ch 0268 008h] Hypervisor ID : 000000454449584F

Raw Table Data: Length 276 (0x114)

0000: 46 41 43 50 14 01 00 00 06 90 4F 58 49 44 45 00  // FACP......OXIDE.
0010: 50 52 4F 50 4F 4C 49 53 01 00 00 00 4F 58 44 45  // PROPOLIS....OXDE
0020: 01 00 00 00 00 C0 BF BF 00 C0 B7 BF 00 00 09 00  // ................
0030: 00 00 00 00 00 00 00 00 00 B0 00 00 00 00 00 00  // ................
0040: 04 B0 00 00 00 00 00 00 00 00 00 00 08 B0 00 00  // ................
0050: 00 00 00 00 00 00 00 00 04 02 00 04 00 00 00 00  // ................
0060: 00 00 00 00 00 00 00 00 00 00 00 00 00 03 00 00  // ................
0070: 25 05 08 00 01 08 00 01 F9 0C 00 00 00 00 00 00  // %...............
0080: 06 00 00 05 00 00 00 00 00 00 00 00 00 C0 B7 BF  // ................
0090: 00 00 00 00 01 20 00 03 00 B0 00 00 00 00 00 00  // ..... ..........
00A0: 00 00 00 00 00 00 00 00 00 00 00 00 01 10 00 02  // ................
00B0: 04 B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00  // ................
00C0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  // ................
00D0: 01 20 00 03 08 B0 00 00 00 00 00 00 00 00 00 00  // . ..............
00E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  // ................
00F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  // ................
0100: 00 00 00 00 00 00 00 00 00 00 00 00 4F 58 49 44  // ............OXID
0110: 45 00 00 00                                      // E...

================================================================
TABLE: FACS
SRC: /sys/firmware/acpi/tables/FACS
READ: OK
BYTES: 64
SHA256: 8a2f3c6d08a637005f7be37885075749128a34fb49e941a47c82848fcd15fdda

DECOMPILE: OK (normalized ASL follows)
---- ASL (normalized) ----

[000h 0000 004h] Signature : "FACS"
[004h 0004 004h] Length : 00000040
[008h 0008 004h] Hardware Signature : 00000000
[00Ch 0012 004h] 32 Firmware Waking Vector : 00000000
[010h 0016 004h] Global Lock : 00000000
[014h 0020 004h] Flags (decoded below) : 00000000
S4BIOS Support Present : 0
64-bit Wake Supported (V2) : 0
[018h 0024 008h] 64 Firmware Waking Vector : 0000000000000000
[020h 0032 001h] Version : 02
[021h 0033 003h] Reserved : 000000
[024h 0036 004h] OspmFlags (decoded below) : 00000000
64-bit Wake Env Required (V2) : 0

Raw Table Data: Length 64 (0x40)

0000: 46 41 43 53 40 00 00 00 00 00 00 00 00 00 00 00  // FACS@...........
0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  // ................
0020: 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  // ................
0030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  // ................

================================================================
TABLE: HPET
SRC: /sys/firmware/acpi/tables/HPET
READ: OK
BYTES: 56
SHA256: 8cfeba212a9d4efea534a5d8b12ad4b25e2129d2db54ca56590af22c6c90037c

DECOMPILE: OK (normalized ASL follows)
---- ASL (normalized) ----

[000h 0000 004h] Signature : "HPET" [High Precision Event Timer Table]
[004h 0004 004h] Table Length : 00000038
[008h 0008 001h] Revision : 01
[009h 0009 001h] Checksum : 96
[00Ah 0010 006h] Oem ID : "OXIDE"
[010h 0016 008h] Oem Table ID : "PROPOLIS"
[018h 0024 004h] Oem Revision : 00000001
[01Ch 0028 004h] Asl Compiler ID : "OXDE"
[020h 0032 004h] Asl Compiler Revision : 00000001

[024h 0036 004h] Hardware Block ID : 80860701

[028h 0040 00Ch] Timer Block Register : [Generic Address Structure]
[028h 0040 001h] Space ID : 00 [SystemMemory]
[029h 0041 001h] Bit Width : 00
[02Ah 0042 001h] Bit Offset : 00
[02Bh 0043 001h] Encoded Access Width : 00 [Undefined/Legacy]
[02Ch 0044 008h] Address : 00000000FED00000

[034h 0052 001h] Sequence Number : 00
[035h 0053 002h] Minimum Clock Ticks : 0000
[037h 0055 001h] Flags (decoded below) : 01
4K Page Protect : 1
64K Page Protect : 0

Raw Table Data: Length 56 (0x38)

0000: 48 50 45 54 38 00 00 00 01 96 4F 58 49 44 45 00  // HPET8.....OXIDE.
0010: 50 52 4F 50 4F 4C 49 53 01 00 00 00 4F 58 44 45  // PROPOLIS....OXDE
0020: 01 00 00 00 01 07 86 80 00 00 00 00 00 00 D0 FE  // ................
0030: 00 00 00 00 00 00 00 01                          // ........

================================================================
TABLE: MCFG
SRC: /sys/firmware/acpi/tables/MCFG
READ: OK
BYTES: 60
SHA256: 9cfbdf24e38ea501f1b557d021de9ee6c1f0f5e187e4ec4d07b1b9100037862a

DECOMPILE: OK (normalized ASL follows)
---- ASL (normalized) ----

[000h 0000 004h] Signature : "MCFG" [Memory Mapped Configuration Table]
[004h 0004 004h] Table Length : 0000003C
[008h 0008 001h] Revision : 01
[009h 0009 001h] Checksum : A4
[00Ah 0010 006h] Oem ID : "OXIDE"
[010h 0016 008h] Oem Table ID : "PROPOLIS"
[018h 0024 004h] Oem Revision : 00000001
[01Ch 0028 004h] Asl Compiler ID : "OXDE"
[020h 0032 004h] Asl Compiler Revision : 00000001

[024h 0036 008h] Reserved : 0000000000000000

[02Ch 0044 008h] Base Address : 00000000E0000000
[034h 0052 002h] Segment Group Number : 0000
[036h 0054 001h] Start Bus Number : 00
[037h 0055 001h] End Bus Number : FF
[038h 0056 004h] Reserved : 00000000

Raw Table Data: Length 60 (0x3C)

0000: 4D 43 46 47 3C 00 00 00 01 A4 4F 58 49 44 45 00  // MCFG<.....OXIDE.
0010: 50 52 4F 50 4F 4C 49 53 01 00 00 00 4F 58 44 45  // PROPOLIS....OXDE
0020: 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 E0  // ................
0030: 00 00 00 00 00 00 00 FF 00 00 00 00              // ............

</details>

 # TODO:
- [x] Test windows
- [x] Dump old and new tables
- [ ] Test *bsd/illumos

@glitzflitz glitzflitz marked this pull request as ready for review December 31, 2025 04:33
@glitzflitz glitzflitz marked this pull request as draft December 31, 2025 04:54
@glitzflitz glitzflitz force-pushed the acpi_fwcfg_reord branch 9 times, most recently from 5fed974 to b234998 Compare January 4, 2026 11:04
Add a TableLoader builder that can be used to generate the
etc/table-loader file to be passed to guest firmware via fw_cfg.

The etc/table-loader file in fw_cfg contains the sequence of fixed size
linker/loader commands that can be used to instruct guest to allcoate
memory for set of fw_cfg files(e.g. ACPI tables), link allocated memory
by patching pointers and calculate the ACPI checksum.

Signed-off-by: Amey Narkhede <[email protected]>
@pfmooney
Copy link
Contributor

pfmooney commented Jan 4, 2026

Thanks for taking a swing at this. It'll be nice to have ACPI table generation wired up.

Some initial high-level feedback, which you can take with as much salt as you want, since I'm ex-Oxide now:

You're defining quite a few ACPI-specific structs in fwcfg.rs. I would probably move those into firmware/acpi, keeping only the table-loader specific bits in fwcfg.

When it comes to DSDT generation, I think this is probably something we'll want to farm out to the various piece of specific device emulation? They could own the specific knowledge required, rather than defining all those constants in acpi/dsdt.rs. Maybe think about a trait they could opt into for appending bits to a DSDT we build while assembling the machine?

@glitzflitz
Copy link
Author

That makes sense. I'll create a trait for Dsdt and implment for each device that is being exposed.

Add builders to generate basic ACPI tables
RSDP(ACPI 2.0+) that points to XSDT, XSDT with 64-bit table pointers and
RSDT with 32-bit table pointers that would work with the table-loader
mechanism in fw_cfg.

These tables are used to describe the ACPI table hierarchy to guest
firmware. The builders produce raw table data bytes with placeholder
addresses and checksums that are fixed up by firmware using table-loader
commands.

Signed-off-by: Amey Narkhede <[email protected]>
FADT describes fixed hardware features and points to the DSDT. The
builder supports both standard and HW-reduced ACPI modes.

DSDT contains AML bytecode describing system hardware. The builder
provides methods to append AML data which could be populated by an
AML generation mechanism in subsequent commits.

Signed-off-by: Amey Narkhede <[email protected]>
Add a builder for the Multiple APIC Description Table (MADT) that
describes the system's interrupt controllers.

Supports adding local APIC, I/O APIC and interrupt source overrides for
describing processor and interrupt controller topology.

Signed-off-by: Amey Narkhede <[email protected]>
Add builders for MCFG and HPET ACPI tables.

MCFG describes the PCIe ECAM base address, PCIe segment group and bus
number range for firmware to locate PCI Express configuration space.

HPET describes the HPET hardware to the guest. The table uses the bhyve
HPET hardware ID (0x80860701) and maps to the standard HPET MMIO address
at 0xfed00000.

Signed-off-by: Amey Narkhede <[email protected]>
Add the FACS table that provides a memory region for firmware/OS
handshaking. The table includes the GlobalLock field for OS/firmware
mutual exclusion during ACPI operations. We don't yet have support for
GBL_EN handling[1], but expose the table to match OVMF's behaviour.

[1]: oxidecomputer#837

Signed-off-by: Amey Narkhede <[email protected]>
Define bytecode opcodes for AML generation per ACPI Specification
Chapter 20 [1]. Includes namespace modifiers, named objects, data object
prefixes, name path prefixes, local/argument references, control flow
and logical/arithmetic operators.

These constants will be used in subsequent commits to generate AML
bytecode which would enable us to generate ACPI tables ourselves.

[1]: https://uefi.org/specs/ACPI/6.5/20_AML_Specification.html

Signed-off-by: Amey Narkhede <[email protected]>
Implement NameSeg and NameString encoding per ACPI Specification Section
20.2.2 [1]. Single segments encode as 4 bytes padded with underscores,
dual segments use DualNamePrefix and three or more use MultiNamePrefix
with a count byte.
Also implement EISA ID compression for hardware identification strings
like "PNP0A08".

[1]: https://uefi.org/specs/ACPI/6.4_A/20_AML_Specification.html#name-objects-encoding

Signed-off-by: Amey Narkhede <[email protected]>
Add AML bytecode generation to mainly support dynamically generating
ACPI tables and control methods.
The bytecode is built in a single pass by directly writing to the
output buffer. AML scopes encode their length in a 1-4 byte PkgLength
field at the start[1]. Since we don't know the final size until the scope's
content is fully written, reserve 4 bytes when opening a scope upfront
and splice in the actual encoded length when the scope closes.
This avoids complexity of having to build an in memory tree and then
walk it twice to measure and serialize.

The RAII guards automatically close scopes and finalize the PkgLength on
drop. Those guards hold a mutable borrow on the builder so the borrow checker
won't let us close a parent while a child scope is still open. The
limitation of this approach is that the content has to be written in
output order but that is not a big issue for the use case of VM device
descriptions.

[1]: ACPI Specification Section 20.2.4
 https://uefi.org/specs/ACPI/6.4_A/20_AML_Specification.html#package-length-encoding

Signed-off-by: Amey Narkhede <[email protected]>
Implement ResourceTemplateBuilder for constructing resource descriptors
used in methods like _CRS. Supports QWord/DWord memory and I/O ranges, Word
bus numbers and IRQ descriptors per ACPI Specification Section 6.4 [1].

[1]: https://uefi.org/specs/ACPI/6.4_A/06_Device_Configuration.html#resource-data-types-for-acpi

Signed-off-by: Amey Narkhede <[email protected]>
Signed-off-by: glitzflitz <[email protected]>
Export public API for AML generation AmlBuilder, AmlWriter trait, guard
types (ScopeGuard, DeviceGuard, MethodGuard), EisaId and
ResourceTemplateBuilder.
This would enable generating the dynamic bytecode used in tables like
DSDT.

Signed-off-by: Amey Narkhede <[email protected]>
Add DSDT generation that provides the guest OS with device information
via AML. The DSDT contains _SB.PCI0 describing the PCIe host bridge
with bus number and MMIO resources.
The ECAM is reserved via a separate PNP0C02 motherboard resources device
(_SB.MRES) rather than in the PCI host bridge's _CRS. This is required
by PCI Firmware Spec 3.2, sec 4.1.2.

Also add the DsdtGenerator trait that will be implemented by each device
in DSDT to expose its ACPI description.

Signed-off-by: Amey Narkhede <[email protected]>
Since we can generation our own ACPI tables, implement DsdtGenerator
trait for serial console device to expose it in generated DSDT.

Signed-off-by: Amey Narkhede <[email protected]>
Add AT keyboard controller resources to allow guest to enumerate the
i8042 controller. Only keyboard is added to match the OVMF's existing
behaviour for now.

Signed-off-by: Amey Narkhede <[email protected]>
Implement DsdtGenerator for QemuPvPanic to export it via new DSDT.

Signed-off-by: Amey Narkhede <[email protected]>
The OS calls _OSC on the PCIe host bridge to negotiate control of native
PCIe features like hotplug, AER and PME. Without _OSC, Linux logs
warning about missing capability negotiation(_OSC: platform retains
control of PCIe features (AE_NOT_FOUND).
Since as of now we don't have support for any PCIe handling, no
capabilities are exposed. In future when PCIe handling is implemented
the supported bits can be simply unmasked to expose them to the guest.

Also to simplify the aml generation of _OSC itself introduce some high
level wrappers around aml generation.

[1]: https://learn.microsoft.com/en-us/windows-hardware/drivers/pci/enabling-pci-express-native-control

Signed-off-by: Amey Narkhede <[email protected]>
Combine all ACPI tables into the format expected by firmware(OVMF) by
using fw_cfg's table-loader commands for address patching and checksum
computation.

Signed-off-by: Amey Narkhede <[email protected]>
@glitzflitz
Copy link
Author

glitzflitz commented Jan 5, 2026

I pushed the new changes to move table structs out of fwcfg.rs to firmware/acpi/tables.rs and also added new DsstGenerator trait that devices can implement to generate their own ACPI description(More details in DsdtGenerator Trait section above).

@glitzflitz
Copy link
Author

glitzflitz commented Jan 5, 2026

Oops I missed the case of base -> new -> base
https://github.com/oxidecomputer/propolis/pull/999/checks?check_run_id=59499310585

Currently we have VmConfig.native_acpi_tables: bool. I need to make it Option<bool>.

The "unset" state is being lost once a VM touches new propolis in this scenario

  • PHD sends spec without native_acpi_tables
  • Old Propolis doesn't know this field so ignores it and creates the VM
  • Migrate to new Propolis
  • New Propolis sees missing field so deserializes as None
  • Builder converts None to plain bool false
  • Migrate back to old Propolis
  • New Propolis exports its internal false as Some(false) in API spec
  • Some(false) serializes to native_acpi_tables: false
  • Thats why old Propolis sees unknown field native_acpi_tables

Integrate the new ACPI table generation into propolis-standalone and
propolis-server. Also replace hardcoded memory region addresses with
constants that align with ACPI table definitions.

The PCIe ECAM base is kept same as before at 0xe000_0000 (3.5GB) to
match existing i440fx chipset ECAM placement. ECAM is no longer added
to the E820 map as reserved memory since it is MMIO space properly
described in the MCFG ACPI table.

Guest physical memory map:
0x0000_0000 - 0xbfff_ffff    Low RAM (up to 3 GiB)
0xc000_0000 - 0xffff_ffff    PCI hole (1 GiB MMIO region)
  0xc000_0000 - 0xdfff_ffff    32-bit PCI MMIO
  0xe000_0000 - 0xefff_ffff    PCIe ECAM (256 MiB, 256 buses)
  0xfec0_0000                  IOAPIC
  0xfed0_0000                  HPET
  0xffe0_0000 - 0xffff_ffff    Bootrom (2 MiB)
0x1_0000_0000+               High RAM + 64-bit PCI MMIO

e820 map as seen by guest:
0x0000_0000 - 0x0009_ffff    Usable (640 KiB low memory)
0x0010_0000 - 0xbeaf_ffff    Usable (~3 GiB main RAM)
0xbeb0_0000 - 0xbfb6_cfff    Reserved (UEFI runtime/data)
0xbfb6_d000 - 0xbfbf_efff    ACPI Tables + NVS
0xbfbf_f000 - 0xbffd_ffff    Usable (top of low memory)
0xbffe_0000 - 0xffff_ffff    Reserved (PCI hole)
0x1_0000_0000 - highmem      Usable (high RAM above 4 GiB)

To stay on safe side only enable using new ACPI tables for newly
launched VMs. Old VMs using OVMF tables would keep using the same OVMF
tables throughout multiple migrations.  To verify this add the phd test
as well for new VM launched with native tables, native tables preserved
through migration and VM launched from old propolis without native
tables stays with OVMF through multiple future migrations.

Signed-off-by: Amey Narkhede <[email protected]>
Signed-off-by: glitzflitz <[email protected]>
@glitzflitz glitzflitz marked this pull request as ready for review January 6, 2026 01:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants