Skip to content

Enable propolis to generate ACPI tables#999

Open
glitzflitz wants to merge 28 commits intooxidecomputer:masterfrom
glitzflitz:acpi_fwcfg_reord
Open

Enable propolis to generate ACPI tables#999
glitzflitz wants to merge 28 commits intooxidecomputer:masterfrom
glitzflitz:acpi_fwcfg_reord

Conversation

@glitzflitz
Copy link
Copy Markdown

@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.

The AML bytecode for the tables are generated using the acpi_tables crate. To reduce the scope of changes introduced in this PR, the generated tables are as written as close as possible to the original OVMF tables. The only differences are:

  • Compiler ID and Revision values as defined by acpi_tables. This should have no functional difference and can help us determine if an instance is using the original OVMF tables or the new ones generated by Propolis.
  • FACS version 1. The generated tables used version 0, but the only difference between the two are the addition of the version field itseld and X_Firmware_Waking_Vector, which is kept unset.

The acpi_tables crate is currently missing some functionalities needed to build the tables, and so we're currently using a fork. Where possible, the changes will be upstreamed and we'll hopefully be able to stop using the fork.

In order to minimize changes to the DSDT table, the FWDT mechanism for passing data from the guest to the firmware had to ported to Propolis as well. The original OVMF tables use an ACPI Method to determine the 32-bit and 64-bit MMIO windows for the PCI bridge. The window ranges are read from an OperationRegion defined in an SSDT table.

The process to determine the actual values to set in FWDT is a little more obscure. After laying out the memory space map, OVMF iterates over it and extracts the values for the 32-bit MMIO window as going from the end of the instance lowmemory region to the last MMIO region above PcdOvmfFdBaseAddress.

PcdOvmfFdBaseAddress is set as FW_BASE_ADDRESS, and its value depends on FD_SIZE_IN_KB, the firmware flash size. I haven't seen this value being modified anywhere, so I believe Propolis uses the default value of 4096, meaning that PcdOvmfFdBaseAddress is defined as 0xFFC00000.

And so the end address of the PCI 32-bit MMIO window set in FWDT is the highest MMIO address in the memory map lower than 0xFFC00000. Enabling the OVMF DEBUG_GCD flag, we can retrieve the final memory map for a 2GB VM:

GCDMemType Range                             Capabilities     Attributes
========== ================================= ================ ================
SystemMem  0000000000000000-000000000009FFFF 800000000002600F 0000000000000008*
MMIO       00000000000A0000-00000000000FFFFF C700000000026001 0000000000000001
SystemMem  0000000000100000-000000007EDFFFFF 800000000002600F 0000000000000008*
SystemMem  000000007EE00000-000000007EFFFFFF 800000000002600F 0000000000020008*
SystemMem  000000007F000000-000000007FADEFFF 800000000002600F 0000000000000008*
SystemMem  000000007FADF000-000000007FADFFFF 800000000002600F 0000000000004008*
SystemMem  000000007FAE0000-000000007FAE4FFF 800000000002600F 0000000000020008*
SystemMem  000000007FAE5000-000000007FAE7FFF 800000000002600F 0000000000004008*
SystemMem  000000007FAE8000-000000007FAECFFF 800000000002600F 0000000000020008*
SystemMem  000000007FAED000-000000007FAEEFFF 800000000002600F 0000000000004008*
SystemMem  000000007FAEF000-000000007FBFFFFF 800000000002600F 0000000000000008*
SystemMem  000000007FC00000-000000007FDFFFFF 800000000002600F 0000000000020008*
SystemMem  000000007FE00000-000000007FFDFFFF 800000000002600F 0000000000000008*
SystemMem  000000007FFE0000-000000007FFEDFFF 800000000002600F 8000000000000008*
SystemMem  000000007FFEE000-000000007FFFFFFF 800000000002600F 0000000000000008*
MMIO       0000000080000000-00000000FBFFFFFF C700000000026001 0000000000000001
NonExist   00000000FC000000-00000000FEBFFFFF 0000000000000000 0000000000000000
MMIO       00000000FEC00000-00000000FEC00FFF C700000000026001 0000000000000001
NonExist   00000000FEC01000-00000000FECFFFFF 0000000000000000 0000000000000000
MMIO       00000000FED00000-00000000FED003FF C700000000000001 0000000000000001
NonExist   00000000FED00400-00000000FEDFFFFF 0000000000000000 0000000000000000
MMIO       00000000FEE00000-00000000FEE00FFF C700000000026001 0000000000000001*
MMIO       00000000FEE01000-00000000FEEFFFFF C700000000026001 0000000000000001
NonExist   00000000FEF00000-00000007FFFFFFFF 0000000000000000 0000000000000000
MMIO       0000000800000000-0000000FFFFFFFFF C000000000000001 0000000000000001

The resulting 32-bit MMIO region set in FWDT for this example is 0x80000000-0xFEF00000.

Another curious aspect of this process is that the 64-bit MMIO region seems to always be set to 0, resulting in the DSDT table never declaring any 64-MMIO region for the PCI root. The commit that introduced the FWDT region values mention that only the 32-bits are populated.

Since the generated tables are functionally identical to the original OVMF ones, they are introduced to Propolis withot any additional opt-[in/out] mechanism.

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 when building the ACPI tables.

