/** @file Copyright (c) 2017 - 2019, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include EFI_GCD_MEMORY_SPACE_DESCRIPTOR *mAcpiGcdMemoryMap; EFI_GCD_IO_SPACE_DESCRIPTOR *mAcpiGcdIoMap; UINTN mAcpiGcdMemoryMapNumberOfDescriptors; UINTN mAcpiGcdIoMapNumberOfDescriptors; VOID DumpAcpiMadt ( IN EFI_ACPI_4_0_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER *Madt ); VOID DumpAcpiMcfg ( IN EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE_HEADER *Mcfg ); VOID DumpAcpiHpet ( IN EFI_ACPI_HIGH_PRECISION_EVENT_TIMER_TABLE_HEADER *Hpet ); VOID DumpAcpiDmar ( IN EFI_ACPI_DMAR_HEADER *Dmar ); VOID DumpAcpiWsmt ( IN EFI_ACPI_WSMT_TABLE *Wsmt ); VOID DumpAcpiTpm2 ( IN EFI_TPM2_ACPI_TABLE *Tpm2 ); VOID DumpAcpiTcpa ( IN EFI_ACPI_DESCRIPTION_HEADER *Tcpa ); EFI_STATUS CheckAcpiMadt ( IN EFI_ACPI_4_0_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER *Madt ); EFI_STATUS CheckAcpiMcfg ( IN EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE_HEADER *Mcfg ); EFI_STATUS CheckAcpiHpet ( IN EFI_ACPI_HIGH_PRECISION_EVENT_TIMER_TABLE_HEADER *Hpet ); EFI_STATUS CheckAcpiDmar ( IN EFI_ACPI_DMAR_HEADER *Dmar ); EFI_STATUS CheckAcpiTpm2 ( IN EFI_TPM2_ACPI_TABLE *Tpm2 ); EFI_STATUS CheckAcpiTcpa ( IN EFI_ACPI_DESCRIPTION_HEADER *Tcpa ); VOID TestPointDumpGcd ( OUT EFI_GCD_MEMORY_SPACE_DESCRIPTOR **GcdMemoryMap, OPTIONAL OUT UINTN *GcdMemoryMapNumberOfDescriptors, OPTIONAL OUT EFI_GCD_IO_SPACE_DESCRIPTOR **GcdIoMap, OPTIONAL OUT UINTN *GcdIoMapNumberOfDescriptors, OPTIONAL IN BOOLEAN DumpPrint ); BOOLEAN IsMmioExit ( IN EFI_PHYSICAL_ADDRESS BaseAddress, IN UINT64 Length, IN BOOLEAN CheckAllocated ) { UINTN Index; for (Index = 0; Index < mAcpiGcdMemoryMapNumberOfDescriptors; Index++) { if (mAcpiGcdMemoryMap[Index].GcdMemoryType != EfiGcdMemoryTypeMemoryMappedIo) { continue; } if ((BaseAddress >= mAcpiGcdMemoryMap[Index].BaseAddress) && (BaseAddress + Length <= mAcpiGcdMemoryMap[Index].BaseAddress + mAcpiGcdMemoryMap[Index].Length)) { if (CheckAllocated) { if (mAcpiGcdMemoryMap[Index].ImageHandle != NULL) { return TRUE; } else { return FALSE; } } else { return TRUE; } } } return FALSE; } BOOLEAN IsIoExit ( IN EFI_PHYSICAL_ADDRESS BaseAddress, IN UINT64 Length, IN BOOLEAN CheckAllocated ) { UINTN Index; for (Index = 0; Index < mAcpiGcdIoMapNumberOfDescriptors; Index++) { if (mAcpiGcdIoMap[Index].GcdIoType != EfiGcdIoTypeIo) { continue; } if ((BaseAddress >= mAcpiGcdIoMap[Index].BaseAddress) && (BaseAddress + Length <= mAcpiGcdIoMap[Index].BaseAddress + mAcpiGcdIoMap[Index].Length)) { if (CheckAllocated) { if (mAcpiGcdIoMap[Index].ImageHandle != NULL) { return TRUE; } else { return FALSE; } } else { return TRUE; } } } return FALSE; } VOID DumpCharArray ( IN CHAR8 *Ch, IN UINTN Size ) { UINTN Index; for (Index = 0; Index < Size; Index++) { DEBUG ((DEBUG_INFO, "%c", Ch[Index])); } } VOID DumpAcpiTableHeader ( IN EFI_ACPI_DESCRIPTION_HEADER *Table ) { DEBUG ((DEBUG_INFO, " ")); DumpCharArray ((CHAR8 *)&Table->Signature, sizeof(Table->Signature)); DEBUG ((DEBUG_INFO, " : (0x%016lx) 0x%02x \'", Table, Table->Revision)); DumpCharArray ((CHAR8 *)Table->OemId, sizeof(Table->OemId)); DEBUG ((DEBUG_INFO, "\' \'")); DumpCharArray ((CHAR8 *)&Table->OemTableId, sizeof(Table->OemTableId)); DEBUG ((DEBUG_INFO, "\' 0x%08x \'", Table->OemRevision)); DumpCharArray ((CHAR8 *)&Table->CreatorId, sizeof(Table->CreatorId)); DEBUG ((DEBUG_INFO, "\' 0x%08x |\n", Table->CreatorRevision)); } VOID DumpAcpiFadt ( IN EFI_ACPI_5_0_FIXED_ACPI_DESCRIPTION_TABLE *Fadt ) { DumpAcpiTableHeader (&Fadt->Header); DEBUG ((DEBUG_INFO, " ")); DEBUG ((DEBUG_INFO, " SCI=0x%04x", Fadt->SciInt)); DEBUG ((DEBUG_INFO, " SMI=0x%08x", Fadt->SmiCmd)); DEBUG ((DEBUG_INFO, " AcpiEnable=0x%02x", Fadt->AcpiEnable)); DEBUG ((DEBUG_INFO, " AcpiDisable=0x%02x", Fadt->AcpiDisable)); DEBUG ((DEBUG_INFO, "\n")); } EFI_STATUS CheckAcpiFadt ( IN EFI_ACPI_5_0_FIXED_ACPI_DESCRIPTION_TABLE *Fadt ) { if (Fadt->SmiCmd != 0) { if (!IsIoExit (Fadt->SmiCmd, 1, TRUE)) { DEBUG ((DEBUG_ERROR, "FADT.SmiCmd resource (0x%x) is not reported correctly.\n", Fadt->SmiCmd)); return EFI_NOT_STARTED; } } if (Fadt->Pm1aEvtBlk != 0) { if (!IsIoExit (Fadt->Pm1aEvtBlk, Fadt->Pm1EvtLen, TRUE)) { DEBUG ((DEBUG_ERROR, "FADT.Pm1aEvtBlk resource (0x%x) is not reported correctly.\n", Fadt->Pm1aEvtBlk)); return EFI_NOT_STARTED; } } if (Fadt->Pm1bEvtBlk != 0) { if (!IsIoExit (Fadt->Pm1bEvtBlk, Fadt->Pm1EvtLen, TRUE)) { DEBUG ((DEBUG_ERROR, "FADT.Pm1bEvtBlk resource (0x%x) is not reported correctly.\n", Fadt->Pm1bEvtBlk)); return EFI_NOT_STARTED; } } if (Fadt->Pm1aCntBlk != 0) { if (!IsIoExit (Fadt->Pm1aCntBlk, Fadt->Pm1CntLen, TRUE)) { DEBUG ((DEBUG_ERROR, "FADT.Pm1aCntBlk resource (0x%x) is not reported correctly.\n", Fadt->Pm1aCntBlk)); return EFI_NOT_STARTED; } } if (Fadt->Pm1bCntBlk != 0) { if (!IsIoExit (Fadt->Pm1bCntBlk, Fadt->Pm1CntLen, TRUE)) { DEBUG ((DEBUG_ERROR, "FADT.Pm1bCntBlk resource (0x%x) is not reported correctly.\n", Fadt->Pm1bCntBlk)); return EFI_NOT_STARTED; } } if (Fadt->Pm2CntBlk != 0) { if (!IsIoExit (Fadt->Pm2CntBlk, Fadt->Pm2CntLen, TRUE)) { DEBUG ((DEBUG_ERROR, "FADT.Pm2CntBlk resource (0x%x) is not reported correctly.\n", Fadt->Pm2CntBlk)); return EFI_NOT_STARTED; } } if (Fadt->PmTmrBlk != 0) { if (!IsIoExit (Fadt->PmTmrBlk, Fadt->PmTmrLen, TRUE)) { DEBUG ((DEBUG_ERROR, "FADT.PmTmrBlk resource (0x%x) is not reported correctly.\n", Fadt->PmTmrBlk)); return EFI_NOT_STARTED; } } if (Fadt->Gpe0Blk != 0) { if (!IsIoExit (Fadt->Gpe0Blk, Fadt->Gpe0BlkLen, TRUE)) { DEBUG ((DEBUG_ERROR, "FADT.Gpe0Blk resource (0x%x) is not reported correctly.\n", Fadt->Gpe0Blk)); return EFI_NOT_STARTED; } } if (Fadt->Gpe1Blk != 0) { if (!IsIoExit (Fadt->Gpe1Blk, Fadt->Gpe1BlkLen, TRUE)) { DEBUG ((DEBUG_ERROR, "FADT.Gpe1Blk resource (0x%x) is not reported correctly.\n", Fadt->Gpe1Blk)); return EFI_NOT_STARTED; } } if (Fadt->Header.Length > OFFSET_OF(EFI_ACPI_5_0_FIXED_ACPI_DESCRIPTION_TABLE, ResetReg)) { if (Fadt->ResetReg.Address != 0) { switch (Fadt->ResetReg.AddressSpaceId) { case EFI_ACPI_5_0_SYSTEM_MEMORY: if (!IsMmioExit (Fadt->ResetReg.Address, Fadt->ResetReg.RegisterBitWidth/8, TRUE)) { DEBUG ((DEBUG_ERROR, "FADT.ResetReg resource (0x%x) is not reported correctly.\n", Fadt->ResetReg.Address)); return EFI_NOT_STARTED; } break; case EFI_ACPI_5_0_SYSTEM_IO: if (!IsIoExit (Fadt->ResetReg.Address, Fadt->ResetReg.RegisterBitWidth/8, TRUE)) { DEBUG ((DEBUG_ERROR, "FADT.ResetReg resource (0x%x) is not reported correctly.\n", Fadt->ResetReg.Address)); return EFI_NOT_STARTED; } break; } } } if (Fadt->Header.Length > OFFSET_OF(EFI_ACPI_5_0_FIXED_ACPI_DESCRIPTION_TABLE, XPm1aEvtBlk)) { if (Fadt->XPm1aEvtBlk.Address != 0) { switch (Fadt->XPm1aEvtBlk.AddressSpaceId) { case EFI_ACPI_5_0_SYSTEM_MEMORY: if (!IsMmioExit (Fadt->XPm1aEvtBlk.Address, Fadt->XPm1aEvtBlk.RegisterBitWidth/8, TRUE)) { DEBUG ((DEBUG_ERROR, "FADT.XPm1aEvtBlk resource (0x%x) is not reported correctly.\n", Fadt->XPm1aEvtBlk.Address)); return EFI_NOT_STARTED; } break; case EFI_ACPI_5_0_SYSTEM_IO: if (!IsIoExit (Fadt->XPm1aEvtBlk.Address, Fadt->XPm1aEvtBlk.RegisterBitWidth/8, TRUE)) { DEBUG ((DEBUG_ERROR, "FADT.XPm1aEvtBlk resource (0x%x) is not reported correctly.\n", Fadt->XPm1aEvtBlk.Address)); return EFI_NOT_STARTED; } break; } } } if (Fadt->Header.Length > OFFSET_OF(EFI_ACPI_5_0_FIXED_ACPI_DESCRIPTION_TABLE, XPm1bEvtBlk)) { if (Fadt->XPm1bEvtBlk.Address != 0) { switch (Fadt->XPm1bEvtBlk.AddressSpaceId) { case EFI_ACPI_5_0_SYSTEM_MEMORY: if (!IsMmioExit (Fadt->XPm1bEvtBlk.Address, Fadt->XPm1bEvtBlk.RegisterBitWidth/8, TRUE)) { DEBUG ((DEBUG_ERROR, "FADT.XPm1bEvtBlk resource (0x%x) is not reported correctly.\n", Fadt->XPm1bEvtBlk.Address)); return EFI_NOT_STARTED; } break; case EFI_ACPI_5_0_SYSTEM_IO: if (!IsIoExit (Fadt->XPm1bEvtBlk.Address, Fadt->XPm1bEvtBlk.RegisterBitWidth/8, TRUE)) { DEBUG ((DEBUG_ERROR, "FADT.XPm1bEvtBlk resource (0x%x) is not reported correctly.\n", Fadt->XPm1bEvtBlk.Address)); return EFI_NOT_STARTED; } break; } } } if (Fadt->Header.Length > OFFSET_OF(EFI_ACPI_5_0_FIXED_ACPI_DESCRIPTION_TABLE, XPm1aCntBlk)) { if (Fadt->XPm1aCntBlk.Address != 0) { switch (Fadt->XPm1aCntBlk.AddressSpaceId) { case EFI_ACPI_5_0_SYSTEM_MEMORY: if (!IsMmioExit (Fadt->XPm1aCntBlk.Address, Fadt->XPm1aCntBlk.RegisterBitWidth/8, TRUE)) { DEBUG ((DEBUG_ERROR, "FADT.XPm1aCntBlk resource (0x%x) is not reported correctly.\n", Fadt->XPm1aCntBlk.Address)); return EFI_NOT_STARTED; } break; case EFI_ACPI_5_0_SYSTEM_IO: if (!IsIoExit (Fadt->XPm1aCntBlk.Address, Fadt->XPm1aCntBlk.RegisterBitWidth/8, TRUE)) { DEBUG ((DEBUG_ERROR, "FADT.XPm1aCntBlk resource (0x%x) is not reported correctly.\n", Fadt->XPm1aCntBlk.Address)); return EFI_NOT_STARTED; } break; } } } if (Fadt->Header.Length > OFFSET_OF(EFI_ACPI_5_0_FIXED_ACPI_DESCRIPTION_TABLE, XPm1bCntBlk)) { if (Fadt->XPm1bCntBlk.Address != 0) { switch (Fadt->XPm1bCntBlk.AddressSpaceId) { case EFI_ACPI_5_0_SYSTEM_MEMORY: if (!IsMmioExit (Fadt->XPm1bCntBlk.Address, Fadt->XPm1bCntBlk.RegisterBitWidth/8, TRUE)) { DEBUG ((DEBUG_ERROR, "FADT.XPm1bCntBlk resource (0x%x) is not reported correctly.\n", Fadt->XPm1bCntBlk.Address)); return EFI_NOT_STARTED; } break; case EFI_ACPI_5_0_SYSTEM_IO: if (!IsIoExit (Fadt->XPm1bCntBlk.Address, Fadt->XPm1bCntBlk.RegisterBitWidth/8, TRUE)) { DEBUG ((DEBUG_ERROR, "FADT.XPm1bCntBlk resource (0x%x) is not reported correctly.\n", Fadt->XPm1bCntBlk.Address)); return EFI_NOT_STARTED; } break; } } } if (Fadt->Header.Length > OFFSET_OF(EFI_ACPI_5_0_FIXED_ACPI_DESCRIPTION_TABLE, XPm2CntBlk)) { if (Fadt->XPm2CntBlk.Address != 0) { switch (Fadt->XPm2CntBlk.AddressSpaceId) { case EFI_ACPI_5_0_SYSTEM_MEMORY: if (!IsMmioExit (Fadt->XPm2CntBlk.Address, Fadt->XPm2CntBlk.RegisterBitWidth/8, TRUE)) { DEBUG ((DEBUG_ERROR, "FADT.XPm2CntBlk resource (0x%x) is not reported correctly.\n", Fadt->XPm2CntBlk.Address)); return EFI_NOT_STARTED; } break; case EFI_ACPI_5_0_SYSTEM_IO: if (!IsIoExit (Fadt->XPm2CntBlk.Address, Fadt->XPm2CntBlk.RegisterBitWidth/8, TRUE)) { DEBUG ((DEBUG_ERROR, "FADT.XPm2CntBlk resource (0x%x) is not reported correctly.\n", Fadt->XPm2CntBlk.Address)); return EFI_NOT_STARTED; } break; } } } if (Fadt->Header.Length > OFFSET_OF(EFI_ACPI_5_0_FIXED_ACPI_DESCRIPTION_TABLE, XPmTmrBlk)) { if (Fadt->XPmTmrBlk.Address != 0) { switch (Fadt->XPmTmrBlk.AddressSpaceId) { case EFI_ACPI_5_0_SYSTEM_MEMORY: if (!IsMmioExit (Fadt->XPmTmrBlk.Address, Fadt->XPmTmrBlk.RegisterBitWidth/8, TRUE)) { DEBUG ((DEBUG_ERROR, "FADT.XPmTmrBlk resource (0x%x) is not reported correctly.\n", Fadt->XPmTmrBlk.Address)); return EFI_NOT_STARTED; } break; case EFI_ACPI_5_0_SYSTEM_IO: if (!IsIoExit (Fadt->XPmTmrBlk.Address, Fadt->XPmTmrBlk.RegisterBitWidth/8, TRUE)) { DEBUG ((DEBUG_ERROR, "FADT.XPmTmrBlk resource (0x%x) is not reported correctly.\n", Fadt->XPmTmrBlk.Address)); return EFI_NOT_STARTED; } break; } } } if (Fadt->Header.Length > OFFSET_OF(EFI_ACPI_5_0_FIXED_ACPI_DESCRIPTION_TABLE, XGpe0Blk)) { if (Fadt->XGpe0Blk.Address != 0) { switch (Fadt->XGpe0Blk.AddressSpaceId) { case EFI_ACPI_5_0_SYSTEM_MEMORY: if (!IsMmioExit (Fadt->XGpe0Blk.Address, Fadt->XGpe0Blk.RegisterBitWidth/8, TRUE)) { DEBUG ((DEBUG_ERROR, "FADT.XGpe0Blk resource (0x%x) is not reported correctly.\n", Fadt->XGpe0Blk.Address)); return EFI_NOT_STARTED; } break; case EFI_ACPI_5_0_SYSTEM_IO: if (!IsIoExit (Fadt->XGpe0Blk.Address, Fadt->XGpe0Blk.RegisterBitWidth/8, TRUE)) { DEBUG ((DEBUG_ERROR, "FADT.XGpe0Blk resource (0x%x) is not reported correctly.\n", Fadt->XGpe0Blk.Address)); return EFI_NOT_STARTED; } break; } } } if (Fadt->Header.Length > OFFSET_OF(EFI_ACPI_5_0_FIXED_ACPI_DESCRIPTION_TABLE, XGpe1Blk)) { if (Fadt->XGpe1Blk.Address != 0) { switch (Fadt->XGpe1Blk.AddressSpaceId) { case EFI_ACPI_5_0_SYSTEM_MEMORY: if (!IsMmioExit (Fadt->XGpe1Blk.Address, Fadt->XGpe1Blk.RegisterBitWidth/8, TRUE)) { DEBUG ((DEBUG_ERROR, "FADT.XGpe1Blk resource (0x%x) is not reported correctly.\n", Fadt->XGpe1Blk.Address)); return EFI_NOT_STARTED; } break; case EFI_ACPI_5_0_SYSTEM_IO: if (!IsIoExit (Fadt->XGpe1Blk.Address, Fadt->XGpe1Blk.RegisterBitWidth/8, TRUE)) { DEBUG ((DEBUG_ERROR, "FADT.XGpe1Blk resource (0x%x) is not reported correctly.\n", Fadt->XGpe1Blk.Address)); return EFI_NOT_STARTED; } break; } } } if (Fadt->Header.Length > OFFSET_OF(EFI_ACPI_5_0_FIXED_ACPI_DESCRIPTION_TABLE, SleepControlReg)) { if (Fadt->SleepControlReg.Address != 0) { switch (Fadt->SleepControlReg.AddressSpaceId) { case EFI_ACPI_5_0_SYSTEM_MEMORY: if (!IsMmioExit (Fadt->SleepControlReg.Address, Fadt->SleepControlReg.RegisterBitWidth/8, TRUE)) { DEBUG ((DEBUG_ERROR, "FADT.SleepControlReg resource (0x%x) is not reported correctly.\n", Fadt->SleepControlReg.Address)); return EFI_NOT_STARTED; } break; case EFI_ACPI_5_0_SYSTEM_IO: if (!IsIoExit (Fadt->SleepControlReg.Address, Fadt->SleepControlReg.RegisterBitWidth/8, TRUE)) { DEBUG ((DEBUG_ERROR, "FADT.SleepControlReg resource (0x%x) is not reported correctly.\n", Fadt->SleepControlReg.Address)); return EFI_NOT_STARTED; } break; } } } if (Fadt->Header.Length > OFFSET_OF(EFI_ACPI_5_0_FIXED_ACPI_DESCRIPTION_TABLE, SleepStatusReg)) { if (Fadt->SleepStatusReg.Address != 0) { switch (Fadt->SleepStatusReg.AddressSpaceId) { case EFI_ACPI_5_0_SYSTEM_MEMORY: if (!IsMmioExit (Fadt->SleepStatusReg.Address, Fadt->SleepStatusReg.RegisterBitWidth/8, TRUE)) { DEBUG ((DEBUG_ERROR, "FADT.SleepStatusReg resource (0x%x) is not reported correctly.\n", Fadt->SleepStatusReg.Address)); return EFI_NOT_STARTED; } break; case EFI_ACPI_5_0_SYSTEM_IO: if (!IsIoExit (Fadt->SleepStatusReg.Address, Fadt->SleepStatusReg.RegisterBitWidth/8, TRUE)) { DEBUG ((DEBUG_ERROR, "FADT.SleepStatusReg resource (0x%x) is not reported correctly.\n", Fadt->SleepStatusReg.Address)); return EFI_NOT_STARTED; } break; } } } return EFI_SUCCESS; } VOID DumpAcpiFacs ( IN EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *Facs ) { DEBUG ((DEBUG_INFO, " ")); DumpCharArray ((CHAR8 *)&Facs->Signature, sizeof(Facs->Signature)); DEBUG ((DEBUG_INFO, " : (0x%016lx) 0x%02x\n", Facs, Facs->Version)); DEBUG ((DEBUG_INFO, " ")); DEBUG ((DEBUG_INFO, " HardwareSignature=%08x\n", Facs->HardwareSignature)); } VOID DumpAcpiTable ( IN EFI_ACPI_DESCRIPTION_HEADER *Table ) { EFI_ACPI_5_0_FIXED_ACPI_DESCRIPTION_TABLE *Fadt; if (Table == NULL) { return ; } switch (Table->Signature) { case EFI_ACPI_5_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE: Fadt = (EFI_ACPI_5_0_FIXED_ACPI_DESCRIPTION_TABLE *)Table; DumpAcpiFadt (Fadt); if (Fadt->Header.Revision >= EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE_REVISION) { if (Fadt->XFirmwareCtrl != 0) { DumpAcpiFacs ((EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *)(UINTN)Fadt->XFirmwareCtrl); } else { DumpAcpiFacs ((EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *)(UINTN)Fadt->FirmwareCtrl); } if (Fadt->XDsdt != 0) { DumpAcpiTable ((EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Fadt->XDsdt); } else { DumpAcpiTable ((EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Fadt->Dsdt); } } else { DumpAcpiFacs ((EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *)(UINTN)Fadt->FirmwareCtrl); DumpAcpiTable ((EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Fadt->Dsdt); } break; case EFI_ACPI_4_0_MULTIPLE_APIC_DESCRIPTION_TABLE_SIGNATURE: DumpAcpiMadt ((EFI_ACPI_4_0_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER *)Table); break; case EFI_ACPI_2_0_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE_SIGNATURE: DumpAcpiMcfg ((EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE_HEADER *)Table); break; case EFI_ACPI_3_0_HIGH_PRECISION_EVENT_TIMER_TABLE_SIGNATURE: DumpAcpiHpet ((EFI_ACPI_HIGH_PRECISION_EVENT_TIMER_TABLE_HEADER *)Table); break; case EFI_ACPI_4_0_DMA_REMAPPING_TABLE_SIGNATURE: DumpAcpiDmar ((EFI_ACPI_DMAR_HEADER *)Table); break; case EFI_ACPI_WINDOWS_SMM_SECURITY_MITIGATION_TABLE_SIGNATURE: DumpAcpiWsmt ((EFI_ACPI_WSMT_TABLE *)Table); break; case EFI_ACPI_5_0_TRUSTED_COMPUTING_PLATFORM_2_TABLE_SIGNATURE: DumpAcpiTpm2 ((EFI_TPM2_ACPI_TABLE *)Table); break; case EFI_ACPI_3_0_TRUSTED_COMPUTING_PLATFORM_ALLIANCE_CAPABILITIES_TABLE_SIGNATURE: DumpAcpiTcpa ((VOID *)Table); break; default: DumpAcpiTableHeader (Table); break; } } EFI_STATUS CheckAcpiTableResource ( IN EFI_ACPI_DESCRIPTION_HEADER *Table ) { EFI_ACPI_5_0_FIXED_ACPI_DESCRIPTION_TABLE *Fadt; if (Table == NULL) { return EFI_INVALID_PARAMETER; } switch (Table->Signature) { case EFI_ACPI_5_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE: Fadt = (EFI_ACPI_5_0_FIXED_ACPI_DESCRIPTION_TABLE *)Table; CheckAcpiFadt (Fadt); if (Fadt->Header.Revision >= EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE_REVISION) { if (Fadt->XFirmwareCtrl != 0) { // CheckAcpiFacs ((EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *)(UINTN)Fadt->XFirmwareCtrl); } else { // CheckAcpiFacs ((EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *)(UINTN)Fadt->FirmwareCtrl); } if (Fadt->XDsdt != 0) { // CheckAcpiDsdt ((EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Fadt->XDsdt); } else { // CheckAcpiDsdt ((EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Fadt->Dsdt); } } else { // CheckAcpiFacs ((EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *)(UINTN)Fadt->FirmwareCtrl); // CheckAcpiDsdt ((EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Fadt->Dsdt); } break; case EFI_ACPI_4_0_MULTIPLE_APIC_DESCRIPTION_TABLE_SIGNATURE: return CheckAcpiMadt ((EFI_ACPI_4_0_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER *)Table); break; case EFI_ACPI_2_0_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE_SIGNATURE: return CheckAcpiMcfg ((EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE_HEADER *)Table); break; case EFI_ACPI_3_0_HIGH_PRECISION_EVENT_TIMER_TABLE_SIGNATURE: return CheckAcpiHpet ((EFI_ACPI_HIGH_PRECISION_EVENT_TIMER_TABLE_HEADER *)Table); break; case EFI_ACPI_4_0_DMA_REMAPPING_TABLE_SIGNATURE: return CheckAcpiDmar ((EFI_ACPI_DMAR_HEADER *)Table); break; case EFI_ACPI_WINDOWS_SMM_SECURITY_MITIGATION_TABLE_SIGNATURE: // CheckAcpiWsmt ((EFI_ACPI_WSMT_TABLE *)Table); break; case EFI_ACPI_5_0_TRUSTED_COMPUTING_PLATFORM_2_TABLE_SIGNATURE: return CheckAcpiTpm2 ((EFI_TPM2_ACPI_TABLE *)Table); break; case EFI_ACPI_3_0_TRUSTED_COMPUTING_PLATFORM_ALLIANCE_CAPABILITIES_TABLE_SIGNATURE: return CheckAcpiTcpa ((VOID *)Table); break; default: break; } return EFI_SUCCESS; } EFI_STATUS DumpAcpiRsdt ( IN EFI_ACPI_DESCRIPTION_HEADER *Rsdt, IN UINT32 *Signature, OPTIONAL OUT VOID **OutTable, OPTIONAL IN BOOLEAN DumpPrint, IN BOOLEAN CheckResource ) { UINTN Index; UINT32 EntryCount; UINT32 *EntryPtr; EFI_ACPI_DESCRIPTION_HEADER *Table; EFI_STATUS Status; EFI_STATUS ReturnStatus; if (Rsdt == NULL) { return EFI_INVALID_PARAMETER; } if (OutTable != NULL) { *OutTable = NULL; } else if ((OutTable == NULL) && (Signature != NULL)) { return EFI_INVALID_PARAMETER; } ReturnStatus = EFI_SUCCESS; EntryCount = (Rsdt->Length - sizeof (EFI_ACPI_DESCRIPTION_HEADER)) / sizeof(UINT32); EntryPtr = (UINT32 *)(Rsdt + 1); for (Index = 0; Index < EntryCount; Index ++, EntryPtr ++) { Table = (EFI_ACPI_DESCRIPTION_HEADER *)((UINTN)(*EntryPtr)); if (DumpPrint) { DumpAcpiTable (Table); } if (CheckResource) { Status = CheckAcpiTableResource (Table); if (EFI_ERROR(Status)) { ReturnStatus = Status; } } if (Signature != NULL && Table->Signature == *Signature) { *OutTable = Table; } } if (OutTable != NULL) { if (*OutTable == NULL) { return EFI_NOT_FOUND; } } return ReturnStatus; } EFI_STATUS DumpAcpiXsdt ( IN EFI_ACPI_DESCRIPTION_HEADER *Xsdt, IN UINT32 *Signature, OPTIONAL OUT VOID **OutTable, OPTIONAL IN BOOLEAN DumpPrint, IN BOOLEAN CheckResource ) { UINTN Index; UINT32 EntryCount; UINT64 EntryPtr; UINTN BasePtr; EFI_ACPI_DESCRIPTION_HEADER *Table; EFI_STATUS Status; EFI_STATUS ReturnStatus; if (Xsdt == NULL) { return EFI_INVALID_PARAMETER; } if (OutTable != NULL) { *OutTable = NULL; } else if ((OutTable == NULL) && (Signature != NULL)) { return EFI_INVALID_PARAMETER; } ReturnStatus = EFI_SUCCESS; EntryCount = (Xsdt->Length - sizeof (EFI_ACPI_DESCRIPTION_HEADER)) / sizeof(UINT64); BasePtr = (UINTN)(Xsdt + 1); for (Index = 0; Index < EntryCount; Index ++) { CopyMem (&EntryPtr, (VOID *)(BasePtr + Index * sizeof(UINT64)), sizeof(UINT64)); Table = (EFI_ACPI_DESCRIPTION_HEADER *)((UINTN)(EntryPtr)); if (DumpPrint) { DumpAcpiTable (Table); } if (CheckResource) { Status = CheckAcpiTableResource (Table); if (EFI_ERROR(Status)) { ReturnStatus = Status; } } if (Signature != NULL && Table->Signature == *Signature) { *OutTable = Table; } } if (OutTable != NULL) { if (*OutTable == NULL) { return EFI_NOT_FOUND; } } return ReturnStatus; } EFI_STATUS DumpAcpiRsdp ( IN EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER *Rsdp, IN UINT32 *Signature, OPTIONAL OUT VOID **Table, IN BOOLEAN DumpPrint, IN BOOLEAN CheckResource ) { EFI_STATUS Status; EFI_ACPI_DESCRIPTION_HEADER *Rsdt; EFI_ACPI_DESCRIPTION_HEADER *Xsdt; if (DumpPrint) { DumpCharArray ((CHAR8 *)&Rsdp->Signature, sizeof(Rsdp->Signature)); DEBUG ((DEBUG_INFO, ": (0x%016lx) 0x%02x \'", Rsdp, Rsdp->Revision)); DumpCharArray ((CHAR8 *)Rsdp->OemId, sizeof(Rsdp->OemId)); DEBUG ((DEBUG_INFO, "\'\n")); DEBUG ((DEBUG_INFO, " ")); DEBUG ((DEBUG_INFO, " RSDT=0x%08x XSDT=0x%016lx\n", Rsdp->RsdtAddress, Rsdp->XsdtAddress)); if (Rsdp->Revision >= EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER_REVISION) { DumpAcpiTable ((EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Rsdp->XsdtAddress); } DumpAcpiTable ((EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Rsdp->RsdtAddress); } // // Search XSDT // if (Rsdp->Revision >= EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER_REVISION) { Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN) Rsdp->XsdtAddress; Status = DumpAcpiXsdt (Xsdt, Signature, Table, DumpPrint, CheckResource); } else { // // Search RSDT // Rsdt = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN) Rsdp->RsdtAddress; Status = DumpAcpiRsdt (Rsdt, Signature, Table, DumpPrint, CheckResource); } return Status; } EFI_STATUS DumpAcpiWithGuid ( IN EFI_GUID *AcpiTableGuid, IN UINT32 *Signature, OPTIONAL OUT VOID **Table, IN BOOLEAN DumpPrint, IN BOOLEAN CheckResource ) { VOID *Rsdp; EFI_STATUS Status; Status = EfiGetSystemConfigurationTable (AcpiTableGuid, &Rsdp); if (EFI_ERROR(Status)) { return EFI_NOT_FOUND; } Status = DumpAcpiRsdp (Rsdp, Signature, Table, DumpPrint, CheckResource); return Status; } EFI_STATUS TestPointCheckAcpi ( VOID ) { EFI_STATUS Status; DEBUG ((DEBUG_INFO, "==== TestPointCheckAcpi - Enter\n")); DEBUG ((DEBUG_INFO, "AcpiTable :\n")); DEBUG ((DEBUG_INFO, " Table Address Rev OemId OemTableId OemRev Creat CreatorRev\n")); // // First dump // Status = DumpAcpiWithGuid (&gEfiAcpi20TableGuid, NULL, NULL, TRUE, FALSE); if (Status == EFI_NOT_FOUND) { Status = DumpAcpiWithGuid (&gEfiAcpi10TableGuid, NULL, NULL, TRUE, FALSE); } if (EFI_ERROR(Status)) { DEBUG ((DEBUG_ERROR, "No ACPI table\n")); TestPointLibAppendErrorString ( PLATFORM_TEST_POINT_ROLE_PLATFORM_IBV, NULL, TEST_POINT_BYTE4_READY_TO_BOOT_ACPI_TABLE_FUNCTIONAL_ERROR_CODE \ TEST_POINT_READY_TO_BOOT \ TEST_POINT_BYTE4_READY_TO_BOOT_ACPI_TABLE_FUNCTIONAL_ERROR_STRING ); } DEBUG ((DEBUG_INFO, "==== TestPointCheckAcpi - Exit\n")); return Status; } EFI_STATUS TestPointCheckAcpiGcdResource ( VOID ) { EFI_STATUS Status; DEBUG ((DEBUG_INFO, "==== TestPointCheckAcpiGcdResource - Enter\n")); // // Check the ACPI existence // Status = DumpAcpiWithGuid (&gEfiAcpi20TableGuid, NULL, NULL, FALSE, FALSE); if (Status == EFI_NOT_FOUND) { Status = DumpAcpiWithGuid (&gEfiAcpi10TableGuid, NULL, NULL, FALSE, FALSE); } if (!EFI_ERROR(Status)) { // // Then check resource in ACPI and GCD // TestPointDumpGcd (&mAcpiGcdMemoryMap, &mAcpiGcdMemoryMapNumberOfDescriptors, &mAcpiGcdIoMap, &mAcpiGcdIoMapNumberOfDescriptors, FALSE); Status = DumpAcpiWithGuid (&gEfiAcpi20TableGuid, NULL, NULL, FALSE, TRUE); if (Status == EFI_NOT_FOUND) { Status = DumpAcpiWithGuid (&gEfiAcpi10TableGuid, NULL, NULL, FALSE, TRUE); } } if (EFI_ERROR(Status)) { DEBUG ((DEBUG_ERROR, "ACPI table resource not in GCD\n")); TestPointLibAppendErrorString ( PLATFORM_TEST_POINT_ROLE_PLATFORM_IBV, NULL, TEST_POINT_BYTE4_READY_TO_BOOT_GCD_RESOURCE_FUNCTIONAL_ERROR_CODE \ TEST_POINT_READY_TO_BOOT \ TEST_POINT_BYTE4_READY_TO_BOOT_GCD_RESOURCE_FUNCTIONAL_ERROR_STRING ); } DEBUG ((DEBUG_INFO, "==== TestPointCheckAcpiGcdResource - Exit\n")); return Status; } VOID * TestPointGetAcpi ( IN UINT32 Signature ) { EFI_STATUS Status; VOID *Table; Status = DumpAcpiWithGuid (&gEfiAcpi20TableGuid, &Signature, &Table, FALSE, FALSE); if (Status == EFI_NOT_FOUND) { Status = DumpAcpiWithGuid (&gEfiAcpi10TableGuid, &Signature, &Table, FALSE, FALSE); } if (EFI_ERROR(Status)) { return NULL; } return Table; }