mirror of https://github.com/acidanthera/audk.git
Fix the bug in AcpiTableDxe drivers that doesn't work when more than 20 Acpi tables are installed.
Signed-off-by: lgao4 Signed-off-by: jljusten Reviewed-by: jyao1 git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12112 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
be5ec8c531
commit
37abfb7ea1
|
@ -457,11 +457,9 @@ ReallocateAcpiTableBuffer (
|
||||||
//
|
//
|
||||||
NewMaxTableNumber = mEfiAcpiMaxNumTables + EFI_ACPI_MAX_NUM_TABLES;
|
NewMaxTableNumber = mEfiAcpiMaxNumTables + EFI_ACPI_MAX_NUM_TABLES;
|
||||||
//
|
//
|
||||||
// Create RSDP, RSDT, XSDT structures and allocate all buffers
|
// Create RSDT, XSDT structures and allocate buffers.
|
||||||
//
|
//
|
||||||
TotalSize = sizeof (EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER) +
|
TotalSize = sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for ACPI 1.0 RSDT
|
||||||
sizeof (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER) +
|
|
||||||
sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for ACPI 1.0 RSDT
|
|
||||||
NewMaxTableNumber * sizeof (UINT32) +
|
NewMaxTableNumber * sizeof (UINT32) +
|
||||||
sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for ACPI 2.0/3.0 RSDT
|
sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for ACPI 2.0/3.0 RSDT
|
||||||
NewMaxTableNumber * sizeof (UINT32) +
|
NewMaxTableNumber * sizeof (UINT32) +
|
||||||
|
@ -492,25 +490,16 @@ ReallocateAcpiTableBuffer (
|
||||||
Pointer = (UINT8 *) (UINTN) PageAddress;
|
Pointer = (UINT8 *) (UINTN) PageAddress;
|
||||||
ZeroMem (Pointer, TotalSize);
|
ZeroMem (Pointer, TotalSize);
|
||||||
|
|
||||||
AcpiTableInstance->Rsdp1 = (EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER *) Pointer;
|
|
||||||
Pointer += sizeof (EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER);
|
|
||||||
AcpiTableInstance->Rsdp3 = (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *) Pointer;
|
|
||||||
Pointer += sizeof (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER);
|
|
||||||
|
|
||||||
AcpiTableInstance->Rsdt1 = (EFI_ACPI_DESCRIPTION_HEADER *) Pointer;
|
AcpiTableInstance->Rsdt1 = (EFI_ACPI_DESCRIPTION_HEADER *) Pointer;
|
||||||
Pointer += (sizeof (EFI_ACPI_DESCRIPTION_HEADER) + NewMaxTableNumber * sizeof (UINT32));
|
Pointer += (sizeof (EFI_ACPI_DESCRIPTION_HEADER) + NewMaxTableNumber * sizeof (UINT32));
|
||||||
AcpiTableInstance->Rsdt3 = (EFI_ACPI_DESCRIPTION_HEADER *) Pointer;
|
AcpiTableInstance->Rsdt3 = (EFI_ACPI_DESCRIPTION_HEADER *) Pointer;
|
||||||
Pointer += (sizeof (EFI_ACPI_DESCRIPTION_HEADER) + NewMaxTableNumber * sizeof (UINT32));
|
Pointer += (sizeof (EFI_ACPI_DESCRIPTION_HEADER) + NewMaxTableNumber * sizeof (UINT32));
|
||||||
|
|
||||||
AcpiTableInstance->Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *) Pointer;
|
AcpiTableInstance->Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *) Pointer;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Initialize RSDP
|
// Update RSDP to point to the new Rsdt and Xsdt address.
|
||||||
//
|
//
|
||||||
CopyMem (AcpiTableInstance->Rsdp1, TempPrivateData.Rsdp1, sizeof (EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER));
|
|
||||||
AcpiTableInstance->Rsdp1->RsdtAddress = (UINT32) (UINTN) AcpiTableInstance->Rsdt1;
|
AcpiTableInstance->Rsdp1->RsdtAddress = (UINT32) (UINTN) AcpiTableInstance->Rsdt1;
|
||||||
|
|
||||||
CopyMem (AcpiTableInstance->Rsdp3, TempPrivateData.Rsdp3, sizeof (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER));
|
|
||||||
AcpiTableInstance->Rsdp3->RsdtAddress = (UINT32) (UINTN) AcpiTableInstance->Rsdt3;
|
AcpiTableInstance->Rsdp3->RsdtAddress = (UINT32) (UINTN) AcpiTableInstance->Rsdt3;
|
||||||
CurrentData = (UINT64) (UINTN) AcpiTableInstance->Xsdt;
|
CurrentData = (UINT64) (UINTN) AcpiTableInstance->Xsdt;
|
||||||
CopyMem (&AcpiTableInstance->Rsdp3->XsdtAddress, &CurrentData, sizeof (UINT64));
|
CopyMem (&AcpiTableInstance->Rsdp3->XsdtAddress, &CurrentData, sizeof (UINT64));
|
||||||
|
@ -525,15 +514,13 @@ ReallocateAcpiTableBuffer (
|
||||||
//
|
//
|
||||||
// Calculate orignal ACPI table buffer size
|
// Calculate orignal ACPI table buffer size
|
||||||
//
|
//
|
||||||
TotalSize = sizeof (EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER) +
|
TotalSize = sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for ACPI 1.0 RSDT
|
||||||
sizeof (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER) +
|
|
||||||
sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for ACPI 1.0 RSDT
|
|
||||||
mEfiAcpiMaxNumTables * sizeof (UINT32) +
|
mEfiAcpiMaxNumTables * sizeof (UINT32) +
|
||||||
sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for ACPI 2.0/3.0 RSDT
|
sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for ACPI 2.0/3.0 RSDT
|
||||||
mEfiAcpiMaxNumTables * sizeof (UINT32) +
|
mEfiAcpiMaxNumTables * sizeof (UINT32) +
|
||||||
sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for ACPI 2.0/3.0 XSDT
|
sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for ACPI 2.0/3.0 XSDT
|
||||||
mEfiAcpiMaxNumTables * sizeof (UINT64);
|
mEfiAcpiMaxNumTables * sizeof (UINT64);
|
||||||
gBS->FreePages ((EFI_PHYSICAL_ADDRESS)(UINTN)TempPrivateData.Rsdp1, EFI_SIZE_TO_PAGES (TotalSize));
|
gBS->FreePages ((EFI_PHYSICAL_ADDRESS)(UINTN)TempPrivateData.Rsdt1, EFI_SIZE_TO_PAGES (TotalSize));
|
||||||
|
|
||||||
//
|
//
|
||||||
// Update the Max ACPI table number
|
// Update the Max ACPI table number
|
||||||
|
@ -1718,6 +1705,7 @@ AcpiTableAcpiTableConstructor (
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
UINT64 CurrentData;
|
UINT64 CurrentData;
|
||||||
UINTN TotalSize;
|
UINTN TotalSize;
|
||||||
|
UINTN RsdpTableSize;
|
||||||
UINT8 *Pointer;
|
UINT8 *Pointer;
|
||||||
EFI_PHYSICAL_ADDRESS PageAddress;
|
EFI_PHYSICAL_ADDRESS PageAddress;
|
||||||
|
|
||||||
|
@ -1737,12 +1725,34 @@ AcpiTableAcpiTableConstructor (
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Create RSDP, RSDT, XSDT structures
|
// Create RSDP table
|
||||||
// Allocate all buffers
|
|
||||||
//
|
//
|
||||||
TotalSize = sizeof (EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER) +
|
RsdpTableSize = sizeof (EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER) +
|
||||||
sizeof (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER) +
|
sizeof (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER);
|
||||||
sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for ACPI 1.0 RSDT
|
|
||||||
|
PageAddress = 0xFFFFFFFF;
|
||||||
|
Status = gBS->AllocatePages (
|
||||||
|
AllocateMaxAddress,
|
||||||
|
EfiACPIReclaimMemory,
|
||||||
|
EFI_SIZE_TO_PAGES (RsdpTableSize),
|
||||||
|
&PageAddress
|
||||||
|
);
|
||||||
|
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return EFI_OUT_OF_RESOURCES;
|
||||||
|
}
|
||||||
|
|
||||||
|
Pointer = (UINT8 *) (UINTN) PageAddress;
|
||||||
|
ZeroMem (Pointer, RsdpTableSize);
|
||||||
|
|
||||||
|
AcpiTableInstance->Rsdp1 = (EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER *) Pointer;
|
||||||
|
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) +
|
mEfiAcpiMaxNumTables * sizeof (UINT32) +
|
||||||
sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for ACPI 2.0/3.0 RSDT
|
sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for ACPI 2.0/3.0 RSDT
|
||||||
mEfiAcpiMaxNumTables * sizeof (UINT32) +
|
mEfiAcpiMaxNumTables * sizeof (UINT32) +
|
||||||
|
@ -1767,22 +1777,17 @@ AcpiTableAcpiTableConstructor (
|
||||||
);
|
);
|
||||||
|
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
|
gBS->FreePages ((EFI_PHYSICAL_ADDRESS)(UINTN)AcpiTableInstance->Rsdp1, EFI_SIZE_TO_PAGES (RsdpTableSize));
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
Pointer = (UINT8 *) (UINTN) PageAddress;
|
Pointer = (UINT8 *) (UINTN) PageAddress;
|
||||||
ZeroMem (Pointer, TotalSize);
|
ZeroMem (Pointer, TotalSize);
|
||||||
|
|
||||||
AcpiTableInstance->Rsdp1 = (EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER *) Pointer;
|
|
||||||
Pointer += sizeof (EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER);
|
|
||||||
AcpiTableInstance->Rsdp3 = (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *) Pointer;
|
|
||||||
Pointer += sizeof (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER);
|
|
||||||
|
|
||||||
AcpiTableInstance->Rsdt1 = (EFI_ACPI_DESCRIPTION_HEADER *) Pointer;
|
AcpiTableInstance->Rsdt1 = (EFI_ACPI_DESCRIPTION_HEADER *) Pointer;
|
||||||
Pointer += (sizeof (EFI_ACPI_DESCRIPTION_HEADER) + EFI_ACPI_MAX_NUM_TABLES * sizeof (UINT32));
|
Pointer += (sizeof (EFI_ACPI_DESCRIPTION_HEADER) + EFI_ACPI_MAX_NUM_TABLES * sizeof (UINT32));
|
||||||
AcpiTableInstance->Rsdt3 = (EFI_ACPI_DESCRIPTION_HEADER *) Pointer;
|
AcpiTableInstance->Rsdt3 = (EFI_ACPI_DESCRIPTION_HEADER *) Pointer;
|
||||||
Pointer += (sizeof (EFI_ACPI_DESCRIPTION_HEADER) + EFI_ACPI_MAX_NUM_TABLES * sizeof (UINT32));
|
Pointer += (sizeof (EFI_ACPI_DESCRIPTION_HEADER) + EFI_ACPI_MAX_NUM_TABLES * sizeof (UINT32));
|
||||||
|
|
||||||
AcpiTableInstance->Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *) Pointer;
|
AcpiTableInstance->Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *) Pointer;
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
Loading…
Reference in New Issue