One thing to note is that OVMF actually ignores etc/acpi/rsdp and the RSDP and XSDT tables. It opens all three files and processes the commands in etc/acpi/table-loader on top of etc/acpi/tables. But it processes the AddPointer commands one final time and only actually loads the tables have pointers to them, intentionally excluding the RSDP and XSDT tables.

In practice this means that the RSDP and XSDT tables are always generated by OVMF and the etc/acpi/rsdp is never read. This PR does generate these tables for completeness, but any changes to them will not be reflected in the guest when using OVMF.

Note

The next sections discuss the original work for generating the tables and AML bytecode. Since the final approach was modified to follow the suggestions described in #999 (comment), the content no longer reflects the actual changes in this PR, so I ommitted them, but kept them hidden for reference.

Original discussion about AML and table 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 enables device emulators to implement their ACPI descriptions to the DSDT. Devices can expose themselves in the DSDT by implementing the DsdtGenerator and Aml trait and wiring it up through Lifecycle::as_dsdt_generator().

The DsdtGenerator trait has one method:

  • dsdt_scope() - returns SystemBus, PciRoot, or Lpc depending on where the device belongs in the ACPI namespace.

During DSDT construction, the registered generators are invoked within the appropriate scope.

See LpcUart and PS2Ctrl for examples.

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.

This approach should be expanded to other devices, pusing the DSDT table to be built primarily by generators. This would make the DSDT table structure more closely match the Propolis internal representation of these devices. Currently it's not possible to generate the exact same DSDT table as OVMF using the existing code structure. For example, the LPC device is declared inside the PCI0 namespace. In Propolis, this would require the I440FxHostBridge to have a reference to Piix3Lpc. Both structs also lack some of the necessary information to generate the full table.

Note

Another section omitted due to the change in approach.

Original discussion API changes

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.

Note

Propolis currently have limited PCIe support, and actually lack the ACPI constructs necessary to support it. The original PR made some changes to improve things, but these changes were reverted to keep the tables the same.

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

The process to validate that the generated ACPI tables match the original OVMF tables followed these steps:

  • Use acpidump to dump the tables AML byte code.
  • Use iasl to disassamble the tables.
  • Use dmesg to capture the instante boot log (when applicable).
  • Use fwts to run ACPI tests (when applicable).
  • Verifying that /proc/iomem or devinfo -u match the expected memory layout.

These steps were completed in Propolis instances using the followint operating systems:

  • Debian 12
  • Windows Server 2022
  • FreeBSD 15
  • OmniOS r151056

The tables were collected from an instance running unmodified Propolis code and then compared to Propolis built on this PR. To ensure minimal change the results were compared at the binary bytecode level using xxd and wdiff.

The results in indicate minimal changes to the table headers because of the different Compiler ID and revision, which result in changes to the table checksum. The original tables used INTL or OVMF and the generated tables use RVAT. The other change, as mentioned earlier, is the FACS table revision (from 0 to 1).

Tip

Pipe the content below to colordiff --difftype=wdiff for coloured output.

