Ard,
On 2016/2/19 21:15, Ard Biesheuvel wrote:
AARCH64 systems never require compatibility with legacy ACPI OSes, and
may not have any 32-bit addressable system RAM. To support ACPI on these
systems, we need to be able to relax the 4 GB allocation restriction.
So add a PCD PcdAcpiExposedTableVersions containing a bitmask describing
which ACPI versions are targeted, and wire it up it up to the memory
Remove the duplicated "it up"?
allocation calls in AcpiTableDxe/AcpiTableProtocol.c. I.e., if ACPI v1.0b
is not among the supported versions, the memory allocations are not limited
to 4 GB, and only table types that carry 64-bit addresses are emitted.
Note that this will inhibit the publishing of any tables that carry only
32-bit addresses, i.e., RSDPv1, RSDTv1 and RSDTv3.
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ard Biesheuvel <[email protected]>
Reviewed-by: "Yao, Jiewen" <[email protected]>
---
MdeModulePkg/MdeModulePkg.dec | 11 +
MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiSdt.c | 3 +-
MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf | 2 +
MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c | 448
++++++++++++--------
4 files changed, 277 insertions(+), 187 deletions(-)
[trimmed]
diff --git a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf
b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf
index e9cd728dbfb6..0fb2c9cfb52e 100644
--- a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf
+++ b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf
@@ -2,6 +2,7 @@
# ACPI Table Protocol Driver
#
# Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
+# Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>
# This program and the accompanying materials are
# licensed and made available under the terms and conditions of the BSD
License
# which accompanies this distribution. The full text of the license may be
found at
@@ -67,6 +68,7 @@ [Pcd]
gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultOemRevision ## CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultCreatorId ## CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultCreatorRevision ## CONSUMES
+ gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiExposedTableVersions ## CONSUMES
[Protocols]
gEfiAcpiTableProtocolGuid ## PRODUCES
diff --git a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c
b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c
index c6abf1bf0c52..c8fdc0e1c383 100644
--- a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c
+++ b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c
@@ -2,6 +2,7 @@
ACPI Table Protocol Implementation
Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD
License
which accompanies this distribution. The full text of the license may be
found at
@@ -21,6 +22,12 @@
//
UINTN mEfiAcpiMaxNumTables = EFI_ACPI_MAX_NUM_TABLES;
+//
+// Allocation strategy to use for AllocatePages ().
+// Runtime value depends on PcdExposedAcpiTableVersions.
+//
+STATIC EFI_ALLOCATE_TYPE mAcpiTableAllocType;
+
/**
This function adds an ACPI table to the table list. It will detect FACS and
allocate the correct type of memory and properly align the table.
@@ -135,8 +142,10 @@ PublishTables (
*CurrentRsdtEntry = (UINT32) (UINTN) AcpiTableInstance->Fadt1;
}
if ((Version & ACPI_TABLE_VERSION_GTE_2_0) != 0) {
- CurrentRsdtEntry = (UINT32 *) ((UINT8 *) AcpiTableInstance->Rsdt3 +
sizeof (EFI_ACPI_DESCRIPTION_HEADER));
- *CurrentRsdtEntry = (UINT32) (UINTN) AcpiTableInstance->Fadt3;
+ if (PcdGet32 (PcdAcpiExposedTableVersions)) {
It should be if ((PcdGet32 (PcdAcpiExposedTableVersions) &
EFI_ACPI_TABLE_VERSION_1_0B) != 0) { ?
+ CurrentRsdtEntry = (UINT32 *) ((UINT8 *) AcpiTableInstance->Rsdt3 +
sizeof (EFI_ACPI_DESCRIPTION_HEADER));
+ *CurrentRsdtEntry = (UINT32) (UINTN) AcpiTableInstance->Fadt3;
+ }
CurrentXsdtEntry = (VOID *) ((UINT8 *) AcpiTableInstance->Xsdt + sizeof
(EFI_ACPI_DESCRIPTION_HEADER));
//
// Add entry to XSDT, XSDT expects 64 bit pointers, but
@@ -209,6 +218,7 @@ InstallAcpiTable (
EFI_ACPI_TABLE_INSTANCE *AcpiTableInstance;
EFI_STATUS Status;
VOID *AcpiTableBufferConst;
+ EFI_ACPI_TABLE_VERSION Version;
//
// Check for invalid input parameters
@@ -218,6 +228,8 @@ InstallAcpiTable (
return EFI_INVALID_PARAMETER;
}
+ Version = PcdGet32 (PcdAcpiExposedTableVersions);
+
//
// Get the instance of the ACPI table protocol
//
@@ -232,13 +244,13 @@ InstallAcpiTable (
AcpiTableInstance,
AcpiTableBufferConst,
TRUE,
- EFI_ACPI_TABLE_VERSION_1_0B | ACPI_TABLE_VERSION_GTE_2_0,
+ Version,
TableKey
);
if (!EFI_ERROR (Status)) {
Status = PublishTables (
AcpiTableInstance,
- EFI_ACPI_TABLE_VERSION_1_0B | ACPI_TABLE_VERSION_GTE_2_0
+ Version
);
}
FreePool (AcpiTableBufferConst);
@@ -250,7 +262,7 @@ InstallAcpiTable (
if (!EFI_ERROR (Status)) {
SdtNotifyAcpiList (
AcpiTableInstance,
- EFI_ACPI_TABLE_VERSION_1_0B | ACPI_TABLE_VERSION_GTE_2_0,
+ Version,
*TableKey
);
}
@@ -337,16 +349,19 @@ ReallocateAcpiTableBuffer (
//
// Create RSDT, XSDT structures and allocate buffers.
//
- TotalSize = sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for ACPI 1.0
RSDT
- NewMaxTableNumber * sizeof (UINT32) +
- sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for ACPI
2.0/3.0 RSDT
- NewMaxTableNumber * sizeof (UINT32) +
- sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for ACPI
2.0/3.0 XSDT
+ TotalSize = sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for ACPI
2.0/3.0 XSDT
NewMaxTableNumber * sizeof (UINT64);
+ if ((PcdGet32 (PcdAcpiExposedTableVersions) & EFI_ACPI_TABLE_VERSION_1_0B)
!= 0) {
+ TotalSize += sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for ACPI 1.0
RSDT
+ NewMaxTableNumber * sizeof (UINT32) +
+ sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for ACPI
2.0/3.0 RSDT
+ NewMaxTableNumber * sizeof (UINT32);
+ }
+
//
// Allocate memory in the lower 32 bit of address range for
- // compatibility with ACPI 1.0 OS.
+ // compatibility with ACPI 1.0 OS if PcdAcpiAllocateTablesBelow4GB == TRUE
Where does PcdAcpiAllocateTablesBelow4GB from?
//
// This is done because ACPI 1.0 pointers are 32 bit values.
// ACPI 2.0 OS and all 64 bit OS must use the 64 bit ACPI table addresses.
@@ -355,7 +370,7 @@ ReallocateAcpiTableBuffer (
//
PageAddress = 0xFFFFFFFF;
Status = gBS->AllocatePages (
- AllocateMaxAddress,
+ mAcpiTableAllocType,
EfiACPIReclaimMemory,
EFI_SIZE_TO_PAGES (TotalSize),
&PageAddress
@@ -369,35 +384,45 @@ ReallocateAcpiTableBuffer (
ZeroMem (Pointer, TotalSize);
AcpiTableInstance->Rsdt1 = (EFI_ACPI_DESCRIPTION_HEADER *) Pointer;
- Pointer += (sizeof (EFI_ACPI_DESCRIPTION_HEADER) + NewMaxTableNumber *
sizeof (UINT32));
- AcpiTableInstance->Rsdt3 = (EFI_ACPI_DESCRIPTION_HEADER *) Pointer;
- Pointer += (sizeof (EFI_ACPI_DESCRIPTION_HEADER) + NewMaxTableNumber *
sizeof (UINT32));
+ if ((PcdGet32 (PcdAcpiExposedTableVersions) & EFI_ACPI_TABLE_VERSION_1_0B)
!= 0) {
+ Pointer += (sizeof (EFI_ACPI_DESCRIPTION_HEADER) + NewMaxTableNumber *
sizeof (UINT32));
+ AcpiTableInstance->Rsdt3 = (EFI_ACPI_DESCRIPTION_HEADER *) Pointer;
+ Pointer += (sizeof (EFI_ACPI_DESCRIPTION_HEADER) + NewMaxTableNumber *
sizeof (UINT32));
+ }
AcpiTableInstance->Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *) Pointer;
//
// Update RSDP to point to the new Rsdt and Xsdt address.
//
- AcpiTableInstance->Rsdp1->RsdtAddress = (UINT32) (UINTN)
AcpiTableInstance->Rsdt1;
- AcpiTableInstance->Rsdp3->RsdtAddress = (UINT32) (UINTN)
AcpiTableInstance->Rsdt3;
+ if ((PcdGet32 (PcdAcpiExposedTableVersions) & EFI_ACPI_TABLE_VERSION_1_0B)
!= 0) {
+ AcpiTableInstance->Rsdp1->RsdtAddress = (UINT32) (UINTN)
AcpiTableInstance->Rsdt1;
+ AcpiTableInstance->Rsdp3->RsdtAddress = (UINT32) (UINTN)
AcpiTableInstance->Rsdt3;
+ }
CurrentData = (UINT64) (UINTN) AcpiTableInstance->Xsdt;
CopyMem (&AcpiTableInstance->Rsdp3->XsdtAddress, &CurrentData, sizeof
(UINT64));
//
// copy the original Rsdt1, Rsdt3 and Xsdt structure to new buffer
//
- CopyMem (AcpiTableInstance->Rsdt1, TempPrivateData.Rsdt1, (sizeof
(EFI_ACPI_DESCRIPTION_HEADER) + mEfiAcpiMaxNumTables * sizeof (UINT32)));
- CopyMem (AcpiTableInstance->Rsdt3, TempPrivateData.Rsdt3, (sizeof
(EFI_ACPI_DESCRIPTION_HEADER) + mEfiAcpiMaxNumTables * sizeof (UINT32)));
+ if ((PcdGet32 (PcdAcpiExposedTableVersions) & EFI_ACPI_TABLE_VERSION_1_0B)
!= 0) {
+ CopyMem (AcpiTableInstance->Rsdt1, TempPrivateData.Rsdt1, (sizeof
(EFI_ACPI_DESCRIPTION_HEADER) + mEfiAcpiMaxNumTables * sizeof (UINT32)));
+ CopyMem (AcpiTableInstance->Rsdt3, TempPrivateData.Rsdt3, (sizeof
(EFI_ACPI_DESCRIPTION_HEADER) + mEfiAcpiMaxNumTables * sizeof (UINT32)));
+ }
CopyMem (AcpiTableInstance->Xsdt, TempPrivateData.Xsdt, (sizeof
(EFI_ACPI_DESCRIPTION_HEADER) + mEfiAcpiMaxNumTables * sizeof (UINT64)));
//
// Calculate orignal ACPI table buffer size
//
- TotalSize = sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for ACPI 1.0
RSDT
- mEfiAcpiMaxNumTables * sizeof (UINT32) +
- sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for ACPI
2.0/3.0 RSDT
- mEfiAcpiMaxNumTables * sizeof (UINT32) +
- sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for ACPI
2.0/3.0 XSDT
+ TotalSize = sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for ACPI
2.0/3.0 XSDT
mEfiAcpiMaxNumTables * sizeof (UINT64);
+
+ if ((PcdGet32 (PcdAcpiExposedTableVersions) & EFI_ACPI_TABLE_VERSION_1_0B)
!= 0) {
+ TotalSize += sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for ACPI
1.0 RSDT
+ mEfiAcpiMaxNumTables * sizeof (UINT32) +
+ sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for ACPI
2.0/3.0 RSDT
+ mEfiAcpiMaxNumTables * sizeof (UINT32);
+ }
+
gBS->FreePages ((EFI_PHYSICAL_ADDRESS)(UINTN)TempPrivateData.Rsdt1,
EFI_SIZE_TO_PAGES (TotalSize));
//
@@ -494,7 +519,7 @@ AddTableToList (
//
ASSERT ((EFI_PAGE_SIZE % 64) == 0);
Status = gBS->AllocatePages (
- AllocateMaxAddress,
+ mAcpiTableAllocType,
EfiACPIMemoryNVS,
CurrentTableList->NumberOfPages,
&CurrentTableList->PageAddress
I believe the allocation for FACS should be also handled same with
BdsDxe, BootGraphicsResourceTableDxe, BootScriptExecutorDxe,
FirmwarePerformanceDataTableDxe, PiDxeS3BootScriptLib, CapsuleRuntimeDxe
as Jiewen said in [PATCH v3 2/4], because FACS will be got by AcpiS3Save
to ACPI_S3_CONTEXT.AcpiFacsTable in S3Ready() and
ACPI_S3_CONTEXT.AcpiFacsTable will be consumed by PEIM S3Resume2Pei in
S3ResumeBootOs().
@@ -504,7 +529,7 @@ AddTableToList (
// All other tables are ACPI reclaim memory, no alignment requirements.
//
Status = gBS->AllocatePages (
- AllocateMaxAddress,
+ mAcpiTableAllocType,
EfiACPIReclaimMemory,
CurrentTableList->NumberOfPages,
&CurrentTableList->PageAddress
[trimmed]
@@ -1625,22 +1688,27 @@ AcpiTableAcpiTableConstructor (
ZeroMem (Pointer, RsdpTableSize);
AcpiTableInstance->Rsdp1 = (EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER *)
Pointer;
- Pointer += sizeof (EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER);
+ if ((PcdGet32 (PcdAcpiExposedTableVersions) & EFI_ACPI_TABLE_VERSION_1_0B)
!= 0) {
+ Pointer += sizeof (EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER);
+ }
AcpiTableInstance->Rsdp3 = (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *)
Pointer;
//
// Create RSDT, XSDT structures
//
- TotalSize = sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for ACPI 1.0
RSDT
- mEfiAcpiMaxNumTables * sizeof (UINT32) +
- sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for ACPI
2.0/3.0 RSDT
- mEfiAcpiMaxNumTables * sizeof (UINT32) +
- sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for ACPI
2.0/3.0 XSDT
+ TotalSize = sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for ACPI
2.0/3.0 XSDT
mEfiAcpiMaxNumTables * sizeof (UINT64);
+ if ((PcdGet32 (PcdAcpiExposedTableVersions) & EFI_ACPI_TABLE_VERSION_1_0B)
!= 0) {
+ TotalSize += sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for ACPI 1.0
RSDT
+ mEfiAcpiMaxNumTables * sizeof (UINT32) +
+ sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for ACPI
2.0/3.0 RSDT
+ mEfiAcpiMaxNumTables * sizeof (UINT32);
+ }
+
//
// Allocate memory in the lower 32 bit of address range for
- // compatibility with ACPI 1.0 OS.
+ // compatibility with ACPI 1.0 OS if PcdAcpiAllocateTablesBelow4GB == TRUE
Where does PcdAcpiAllocateTablesBelow4GB from?
//
// This is done because ACPI 1.0 pointers are 32 bit values.
// ACPI 2.0 OS and all 64 bit OS must use the 64 bit ACPI table addresses.
@@ -1649,7 +1717,7 @@ AcpiTableAcpiTableConstructor (
//
PageAddress = 0xFFFFFFFF;
Status = gBS->AllocatePages (
- AllocateMaxAddress,
+ mAcpiTableAllocType,
EfiACPIReclaimMemory,
EFI_SIZE_TO_PAGES (TotalSize),
&PageAddress
@@ -1664,66 +1732,74 @@ AcpiTableAcpiTableConstructor (
ZeroMem (Pointer, TotalSize);
AcpiTableInstance->Rsdt1 = (EFI_ACPI_DESCRIPTION_HEADER *) Pointer;
- Pointer += (sizeof (EFI_ACPI_DESCRIPTION_HEADER) + EFI_ACPI_MAX_NUM_TABLES *
sizeof (UINT32));
- AcpiTableInstance->Rsdt3 = (EFI_ACPI_DESCRIPTION_HEADER *) Pointer;
- Pointer += (sizeof (EFI_ACPI_DESCRIPTION_HEADER) + EFI_ACPI_MAX_NUM_TABLES *
sizeof (UINT32));
+ if ((PcdGet32 (PcdAcpiExposedTableVersions) & EFI_ACPI_TABLE_VERSION_1_0B)
!= 0) {
+ Pointer += (sizeof (EFI_ACPI_DESCRIPTION_HEADER) + EFI_ACPI_MAX_NUM_TABLES
* sizeof (UINT32));
+ AcpiTableInstance->Rsdt3 = (EFI_ACPI_DESCRIPTION_HEADER *) Pointer;
+ Pointer += (sizeof (EFI_ACPI_DESCRIPTION_HEADER) + EFI_ACPI_MAX_NUM_TABLES
* sizeof (UINT32));
+ }
AcpiTableInstance->Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *) Pointer;
//
// Initialize RSDP
//
- CurrentData = EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER_SIGNATURE;
- CopyMem (&AcpiTableInstance->Rsdp1->Signature, &CurrentData, sizeof
(UINT64));
- CopyMem (AcpiTableInstance->Rsdp1->OemId, PcdGetPtr (PcdAcpiDefaultOemId), sizeof
(AcpiTableInstance->Rsdp1->OemId));
- AcpiTableInstance->Rsdp1->Reserved = EFI_ACPI_RESERVED_BYTE;
- AcpiTableInstance->Rsdp1->RsdtAddress = (UINT32) (UINTN)
AcpiTableInstance->Rsdt1;
+ if ((PcdGet32 (PcdAcpiExposedTableVersions) & EFI_ACPI_TABLE_VERSION_1_0B)
!= 0) {
+ CurrentData = EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER_SIGNATURE;
+ CopyMem (&AcpiTableInstance->Rsdp1->Signature, &CurrentData, sizeof
(UINT64));
+ CopyMem (AcpiTableInstance->Rsdp1->OemId, PcdGetPtr (PcdAcpiDefaultOemId),
sizeof (AcpiTableInstance->Rsdp1->OemId));
+ AcpiTableInstance->Rsdp1->Reserved = EFI_ACPI_RESERVED_BYTE;
+ AcpiTableInstance->Rsdp1->RsdtAddress = (UINT32) (UINTN)
AcpiTableInstance->Rsdt1;
+ }
CurrentData = EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER_SIGNATURE;
CopyMem (&AcpiTableInstance->Rsdp3->Signature, &CurrentData, sizeof
(UINT64));
CopyMem (AcpiTableInstance->Rsdp3->OemId, PcdGetPtr (PcdAcpiDefaultOemId), sizeof
(AcpiTableInstance->Rsdp3->OemId));
+ if ((PcdGet32 (PcdAcpiExposedTableVersions) & EFI_ACPI_TABLE_VERSION_1_0B)
!= 0) {
+ AcpiTableInstance->Rsdp3->RsdtAddress = (UINT32) (UINTN)
AcpiTableInstance->Rsdt3;
+ }
[MARK1]
AcpiTableInstance->Rsdp3->Revision =
EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER_REVISION;
- AcpiTableInstance->Rsdp3->RsdtAddress = (UINT32) (UINTN)
AcpiTableInstance->Rsdt3;
Why not to add the code [MARK1] at here that would still follow the
layout of Rsdp3 as the initialization sequence?
AcpiTableInstance->Rsdp3->Length = sizeof
(EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER);
CurrentData = (UINT64) (UINTN) AcpiTableInstance->Xsdt;
CopyMem (&AcpiTableInstance->Rsdp3->XsdtAddress, &CurrentData, sizeof
(UINT64));
SetMem (AcpiTableInstance->Rsdp3->Reserved, 3, EFI_ACPI_RESERVED_BYTE);
- //
- // Initialize Rsdt
- //
- // Note that we "reserve" one entry for the FADT so it can always be
- // at the beginning of the list of tables. Some OS don't seem
- // to find it correctly if it is too far down the list.
- //
- AcpiTableInstance->Rsdt1->Signature =
EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_TABLE_SIGNATURE;
- AcpiTableInstance->Rsdt1->Length = sizeof (EFI_ACPI_DESCRIPTION_HEADER);
- AcpiTableInstance->Rsdt1->Revision =
EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_TABLE_REVISION;
- CopyMem (AcpiTableInstance->Rsdt1->OemId, PcdGetPtr (PcdAcpiDefaultOemId), sizeof
(AcpiTableInstance->Rsdt1->OemId));
- CurrentData = PcdGet64 (PcdAcpiDefaultOemTableId);
- CopyMem (&AcpiTableInstance->Rsdt1->OemTableId, &CurrentData, sizeof
(UINT64));
- AcpiTableInstance->Rsdt1->OemRevision = PcdGet32
(PcdAcpiDefaultOemRevision);
- AcpiTableInstance->Rsdt1->CreatorId = PcdGet32
(PcdAcpiDefaultCreatorId);
- AcpiTableInstance->Rsdt1->CreatorRevision = PcdGet32
(PcdAcpiDefaultCreatorRevision);
- //
- // We always reserve first one for FADT
- //
- AcpiTableInstance->NumberOfTableEntries1 = 1;
- AcpiTableInstance->Rsdt1->Length = AcpiTableInstance->Rsdt1->Length
+ sizeof(UINT32);
-
- AcpiTableInstance->Rsdt3->Signature =
EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_TABLE_SIGNATURE;
- AcpiTableInstance->Rsdt3->Length = sizeof
(EFI_ACPI_DESCRIPTION_HEADER);
- AcpiTableInstance->Rsdt3->Revision =
EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_TABLE_REVISION;
- CopyMem (AcpiTableInstance->Rsdt3->OemId, PcdGetPtr (PcdAcpiDefaultOemId), sizeof
(AcpiTableInstance->Rsdt3->OemId));
- CurrentData = PcdGet64 (PcdAcpiDefaultOemTableId);
- CopyMem (&AcpiTableInstance->Rsdt3->OemTableId, &CurrentData, sizeof
(UINT64));
- AcpiTableInstance->Rsdt3->OemRevision = PcdGet32
(PcdAcpiDefaultOemRevision);
- AcpiTableInstance->Rsdt3->CreatorId = PcdGet32
(PcdAcpiDefaultCreatorId);
- AcpiTableInstance->Rsdt3->CreatorRevision = PcdGet32
(PcdAcpiDefaultCreatorRevision);
- //
- // We always reserve first one for FADT
- //
+ if ((PcdGet32 (PcdAcpiExposedTableVersions) & EFI_ACPI_TABLE_VERSION_1_0B)
!= 0) {
+ //
+ // Initialize Rsdt
+ //
+ // Note that we "reserve" one entry for the FADT so it can always be
+ // at the beginning of the list of tables. Some OS don't seem
+ // to find it correctly if it is too far down the list.
+ //
+ AcpiTableInstance->Rsdt1->Signature =
EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_TABLE_SIGNATURE;
+ AcpiTableInstance->Rsdt1->Length = sizeof (EFI_ACPI_DESCRIPTION_HEADER);
+ AcpiTableInstance->Rsdt1->Revision =
EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_TABLE_REVISION;
+ CopyMem (AcpiTableInstance->Rsdt1->OemId, PcdGetPtr (PcdAcpiDefaultOemId),
sizeof (AcpiTableInstance->Rsdt1->OemId));
+ CurrentData = PcdGet64 (PcdAcpiDefaultOemTableId);
+ CopyMem (&AcpiTableInstance->Rsdt1->OemTableId, &CurrentData, sizeof
(UINT64));
+ AcpiTableInstance->Rsdt1->OemRevision = PcdGet32
(PcdAcpiDefaultOemRevision);
+ AcpiTableInstance->Rsdt1->CreatorId = PcdGet32
(PcdAcpiDefaultCreatorId);
+ AcpiTableInstance->Rsdt1->CreatorRevision = PcdGet32
(PcdAcpiDefaultCreatorRevision);
+ //
+ // We always reserve first one for FADT
+ //
+ AcpiTableInstance->NumberOfTableEntries1 = 1;
+ AcpiTableInstance->Rsdt1->Length =
AcpiTableInstance->Rsdt1->Length + sizeof(UINT32);
+
+ AcpiTableInstance->Rsdt3->Signature =
EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_TABLE_SIGNATURE;
+ AcpiTableInstance->Rsdt3->Length = sizeof
(EFI_ACPI_DESCRIPTION_HEADER);
+ AcpiTableInstance->Rsdt3->Revision =
EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_TABLE_REVISION;
+ CopyMem (AcpiTableInstance->Rsdt3->OemId, PcdGetPtr (PcdAcpiDefaultOemId),
sizeof (AcpiTableInstance->Rsdt3->OemId));
+ CurrentData = PcdGet64 (PcdAcpiDefaultOemTableId);
+ CopyMem (&AcpiTableInstance->Rsdt3->OemTableId, &CurrentData, sizeof
(UINT64));
+ AcpiTableInstance->Rsdt3->OemRevision = PcdGet32
(PcdAcpiDefaultOemRevision);
+ AcpiTableInstance->Rsdt3->CreatorId = PcdGet32
(PcdAcpiDefaultCreatorId);
+ AcpiTableInstance->Rsdt3->CreatorRevision = PcdGet32
(PcdAcpiDefaultCreatorRevision);
+ //
+ // We always reserve first one for FADT
+ //
+ AcpiTableInstance->Rsdt3->Length =
AcpiTableInstance->Rsdt3->Length + sizeof(UINT32);
+ }
AcpiTableInstance->NumberOfTableEntries3 = 1;
- AcpiTableInstance->Rsdt3->Length = AcpiTableInstance->Rsdt3->Length
+ sizeof(UINT32);
//
// Initialize Xsdt
Thanks,
Star
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel