On 26/07/2017 13:42, Laszlo Ersek wrote: > Not exactly; the PCD controls whether the EFI_ACPI_TABLE_PROTOCOL will > expose an RSDT, an XSDT, or both (with matching contents).
You're right that the code does not produce a v1 FADT, I mis-skimmed the awful code of AcpiTableDxe. Though the intentions seems to be there in the UEFI spec, because UEFI has different GUIDs for ACPI 1.0 and 2.0+ RSDPs---and they need not point to the same tables, even though the ACPI 1.0 RSDP is a subset of the 2.0+ one. AcpiTableDxe's data structures have an "Rsdp1" field (pointing to "Rsdt1" and from there to "Fadt1") and an "Rsdp3" field (pointing to "Xsdt" and optionally "Rsdt3", and from both to "Fadt3"). However: * Fadt1 and Fadt3 have exactly the same content. * Rsdt3 doesn't point to Fadt1. It should be easy to make "Fadt1" a v1 table instead of copying the same contents to Fadt1 and Fadt3, and to make Rsdt3 point to Fadt1. The CSM would just work if edk2 did this; until then Windows 2000 over SeaBIOS over OVMF remains broken, but I guess that's not that much of an issue. Anyway, once you take CSM into account, IMHO a firmware solution becomes preferrable to Kevin's proposals to add a etc/table-loader-legacy (or similar) file in fw_cfg. Paolo > The FADT > always comes from the specific edk2 platform (i.e., OVMF client code), > and it is not translated in any way, regardless of the PCD value. > > From "MdeModulePkg/MdeModulePkg.dec": > >> ## Indicates which ACPI versions are targeted by the ACPI tables exposed >> to the OS >> # These values are aligned with the definitions in >> MdePkg/Include/Protocol/AcpiSystemDescriptionTable.h >> # BIT 1 - EFI_ACPI_TABLE_VERSION_1_0B.<BR> >> # BIT 2 - EFI_ACPI_TABLE_VERSION_2_0.<BR> >> # BIT 3 - EFI_ACPI_TABLE_VERSION_3_0.<BR> >> # BIT 4 - EFI_ACPI_TABLE_VERSION_4_0.<BR> >> # BIT 5 - EFI_ACPI_TABLE_VERSION_5_0.<BR> >> # @Prompt Exposed ACPI table versions. >> >> gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiExposedTableVersions|0x3E|UINT32|0x0001004c > The expectation is that the specific edk2 platform overrides this PCD at > build time (if necessary), and then goes on (at boot time) to install > ACPI tables -- using EFI_ACPI_TABLE_PROTOCOL.InstallAcpiTable() -- that > actually match the PCD setting.