=== ./ssdt.dat ===
00000000: 5353 4454 5700 0000 [-0112-] {+017d+} 5245 4448 4154  [-SSDTW.....REDHAT-]  {+SSDTW....}REDHAT+}
00000010: 4f56 4d46 2020 2020 0100 0000 [-494e 544c-] {+5256 4154+}  OVMF    [-....INTL-]    {+....RVAT+}
00000020: [-2906 1820-] {+0000 0001+} 5b80 4657 4454 000c [-18c0 b67f  ).. [.FWDT......-] {+d6ee bf7f  ....[.FWDT......+}
00000030: 0c30 0000 0008 5c5f 5333 5f12 0a04 0a01  .0....\_S3_.....
00000040: 0a00 0a00 0a00 085c 5f53 345f 120a 040a  .......\_S4_....
00000050: 020a 000a 000a 00                        .......
=== ./apic.dat ===
00000000: 4150 4943 8000 0000 [-0103-] {+0196+} 4f56 4d46 2020  APIC......OVMF  
00000010: 4f56 4d46 4544 4b32 2102 1320 [-4f56 4d46-] {+5256 4154+}  OVMFEDK2!.. [-OVMF-] {+RVAT+}
00000020: [-9900-] 0000 {+0001+} 0000 e0fe 0100 0000 0008 0000  ................
00000030: 0100 0000 0008 0101 0100 0000 010c 0200  ................
00000040: 0000 c0fe 0000 0000 020a 0000 0200 0000  ................
00000050: 0000 020a 0005 0500 0000 0d00 020a 0009  ................
00000060: 0900 0000 0d00 020a 000a 0a00 0000 0d00  ................
00000070: 020a 000b 0b00 0000 0d00 0406 ff00 0001  ................
=== ./facs.dat ===
00000000: 4641 4353 4000 0000 0000 0000 0000 0000  FACS@...........
00000010: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000020: {+0100+} 0000 0000 0000 0000 0000 0000 0000 [-0000-]  ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000  ................
=== ./facp.dat ===
00000000: 4641 4350 f400 0000 [-03c5-] {+0338+} 4f56 4d46 2020  [-FACP......OVMF-]  {+FACP.....8OVMF+}  
00000010: 4f56 4d46 4544 4b32 2102 1320 [-4f56 4d46-] {+5256 4154+}  OVMFEDK2!.. [-OVMF-] {+RVAT+}
00000020: [-9900-] 0000 [-00e0-] {+0001 00c0+} bf7f [-00a0-] {+00c0+} b77f 0000 0900  ................
00000030: b200 0000 f1f0 0000 00b0 0000 0000 0000  ................
00000040: 04b0 0000 0000 0000 0000 0000 08b0 0000  ................
00000050: e0af 0000 0000 0000 0402 0004 0400 0000  ................
00000060: 6500 e903 0000 0000 0000 0000 0000 0000  e...............
00000070: a505 0000 0108 0000 f90c 0000 0000 0000  ................
00000080: 0600 0000 0000 0000 0000 0000 [-00a0-] {+00c0+} b77f  ................
00000090: 0000 0000 0120 0000 00b0 0000 0000 0000  ..... ..........
000000a0: 0000 0000 0000 0000 0000 0000 0110 0000  ................
000000b0: 04b0 0000 0000 0000 0000 0000 0000 0000  ................
000000c0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000000d0: 0120 0000 08b0 0000 0000 0000 0120 0000  . ........... ..
000000e0: e0af 0000 0000 0000 0000 0000 0000 0000  ................
000000f0: 0000 0000                                ....
=== ./dsdt.dat ===
00000000: 4453 4454 220d 0000 [-016a-] {+01ca+} 494e 5445 4c20  [-DSDT"....jINTEL-]  {+DSDT".....INTEL+} 
00000010: 4f56 4d46 2020 2020 0400 0000 [-494e 544c-] {+5256 4154+}  OVMF    [-....INTL-]    {+....RVAT+}
00000020: [-2906 1820-] {+0000 0001+} a018 0015 5c2f 045f 5342 5f50  [-).. ....\/._SB_P-]  {+........\/._SB_P+}
00000030: 4349 305f 4352 5346 5744 540a 0008 5f53  CI0_CRSFWDT..._S
00000040: 305f 1207 040a 0500 0000 085f 5335 5f12  0_........._S5_.
00000050: 0604 0000 0000 104b cc5f 5342 5f5b 8243  .......K._SB_[.C
00000060: cc50 4349 3008 5f48 4944 0c41 d00a 0308  .PCI0._HID.A....
00000070: 5f41 4452 0008 5f42 424e 0008 5f55 4944  _ADR.._BBN.._UID
00000080: 0008 4352 4553 1142 070a 6e88 0d00 020c  ..CRES.B..n.....
00000090: 0000 0000 00ff 0000 0000 0147 01f8 0cf8  ...........G....
000000a0: 0c01 0888 0d00 010c 0300 0000 00f7 0c00  ................
000000b0: 00f8 0c88 0d00 010c 0300 0000 0dff ff00  ................
000000c0: 0000 f387 1700 000c 0300 0000 0000 000a  ................
000000d0: 00ff ff0b 0000 0000 0000 0002 0087 1700  ................
000000e0: 000c 0100 0000 0000 0000 f8ff fffb ff00  ................
000000f0: 0000 0000 00fc 0779 0008 4352 3634 1133  .......y..CR64.3
00000100: 0a30 8a2b 0000 0c03 0000 0000 0000 0000  .0.+............
00000110: 0000 0000 8000 0000 ffff ffff ff0f 0000  ................
00000120: 0000 0000 0000 0000 0000 0000 800f 0000  ................
00000130: 7900 1443 115f 4352 5308 5b81 2a46 5744  y..C._CRS.[.*FWD
00000140: 5404 5030 535f 4004 5030 455f 4004 5030  T.P0S_@.P0E_@.P0
00000150: 4c5f 4004 5031 535f 4004 5031 455f 4004  L_@.P1S_@.P1E_@.
00000160: 5031 4c5f 4004 5b81 4304 4657 4454 0350  P1L_@.[.C.FWDT.P
00000170: 3053 4c20 5030 5348 2050 3045 4c20 5030  0SL P0SH P0EL P0
00000180: 4548 2050 304c 4c20 5030 4c48 2050 3153  EH P0LL P0LH P1S
00000190: 4c20 5031 5348 2050 3145 4c20 5031 4548  L P1SH P1EL P1EH
000001a0: 2050 314c 4c20 5031 4c48 208a 4352 4553   P1LL P1LH .CRES
000001b0: 0a5c 5053 3332 8a43 5245 530a 6050 4533  .\PS32.CRES.`PE3
000001c0: 328a 4352 4553 0a68 504c 3332 7050 3053  2.CRES.hPL32pP0S
000001d0: 4c50 5333 3270 5030 454c 5045 3332 7050  LPS32pP0ELPE32pP
000001e0: 304c 4c50 4c33 32a0 1390 9350 3153 4c00  0LLPL32....P1SL.
000001f0: 9350 3153 4800 a443 5245 53a1 4a04 8f43  .P1SH..CRES.J..C
00000200: 5236 340a 0e50 5336 348f 4352 3634 0a16  R64..PS64.CR64..
00000210: 5045 3634 8f43 5236 340a 2650 4c36 3470  PE64.CR64.&PL64p
00000220: 5031 535f 5053 3634 7050 3145 5f50 4536  P1S_PS64pP1E_PE6
00000230: 3470 5031 4c5f 504c 3634 8443 5245 5343  4pP1L_PL64.CRESC
00000240: 5236 3460 a460 1444 525f 5052 5400 a412  R64`.`.DR_PRT...
00000250: 4b51 4012 1104 0bff ff00 5e2e 4c50 435f  KQ@.......^.LPC_
00000260: 4c4e 4b44 0012 1104 0bff ff01 5e2e 4c50  LNKD........^.LP
00000270: 435f 4c4e 4b41 0012 1204 0bff ff0a 025e  C_LNKA.........^
00000280: 2e4c 5043 5f4c 4e4b 4200 1212 040b ffff  .LPC_LNKB.......
00000290: 0a03 5e2e 4c50 435f 4c4e 4b43 0012 1304  ..^.LPC_LNKC....
000002a0: 0cff ff01 0000 5e2e 4c50 435f 4c4e 4b53  ......^.LPC_LNKS
000002b0: 0012 1304 0cff ff01 0001 5e2e 4c50 435f  ..........^.LPC_
000002c0: 4c4e 4b42 0012 1404 0cff ff01 000a 025e  LNKB...........^
000002d0: 2e4c 5043 5f4c 4e4b 4300 1214 040c ffff  .LPC_LNKC.......
000002e0: 0100 0a03 5e2e 4c50 435f 4c4e 4b44 0012  ....^.LPC_LNKD..
000002f0: 1304 0cff ff02 0000 5e2e 4c50 435f 4c4e  ........^.LPC_LN
00000300: 4b42 0012 1304 0cff ff02 0001 5e2e 4c50  KB..........^.LP
00000310: 435f 4c4e 4b43 0012 1404 0cff ff02 000a  C_LNKC..........
00000320: 025e 2e4c 5043 5f4c 4e4b 4400 1214 040c  .^.LPC_LNKD.....
00000330: ffff 0200 0a03 5e2e 4c50 435f 4c4e 4b41  ......^.LPC_LNKA
00000340: 0012 1304 0cff ff03 0000 5e2e 4c50 435f  ..........^.LPC_
00000350: 4c4e 4b43 0012 1304 0cff ff03 0001 5e2e  LNKC..........^.
00000360: 4c50 435f 4c4e 4b44 0012 1404 0cff ff03  LPC_LNKD........
00000370: 000a 025e 2e4c 5043 5f4c 4e4b 4100 1214  ...^.LPC_LNKA...
00000380: 040c ffff 0300 0a03 5e2e 4c50 435f 4c4e  ........^.LPC_LN
00000390: 4b42 0012 1304 0cff ff04 0000 5e2e 4c50  KB..........^.LP
000003a0: 435f 4c4e 4b44 0012 1304 0cff ff04 0001  C_LNKD..........
000003b0: 5e2e 4c50 435f 4c4e 4b41 0012 1404 0cff  ^.LPC_LNKA......
000003c0: ff04 000a 025e 2e4c 5043 5f4c 4e4b 4200  .....^.LPC_LNKB.
000003d0: 1214 040c ffff 0400 0a03 5e2e 4c50 435f  ..........^.LPC_
000003e0: 4c4e 4b43 0012 1304 0cff ff05 0000 5e2e  LNKC..........^.
000003f0: 4c50 435f 4c4e 4b41 0012 1304 0cff ff05  LPC_LNKA........
00000400: 0001 5e2e 4c50 435f 4c4e 4b42 0012 1404  ..^.LPC_LNKB....
00000410: 0cff ff05 000a 025e 2e4c 5043 5f4c 4e4b  .......^.LPC_LNK
00000420: 4300 1214 040c ffff 0500 0a03 5e2e 4c50  C...........^.LP
00000430: 435f 4c4e 4b44 0012 1304 0cff ff06 0000  C_LNKD..........
00000440: 5e2e 4c50 435f 4c4e 4b42 0012 1304 0cff  ^.LPC_LNKB......
00000450: ff06 0001 5e2e 4c50 435f 4c4e 4b43 0012  ....^.LPC_LNKC..
00000460: 1404 0cff ff06 000a 025e 2e4c 5043 5f4c  .........^.LPC_L
00000470: 4e4b 4400 1214 040c ffff 0600 0a03 5e2e  NKD...........^.
00000480: 4c50 435f 4c4e 4b41 0012 1304 0cff ff07  LPC_LNKA........
00000490: 0000 5e2e 4c50 435f 4c4e 4b43 0012 1304  ..^.LPC_LNKC....
000004a0: 0cff ff07 0001 5e2e 4c50 435f 4c4e 4b44  ......^.LPC_LNKD
000004b0: 0012 1404 0cff ff07 000a 025e 2e4c 5043  ...........^.LPC
000004c0: 5f4c 4e4b 4100 1214 040c ffff 0700 0a03  _LNKA...........
000004d0: 5e2e 4c50 435f 4c4e 4b42 0012 1304 0cff  ^.LPC_LNKB......
000004e0: ff08 0000 5e2e 4c50 435f 4c4e 4b44 0012  ....^.LPC_LNKD..
000004f0: 1304 0cff ff08 0001 5e2e 4c50 435f 4c4e  ........^.LPC_LN
00000500: 4b41 0012 1404 0cff ff08 000a 025e 2e4c  KA...........^.L
00000510: 5043 5f4c 4e4b 4200 1214 040c ffff 0800  PC_LNKB.........
00000520: 0a03 5e2e 4c50 435f 4c4e 4b43 0012 1304  ..^.LPC_LNKC....
00000530: 0cff ff09 0000 5e2e 4c50 435f 4c4e 4b41  ......^.LPC_LNKA
00000540: 0012 1304 0cff ff09 0001 5e2e 4c50 435f  ..........^.LPC_
00000550: 4c4e 4b42 0012 1404 0cff ff09 000a 025e  LNKB...........^
00000560: 2e4c 5043 5f4c 4e4b 4300 1214 040c ffff  .LPC_LNKC.......
00000570: 0900 0a03 5e2e 4c50 435f 4c4e 4b44 0012  ....^.LPC_LNKD..
00000580: 1304 0cff ff0a 0000 5e2e 4c50 435f 4c4e  ........^.LPC_LN
00000590: 4b42 0012 1304 0cff ff0a 0001 5e2e 4c50  KB..........^.LP
000005a0: 435f 4c4e 4b43 0012 1404 0cff ff0a 000a  C_LNKC..........
000005b0: 025e 2e4c 5043 5f4c 4e4b 4400 1214 040c  .^.LPC_LNKD.....
000005c0: ffff 0a00 0a03 5e2e 4c50 435f 4c4e 4b41  ......^.LPC_LNKA
000005d0: 0012 1304 0cff ff0b 0000 5e2e 4c50 435f  ..........^.LPC_
000005e0: 4c4e 4b43 0012 1304 0cff ff0b 0001 5e2e  LNKC..........^.
000005f0: 4c50 435f 4c4e 4b44 0012 1404 0cff ff0b  LPC_LNKD........
00000600: 000a 025e 2e4c 5043 5f4c 4e4b 4100 1214  ...^.LPC_LNKA...
00000610: 040c ffff 0b00 0a03 5e2e 4c50 435f 4c4e  ........^.LPC_LN
00000620: 4b42 0012 1304 0cff ff0c 0000 5e2e 4c50  KB..........^.LP
00000630: 435f 4c4e 4b44 0012 1304 0cff ff0c 0001  C_LNKD..........
00000640: 5e2e 4c50 435f 4c4e 4b41 0012 1404 0cff  ^.LPC_LNKA......
00000650: ff0c 000a 025e 2e4c 5043 5f4c 4e4b 4200  .....^.LPC_LNKB.
00000660: 1214 040c ffff 0c00 0a03 5e2e 4c50 435f  ..........^.LPC_
00000670: 4c4e 4b43 0012 1304 0cff ff0d 0000 5e2e  LNKC..........^.
00000680: 4c50 435f 4c4e 4b41 0012 1304 0cff ff0d  LPC_LNKA........
00000690: 0001 5e2e 4c50 435f 4c4e 4b42 0012 1404  ..^.LPC_LNKB....
000006a0: 0cff ff0d 000a 025e 2e4c 5043 5f4c 4e4b  .......^.LPC_LNK
000006b0: 4300 1214 040c ffff 0d00 0a03 5e2e 4c50  C...........^.LP
000006c0: 435f 4c4e 4b44 0012 1304 0cff ff0e 0000  C_LNKD..........
000006d0: 5e2e 4c50 435f 4c4e 4b42 0012 1304 0cff  ^.LPC_LNKB......
000006e0: ff0e 0001 5e2e 4c50 435f 4c4e 4b43 0012  ....^.LPC_LNKC..
000006f0: 1404 0cff ff0e 000a 025e 2e4c 5043 5f4c  .........^.LPC_L
00000700: 4e4b 4400 1214 040c ffff 0e00 0a03 5e2e  NKD...........^.
00000710: 4c50 435f 4c4e 4b41 0012 1304 0cff ff0f  LPC_LNKA........
00000720: 0000 5e2e 4c50 435f 4c4e 4b43 0012 1304  ..^.LPC_LNKC....
00000730: 0cff ff0f 0001 5e2e 4c50 435f 4c4e 4b44  ......^.LPC_LNKD
00000740: 0012 1404 0cff ff0f 000a 025e 2e4c 5043  ...........^.LPC
00000750: 5f4c 4e4b 4100 1214 040c ffff 0f00 0a03  _LNKA...........
00000760: 5e2e 4c50 435f 4c4e 4b42 005b 8245 5b4c  ^.LPC_LNKB.[.E[L
00000770: 5043 5f08 5f41 4452 0c00 0001 005b 824b  PC_._ADR.....[.K
00000780: 044c 4e4b 5308 5f48 4944 0c41 d00c 0f08  .LNKS._HID.A....
00000790: 5f55 4944 0008 5f53 5441 0a0b 1406 5f53  _UID.._STA...._S
000007a0: 5253 0114 065f 4449 5300 085f 5052 5311  RS..._DIS.._PRS.
000007b0: 0e0a 0b89 0600 0901 0900 0000 7900 140b  ............y...
000007c0: 5f43 5253 00a4 5f50 5253 5b80 5052 5230  _CRS.._PRS[.PRR0
000007d0: 020a 600a 045b 811a 5052 5230 0050 4952  ..`..[..PRR0.PIR
000007e0: 4108 5049 5242 0850 4952 4308 5049 5244  A.PIRB.PIRC.PIRD
000007f0: 0814 1550 5354 4101 a009 7b68 0a80 00a4  ...PSTA...{h....
00000800: 0a09 a104 a40a 0b14 3850 4352 5309 0842  ........8PCRS..B
00000810: 5546 3011 0e0a 0b89 0600 0901 0000 0000  UF0.............
00000820: 7900 8a42 5546 300a 0549 5251 57a0 0d92  y..BUF0..IRQW...
00000830: 7b68 0a80 0070 6849 5251 57a4 4255 4630  {h...phIRQW.BUF0
00000840: 0850 5052 5311 160a 1389 0e00 0903 0500  .PPRS...........
00000850: 0000 0a00 0000 0b00 0000 7900 5b82 4c06  ..........y.[.L.
00000860: 4c4e 4b41 085f 4849 440c 41d0 0c0f 085f  LNKA._HID.A...._
00000870: 5549 4401 140f 5f53 5441 00a4 5053 5441  UID..._STA..PSTA
00000880: 5049 5241 1411 5f44 4953 007d 5049 5241  PIRA.._DIS.}PIRA
00000890: 0a80 5049 5241 140f 5f43 5253 00a4 5043  ..PIRA.._CRS..PC
000008a0: 5253 5049 5241 140b 5f50 5253 00a4 5050  RSPIRA.._PRS..PP
000008b0: 5253 1417 5f53 5253 018a 680a 0549 5251  RS.._SRS..h..IRQ
000008c0: 5770 4952 5157 5049 5241 5b82 4d06 4c4e  WpIRQWPIRA[.M.LN
000008d0: 4b42 085f 4849 440c 41d0 0c0f 085f 5549  KB._HID.A...._UI
000008e0: 440a 0214 0f5f 5354 4100 a450 5354 4150  D...._STA..PSTAP
000008f0: 4952 4214 115f 4449 5300 7d50 4952 420a  IRB.._DIS.}PIRB.
00000900: 8050 4952 4214 0f5f 4352 5300 a450 4352  .PIRB.._CRS..PCR
00000910: 5350 4952 4214 0b5f 5052 5300 a450 5052  SPIRB.._PRS..PPR
00000920: 5314 175f 5352 5301 8a68 0a05 4952 5157  S.._SRS..h..IRQW
00000930: 7049 5251 5750 4952 425b 824d 064c 4e4b  pIRQWPIRB[.M.LNK
00000940: 4308 5f48 4944 0c41 d00c 0f08 5f55 4944  C._HID.A...._UID
00000950: 0a03 140f 5f53 5441 00a4 5053 5441 5049  ...._STA..PSTAPI
00000960: 5243 1411 5f44 4953 007d 5049 5243 0a80  RC.._DIS.}PIRC..
00000970: 5049 5243 140f 5f43 5253 00a4 5043 5253  PIRC.._CRS..PCRS
00000980: 5049 5243 140b 5f50 5253 00a4 5050 5253  PIRC.._PRS..PPRS
00000990: 1417 5f53 5253 018a 680a 0549 5251 5770  .._SRS..h..IRQWp
000009a0: 4952 5157 5049 5243 5b82 4d06 4c4e 4b44  IRQWPIRC[.M.LNKD
000009b0: 085f 4849 440c 41d0 0c0f 085f 5549 440a  ._HID.A...._UID.
000009c0: 0414 0f5f 5354 4100 a450 5354 4150 4952  ..._STA..PSTAPIR
000009d0: 4414 115f 4449 5300 7d50 4952 440a 8050  D.._DIS.}PIRD..P
000009e0: 4952 4414 0f5f 4352 5300 a450 4352 5350  IRD.._CRS..PCRSP
000009f0: 4952 4414 0b5f 5052 5300 a450 5052 5314  IRD.._PRS..PPRS.
00000a00: 175f 5352 5301 8a68 0a05 4952 5157 7049  ._SRS..h..IRQWpI
00000a10: 5251 5750 4952 445b 8233 5049 435f 085f  RQWPIRD[.3PIC_._
00000a20: 4849 440b 41d0 085f 4352 5311 200a 1d47  HID.A.._CRS. ..G
00000a30: 0120 0020 0000 0247 01a0 00a0 0000 0247  . . ...G.......G
00000a40: 01d0 04d0 0400 0222 0400 7900 5b82 4e04  ......."..y.[.N.
00000a50: 444d 4143 085f 4849 440c 41d0 0200 085f  DMAC._HID.A...._
00000a60: 4352 5311 380a 3547 0100 0000 0000 1047  CRS.8.5G.......G
00000a70: 0181 0081 0000 0347 0187 0087 0000 0147  .......G.......G
00000a80: 0189 0089 0000 0347 018f 008f 0000 0147  .......G.......G
00000a90: 01c0 00c0 0000 202a 1000 7900 5b82 2554  ...... *..y.[.%T
00000aa0: 4d52 5f08 5f48 4944 0c41 d001 0008 5f43  MR_._HID.A...._C
00000ab0: 5253 1110 0a0d 4701 4000 4000 0004 2201  RS....G.@.@...".
00000ac0: 0079 005b 8225 5254 435f 085f 4849 440c  .y.[.%RTC_._HID.
00000ad0: 41d0 0b00 085f 4352 5311 100a 0d47 0170  A...._CRS....G.p
00000ae0: 0070 0000 0222 0001 7900 5b82 2253 504b  .p..."..y.[."SPK
00000af0: 5208 5f48 4944 0c41 d008 0008 5f43 5253  R._HID.A...._CRS
00000b00: 110d 0a0a 4701 6100 6100 0101 7900 5b82  ....G.a.a...y.[.
00000b10: 2546 5055 5f08 5f48 4944 0c41 d00c 0408  %FPU_._HID.A....
00000b20: 5f43 5253 1110 0a0d 4701 f000 f000 0010  _CRS....G.......
00000b30: 2200 2079 005b 824a 0d58 5452 4108 5f48  ". y.[.J.XTRA._H
00000b40: 4944 0c41 d00c 0208 5f55 4944 0108 5f43  ID.A...._UID.._C
00000b50: 5253 114e 0b0a ba47 0110 0010 0000 1047  RS.N...G.......G
00000b60: 0122 0022 0000 1e47 0144 0044 0000 1c47  ."."...G.D.D...G
00000b70: 0162 0062 0000 0247 0165 0065 0000 0b47  .b.b...G.e.e...G
00000b80: 0172 0072 0000 0e47 0180 0080 0000 0147  .r.r...G.......G
00000b90: 0184 0084 0000 0347 0188 0088 0000 0147  .......G.......G
00000ba0: 018c 008c 0000 0347 0190 0090 0000 1047  .......G.......G
00000bb0: 01a2 00a2 0000 1e47 01e0 00e0 0000 1047  .......G.......G
00000bc0: 01e0 01e0 0100 1047 0160 0160 0100 1047  .......G.`.`...G
00000bd0: 0170 0370 0300 0247 0102 0402 0400 0147  .p.p...G.......G
00000be0: 0140 0440 0400 1047 01e0 afe0 af00 0447  .@.@...G.......G
00000bf0: 0100 b000 b000 4086 0900 0000 00c0 fe00  ......@.........
00000c00: 1000 0086 0900 0000 00e0 fe00 0010 0079  ...............y
00000c10: 005b 8237 5053 324b 085f 4849 440c 41d0  .[.7PS2K._HID.A.
00000c20: 0303 085f 4349 440c 41d0 030b 085f 4352  ..._CID.A...._CR
00000c30: 5311 180a 1547 0160 0060 0000 0147 0164  S....G.`.`...G.d
00000c40: 0064 0000 0122 0200 7900 5b82 3755 4152  .d..."..y.[.7UAR
00000c50: 3108 5f48 4944 0c41 d005 0108 5f44 444e  1._HID.A...._DDN
00000c60: 0d43 4f4d 3100 085f 5549 4401 085f 4352  .COM1.._UID.._CR
00000c70: 5311 110a 0e47 01f8 03f8 0301 0823 1000  S....G.......#..
00000c80: 0179 005b 8238 5541 5232 085f 4849 440c  .y.[.8UAR2._HID.
00000c90: 41d0 0501 085f 4444 4e0d 434f 4d32 0008  A...._DDN.COM2..
00000ca0: 5f55 4944 0a02 085f 4352 5311 110a 0e47  _UID..._CRS....G
00000cb0: 01f8 02f8 0201 0823 0800 0179 005b 8243  .......#...y.[.C
00000cc0: 0650 4556 5408 5f48 4944 0d51 454d 5530  .PEVT._HID.QEMU0
00000cd0: 3030 3100 085f 4352 5311 0d0a 0a47 0105  001.._CRS....G..
00000ce0: 0505 0501 0179 005b 8050 454f 5201 0b05  .....y.[.PEOR...
00000cf0: 0501 5b81 0b50 454f 5201 5045 5054 0808  ..[..PEOR.PEPT..
00000d00: 5f53 5441 0a0f 140e 5244 5054 0070 5045  _STA....RDPT.pPE
00000d10: 5054 60a4 6014 0c57 5250 5401 7068 5045  PT`.`..WRPT.phPE
00000d20: 5054                                     PT

A few notes about the manual tests:

  1. The BSD port of acpidump uses a different output format than that of Linux, Illumos, and Windows, so the comparison was made mostly by hand.

  2. Windows EnumSystemFirmwareTables syscall doesn't actually list all ACPI tables. acpidump gets around this by hard-coding a process to dump the DSDT and XSDT, but this still leaves out the FACS table. I was able to retrieve it from the Windows Registry and compare it manually (luckily it's a small table filled with mostly zeros).
    image

  3. fwts currently reports num. CPUs + 2 errors and 1 warning, but they are also present when using the OVMF tables. We should look into fixing them.

    Test Failure Summary
    ================================================================================
    
    Critical failures: NONE
    
    High failures: 1
     fadt: FADT X_GPE0_BLK Access width 0x00 but it should be 1 (byte access).
    
    Medium failures: 3
     madt: LAPIC has no matching processor UID 0
     madt: LAPIC has no matching processor UID 1
     madt: LAPICNMI has no matching processor UID 255
    
    Low failures: NONE
    
    Other failures: NONE
    
    Test 3 of 6: FADT revision test.
    FADT revision: 3.0
    FADT table length: 244
    WARNING: Test 3, FADT revision is outdated: 3.0
    
    ADVICE: The most recent revision of the FADT defined in the ACPI specification
    is 6.6. While older revisions of the FADT can be used, newer ones may enable
    additional functionality that cannot be used until the FADT is updated.
    

Automated tests are added where possible. Since the AML code is generated using the acpi_tables crate it didn't seem necessary to test that AML code was correct, so the tests focus on the what we do with the tables rather thatn the how we build them. The exception is the DSDT table because it uses the DsdtGenerator pattern.

The PR includes two PHD tests for proper VM testing. Currently Propolis CI uses a fairly minimal Alpine image, so acpi_tables_generation checks as much of the ACPI tables as possible without relying on external tools. acpi_tables_parse is a more comprehensive test but requires an image that has acpidump, iasl, and fwts installed.

Note

The original test results are kept for reference, but the actual data is no longer reflective of the final version of this PR.

Original Testing
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
[    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.
OVMF ACPI table dump
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 (<method pathname>, MethodObj, <argument count>)
     * 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
    })
}

New ACPI table dump
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              // ............

@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 <ameynarkhede03@gmail.com>
@pfmooney
Copy link
Copy Markdown
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
Copy Markdown
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 <ameynarkhede03@gmail.com>
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 <ameynarkhede03@gmail.com>
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 <ameynarkhede03@gmail.com>
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 <ameynarkhede03@gmail.com>
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 <ameynarkhede03@gmail.com>
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 <ameynarkhede03@gmail.com>
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 <ameynarkhede03@gmail.com>
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 <ameynarkhede03@gmail.com>
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 <ameynarkhede03@gmail.com>
Signed-off-by: glitzflitz <ameynarkhede03@gmail.com>
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 <ameynarkhede03@gmail.com>
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 <ameynarkhede03@gmail.com>
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 <ameynarkhede03@gmail.com>
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 <ameynarkhede03@gmail.com>
Implement DsdtGenerator for QemuPvPanic to export it via new DSDT.

Signed-off-by: Amey Narkhede <ameynarkhede03@gmail.com>
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 <ameynarkhede03@gmail.com>
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 <ameynarkhede03@gmail.com>
@glitzflitz
Copy link
Copy Markdown
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
Copy Markdown
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

All tests should pass now

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 <ameynarkhede03@gmail.com>
Signed-off-by: glitzflitz <ameynarkhede03@gmail.com>
@glitzflitz glitzflitz marked this pull request as ready for review January 6, 2026 01:06
@AlejandroME AlejandroME added this to the 20 milestone Feb 26, 2026
@lgfa29
Copy link
Copy Markdown
Member

lgfa29 commented Mar 18, 2026

Hi @glitzflitz 👋

Apologies for the long wait to getting back to you here, but thank you very much for all the work you put in this PR! I'm starting to work on PCI hotplug, so this PR will be very useful 😄

As you mentioned, the ACPI tables generated here are different from the ones we currently pull from EDKII. The API flag you added does help us control when the new tables are released, but it also means that we're blocked in using the new table generation until we're confident that they will not cause issues in production environments, which could take a while.

Chatting with @iximeow, we think that a more cautious approach would be to adjust this PR so the it generates tables that are identical to the ones we use today (or as close as possible at least), and then we modernize them little by little, and probably gate specific changes behind flags that users can opt-in/out of.

Another point to consider is using the acpi_tables crate instead of having custom logic to generate the AML code. The code you wrote works well, but the crate is a little more flexible in terms of expanding to other kinds of ACPI code generation and it's less code for us to maintain.

So for next steps, if you don't mind, I will take over this PR and make the following changes:

  1. Use the acpi_tables crate for AML generation.
  2. Generate tables that are as close as possible to the ones we use today.

I will then do a more through review and fix things here and there as necessary.

Let me know if you have any thoughts on this, and thank you again for the contribution!

@lgfa29 lgfa29 self-assigned this Mar 18, 2026
@glitzflitz
Copy link
Copy Markdown
Author

@lgfa29 the approach of matching new tables with old EDKII tables sounds totally reasonable to me. Feel free to take over the PR!
Let me know in case you need more details.

lgfa29 added 3 commits April 18, 2026 00:56
Use the acpi_tables crate to generate the ACPI tables. The crate was
missing some elements we needed, so it was forked for now. If changes
are accepted and merged upstream we can stop using the fork.

The ACPI tables were also kept identical to the current static EDK2
tables to allow us to move forward with table generation while
minimizing risk.
@lgfa29 lgfa29 force-pushed the acpi_fwcfg_reord branch from 4673ea1 to a6b3ae3 Compare April 21, 2026 02:10
@lgfa29 lgfa29 requested review from hawkw and iximeow April 24, 2026 01:29
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.

4 participants