From f6ceca9c723bb9e91e71e666b73beefa95494a3b Mon Sep 17 00:00:00 2001 From: Goldfish64 Date: Thu, 9 Jul 2020 20:27:20 -0500 Subject: [PATCH] DxeIpl: Fix ACPI reset register detection --- Legacy/BootPlatform/DxeIpl/LegacyTable.c | 30 ++++++++++++++++++------ 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/Legacy/BootPlatform/DxeIpl/LegacyTable.c b/Legacy/BootPlatform/DxeIpl/LegacyTable.c index b6a06563..9ce17cda 100644 --- a/Legacy/BootPlatform/DxeIpl/LegacyTable.c +++ b/Legacy/BootPlatform/DxeIpl/LegacyTable.c @@ -307,12 +307,28 @@ PrepareFadtTable ( ); } if (Fadt->Header.Length >= OFFSET_OF (EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE, ResetValue) + sizeof (Fadt->ResetValue)) { - CopyMem ( - &AcpiDescription->RESET_REG, - &Fadt->ResetReg, - sizeof(EFI_ACPI_3_0_GENERIC_ADDRESS_STRUCTURE) - ); - AcpiDescription->RESET_VALUE = Fadt->ResetValue; + // + // Ensure FADT register information is valid and can be trusted before using. + // If not, use universal register settings. See AcpiFadtEnableReset() in OcAcpiLib. + // + if (Fadt->ResetReg.Address != 0 && Fadt->ResetReg.RegisterBitWidth == 8) { + CopyMem ( + &AcpiDescription->RESET_REG, + &Fadt->ResetReg, + sizeof(EFI_ACPI_3_0_GENERIC_ADDRESS_STRUCTURE) + ); + AcpiDescription->RESET_VALUE = Fadt->ResetValue; + } else { + // + // Use mostly universal default of 0xCF9. + // + AcpiDescription->RESET_REG.Address = 0xCF9; + AcpiDescription->RESET_REG.AddressSpaceId = EFI_ACPI_3_0_SYSTEM_IO; + AcpiDescription->RESET_REG.RegisterBitWidth = 8; + AcpiDescription->RESET_REG.RegisterBitOffset = 0; + AcpiDescription->RESET_REG.AccessSize = EFI_ACPI_3_0_BYTE; + AcpiDescription->RESET_VALUE = 6; + } } else { // // ** CHANGE START ** @@ -322,7 +338,7 @@ PrepareFadtTable ( AcpiDescription->RESET_REG.AddressSpaceId = EFI_ACPI_3_0_SYSTEM_IO; AcpiDescription->RESET_REG.RegisterBitWidth = 8; AcpiDescription->RESET_REG.RegisterBitOffset = 0; - AcpiDescription->RESET_REG.AccessSize = 1; + AcpiDescription->RESET_REG.AccessSize = EFI_ACPI_3_0_BYTE; AcpiDescription->RESET_VALUE = 0xFE; // // ** CHANGE END **