/** @file\r
This is the implementation to save ACPI S3 Context.\r
\r
-Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions\r
-of the BSD License which accompanies this distribution. The\r
-full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
#include <Library/LockBoxLib.h>\r
#include <Library/PcdLib.h>\r
#include <Library/DebugLib.h>\r
+#include <Library/UefiLib.h>\r
#include <Guid/AcpiS3Context.h>\r
-#include <Guid/Acpi.h>\r
#include <IndustryStandard/Acpi.h>\r
#include <Protocol/LockBox.h>\r
\r
\r
@param MemoryType Memory type of memory to allocate.\r
@param Size Size of memory to allocate.\r
- \r
+\r
@return Allocated address for output.\r
\r
**/\r
return Buffer;\r
}\r
\r
-/**\r
-\r
- This function scan ACPI table in RSDT.\r
-\r
- @param Rsdt ACPI RSDT\r
- @param Signature ACPI table signature\r
-\r
- @return ACPI table\r
-\r
-**/\r
-VOID *\r
-ScanTableInRSDT (\r
- IN EFI_ACPI_DESCRIPTION_HEADER *Rsdt,\r
- IN UINT32 Signature\r
- )\r
-{\r
- UINTN Index;\r
- UINT32 EntryCount;\r
- UINT32 *EntryPtr;\r
- EFI_ACPI_DESCRIPTION_HEADER *Table;\r
-\r
- if (Rsdt == NULL) {\r
- return NULL;\r
- }\r
-\r
- EntryCount = (Rsdt->Length - sizeof (EFI_ACPI_DESCRIPTION_HEADER)) / sizeof(UINT32);\r
- \r
- EntryPtr = (UINT32 *)(Rsdt + 1);\r
- for (Index = 0; Index < EntryCount; Index ++, EntryPtr ++) {\r
- Table = (EFI_ACPI_DESCRIPTION_HEADER *)((UINTN)(*EntryPtr));\r
- if (Table->Signature == Signature) {\r
- return Table;\r
- }\r
- }\r
- \r
- return NULL;\r
-}\r
-\r
-/**\r
-\r
- This function scan ACPI table in XSDT.\r
-\r
- @param Xsdt ACPI XSDT\r
- @param Signature ACPI table signature\r
-\r
- @return ACPI table\r
-\r
-**/\r
-VOID *\r
-ScanTableInXSDT (\r
- IN EFI_ACPI_DESCRIPTION_HEADER *Xsdt,\r
- IN UINT32 Signature\r
- )\r
-{\r
- UINTN Index;\r
- UINT32 EntryCount;\r
- UINT64 EntryPtr;\r
- UINTN BasePtr;\r
- EFI_ACPI_DESCRIPTION_HEADER *Table;\r
-\r
- if (Xsdt == NULL) {\r
- return NULL;\r
- }\r
-\r
- EntryCount = (Xsdt->Length - sizeof (EFI_ACPI_DESCRIPTION_HEADER)) / sizeof(UINT64);\r
- \r
- BasePtr = (UINTN)(Xsdt + 1);\r
- for (Index = 0; Index < EntryCount; Index ++) {\r
- CopyMem (&EntryPtr, (VOID *)(BasePtr + Index * sizeof(UINT64)), sizeof(UINT64));\r
- Table = (EFI_ACPI_DESCRIPTION_HEADER *)((UINTN)(EntryPtr));\r
- if (Table->Signature == Signature) {\r
- return Table;\r
- }\r
- }\r
- \r
- return NULL;\r
-}\r
-\r
-/**\r
- To find Facs in FADT.\r
-\r
- @param Fadt FADT table pointer\r
- \r
- @return Facs table pointer.\r
-**/\r
-EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *\r
-FindAcpiFacsFromFadt (\r
- IN EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE *Fadt\r
- )\r
-{\r
- EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *Facs;\r
- UINT64 Data64;\r
-\r
- if (Fadt == NULL) {\r
- return NULL;\r
- }\r
-\r
- if (Fadt->Header.Revision < EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE_REVISION) {\r
- Facs = (EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *)(UINTN)Fadt->FirmwareCtrl;\r
- } else {\r
- if (Fadt->FirmwareCtrl != 0) {\r
- Facs = (EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *)(UINTN)Fadt->FirmwareCtrl;\r
- } else {\r
- CopyMem (&Data64, &Fadt->XFirmwareCtrl, sizeof(UINT64));\r
- Facs = (EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *)(UINTN)Data64;\r
- }\r
- }\r
- return Facs;\r
-}\r
-\r
-/**\r
- To find Facs in Acpi tables.\r
- \r
- To find Firmware ACPI control strutcure in Acpi Tables since the S3 waking vector is stored \r
- in the table.\r
-\r
- @param AcpiTableGuid The guid used to find ACPI table in UEFI ConfigurationTable.\r
- \r
- @return Facs table pointer.\r
-**/\r
-EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *\r
-FindAcpiFacsTableByAcpiGuid (\r
- IN EFI_GUID *AcpiTableGuid\r
- )\r
-{\r
- EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER *Rsdp;\r
- EFI_ACPI_DESCRIPTION_HEADER *Rsdt;\r
- EFI_ACPI_DESCRIPTION_HEADER *Xsdt;\r
- EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE *Fadt;\r
- EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *Facs;\r
- UINTN Index;\r
-\r
- Rsdp = NULL;\r
- //\r
- // found ACPI table RSD_PTR from system table\r
- //\r
- for (Index = 0; Index < gST->NumberOfTableEntries; Index++) {\r
- if (CompareGuid (&(gST->ConfigurationTable[Index].VendorGuid), AcpiTableGuid)) {\r
- //\r
- // A match was found.\r
- //\r
- Rsdp = gST->ConfigurationTable[Index].VendorTable;\r
- break;\r
- }\r
- }\r
-\r
- if (Rsdp == NULL) {\r
- return NULL;\r
- }\r
-\r
- //\r
- // Search XSDT\r
- //\r
- if (Rsdp->Revision >= EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER_REVISION) {\r
- Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN) Rsdp->XsdtAddress;\r
- Fadt = ScanTableInXSDT (Xsdt, EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE);\r
- if (Fadt != NULL) {\r
- Facs = FindAcpiFacsFromFadt (Fadt);\r
- if (Facs != NULL) {\r
- return Facs;\r
- }\r
- }\r
- }\r
-\r
- //\r
- // Search RSDT\r
- //\r
- Rsdt = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN) Rsdp->RsdtAddress;\r
- Fadt = ScanTableInRSDT (Rsdt, EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE);\r
- if (Fadt != NULL) {\r
- Facs = FindAcpiFacsFromFadt (Fadt);\r
- if (Facs != NULL) {\r
- return Facs;\r
- }\r
- }\r
-\r
- return NULL;\r
-}\r
-\r
-/**\r
- To find Facs in Acpi tables.\r
- \r
- To find Firmware ACPI control strutcure in Acpi Tables since the S3 waking vector is stored \r
- in the table.\r
- \r
- @return Facs table pointer.\r
-**/\r
-EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *\r
-FindAcpiFacsTable (\r
- VOID\r
- )\r
-{\r
- EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *Facs;\r
-\r
- Facs = FindAcpiFacsTableByAcpiGuid (&gEfiAcpi20TableGuid);\r
- if (Facs != NULL) {\r
- return Facs;\r
- }\r
-\r
- return FindAcpiFacsTableByAcpiGuid (&gEfiAcpi10TableGuid);\r
-}\r
-\r
/**\r
The function will check if long mode waking vector is supported.\r
\r
\r
@param[in] LongModeWakingVectorSupport Support long mode waking vector or not.\r
\r
- If BootScriptExector driver will run in 64-bit mode, this function will establish the 1:1 \r
+ If BootScriptExector driver will run in 64-bit mode, this function will establish the 1:1\r
virtual to physical mapping page table when long mode waking vector is supported, otherwise\r
create 4G page table when long mode waking vector is not supported and let PF handler to\r
handle > 4G request.\r
- If BootScriptExector driver will not run in 64-bit mode, this function will do nothing. \r
- \r
- @return Page table base address. \r
+ If BootScriptExector driver will not run in 64-bit mode, this function will do nothing.\r
+\r
+ @return Page table base address.\r
\r
**/\r
EFI_PHYSICAL_ADDRESS\r
S3AllocatePageTablesBuffer (\r
IN BOOLEAN LongModeWakingVectorSupport\r
)\r
-{ \r
+{\r
if (FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {\r
UINTN ExtraPageTablePages;\r
UINT32 RegEax;\r
// We need calculate whole page size then allocate once, because S3 restore page table does not know each page in Nvs.\r
//\r
if (!Page1GSupport) {\r
- TotalPageTableSize = (UINTN)(1 + NumberOfPml4EntriesNeeded + NumberOfPml4EntriesNeeded * NumberOfPdpEntriesNeeded);\r
+ TotalPageTableSize = 1 + NumberOfPml4EntriesNeeded + NumberOfPml4EntriesNeeded * NumberOfPdpEntriesNeeded;\r
} else {\r
- TotalPageTableSize = (UINTN)(1 + NumberOfPml4EntriesNeeded);\r
+ TotalPageTableSize = 1 + NumberOfPml4EntriesNeeded;\r
}\r
\r
TotalPageTableSize += ExtraPageTablePages;\r
- DEBUG ((EFI_D_ERROR, "AcpiS3ContextSave TotalPageTableSize - 0x%x pages\n", TotalPageTableSize));\r
+ DEBUG ((DEBUG_INFO, "AcpiS3ContextSave TotalPageTableSize - 0x%x pages\n", TotalPageTableSize));\r
\r
//\r
// By architecture only one PageMapLevel4 exists - so lets allocate storage for it.\r
//\r
// If DXE is running 32-bit mode, no need to establish page table.\r
//\r
- return (EFI_PHYSICAL_ADDRESS) 0; \r
+ return (EFI_PHYSICAL_ADDRESS) 0;\r
}\r
}\r
\r
//\r
// Get ACPI Table because we will save its position to variable\r
//\r
- Facs = (EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *) FindAcpiFacsTable ();\r
+ Facs = (EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *) EfiLocateFirstAcpiTable (\r
+ EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_SIGNATURE\r
+ );\r
AcpiS3Context->AcpiFacsTable = (EFI_PHYSICAL_ADDRESS) (UINTN) Facs;\r
ASSERT (AcpiS3Context->AcpiFacsTable != 0);\r
\r