Skip to content

Commit

Permalink
ArmVirtPkg/XenAcpiPlatformDxe: Install FACS table from DT
Browse files Browse the repository at this point in the history
The FACS may still exist when the reduced hardware flag is set in FADT;
it is optional. Since it contains the hardware signature field which
indicates that a hibernated system should boot cleanly instead of
attempting to resume, a platform may choose to expose it. Propagate it
correctly.

Also avoid a NULL pointer dereference if the platform doesn't provide
a DSDT.

Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
Message-Id: <881dd0a2558ecbdfa02c844722d8a1103ab97ab3.camel@infradead.org>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
[lersek@redhat.com: uncrustify]
  • Loading branch information
dwmw2 authored and mergify[bot] committed Feb 25, 2024
1 parent f881b4d commit ba96acd
Showing 1 changed file with 29 additions and 8 deletions.
37 changes: 29 additions & 8 deletions ArmVirtPkg/XenAcpiPlatformDxe/XenAcpiPlatformDxe.c
Original file line number Diff line number Diff line change
Expand Up @@ -128,10 +128,12 @@ InstallXenArmTables (
EFI_ACPI_DESCRIPTION_HEADER *Xsdt;
EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE *FadtTable;
EFI_ACPI_DESCRIPTION_HEADER *DsdtTable;
EFI_ACPI_3_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *FacsTable;

XenAcpiRsdpStructurePtr = NULL;
FadtTable = NULL;
DsdtTable = NULL;
FacsTable = NULL;
TableHandle = 0;
NumberOfTableEntries = 0;

Expand Down Expand Up @@ -191,21 +193,40 @@ InstallXenArmTables (
FadtTable = (EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE *)
(UINTN)CurrentTablePointer;
DsdtTable = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)FadtTable->Dsdt;
FacsTable = (EFI_ACPI_3_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *)
(UINTN)FadtTable->FirmwareCtrl;
}
}
}

//
// Install DSDT table.
//
Status = AcpiProtocol->InstallAcpiTable (
AcpiProtocol,
DsdtTable,
DsdtTable->Length,
&TableHandle
);
if (EFI_ERROR (Status)) {
return Status;
if (DsdtTable != NULL) {
Status = AcpiProtocol->InstallAcpiTable (
AcpiProtocol,
DsdtTable,
DsdtTable->Length,
&TableHandle
);
if (EFI_ERROR (Status)) {
return Status;
}
}

//
// Install FACS table.
//
if (FacsTable != NULL) {
Status = AcpiProtocol->InstallAcpiTable (
AcpiProtocol,
FacsTable,
FacsTable->Length,
&TableHandle
);
if (EFI_ERROR (Status)) {
return Status;
}
}

return EFI_SUCCESS;
Expand Down

0 comments on commit ba96acd

Please sign in to comment.