STM/Test/FrmPkg/Core/DlEntryDump.c

3206 lines
113 KiB
C

/** @file
DlEntry dump information
Copyright (c) 2016, Intel Corporation. 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
http://opensource.org/licenses/bsd-license.php.
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#include "Dce.h"
#include "Frm.h"
#include "Dmar.h"
#include "DrtmTpm.h"
#include <IndustryStandard/Acpi.h>
#include <IndustryStandard/MemoryMappedConfigurationSpaceAccessTable.h>
/**
This function dump raw data.
@param Data raw data
@param Size raw data size
**/
VOID
DumpData (
IN UINT8 *Data,
IN UINT32 Size
)
{
UINT32 Index;
for (Index = 0; Index < Size; Index++) {
DEBUG ((EFI_D_INFO, "%02x", (UINTN)Data[Index]));
}
}
/**
This function dump raw data with colume format.
@param Data raw data
@param Size raw data size
**/
VOID
DumpHex (
IN UINT8 *Data,
IN UINT32 Size
)
{
UINT32 Index;
UINT32 Count;
UINT32 Left;
#define COLUME_SIZE (16 * 2)
Count = Size / COLUME_SIZE;
Left = Size % COLUME_SIZE;
for (Index = 0; Index < Count; Index++) {
DEBUG ((EFI_D_INFO, "(TXT) %04x: ", Index * COLUME_SIZE));
DumpData (Data + Index * COLUME_SIZE, COLUME_SIZE);
DEBUG ((EFI_D_INFO, "\n"));
}
if (Left != 0) {
DEBUG ((EFI_D_INFO, "(TXT) %04x: ", Index * COLUME_SIZE));
DumpData (Data + Index * COLUME_SIZE, Left);
DEBUG ((EFI_D_INFO, "\n"));
}
}
/**
This function dump ACPI table header.
@param Header ACPI table header
**/
VOID
DumpAcpiTableHeader (
IN EFI_ACPI_DESCRIPTION_HEADER *Header
)
{
UINT8 *SignatureByte;
UINT8 OemTableId[8];
UINT8 *CreatorId;
SignatureByte = (UINT8*)&Header->Signature;
DEBUG ((EFI_D_INFO, "(TXT) Table Header:\n"));
DEBUG ((EFI_D_INFO,
"(TXT) Signature ............................................ '%c%c%c%c'\n",
SignatureByte[0],
SignatureByte[1],
SignatureByte[2],
SignatureByte[3]
));
DEBUG ((EFI_D_INFO,
"(TXT) Length ............................................... 0x%08x\n",
(UINTN)Header->Length
));
DEBUG ((EFI_D_INFO,
"(TXT) Revision ............................................. 0x%02x\n",
(UINTN)Header->Revision
));
DEBUG ((EFI_D_INFO,
"(TXT) Checksum ............................................. 0x%02x\n",
(UINTN)Header->Checksum
));
DEBUG ((EFI_D_INFO,
"(TXT) OEMID ................................................ '%c%c%c%c%c%c'\n",
Header->OemId[0],
Header->OemId[1],
Header->OemId[2],
Header->OemId[3],
Header->OemId[4],
Header->OemId[5]
));
CopyMem (&OemTableId, &Header->OemTableId, sizeof(OemTableId));
DEBUG ((EFI_D_INFO,
"(TXT) OEM Table ID ......................................... '%c%c%c%c%c%c%c%c'\n",
OemTableId[0],
OemTableId[1],
OemTableId[2],
OemTableId[3],
OemTableId[4],
OemTableId[5],
OemTableId[6],
OemTableId[7]
));
DEBUG ((EFI_D_INFO,
"(TXT) OEM Revision ......................................... 0x%08x\n",
(UINTN)Header->OemRevision
));
CreatorId = (UINT8 *)&Header->CreatorId;
DEBUG ((EFI_D_INFO,
"(TXT) Creator ID ........................................... '%c%c%c%c'\n",
CreatorId[0],
CreatorId[1],
CreatorId[2],
CreatorId[3]
));
DEBUG ((EFI_D_INFO,
"(TXT) Creator Revision ..................................... 0x%08x\n",
(UINTN)Header->CreatorRevision
));
return;
}
/**
This function dump ACPI RSDP.
@param Rsdp ACPI RSDP
**/
VOID
DumpAcpiRSDP (
IN EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER *Rsdp
)
{
UINT8 *Signature;
if (Rsdp == NULL) {
return;
}
DEBUG ((EFI_D_INFO,
"(TXT) *****************************************************************************\n"
"(TXT) * Root System Description Pointer *\n"
"(TXT) *****************************************************************************\n"
));
DEBUG ((EFI_D_INFO,
(sizeof(UINTN) == sizeof(UINT64)) ?
"(TXT) RSDP address ............................................. 0x%016lx\n" :
"(TXT) RSDP address ............................................. 0x%08x\n",
Rsdp
));
Signature = (UINT8 *)&Rsdp->Signature;
DEBUG ((EFI_D_INFO,
"(TXT) Signature .............................................. '%c%c%c%c%c%c%c%c'\n",
Signature[0],
Signature[1],
Signature[2],
Signature[3],
Signature[4],
Signature[5],
Signature[6],
Signature[7]
));
DEBUG ((EFI_D_INFO,
"(TXT) Checksum ............................................... 0x%02x\n",
Rsdp->Checksum
));
DEBUG ((EFI_D_INFO,
"(TXT) OEMID .................................................. '%c%c%c%c%c%c'\n",
Rsdp->OemId[0],
Rsdp->OemId[1],
Rsdp->OemId[2],
Rsdp->OemId[3],
Rsdp->OemId[4],
Rsdp->OemId[5]
));
DEBUG ((EFI_D_INFO,
"(TXT) Revision ............................................... 0x%02x\n",
Rsdp->Revision
));
DEBUG ((EFI_D_INFO,
"(TXT) RsdtAddress ............................................ 0x%08x\n",
Rsdp->RsdtAddress
));
if (Rsdp->Revision >= 2) {
DEBUG ((EFI_D_INFO,
"(TXT) Length ................................................. 0x%08x\n",
Rsdp->Length
));
DEBUG ((EFI_D_INFO,
"(TXT) XsdtAddress ............................................ 0x%016lx\n",
Rsdp->XsdtAddress
));
DEBUG ((EFI_D_INFO,
"(TXT) Extended Checksum ...................................... 0x%02x\n",
Rsdp->ExtendedChecksum
));
}
DEBUG ((EFI_D_INFO,
"(TXT) *****************************************************************************\n\n"
));
return;
}
/**
This function dump ACPI RSDT.
@param Rsdt ACPI RSDT
**/
VOID
DumpAcpiRSDT (
IN EFI_ACPI_DESCRIPTION_HEADER *Rsdt
)
{
UINTN EntryCount;
UINTN Index;
UINT32 *EntryPtr;
if (Rsdt == NULL) {
return;
}
EntryCount = (Rsdt->Length - sizeof (EFI_ACPI_DESCRIPTION_HEADER)) / 4;
DEBUG ((EFI_D_INFO,
"(TXT) *****************************************************************************\n"
"(TXT) * Root System Description Table *\n"
"(TXT) *****************************************************************************\n"
));
DEBUG ((EFI_D_INFO,
(sizeof(UINTN) == sizeof(UINT64)) ?
"(TXT) RSDT address ............................................. 0x%016lx\n" :
"(TXT) RSDT address ............................................. 0x%08x\n",
Rsdt
));
DumpAcpiTableHeader (Rsdt);
DEBUG ((EFI_D_INFO,
"(TXT) Table Contents:\n"
));
EntryPtr = (UINT32 *)(Rsdt + 1);
for (Index = 0; Index < EntryCount; Index ++, EntryPtr ++) {
DEBUG ((EFI_D_INFO,
"(TXT) Entry %2d: ............................................ 0x%08x\n",
Index + 1,
*EntryPtr
));
}
DEBUG ((EFI_D_INFO,
"(TXT) *****************************************************************************\n\n"
));
return;
}
/**
This function dump ACPI XSDT.
@param Rsdt ACPI XSDT
**/
VOID
DumpAcpiXSDT (
IN EFI_ACPI_DESCRIPTION_HEADER *Xsdt
)
{
UINTN EntryCount;
UINTN Index;
UINT64 *EntryPtr;
UINT64 TempEntry;
if (Xsdt == NULL) {
return;
}
EntryCount = (Xsdt->Length - sizeof (EFI_ACPI_DESCRIPTION_HEADER)) / 8;
DEBUG ((EFI_D_INFO,
"(TXT) *****************************************************************************\n"
"(TXT) * Extended System Description Table *\n"
"(TXT) *****************************************************************************\n"
));
DEBUG ((EFI_D_INFO,
(sizeof(UINTN) == sizeof(UINT64)) ?
"(TXT) XSDT address ............................................. 0x%016lx\n" :
"(TXT) XSDT address ............................................. 0x%08x\n",
Xsdt
));
DumpAcpiTableHeader (Xsdt);
DEBUG ((EFI_D_INFO,
"(TXT) Table Contents:\n"
));
EntryPtr = (UINT64 *)(Xsdt + 1);
for (Index = 0; Index < EntryCount; Index ++, EntryPtr ++) {
CopyMem (&TempEntry, EntryPtr, sizeof(UINT64));
DEBUG ((EFI_D_INFO,
"(TXT) Entry %2d: ............................................ 0x%016lx\n",
Index + 1,
TempEntry
));
}
DEBUG ((EFI_D_INFO,
"(TXT) *****************************************************************************\n\n"
));
return;
}
//
// This table defines the DMAR DeviceScopt entry type string
//
GLOBAL_REMOVE_IF_UNREFERENCED CHAR16 *mDeviceScopeEntryTypeStr[] = {
L"PCI Endpoint Device",
L"PCI Sub-hierachy",
L"IOAPIC",
L"MSI Capable HPET",
L"ACPI Namespace Device",
};
/**
This function dump DMAR Device Scopt Entry.
@param DmarDeviceScopeEntry DMAR Device Scopt Entry
**/
VOID
DumpDmarDeviceScopeEntry (
IN EFI_ACPI_DMAR_DEVICE_SCOPE_ENTRY_STRUCTURE *DmarDeviceScopeEntry
)
{
UINTN PciPathNumber;
UINTN Index;
EFI_ACPI_DMAR_PCI_PATH *PciPath;
DEBUG ((EFI_D_INFO,
"(TXT) *************************************************************************\n"
"(TXT) * DMA-Remapping Device Scope Entry Structure *\n"
"(TXT) *************************************************************************\n"
));
DEBUG ((EFI_D_INFO,
(sizeof(UINTN) == sizeof(UINT64)) ?
"(TXT) DMAR Device Scope Entry address ...................... 0x%016lx\n" :
"(TXT) DMAR Device Scope Entry address ...................... 0x%08x\n",
DmarDeviceScopeEntry
));
DEBUG ((EFI_D_INFO,
"(TXT) Device Scope Entry Type ............................ 0x%02x\n",
(UINTN)DmarDeviceScopeEntry->DeviceScopeEntryType
));
if (DmarDeviceScopeEntry->DeviceScopeEntryType < sizeof(mDeviceScopeEntryTypeStr)/sizeof(mDeviceScopeEntryTypeStr[0])) {
DEBUG ((EFI_D_INFO,
"(TXT) %s\n",
mDeviceScopeEntryTypeStr[DmarDeviceScopeEntry->DeviceScopeEntryType]
));
}
DEBUG ((EFI_D_INFO,
"(TXT) Length ............................................. 0x%02x\n",
(UINTN)DmarDeviceScopeEntry->Length
));
DEBUG ((EFI_D_INFO,
"(TXT) Enumeration ID ..................................... 0x%02x\n",
(UINTN)DmarDeviceScopeEntry->EnumerationID
));
DEBUG ((EFI_D_INFO,
"(TXT) Starting Bus Number ................................ 0x%02x\n",
(UINTN)DmarDeviceScopeEntry->StartingBusNumber
));
PciPathNumber = (DmarDeviceScopeEntry->Length - sizeof(EFI_ACPI_DMAR_DEVICE_SCOPE_ENTRY_STRUCTURE)) / sizeof(EFI_ACPI_DMAR_PCI_PATH);
PciPath = (EFI_ACPI_DMAR_PCI_PATH *)(DmarDeviceScopeEntry + 1);
for (Index = 0; Index < PciPathNumber; Index++) {
DEBUG ((EFI_D_INFO,
"(TXT) Device ............................................. 0x%02x\n",
(UINTN)PciPath[Index].Device
));
DEBUG ((EFI_D_INFO,
"(TXT) Function ........................................... 0x%02x\n",
(UINTN)PciPath[Index].Function
));
}
DEBUG ((EFI_D_INFO,
"(TXT) *************************************************************************\n\n"
));
return;
}
/**
This function dump DMAR DRHD structure.
@param Drhd DMAR DRHD structure
**/
VOID
DumpDmarDrhd (
IN EFI_ACPI_DMAR_HARDWARE_UNIT_DEFINITION_STRUCTURE *Drhd
)
{
EFI_ACPI_DMAR_DEVICE_SCOPE_ENTRY_STRUCTURE *DmarDeviceScopeEntry;
INTN DrhdLen;
DEBUG ((EFI_D_INFO,
"(TXT) ***************************************************************************\n"
"(TXT) * DMA-Remapping Hardware Definition Structure *\n"
"(TXT) ***************************************************************************\n"
));
DEBUG ((EFI_D_INFO,
(sizeof(UINTN) == sizeof(UINT64)) ?
"(TXT) DRHD address ........................................... 0x%016lx\n" :
"(TXT) DRHD address ........................................... 0x%08x\n",
Drhd
));
DEBUG ((EFI_D_INFO,
"(TXT) Type ................................................. 0x%04x\n",
(UINTN)Drhd->Type
));
DEBUG ((EFI_D_INFO,
"(TXT) Length ............................................... 0x%04x\n",
(UINTN)Drhd->Length
));
DEBUG ((EFI_D_INFO,
"(TXT) Flags ................................................ 0x%02x\n",
(UINTN)Drhd->Flags
));
DEBUG ((EFI_D_INFO,
"(TXT) INCLUDE_PCI_ALL .................................... 0x%02x\n",
(UINTN)(Drhd->Flags & 0x1)
));
DEBUG ((EFI_D_INFO,
"(TXT) Segment Number ....................................... 0x%04x\n",
(UINTN)Drhd->SegmentNumber
));
DEBUG ((EFI_D_INFO,
"(TXT) Register Base Address ................................ 0x%016lx\n",
Drhd->RegisterBaseAddress
));
DrhdLen = Drhd->Length - sizeof(EFI_ACPI_DMAR_HARDWARE_UNIT_DEFINITION_STRUCTURE);
DmarDeviceScopeEntry = (EFI_ACPI_DMAR_DEVICE_SCOPE_ENTRY_STRUCTURE *)(Drhd + 1);
while (DrhdLen > 0) {
DumpDmarDeviceScopeEntry (DmarDeviceScopeEntry);
DrhdLen -= DmarDeviceScopeEntry->Length;
DmarDeviceScopeEntry = (EFI_ACPI_DMAR_DEVICE_SCOPE_ENTRY_STRUCTURE *)((UINTN)DmarDeviceScopeEntry + DmarDeviceScopeEntry->Length);
}
DEBUG ((EFI_D_INFO,
"(TXT) ***************************************************************************\n\n"
));
return;
}
/**
This function dump DMAR RMRR structure.
@param Rmrr DMAR RMRR structure
**/
VOID
DumpDmarRmrr (
EFI_ACPI_DMAR_RESERVED_MEMORY_REGION_REPORTING_STRUCTURE *Rmrr
)
{
EFI_ACPI_DMAR_DEVICE_SCOPE_ENTRY_STRUCTURE *DmarDeviceScopeEntry;
INTN RmrrLen;
DEBUG ((EFI_D_INFO,
"(TXT) ***************************************************************************\n"
"(TXT) * Reserved Memory Region Reporting Structure *\n"
"(TXT) ***************************************************************************\n"
));
DEBUG ((EFI_D_INFO,
(sizeof(UINTN) == sizeof(UINT64)) ?
"(TXT) RMRR address ........................................... 0x%016lx\n" :
"(TXT) RMRR address ........................................... 0x%08x\n",
Rmrr
));
DEBUG ((EFI_D_INFO,
"(TXT) Type ................................................. 0x%04x\n",
(UINTN)Rmrr->Type
));
DEBUG ((EFI_D_INFO,
"(TXT) Length ............................................... 0x%04x\n",
(UINTN)Rmrr->Length
));
DEBUG ((EFI_D_INFO,
"(TXT) Segment Number ....................................... 0x%04x\n",
(UINTN)Rmrr->SegmentNumber
));
DEBUG ((EFI_D_INFO,
"(TXT) Reserved Memory Region Base Address .................. 0x%016lx\n",
Rmrr->ReservedMemoryRegionBaseAddress
));
DEBUG ((EFI_D_INFO,
"(TXT) Reserved Memory Region Limit Address ................. 0x%016lx\n",
Rmrr->ReservedMemoryRegionLimitAddress
));
RmrrLen = Rmrr->Length - sizeof(EFI_ACPI_DMAR_RESERVED_MEMORY_REGION_REPORTING_STRUCTURE);
DmarDeviceScopeEntry = (EFI_ACPI_DMAR_DEVICE_SCOPE_ENTRY_STRUCTURE *)(Rmrr + 1);
while (RmrrLen > 0) {
DumpDmarDeviceScopeEntry (DmarDeviceScopeEntry);
RmrrLen -= DmarDeviceScopeEntry->Length;
DmarDeviceScopeEntry = (EFI_ACPI_DMAR_DEVICE_SCOPE_ENTRY_STRUCTURE *)((UINTN)DmarDeviceScopeEntry + DmarDeviceScopeEntry->Length);
}
DEBUG ((EFI_D_INFO,
"(TXT) ***************************************************************************\n\n"
));
return;
}
/**
This function dump DMAR ATSR structure.
@param Atsr DMAR ATSR structure
**/
VOID
DumpDmarAtsr (
EFI_ACPI_DMAR_ROOT_PORT_ATS_CAPABILITY_REPORTING_STRUCTURE *Atsr
)
{
EFI_ACPI_DMAR_DEVICE_SCOPE_ENTRY_STRUCTURE *DmarDeviceScopeEntry;
INTN AtsrLen;
DEBUG ((EFI_D_INFO,
"(TXT) ***************************************************************************\n"
"(TXT) * Root Port ATS Capability Reporting Structure *\n"
"(TXT) ***************************************************************************\n"
));
DEBUG ((EFI_D_INFO,
(sizeof(UINTN) == sizeof(UINT64)) ?
"(TXT) ATSR address ........................................... 0x%016lx\n" :
"(TXT) ATSR address ........................................... 0x%08x\n",
Atsr
));
DEBUG ((EFI_D_INFO,
"(TXT) Type ................................................. 0x%04x\n",
(UINTN)Atsr->Type
));
DEBUG ((EFI_D_INFO,
"(TXT) Length ............................................... 0x%04x\n",
(UINTN)Atsr->Length
));
DEBUG ((EFI_D_INFO,
"(TXT) Flags ................................................ 0x%02x\n",
(UINTN)Atsr->Flags
));
DEBUG ((EFI_D_INFO,
"(TXT) ALL_PORTS .......................................... 0x%02x\n",
(UINTN)(Atsr->Flags & 0x1)
));
DEBUG ((EFI_D_INFO,
"(TXT) Segment Number ....................................... 0x%04x\n",
(UINTN)Atsr->SegmentNumber
));
AtsrLen = Atsr->Length - sizeof(EFI_ACPI_DMAR_ROOT_PORT_ATS_CAPABILITY_REPORTING_STRUCTURE);
DmarDeviceScopeEntry = (EFI_ACPI_DMAR_DEVICE_SCOPE_ENTRY_STRUCTURE *)(Atsr + 1);
while (AtsrLen > 0) {
DumpDmarDeviceScopeEntry (DmarDeviceScopeEntry);
AtsrLen -= DmarDeviceScopeEntry->Length;
DmarDeviceScopeEntry = (EFI_ACPI_DMAR_DEVICE_SCOPE_ENTRY_STRUCTURE *)((UINTN)DmarDeviceScopeEntry + DmarDeviceScopeEntry->Length);
}
DEBUG ((EFI_D_INFO,
"(TXT) ***************************************************************************\n\n"
));
return;
}
/**
This function dump DMAR RHSA structure.
@param Rhsa DMAR RHSA structure
**/
VOID
DumpDmarRhsa (
EFI_ACPI_DMAR_REMAPPING_HARDWARE_STATIC_AFFINITY_STRUCTURE *Rhsa
)
{
DEBUG ((EFI_D_INFO,
"(TXT) ***************************************************************************\n"
"(TXT) * Remapping Hardware Static Affinity Structure *\n"
"(TXT) ***************************************************************************\n"
));
DEBUG ((EFI_D_INFO,
(sizeof(UINTN) == sizeof(UINT64)) ?
"(TXT) RHSA address ........................................... 0x%016lx\n" :
"(TXT) RHSA address ........................................... 0x%08x\n",
Rhsa
));
DEBUG ((EFI_D_INFO,
"(TXT) Type ................................................. 0x%04x\n",
(UINTN)Rhsa->Type
));
DEBUG ((EFI_D_INFO,
"(TXT) Length ............................................... 0x%04x\n",
(UINTN)Rhsa->Length
));
DEBUG ((EFI_D_INFO,
"(TXT) Register Base Address ................................ 0x%016lx\n",
Rhsa->RegisterBaseAddress
));
DEBUG ((EFI_D_INFO,
"(TXT) Proximity Domain ..................................... 0x%08x\n",
(UINTN)Rhsa->ProximityDomain
));
DEBUG ((EFI_D_INFO,
"(TXT) ***************************************************************************\n\n"
));
return;
}
/**
This function dump DMAR ANDD structure.
@param Andd DMAR ANDD structure
**/
VOID
DumpDmarAndd (
EFI_ACPI_DMAR_ACPI_NAME_SPACE_DEVICE_DECLARATION_STRUCTURE *Andd
)
{
DEBUG ((EFI_D_INFO,
"(TXT) ***************************************************************************\n"
"(TXT) * ACPI Name-space Device Declaration Structure *\n"
"(TXT) ***************************************************************************\n"
));
DEBUG ((EFI_D_INFO,
(sizeof(UINTN) == sizeof(UINT64)) ?
"(TXT) ANDD address ........................................... 0x%016lx\n" :
"(TXT) ANDD address ........................................... 0x%08x\n",
Andd
));
DEBUG ((EFI_D_INFO,
"(TXT) Type ................................................. 0x%04x\n",
Andd->Type
));
DEBUG ((EFI_D_INFO,
"(TXT) Length ............................................... 0x%04x\n",
Andd->Length
));
DEBUG ((EFI_D_INFO,
"(TXT) ACPI Device Number ................................... 0x%02x\n",
Andd->ACPIDeviceNumber
));
DEBUG ((EFI_D_INFO,
"(TXT) ACPI Object Name ..................................... '%a'\n",
(Andd + 1)
));
DEBUG ((EFI_D_INFO,
"(TXT) ***************************************************************************\n\n"
));
return;
}
/**
This function dump DMAR ACPI table.
@param Dmar DMAR ACPI table
**/
VOID
DumpDmar (
IN EFI_ACPI_DMAR_DESCRIPTION_TABLE *Dmar
)
{
EFI_ACPI_DMAR_STRUCTURE_HEADER *DmarHeader;
INTN DmarLen;
DEBUG ((EFI_D_INFO,
"(TXT) *****************************************************************************\n"
"(TXT) * DMAR Table *\n"
"(TXT) *****************************************************************************\n"
));
DEBUG ((EFI_D_INFO,
(sizeof(UINTN) == sizeof(UINT64)) ?
"(TXT) DMAR address ............................................. 0x%016lx\n" :
"(TXT) DMAR address ............................................. 0x%08x\n",
Dmar
));
DumpAcpiTableHeader ((EFI_ACPI_DESCRIPTION_HEADER *)Dmar);
DEBUG ((EFI_D_INFO, "(TXT) Table Contents:\n"));
DEBUG ((EFI_D_INFO,
"(TXT) HostAddressWidth ..................................... 0x%02x\n",
(UINTN)Dmar->HostAddressWidth
));
DEBUG ((EFI_D_INFO,
"(TXT) Flags ................................................ 0x%02x\n",
(UINTN)Dmar->Flags
));
DEBUG ((EFI_D_INFO,
"(TXT) INTR_REMAP ......................................... 0x%02x\n",
(UINTN)(Dmar->Flags & 0x1)
));
DEBUG ((EFI_D_INFO,
"(TXT) X2APIC_OPT_OUT_SET ................................. 0x%02x\n",
(UINTN)(Dmar->Flags & 0x2)
));
DmarLen = Dmar->Header.Length - sizeof(EFI_ACPI_DMAR_DESCRIPTION_TABLE);
DmarHeader = (EFI_ACPI_DMAR_STRUCTURE_HEADER *)(Dmar + 1);
while (DmarLen > 0) {
switch (DmarHeader->Type) {
case EFI_ACPI_DMA_REMAPPING_STRUCTURE_TYPE_DRHD:
DumpDmarDrhd ((EFI_ACPI_DMAR_HARDWARE_UNIT_DEFINITION_STRUCTURE *)DmarHeader);
break;
case EFI_ACPI_DMA_REMAPPING_STRUCTURE_TYPE_RMRR:
DumpDmarRmrr ((EFI_ACPI_DMAR_RESERVED_MEMORY_REGION_REPORTING_STRUCTURE *)DmarHeader);
break;
case EFI_ACPI_DMA_REMAPPING_STRUCTURE_TYPE_ATSR:
DumpDmarAtsr ((EFI_ACPI_DMAR_ROOT_PORT_ATS_CAPABILITY_REPORTING_STRUCTURE *)DmarHeader);
break;
case EFI_ACPI_DMA_REMAPPING_STRUCTURE_TYPE_RHSA:
DumpDmarRhsa ((EFI_ACPI_DMAR_REMAPPING_HARDWARE_STATIC_AFFINITY_STRUCTURE *)DmarHeader);
break;
case EFI_ACPI_DMA_REMAPPING_STRUCTURE_TYPE_ANDD:
DumpDmarAndd ((EFI_ACPI_DMAR_ACPI_NAME_SPACE_DEVICE_DECLARATION_STRUCTURE *)DmarHeader);
break;
default:
break;
}
DmarLen -= DmarHeader->Length;
DmarHeader = (EFI_ACPI_DMAR_STRUCTURE_HEADER *)((UINTN)DmarHeader + DmarHeader->Length);
}
DEBUG ((EFI_D_INFO,
"(TXT) *****************************************************************************\n\n"
));
ASSERT (DmarLen == 0);
return ;
}
#pragma pack(1)
typedef struct {
UINT8 Type;
UINT8 Length;
} APIC_STRUCT_HEADER;
#pragma pack()
/**
This function dump MADT ProcessorLocalApic structure.
@param ProcessorLocalApic MADT ProcessorLocalApic structure
**/
VOID
DumpApicProcessorLocalApic (
EFI_ACPI_1_0_PROCESSOR_LOCAL_APIC_STRUCTURE *ProcessorLocalApic
)
{
DEBUG ((EFI_D_INFO,
"(TXT) ***************************************************************************\n"
"(TXT) * Processor Local APIC Structure *\n"
"(TXT) ***************************************************************************\n"
));
DEBUG ((EFI_D_INFO,
(sizeof(UINTN) == sizeof(UINT64)) ?
"(TXT) Processor Local APIC address ........................... 0x%016lx\n" :
"(TXT) Processor Local APIC address ........................... 0x%08x\n",
ProcessorLocalApic
));
DEBUG ((EFI_D_INFO,
"(TXT) Type ................................................. 0x%02x\n",
ProcessorLocalApic->Type
));
DEBUG ((EFI_D_INFO,
"(TXT) Length ............................................... 0x%02x\n",
ProcessorLocalApic->Length
));
DEBUG ((EFI_D_INFO,
"(TXT) ACPI Processor ID .................................... 0x%02x\n",
ProcessorLocalApic->AcpiProcessorId
));
DEBUG ((EFI_D_INFO,
"(TXT) APIC ID .............................................. 0x%02x\n",
ProcessorLocalApic->ApicId
));
DEBUG ((EFI_D_INFO,
"(TXT) Flags ................................................ 0x%08x\n",
ProcessorLocalApic->Flags
));
DEBUG ((EFI_D_INFO,
"(TXT) Enabled ............................................ 0x%08x\n",
ProcessorLocalApic->Flags & EFI_ACPI_1_0_LOCAL_APIC_ENABLED
));
DEBUG ((EFI_D_INFO,
"(TXT) ***************************************************************************\n\n"
));
return;
}
/**
This function dump MADT IOApic structure.
@param IOApic MADT IOApic structure
**/
VOID
DumpApicIOApic (
EFI_ACPI_1_0_IO_APIC_STRUCTURE *IOApic
)
{
DEBUG ((EFI_D_INFO,
"(TXT) ***************************************************************************\n"
"(TXT) * IO APIC Structure *\n"
"(TXT) ***************************************************************************\n"
));
DEBUG ((EFI_D_INFO,
(sizeof(UINTN) == sizeof(UINT64)) ?
"(TXT) IO APIC address ........................................ 0x%016lx\n" :
"(TXT) IO APIC address ........................................ 0x%08x\n",
IOApic
));
DEBUG ((EFI_D_INFO,
"(TXT) Type ................................................. 0x%02x\n",
IOApic->Type
));
DEBUG ((EFI_D_INFO,
"(TXT) Length ............................................... 0x%02x\n",
IOApic->Length
));
DEBUG ((EFI_D_INFO,
"(TXT) IO APIC ID ........................................... 0x%02x\n",
IOApic->IoApicId
));
DEBUG ((EFI_D_INFO,
"(TXT) IO APIC Address ...................................... 0x%08x\n",
IOApic->IoApicAddress
));
DEBUG ((EFI_D_INFO,
"(TXT) Global System Interrupt Base ......................... 0x%08x\n",
IOApic->SystemVectorBase
));
DEBUG ((EFI_D_INFO,
"(TXT) ***************************************************************************\n\n"
));
return;
}
/**
This function dump MADT InterruptSourceOverride structure.
@param InterruptSourceOverride MADT InterruptSourceOverride structure
**/
VOID
DumpApicInterruptSourceOverride (
EFI_ACPI_1_0_INTERRUPT_SOURCE_OVERRIDE_STRUCTURE *InterruptSourceOverride
)
{
DEBUG ((EFI_D_INFO,
"(TXT) ***************************************************************************\n"
"(TXT) * Interrupt Source Override Structure *\n"
"(TXT) ***************************************************************************\n"
));
DEBUG ((EFI_D_INFO,
(sizeof(UINTN) == sizeof(UINT64)) ?
"(TXT) Interrupt Source Override address ...................... 0x%016lx\n" :
"(TXT) Interrupt Source Override address ...................... 0x%08x\n",
InterruptSourceOverride
));
DEBUG ((EFI_D_INFO,
"(TXT) Type ................................................. 0x%02x\n",
InterruptSourceOverride->Type
));
DEBUG ((EFI_D_INFO,
"(TXT) Length ............................................... 0x%02x\n",
InterruptSourceOverride->Length
));
DEBUG ((EFI_D_INFO,
"(TXT) Bus .................................................. 0x%02x\n",
InterruptSourceOverride->Bus
));
DEBUG ((EFI_D_INFO,
"(TXT) Source ............................................... 0x%02x\n",
InterruptSourceOverride->Source
));
DEBUG ((EFI_D_INFO,
"(TXT) Global System Interrupt .............................. 0x%08x\n",
InterruptSourceOverride->GlobalSystemInterruptVector
));
DEBUG ((EFI_D_INFO,
"(TXT) Flags ................................................ 0x%04x\n",
InterruptSourceOverride->Flags
));
DEBUG ((EFI_D_INFO,
"(TXT) Polarity ........................................... 0x%04x\n",
InterruptSourceOverride->Flags & 0x3
));
switch (InterruptSourceOverride->Flags & 0x3) {
case 0x0:
DEBUG ((EFI_D_INFO,
"(TXT) Conforms to the specifications of the bus\n"
));
break;
case 0x1:
DEBUG ((EFI_D_INFO,
"(TXT) Active high\n"
));
break;
case 0x3:
DEBUG ((EFI_D_INFO,
"(TXT) Active low\n"
));
break;
default:
break;
}
DEBUG ((EFI_D_INFO,
"(TXT) Trigger Mode ....................................... 0x%04x\n",
InterruptSourceOverride->Flags & 0xc
));
switch (InterruptSourceOverride->Flags & 0xc) {
case 0x0:
DEBUG ((EFI_D_INFO,
"(TXT) Conforms to the specifications of the bus\n"
));
break;
case 0x4:
DEBUG ((EFI_D_INFO,
"(TXT) Edge-triggered\n"
));
break;
case 0xc:
DEBUG ((EFI_D_INFO,
"(TXT) Level-triggered\n"
));
break;
default:
break;
}
DEBUG ((EFI_D_INFO,
"(TXT) ***************************************************************************\n\n"
));
return;
}
/**
This function dump MADT NonMaskableInterruptSource structure.
@param NonMaskableInterruptSource MADT NonMaskableInterruptSource structure
**/
VOID
DumpApicNonMaskableInterruptSource (
EFI_ACPI_1_0_NON_MASKABLE_INTERRUPT_SOURCE_STRUCTURE *NonMaskableInterruptSource
)
{
DEBUG ((EFI_D_INFO,
"(TXT) ***************************************************************************\n"
"(TXT) * Non-Maskable Interrupt Source Structure *\n"
"(TXT) ***************************************************************************\n"
));
DEBUG ((EFI_D_INFO,
(sizeof(UINTN) == sizeof(UINT64)) ?
"(TXT) NMI Source address ..................................... 0x%016lx\n" :
"(TXT) NMI Source address ..................................... 0x%08x\n",
NonMaskableInterruptSource
));
DEBUG ((EFI_D_INFO,
"(TXT) Type ................................................. 0x%02x\n",
NonMaskableInterruptSource->Type
));
DEBUG ((EFI_D_INFO,
"(TXT) Length ............................................... 0x%02x\n",
NonMaskableInterruptSource->Length
));
DEBUG ((EFI_D_INFO,
"(TXT) Flags ................................................ 0x%04x\n",
NonMaskableInterruptSource->Flags
));
DEBUG ((EFI_D_INFO,
"(TXT) Polarity ........................................... 0x%04x\n",
NonMaskableInterruptSource->Flags & 0x3
));
switch (NonMaskableInterruptSource->Flags & 0x3) {
case 0x0:
DEBUG ((EFI_D_INFO,
"(TXT) Conforms to the specifications of the bus\n"
));
break;
case 0x1:
DEBUG ((EFI_D_INFO,
"(TXT) Active high\n"
));
break;
case 0x3:
DEBUG ((EFI_D_INFO,
"(TXT) Active low\n"
));
break;
default:
break;
}
DEBUG ((EFI_D_INFO,
"(TXT) Trigger Mode ....................................... 0x%04x\n",
NonMaskableInterruptSource->Flags & 0xc
));
switch (NonMaskableInterruptSource->Flags & 0xc) {
case 0x0:
DEBUG ((EFI_D_INFO,
"(TXT) Conforms to the specifications of the bus\n"
));
break;
case 0x4:
DEBUG ((EFI_D_INFO,
"(TXT) Edge-triggered\n"
));
break;
case 0xc:
DEBUG ((EFI_D_INFO,
"(TXT) Level-triggered\n"
));
break;
default:
break;
}
DEBUG ((EFI_D_INFO,
"(TXT) Global System Interrupt .............................. 0x%08x\n",
NonMaskableInterruptSource->GlobalSystemInterruptVector
));
DEBUG ((EFI_D_INFO,
"(TXT) ***************************************************************************\n\n"
));
return;
}
/**
This function dump MADT LocalApicNMI structure.
@param LocalApicNMI MADT LocalApicNMI structure
**/
VOID
DumpApicLocalApicNMI (
EFI_ACPI_1_0_LOCAL_APIC_NMI_STRUCTURE *LocalApicNMI
)
{
UINT16 Flags;
DEBUG ((EFI_D_INFO,
"(TXT) ***************************************************************************\n"
"(TXT) * Local APIC NMI Structure *\n"
"(TXT) ***************************************************************************\n"
));
DEBUG ((EFI_D_INFO,
(sizeof(UINTN) == sizeof(UINT64)) ?
"(TXT) Local APIC NMI address ................................. 0x%016lx\n" :
"(TXT) Local APIC NMI address ................................. 0x%08x\n",
LocalApicNMI
));
DEBUG ((EFI_D_INFO,
"(TXT) Type ................................................. 0x%02x\n",
LocalApicNMI->Type
));
DEBUG ((EFI_D_INFO,
"(TXT) Length ............................................... 0x%02x\n",
LocalApicNMI->Length
));
DEBUG ((EFI_D_INFO,
"(TXT) ACPI Processor ID .................................... 0x%02x\n",
LocalApicNMI->AcpiProcessorId
));
CopyMem (&Flags, &LocalApicNMI->Flags, sizeof(UINT16));
DEBUG ((EFI_D_INFO,
"(TXT) Flags ................................................ 0x%04x\n",
Flags
));
DEBUG ((EFI_D_INFO,
"(TXT) Polarity ........................................... 0x%04x\n",
Flags & 0x3
));
switch (Flags & 0x3) {
case 0x0:
DEBUG ((EFI_D_INFO,
"(TXT) Conforms to the specifications of the bus\n"
));
break;
case 0x1:
DEBUG ((EFI_D_INFO,
"(TXT) Active high\n"
));
break;
case 0x3:
DEBUG ((EFI_D_INFO,
"(TXT) Active low\n"
));
break;
default:
break;
}
DEBUG ((EFI_D_INFO,
"(TXT) Trigger Mode ....................................... 0x%04x\n",
Flags & 0xc
));
switch (Flags & 0xc) {
case 0x0:
DEBUG ((EFI_D_INFO,
"(TXT) Conforms to the specifications of the bus\n"
));
break;
case 0x4:
DEBUG ((EFI_D_INFO,
"(TXT) Edge-triggered\n"
));
break;
case 0xc:
DEBUG ((EFI_D_INFO,
"(TXT) Level-triggered\n"
));
break;
default:
break;
}
DEBUG ((EFI_D_INFO,
"(TXT) Local APIC INTI ...................................... 0x%02x\n",
LocalApicNMI->LocalApicInti
));
DEBUG ((EFI_D_INFO,
"(TXT) ***************************************************************************\n\n"
));
return;
}
/**
This function dump MADT LocalApicAddressOverride structure.
@param LocalApicAddressOverride MADT LocalApicAddressOverride structure
**/
VOID
DumpApicLocalApicAddressOverride (
EFI_ACPI_2_0_LOCAL_APIC_ADDRESS_OVERRIDE_STRUCTURE *LocalApicAddressOverride
)
{
UINT64 LocalApicAddress;
DEBUG ((EFI_D_INFO,
"(TXT) ***************************************************************************\n"
"(TXT) * Local APIC Address Override Structure *\n"
"(TXT) ***************************************************************************\n"
));
DEBUG ((EFI_D_INFO,
(sizeof(UINTN) == sizeof(UINT64)) ?
"(TXT) Local APIC Address Override address .................... 0x%016lx\n" :
"(TXT) Local APIC Address Override address .................... 0x%08x\n",
LocalApicAddressOverride
));
DEBUG ((EFI_D_INFO,
"(TXT) Type ................................................. 0x%02x\n",
LocalApicAddressOverride->Type
));
DEBUG ((EFI_D_INFO,
"(TXT) Length ............................................... 0x%02x\n",
LocalApicAddressOverride->Length
));
CopyMem (&LocalApicAddress, &LocalApicAddressOverride->LocalApicAddress, sizeof(UINT64));
DEBUG ((EFI_D_INFO,
"(TXT) Local APIC Address ................................... 0x%016lx\n",
LocalApicAddress
));
DEBUG ((EFI_D_INFO,
"(TXT) ***************************************************************************\n\n"
));
return;
}
/**
This function dump MADT IOSapic structure.
@param IOSapic MADT IOSapic structure
**/
VOID
DumpApicIOSapic (
EFI_ACPI_2_0_IO_SAPIC_STRUCTURE *IOSapic
)
{
DEBUG ((EFI_D_INFO,
"(TXT) ***************************************************************************\n"
"(TXT) * IO SAPIC Structure *\n"
"(TXT) ***************************************************************************\n"
));
DEBUG ((EFI_D_INFO,
(sizeof(UINTN) == sizeof(UINT64)) ?
"(TXT) IO SAPIC address ....................................... 0x%016lx\n" :
"(TXT) IO SAPIC address ....................................... 0x%08x\n",
IOSapic
));
DEBUG ((EFI_D_INFO,
"(TXT) Type ................................................. 0x%02x\n",
IOSapic->Type
));
DEBUG ((EFI_D_INFO,
"(TXT) Length ............................................... 0x%02x\n",
IOSapic->Length
));
DEBUG ((EFI_D_INFO,
"(TXT) IO SAPIC ID .......................................... 0x%02x\n",
IOSapic->IoApicId
));
DEBUG ((EFI_D_INFO,
"(TXT) Global System Interrupt Base ......................... 0x%08x\n",
IOSapic->GlobalSystemInterruptBase
));
DEBUG ((EFI_D_INFO,
"(TXT) IO SAPIC Address ..................................... 0x%016lx\n",
IOSapic->IoSapicAddress
));
DEBUG ((EFI_D_INFO,
"(TXT) ***************************************************************************\n\n"
));
return;
}
/**
This function dump MADT ProcessorLocalSapic structure.
@param ProcessorLocalSapic MADT ProcessorLocalSapic structure
**/
VOID
DumpApicProcessorLocalSapic (
EFI_ACPI_2_0_PROCESSOR_LOCAL_SAPIC_STRUCTURE *ProcessorLocalSapic
)
{
UINT32 Flags;
DEBUG ((EFI_D_INFO,
"(TXT) ***************************************************************************\n"
"(TXT) * Processor Local SAPIC Structure *\n"
"(TXT) ***************************************************************************\n"
));
DEBUG ((EFI_D_INFO,
(sizeof(UINTN) == sizeof(UINT64)) ?
"(TXT) Processor Local SAPIC address .......................... 0x%016lx\n" :
"(TXT) Processor Local SAPIC address .......................... 0x%08x\n",
ProcessorLocalSapic
));
DEBUG ((EFI_D_INFO,
"(TXT) Type ................................................. 0x%02x\n",
ProcessorLocalSapic->Type
));
DEBUG ((EFI_D_INFO,
"(TXT) Length ............................................... 0x%02x\n",
ProcessorLocalSapic->Length
));
DEBUG ((EFI_D_INFO,
"(TXT) ACPI Processor ID .................................... 0x%02x\n",
ProcessorLocalSapic->AcpiProcessorId
));
DEBUG ((EFI_D_INFO,
"(TXT) Local SAPIC ID ....................................... 0x%02x\n",
ProcessorLocalSapic->LocalSapicId
));
DEBUG ((EFI_D_INFO,
"(TXT) Local SAPIC EID ...................................... 0x%02x\n",
ProcessorLocalSapic->LocalSapicEid
));
CopyMem (&Flags, &ProcessorLocalSapic->Flags, sizeof(UINT32));
DEBUG ((EFI_D_INFO,
"(TXT) Flags ................................................ 0x%08x\n",
Flags
));
DEBUG ((EFI_D_INFO,
"(TXT) Enabled ............................................ 0x%08x\n",
Flags & EFI_ACPI_2_0_LOCAL_APIC_ENABLED
));
DEBUG ((EFI_D_INFO,
"(TXT) ***************************************************************************\n\n"
));
return;
}
/**
This function dump MADT PlatformInterruptSource structure.
@param PlatformInterruptSource MADT PlatformInterruptSource structure
**/
VOID
DumpApicPlatformInterruptSource (
EFI_ACPI_2_0_PLATFORM_INTERRUPT_SOURCES_STRUCTURE *PlatformInterruptSource
)
{
DEBUG ((EFI_D_INFO,
"(TXT) ***************************************************************************\n"
"(TXT) * Platform Interrupt Source Structure *\n"
"(TXT) ***************************************************************************\n"
));
DEBUG ((EFI_D_INFO,
(sizeof(UINTN) == sizeof(UINT64)) ?
"(TXT) Platform Interrupt Source address ...................... 0x%016lx\n" :
"(TXT) Platform Interrupt Source address ...................... 0x%08x\n",
PlatformInterruptSource
));
DEBUG ((EFI_D_INFO,
"(TXT) Type ................................................. 0x%02x\n",
PlatformInterruptSource->Type
));
DEBUG ((EFI_D_INFO,
"(TXT) Length ............................................... 0x%02x\n",
PlatformInterruptSource->Length
));
DEBUG ((EFI_D_INFO,
"(TXT) Flags ................................................ 0x%04x\n",
PlatformInterruptSource->Flags
));
DEBUG ((EFI_D_INFO,
"(TXT) Polarity ........................................... 0x%04x\n",
PlatformInterruptSource->Flags & 0x3
));
switch (PlatformInterruptSource->Flags & 0x3) {
case 0x0:
DEBUG ((EFI_D_INFO,
"(TXT) Conforms to the specifications of the bus\n"
));
break;
case 0x1:
DEBUG ((EFI_D_INFO,
"(TXT) Active high\n"
));
break;
case 0x3:
DEBUG ((EFI_D_INFO,
"(TXT) Active low\n"
));
break;
default:
break;
}
DEBUG ((EFI_D_INFO,
"(TXT) Trigger Mode ....................................... 0x%04x\n",
PlatformInterruptSource->Flags & 0xc
));
switch (PlatformInterruptSource->Flags & 0xc) {
case 0x0:
DEBUG ((EFI_D_INFO,
"(TXT) Conforms to the specifications of the bus\n"
));
break;
case 0x4:
DEBUG ((EFI_D_INFO,
"(TXT) Edge-triggered\n"
));
break;
case 0xc:
DEBUG ((EFI_D_INFO,
"(TXT) Level-triggered\n"
));
break;
default:
break;
}
DEBUG ((EFI_D_INFO,
"(TXT) Interrupt Type ....................................... 0x%02x\n",
PlatformInterruptSource->InterruptType
));
switch (PlatformInterruptSource->InterruptType) {
case 1:
DEBUG ((EFI_D_INFO,
"(TXT) PMI\n"
));
break;
case 2:
DEBUG ((EFI_D_INFO,
"(TXT) INIT\n"
));
break;
case 3:
DEBUG ((EFI_D_INFO,
"(TXT) Corrected Platform Error Interrupt\n"
));
break;
default:
break;
}
DEBUG ((EFI_D_INFO,
"(TXT) Processor ID ......................................... 0x%02x\n",
PlatformInterruptSource->ProcessorId
));
DEBUG ((EFI_D_INFO,
"(TXT) Processor EID ........................................ 0x%02x\n",
PlatformInterruptSource->ProcessorEid
));
DEBUG ((EFI_D_INFO,
"(TXT) IO SAPIC Vector ...................................... 0x%02x\n",
PlatformInterruptSource->IoSapicVector
));
DEBUG ((EFI_D_INFO,
"(TXT) Global System Interrupt .............................. 0x%08x\n",
PlatformInterruptSource->GlobalSystemInterrupt
));
DEBUG ((EFI_D_INFO,
"(TXT) ***************************************************************************\n\n"
));
return;
}
/**
This function dump MADT ProcessorLocalX2Apic structure.
@param ProcessorLocalX2Apic MADT ProcessorLocalX2Apic structure
**/
VOID
DumpApicProcessorLocalX2Apic (
EFI_ACPI_4_0_PROCESSOR_LOCAL_X2APIC_STRUCTURE *ProcessorLocalX2Apic
)
{
DEBUG ((EFI_D_INFO,
"(TXT) ***************************************************************************\n"
"(TXT) * Processor Local X2APIC Structure *\n"
"(TXT) ***************************************************************************\n"
));
DEBUG ((EFI_D_INFO,
(sizeof(UINTN) == sizeof(UINT64)) ?
"(TXT) Processor Local X2APIC address ......................... 0x%016lx\n" :
"(TXT) Processor Local X2APIC address ......................... 0x%08x\n",
ProcessorLocalX2Apic
));
DEBUG ((EFI_D_INFO,
"(TXT) Type ................................................. 0x%02x\n",
ProcessorLocalX2Apic->Type
));
DEBUG ((EFI_D_INFO,
"(TXT) Length ............................................... 0x%02x\n",
ProcessorLocalX2Apic->Length
));
DEBUG ((EFI_D_INFO,
"(TXT) X2ACPI ID ............................................ 0x%08x\n",
ProcessorLocalX2Apic->X2ApicId
));
DEBUG ((EFI_D_INFO,
"(TXT) Flags ................................................ 0x%08x\n",
ProcessorLocalX2Apic->Flags
));
DEBUG ((EFI_D_INFO,
"(TXT) Enabled ............................................ 0x%08x\n",
ProcessorLocalX2Apic->Flags & EFI_ACPI_1_0_LOCAL_APIC_ENABLED
));
DEBUG ((EFI_D_INFO,
"(TXT) ACPI Processor UID ................................... 0x%08x\n",
ProcessorLocalX2Apic->AcpiProcessorUid
));
DEBUG ((EFI_D_INFO,
"(TXT) ***************************************************************************\n\n"
));
return;
}
/**
This function dump MADT LocalX2ApicNmi structure.
@param LocalX2ApicNmi MADT LocalX2ApicNmi structure
**/
VOID
DumpApicLocalX2ApicNmi (
EFI_ACPI_4_0_LOCAL_X2APIC_NMI_STRUCTURE *LocalX2ApicNmi
)
{
UINT16 Flags;
DEBUG ((EFI_D_INFO,
"(TXT) ***************************************************************************\n"
"(TXT) * Local X2APIC NMI Structure *\n"
"(TXT) ***************************************************************************\n"
));
DEBUG ((EFI_D_INFO,
(sizeof(UINTN) == sizeof(UINT64)) ?
"(TXT) Local X2APIC NMI address ............................... 0x%016lx\n" :
"(TXT) Local X2APIC NMI address ............................... 0x%08x\n",
LocalX2ApicNmi
));
DEBUG ((EFI_D_INFO,
"(TXT) Type ................................................. 0x%02x\n",
LocalX2ApicNmi->Type
));
DEBUG ((EFI_D_INFO,
"(TXT) Length ............................................... 0x%02x\n",
LocalX2ApicNmi->Length
));
CopyMem (&Flags, &LocalX2ApicNmi->Flags, sizeof(UINT16));
DEBUG ((EFI_D_INFO,
"(TXT) Flags ................................................ 0x%04x\n",
Flags
));
DEBUG ((EFI_D_INFO,
"(TXT) Polarity ........................................... 0x%04x\n",
Flags & 0x3
));
switch (Flags & 0x3) {
case 0x0:
DEBUG ((EFI_D_INFO,
"(TXT) Conforms to the specifications of the bus\n"
));
break;
case 0x1:
DEBUG ((EFI_D_INFO,
"(TXT) Active high\n"
));
break;
case 0x3:
DEBUG ((EFI_D_INFO,
"(TXT) Active low\n"
));
break;
default:
break;
}
DEBUG ((EFI_D_INFO,
"(TXT) Trigger Mode ....................................... 0x%04x\n",
Flags & 0xc
));
switch (Flags & 0xc) {
case 0x0:
DEBUG ((EFI_D_INFO,
"(TXT) Conforms to the specifications of the bus\n"
));
break;
case 0x4:
DEBUG ((EFI_D_INFO,
"(TXT) Edge-triggered\n"
));
break;
case 0xc:
DEBUG ((EFI_D_INFO,
"(TXT) Level-triggered\n"
));
break;
default:
break;
}
DEBUG ((EFI_D_INFO,
"(TXT) ACPI Processor UID ................................... 0x%08x\n",
LocalX2ApicNmi->AcpiProcessorUid
));
DEBUG ((EFI_D_INFO,
"(TXT) Local X2APIC LINT .................................... 0x%02x\n",
LocalX2ApicNmi->LocalX2ApicLint
));
DEBUG ((EFI_D_INFO,
"(TXT) ***************************************************************************\n\n"
));
return;
}
/**
This function dump MADT ACPI Table.
@param Madt MADT ACPI Table
**/
VOID
DumpMadt (
IN EFI_ACPI_1_0_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER *Madt
)
{
APIC_STRUCT_HEADER *ApicStructHeader;
INTN MadtLen;
INTN TableLen;
//
// Dump Madt table
//
DEBUG ((EFI_D_INFO,
"(TXT) *****************************************************************************\n"
"(TXT) * Multiple APIC Description Table *\n"
"(TXT) *****************************************************************************\n"
));
DEBUG ((EFI_D_INFO,
(sizeof(UINTN) == sizeof(UINT64)) ?
"(TXT) MADT address ............................................. 0x%016lx\n" :
"(TXT) MADT address ............................................. 0x%08x\n",
Madt
));
DumpAcpiTableHeader ((EFI_ACPI_DESCRIPTION_HEADER *)Madt);
DEBUG ((EFI_D_INFO,
"(TXT) Table Contents:\n"
));
DEBUG ((EFI_D_INFO,
"(TXT) Local APIC Address ................................... 0x%08x\n",
Madt->LocalApicAddress
));
DEBUG ((EFI_D_INFO,
"(TXT) Flags ................................................ 0x%08x\n",
Madt->Flags
));
DEBUG ((EFI_D_INFO,
"(TXT) PCAT_COMPAT ........................................ 0x%08x\n",
Madt->Flags & EFI_ACPI_1_0_PCAT_COMPAT
));
MadtLen = Madt->Header.Length - sizeof(EFI_ACPI_1_0_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER);
TableLen = 0;
ApicStructHeader = (APIC_STRUCT_HEADER *)(Madt + 1);
while (MadtLen > 0) {
switch (ApicStructHeader->Type) {
case EFI_ACPI_1_0_PROCESSOR_LOCAL_APIC:
DumpApicProcessorLocalApic ((EFI_ACPI_1_0_PROCESSOR_LOCAL_APIC_STRUCTURE *)ApicStructHeader);
TableLen = sizeof(EFI_ACPI_1_0_PROCESSOR_LOCAL_APIC_STRUCTURE);
break;
case EFI_ACPI_1_0_IO_APIC:
DumpApicIOApic ((EFI_ACPI_1_0_IO_APIC_STRUCTURE *)ApicStructHeader);
TableLen = sizeof(EFI_ACPI_1_0_IO_APIC_STRUCTURE);
break;
case EFI_ACPI_1_0_INTERRUPT_SOURCE_OVERRIDE:
DumpApicInterruptSourceOverride ((EFI_ACPI_1_0_INTERRUPT_SOURCE_OVERRIDE_STRUCTURE *)ApicStructHeader);
TableLen = sizeof(EFI_ACPI_1_0_INTERRUPT_SOURCE_OVERRIDE_STRUCTURE);
break;
case EFI_ACPI_1_0_NON_MASKABLE_INTERRUPT_SOURCE:
DumpApicNonMaskableInterruptSource ((EFI_ACPI_1_0_NON_MASKABLE_INTERRUPT_SOURCE_STRUCTURE *)ApicStructHeader);
TableLen = sizeof(EFI_ACPI_1_0_NON_MASKABLE_INTERRUPT_SOURCE_STRUCTURE);
break;
case EFI_ACPI_1_0_LOCAL_APIC_NMI:
DumpApicLocalApicNMI ((EFI_ACPI_1_0_LOCAL_APIC_NMI_STRUCTURE *)ApicStructHeader);
TableLen = sizeof(EFI_ACPI_1_0_LOCAL_APIC_NMI_STRUCTURE);
break;
case EFI_ACPI_2_0_LOCAL_APIC_ADDRESS_OVERRIDE:
DumpApicLocalApicAddressOverride ((EFI_ACPI_2_0_LOCAL_APIC_ADDRESS_OVERRIDE_STRUCTURE *)ApicStructHeader);
TableLen = sizeof(EFI_ACPI_2_0_LOCAL_APIC_ADDRESS_OVERRIDE_STRUCTURE);
break;
case EFI_ACPI_2_0_IO_SAPIC:
DumpApicIOSapic ((EFI_ACPI_2_0_IO_SAPIC_STRUCTURE *)ApicStructHeader);
TableLen = sizeof(EFI_ACPI_2_0_IO_SAPIC_STRUCTURE);
break;
case EFI_ACPI_2_0_PROCESSOR_LOCAL_SAPIC:
DumpApicProcessorLocalSapic ((EFI_ACPI_2_0_PROCESSOR_LOCAL_SAPIC_STRUCTURE *)ApicStructHeader);
TableLen = sizeof(EFI_ACPI_2_0_PROCESSOR_LOCAL_SAPIC_STRUCTURE);
break;
case EFI_ACPI_2_0_PLATFORM_INTERRUPT_SOURCES:
DumpApicPlatformInterruptSource ((EFI_ACPI_2_0_PLATFORM_INTERRUPT_SOURCES_STRUCTURE *)ApicStructHeader);
TableLen = sizeof(EFI_ACPI_2_0_PLATFORM_INTERRUPT_SOURCES_STRUCTURE);
break;
case EFI_ACPI_4_0_PROCESSOR_LOCAL_X2APIC:
DumpApicProcessorLocalX2Apic ((EFI_ACPI_4_0_PROCESSOR_LOCAL_X2APIC_STRUCTURE *)ApicStructHeader);
TableLen = sizeof(EFI_ACPI_4_0_PROCESSOR_LOCAL_X2APIC_STRUCTURE);
break;
case EFI_ACPI_4_0_LOCAL_X2APIC_NMI:
DumpApicLocalX2ApicNmi ((EFI_ACPI_4_0_LOCAL_X2APIC_NMI_STRUCTURE *)ApicStructHeader);
TableLen = sizeof(EFI_ACPI_4_0_LOCAL_X2APIC_NMI_STRUCTURE);
break;
default:
TableLen = ApicStructHeader->Length;
break;
}
ASSERT(TableLen == ApicStructHeader->Length);
MadtLen -= ApicStructHeader->Length;
ApicStructHeader = (APIC_STRUCT_HEADER *)((UINT8 *)ApicStructHeader + ApicStructHeader->Length);
}
DEBUG ((EFI_D_INFO,
"(TXT) *****************************************************************************\n\n"
));
return;
}
/**
This function dump MCFG ACPI table.
@param Mcfg MCFG ACPI table
**/
VOID
DumpMcfg (
IN EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE_HEADER *Mcfg
)
{
UINTN Index;
UINTN Count;
EFI_ACPI_MEMORY_MAPPED_ENHANCED_CONFIGURATION_SPACE_BASE_ADDRESS_ALLOCATION_STRUCTURE *McfgStruct;
DEBUG ((EFI_D_INFO,
"(TXT) *****************************************************************************\n"
"(TXT) * MCFG Table *\n"
"(TXT) *****************************************************************************\n"
));
DEBUG ((EFI_D_INFO,
(sizeof(UINTN) == sizeof(UINT64)) ?
"(TXT) MCFG address ............................................. 0x%016lx\n" :
"(TXT) MCFG address ............................................. 0x%08x\n",
Mcfg
));
DumpAcpiTableHeader ((EFI_ACPI_DESCRIPTION_HEADER *)Mcfg);
DEBUG ((EFI_D_INFO, "(TXT) Table Contents:\n"));
Count = (Mcfg->Header.Length - sizeof(*Mcfg)) / sizeof(*McfgStruct);
McfgStruct = (EFI_ACPI_MEMORY_MAPPED_ENHANCED_CONFIGURATION_SPACE_BASE_ADDRESS_ALLOCATION_STRUCTURE *)(Mcfg + 1);
for (Index = 0; Index < Count; Index++) {
DEBUG ((EFI_D_INFO,
"(TXT) McfgStruct[%d]:\n",
Index
));
DEBUG ((EFI_D_INFO,
"(TXT) Bass Address ......................................... 0x%016lx\n",
McfgStruct->BaseAddress
));
DEBUG ((EFI_D_INFO,
"(TXT) PCI Segment Group Number ............................. 0x%04x\n",
McfgStruct->PciSegmentGroupNumber
));
DEBUG ((EFI_D_INFO,
"(TXT) Start Bus Number ..................................... 0x%02x\n",
McfgStruct->StartBusNumber
));
DEBUG ((EFI_D_INFO,
"(TXT) End Bus Number ....................................... 0x%02x\n",
McfgStruct->EndBusNumber
));
}
DEBUG ((EFI_D_INFO,
"(TXT) *****************************************************************************\n\n"
));
return ;
}
//
// This table defines the ACM type string
//
GLOBAL_REMOVE_IF_UNREFERENCED CHAR16 *mAcmTypeStr[] = {
L"BIOS ACM",
L"SINIT ACM",
};
//
// This table defines the ACM capability string
//
GLOBAL_REMOVE_IF_UNREFERENCED CHAR16 *mCapabilityStr[] = {
L"GETSEC[WAKEUP] for RLP ",
L"MONITOR address for RLP ",
L"ECX for MLE PageTable ",
L"STM support ",
L"TPM12 PCR no legacy ",
L"TPM12 PCR detail authority",
L"Platform Type Client ",
L"Platform Type Server ",
L"MAXPHYADDR supported ",
L"TCG2 compatible eventlog ",
};
//
// This table defines the ACM TPM capability string
//
GLOBAL_REMOVE_IF_UNREFERENCED CHAR16 *mTpmCapabilityStr[] = {
L"Maximum Agility Policy ",
L"Maximum performance Policy",
L"Discrete TPM 1.2 Support ",
L"Discrete TPM 2.0 Support ",
NULL,
L"Firmware TPM 2.0 Support ",
L"TCG2 compliant NV Index ",
};
/**
This function dump ACM binary info.
@param Acm ACM binary
**/
VOID
DumpAcm (
IN TXT_ACM_FORMAT *Acm
)
{
TXT_CHIPSET_ACM_INFORMATION_TABLE *ChipsetAcmInformationTable;
TXT_CHIPSET_ID_LIST *ChipsetIdList;
TXT_PROCESSOR_ID_LIST *ProcessorIdList;
TXT_ACM_TPM_INFO_LIST *TpmInfoList;
UINTN Index;
UINT8 *Buffer;
DEBUG ((EFI_D_INFO,
"(TXT) *****************************************************************************\n"
"(TXT) * ACM *\n"
"(TXT) *****************************************************************************\n"
));
DEBUG ((EFI_D_INFO, "(TXT) ACM: (%08x)\n", Acm));
DEBUG ((EFI_D_INFO, "(TXT) ModuleType - %04x\n", (UINTN)Acm->ModuleType));
if (Acm->ModuleType == TXT_ACM_MODULE_TYPE_CHIPSET_ACM) {
DEBUG ((EFI_D_INFO, "(TXT) Chipset ACM\n"));
}
DEBUG ((EFI_D_INFO, "(TXT) ModuleSubType - %04x\n", (UINTN)Acm->ModuleSubType));
if (Acm->ModuleSubType == TXT_ACM_MODULE_SUBTYPE_CAPABLE_OF_EXECUTE_AT_RESET) {
DEBUG ((EFI_D_INFO, "(TXT) Capable of be Executed at Reset\n"));
}
DEBUG ((EFI_D_INFO, "(TXT) HeaderLen - %08x\n", (UINTN)Acm->HeaderLen));
DEBUG ((EFI_D_INFO, "(TXT) HeaderVersion - %08x\n", (UINTN)Acm->HeaderVersion));
DEBUG ((EFI_D_INFO, "(TXT) ChipsetID - %04x\n", (UINTN)Acm->ChipsetID));
DEBUG ((EFI_D_INFO, "(TXT) Flags - %04x\n", (UINTN)Acm->Flags));
DEBUG ((EFI_D_INFO, "(TXT) PreProduction - %04x\n", (UINTN)Acm->Flags & TXT_ACM_MODULE_FLAG_PREPRODUCTION));
DEBUG ((EFI_D_INFO, "(TXT) Debug Signed - %04x\n", (UINTN)Acm->Flags & TXT_ACM_MODULE_FLAG_DEBUG_SIGN));
DEBUG ((EFI_D_INFO, "(TXT) ModuleVendor - %08x\n", (UINTN)Acm->ModuleVendor));
DEBUG ((EFI_D_INFO, "(TXT) Date - %08x\n", (UINTN)Acm->Date));
DEBUG ((EFI_D_INFO, "(TXT) Size - %08x\n", (UINTN)Acm->Size));
DEBUG ((EFI_D_INFO, "(TXT) CodeControl - %08x\n", (UINTN)Acm->CodeControl));
DEBUG ((EFI_D_INFO, "(TXT) ErrorEntryPoint - %08x\n", (UINTN)Acm->ErrorEntryPoint));
DEBUG ((EFI_D_INFO, "(TXT) GDTLimit - %08x\n", (UINTN)Acm->GDTLimit));
DEBUG ((EFI_D_INFO, "(TXT) GDTBasePtr - %08x\n", (UINTN)Acm->GDTBasePtr));
DEBUG ((EFI_D_INFO, "(TXT) SegSel - %08x\n", (UINTN)Acm->SegSel));
DEBUG ((EFI_D_INFO, "(TXT) EntryPoint - %08x\n", (UINTN)Acm->EntryPoint));
DEBUG ((EFI_D_INFO, "(TXT) KeySize - %08x\n", (UINTN)Acm->KeySize));
DEBUG ((EFI_D_INFO, "(TXT) ScratchSize - %08x\n", (UINTN)Acm->ScratchSize));
Buffer = (UINT8 *)(Acm + 1);
DEBUG ((EFI_D_INFO, "(TXT) RSAPubKey - \n"));
DumpHex (Buffer, Acm->KeySize * 4);
Buffer += Acm->KeySize * 4;
DEBUG ((EFI_D_INFO, "(TXT) RSAPubExp - %08x\n", (UINTN)*(UINT32 *)Buffer));
Buffer += 4;
DEBUG ((EFI_D_INFO, "(TXT) RSASig - \n"));
DumpHex (Buffer, ACM_PKCS_1_5_RSA_SIGNATURE_SIZE); // PKCS #1.5 RSA Signature
Buffer += ACM_PKCS_1_5_RSA_SIGNATURE_SIZE;
Buffer += Acm->ScratchSize * 4;
ChipsetAcmInformationTable = (TXT_CHIPSET_ACM_INFORMATION_TABLE *)Buffer;
DEBUG ((EFI_D_INFO, "(TXT) Chipset ACM info:\n"));
DEBUG ((EFI_D_INFO,
"(TXT) Uuid - {%08x-%08x-%08x-%08x}\n",
(UINTN)ChipsetAcmInformationTable->Uuid.Uuid0,
(UINTN)ChipsetAcmInformationTable->Uuid.Uuid1,
(UINTN)ChipsetAcmInformationTable->Uuid.Uuid2,
(UINTN)ChipsetAcmInformationTable->Uuid.Uuid3
));
DEBUG ((EFI_D_INFO, "(TXT) ChipsetACMType - %02x\n", (UINTN)ChipsetAcmInformationTable->ChipsetACMType));
if (ChipsetAcmInformationTable->ChipsetACMType < sizeof(mAcmTypeStr)/sizeof(mAcmTypeStr[0])) {
DEBUG ((EFI_D_INFO, "(TXT) %s\n", mAcmTypeStr[ChipsetAcmInformationTable->ChipsetACMType]));
}
DEBUG ((EFI_D_INFO, "(TXT) Version - %02x\n", (UINTN)ChipsetAcmInformationTable->Version));
DEBUG ((EFI_D_INFO, "(TXT) Length - %04x\n", (UINTN)ChipsetAcmInformationTable->Length));
DEBUG ((EFI_D_INFO, "(TXT) ChipsetIDList - %08x\n", (UINTN)ChipsetAcmInformationTable->ChipsetIDList));
DEBUG ((EFI_D_INFO, "(TXT) OsSinitTableVer - %08x\n", (UINTN)ChipsetAcmInformationTable->OsSinitTableVer));
DEBUG ((EFI_D_INFO, "(TXT) MinMleHeaderVer - %08x\n", (UINTN)ChipsetAcmInformationTable->MinMleHeaderVer));
if (ChipsetAcmInformationTable->Version >= TXT_CHIPSET_ACM_INFORMATION_TABLE_VERSION_3) {
DEBUG ((EFI_D_INFO, "(TXT) Capabilities - %08x\n", (UINTN)ChipsetAcmInformationTable->Capabilities));
for (Index = 0; Index < sizeof(mCapabilityStr)/sizeof(mCapabilityStr[0]); Index++) {
if (mCapabilityStr[Index] == NULL) {
continue;
}
DEBUG ((EFI_D_INFO,
"(TXT) %s- %08x\n",
mCapabilityStr[Index],
(UINTN)(ChipsetAcmInformationTable->Capabilities & (1 << Index))
));
}
DEBUG ((EFI_D_INFO, "(TXT) AcmVersion - %02x\n", (UINTN)ChipsetAcmInformationTable->AcmVersion));
if (ChipsetAcmInformationTable->Version >= TXT_CHIPSET_ACM_INFORMATION_TABLE_VERSION_6) {
DEBUG ((EFI_D_INFO, "(TXT) AcmRevision - %02x.%02x.%02x\n",
(UINTN)ChipsetAcmInformationTable->AcmRevision[0],
(UINTN)ChipsetAcmInformationTable->AcmRevision[1],
(UINTN)ChipsetAcmInformationTable->AcmRevision[2]
));
}
}
if (ChipsetAcmInformationTable->Version >= TXT_CHIPSET_ACM_INFORMATION_TABLE_VERSION_4) {
DEBUG ((EFI_D_INFO, "(TXT) ProcessorIDList - %08x\n", (UINTN)ChipsetAcmInformationTable->ProcessorIDList));
}
ChipsetIdList = (TXT_CHIPSET_ID_LIST *)((UINTN)Acm + ChipsetAcmInformationTable->ChipsetIDList);
DEBUG ((EFI_D_INFO, "(TXT) Chipset ID List info:\n"));
DEBUG ((EFI_D_INFO, "(TXT) Count - %08x\n", (UINTN)ChipsetIdList->Count));
for (Index = 0; Index < ChipsetIdList->Count; Index++) {
DEBUG ((EFI_D_INFO, "(TXT) ID[%d]:\n", (UINTN)Index));
DEBUG ((EFI_D_INFO, "(TXT) Flags - %08x\n", (UINTN)ChipsetIdList->ChipsetID[Index].Flags));
DEBUG ((EFI_D_INFO, "(TXT) RevisionIdMask - %08x\n", (UINTN)ChipsetIdList->ChipsetID[Index].Flags & TXT_ACM_CHIPSET_ID_REVISION_ID_MAKE));
DEBUG ((EFI_D_INFO, "(TXT) VendorID - %04x\n", (UINTN)ChipsetIdList->ChipsetID[Index].VendorID));
DEBUG ((EFI_D_INFO, "(TXT) DeviceID - %04x\n", (UINTN)ChipsetIdList->ChipsetID[Index].DeviceID));
DEBUG ((EFI_D_INFO, "(TXT) RevisionID - %04x\n", (UINTN)ChipsetIdList->ChipsetID[Index].RevisionID));
DEBUG ((EFI_D_INFO, "(TXT) ExtendedID - %08x\n", (UINTN)ChipsetIdList->ChipsetID[Index].ExtendedID));
}
if (ChipsetAcmInformationTable->Version < TXT_CHIPSET_ACM_INFORMATION_TABLE_VERSION_4) {
goto End;
}
ProcessorIdList = (TXT_PROCESSOR_ID_LIST *)((UINTN)Acm + ChipsetAcmInformationTable->ProcessorIDList);
DEBUG ((EFI_D_INFO, "(TXT) Processor ID List info:\n"));
DEBUG ((EFI_D_INFO, "(TXT) Count - %08x\n", (UINTN)ProcessorIdList->Count));
for (Index = 0; Index < ProcessorIdList->Count; Index++) {
DEBUG ((EFI_D_INFO, "(TXT) ID[%d]:\n", (UINTN)Index));
DEBUG ((EFI_D_INFO, "(TXT) FMS - %08x\n", (UINTN)ProcessorIdList->ProcessorID[Index].FMS));
DEBUG ((EFI_D_INFO, "(TXT) FMSMask - %08x\n", (UINTN)ProcessorIdList->ProcessorID[Index].FMSMask));
DEBUG ((EFI_D_INFO, "(TXT) PlatformID - %016lx\n", ProcessorIdList->ProcessorID[Index].PlatformID));
DEBUG ((EFI_D_INFO, "(TXT) PlatformMask - %016lx\n", ProcessorIdList->ProcessorID[Index].PlatformMask));
}
if (ChipsetAcmInformationTable->Version >= TXT_CHIPSET_ACM_INFORMATION_TABLE_VERSION_5) {
DEBUG ((EFI_D_INFO, "(TXT) TPMInfoList - %08x\n", (UINTN)ChipsetAcmInformationTable->TPMInfoList));
TpmInfoList = (TXT_ACM_TPM_INFO_LIST *)((UINTN)Acm + ChipsetAcmInformationTable->TPMInfoList);
DEBUG ((EFI_D_INFO, "(TXT) TPM Info List info:\n"));
DEBUG ((EFI_D_INFO, "(TXT) Capabilities - %08x\n", (UINTN)TpmInfoList->Capabilities));
for (Index = 0; Index < sizeof(mTpmCapabilityStr) / sizeof(mTpmCapabilityStr[0]); Index++) {
if (mTpmCapabilityStr[Index] == NULL) {
continue;
}
DEBUG((EFI_D_INFO,
"(TXT) %s- %08x\n",
mTpmCapabilityStr[Index],
(UINTN)(TpmInfoList->Capabilities & (1 << Index))
));
}
DEBUG ((EFI_D_INFO, "(TXT) Count - %04x\n", (UINTN)TpmInfoList->Count));
for (Index = 0; Index < TpmInfoList->Count; Index++) {
DEBUG ((EFI_D_INFO, "(TXT) AlgorithmID - %04x\n", (UINTN)TpmInfoList->AlgorithmID[Index]));
}
}
End:
DEBUG ((EFI_D_INFO,
"(TXT) *****************************************************************************\n\n"
));
return ;
}
/**
This function dump MLE header info.
@param MleHeader MLE header
**/
VOID
DumpMleHeader (
IN TXT_MLE_HEADER *MleHeader
)
{
UINTN Index;
DEBUG ((EFI_D_INFO,
"(TXT) *****************************************************************************\n"
"(TXT) * MLE Header *\n"
"(TXT) *****************************************************************************\n"
));
DEBUG ((EFI_D_INFO, "(TXT) MLE Header: (%08x)\n", MleHeader));
DEBUG ((EFI_D_INFO,
"(TXT) Uuid - {%08x-%08x-%08x-%08x}\n",
(UINTN)MleHeader->Uuid.Uuid0,
(UINTN)MleHeader->Uuid.Uuid1,
(UINTN)MleHeader->Uuid.Uuid2,
(UINTN)MleHeader->Uuid.Uuid3
));
DEBUG ((EFI_D_INFO, "(TXT) HeaderLen - %08x\n", (UINTN)MleHeader->HeaderLen));
DEBUG ((EFI_D_INFO, "(TXT) Version - %08x\n", (UINTN)MleHeader->Version));
DEBUG ((EFI_D_INFO, "(TXT) EntryPoint - %08x\n", (UINTN)MleHeader->EntryPoint));
if (MleHeader->Version < TXT_MLE_HEADER_VERSION_1_1) {
goto End ;
}
DEBUG ((EFI_D_INFO, "(TXT) FirstValidPage - %08x\n", (UINTN)MleHeader->FirstValidPage));
DEBUG ((EFI_D_INFO, "(TXT) MleStart - %08x\n", (UINTN)MleHeader->MleStart));
DEBUG ((EFI_D_INFO, "(TXT) MleEnd - %08x\n", (UINTN)MleHeader->MleEnd));
if (MleHeader->Version < TXT_MLE_HEADER_VERSION_2) {
goto End ;
}
DEBUG ((EFI_D_INFO, "(TXT) Capabilities - %08x\n", (UINTN)MleHeader->Capabilities));
for (Index = 0; Index < sizeof(mCapabilityStr)/sizeof(mCapabilityStr[0]); Index++) {
if (mCapabilityStr[Index] == NULL) {
continue;
}
DEBUG ((EFI_D_INFO,
"(TXT) %s- %08x\n",
mCapabilityStr[Index],
MleHeader->Capabilities & (1 << Index)
));
}
if (MleHeader->Version < TXT_MLE_HEADER_VERSION_2_1) {
goto End ;
}
DEBUG ((EFI_D_INFO, "(TXT) CmdlineStart - %08x\n", (UINTN)MleHeader->CmdlineStart));
DEBUG ((EFI_D_INFO, "(TXT) CmdlineEnd - %08x\n", (UINTN)MleHeader->CmdlineEnd));
End:
DEBUG ((EFI_D_INFO,
"(TXT) *****************************************************************************\n\n"
));
return ;
}
/**
This function dump TXT Ext Data Element.
@param ExtDataElement Ext Data Element
@param MaxSize Max size of Ext Data Element
**/
VOID
DumpExtDataElement (
IN TXT_HEAP_EXT_DATA_ELEMENT *ExtDataElement,
IN UINTN MaxSize
)
{
VOID *ExtDataElementEnd;
TXT_HEAP_BIOS_SPEC_VER_ELEMENT *ExtDataBiosSpecVer;
TXT_HEAP_BIOSACM_ELEMENT *ExtDataBiosAcm;
UINT64 *BiosAcmAddrs;
TXT_HEAP_BIOS_EXT_ELEMENT *ExtDataExtBios;
TXT_HEAP_CUSTOM_ELEMENT *ExtDataCustomer;
TXT_HEAP_EVENTLOG_EXT_ELEMENT *ExtDataEventLog;
TXT_EVENT_LOG_CONTAINER *EventLogContainer;
TXT_HEAP_EVENT_LOG_DESCR *EventLogDesc;
UINTN Index;
TXT_HEAP_EVENT_LOG_POINTER_ELEMENT2 *ExtDataEventLogPointerElement2;
TXT_HEAP_EVENT_LOG_POINTER_ELEMENT2_1 *ExtDataEventLogPointerElement2_1;
ExtDataElementEnd = (UINT8 *)ExtDataElement + MaxSize;
while ((UINTN)ExtDataElement < (UINTN)ExtDataElementEnd) {
switch (ExtDataElement->Type) {
case TXT_HEAP_EXTDATA_TYPE_END:
DEBUG ((EFI_D_INFO, "(TXT) ExtDataTypeEnd:\n"));
DEBUG ((EFI_D_INFO, "(TXT) Type - %08x\n", (UINTN)ExtDataElement->Type));
DEBUG ((EFI_D_INFO, "(TXT) Size - %08x\n", (UINTN)ExtDataElement->Size));
break;
case TXT_HEAP_EXTDATA_TYPE_BIOS_SPEC_VER:
ExtDataBiosSpecVer = (TXT_HEAP_BIOS_SPEC_VER_ELEMENT *)(ExtDataElement + 1);
DEBUG ((EFI_D_INFO, "(TXT) ExtDataTypeBiosSpecVer:\n"));
DEBUG ((EFI_D_INFO, "(TXT) Type - %08x\n", (UINTN)ExtDataElement->Type));
DEBUG ((EFI_D_INFO, "(TXT) Size - %08x\n", (UINTN)ExtDataElement->Size));
DEBUG ((EFI_D_INFO, "(TXT) SpecVer - %04x.%04x.%04x\n", (UINTN)ExtDataBiosSpecVer->SpecVerMajor, (UINTN)ExtDataBiosSpecVer->SpecVerMinor, (UINTN)ExtDataBiosSpecVer->SpecVerRevision));
break;
case TXT_HEAP_EXTDATA_TYPE_BIOSACM:
ExtDataBiosAcm = (TXT_HEAP_BIOSACM_ELEMENT *)(ExtDataElement + 1);
DEBUG ((EFI_D_INFO, "(TXT) ExtDataTypeBiosAcm:\n"));
DEBUG ((EFI_D_INFO, "(TXT) Type - %08x\n", (UINTN)ExtDataElement->Type));
DEBUG ((EFI_D_INFO, "(TXT) Size - %08x\n", (UINTN)ExtDataElement->Size));
DEBUG ((EFI_D_INFO, "(TXT) NumAcms - %08x\n", (UINTN)ExtDataBiosAcm->NumAcms));
BiosAcmAddrs = (UINT64 *)(ExtDataBiosAcm + 1);
for (Index = 0; Index < ExtDataBiosAcm->NumAcms; Index++) {
DEBUG ((EFI_D_INFO, "(TXT) BiosAcmAddrs - %016lx\n", BiosAcmAddrs[Index]));
}
break;
case TXT_HEAP_EXTDATA_TYPE_BIOS_EXT:
ExtDataExtBios = (TXT_HEAP_BIOS_EXT_ELEMENT *)(ExtDataElement + 1);
DEBUG ((EFI_D_INFO, "(TXT) ExtDataTypeBiosExt:\n"));
DEBUG ((EFI_D_INFO, "(TXT) Type - %08x\n", (UINTN)ExtDataElement->Type));
DEBUG ((EFI_D_INFO, "(TXT) Size - %08x\n", (UINTN)ExtDataElement->Size));
DEBUG ((EFI_D_INFO, "(TXT) StmSpecVer - %02x.%02x\n", (UINTN)ExtDataExtBios->StmSpecVerMajor, (UINTN)ExtDataExtBios->StmSpecVerMinor));
DEBUG ((EFI_D_INFO, "(TXT) BiosSmmFlags - %04x\n", (UINTN)ExtDataExtBios->BiosSmmFlags));
DEBUG ((EFI_D_INFO, "(TXT) StmFeatureFlags - %04x\n", (UINTN)ExtDataExtBios->StmFeatureFlags));
DEBUG ((EFI_D_INFO, "(TXT) RequiredStmSmmRevId - %08x\n", (UINTN)ExtDataExtBios->RequiredStmSmmRevId));
DEBUG ((EFI_D_INFO, "(TXT) GetBiosAcStatusCmd - %02x\n", (UINTN)ExtDataExtBios->GetBiosAcStatusCmd));
DEBUG ((EFI_D_INFO, "(TXT) UpdateBiosAcCmd - %02x\n", (UINTN)ExtDataExtBios->UpdateBiosAcCmd));
DEBUG ((EFI_D_INFO, "(TXT) GetSinitAcStatusCmd - %02x\n", (UINTN)ExtDataExtBios->GetSinitAcStatusCmd));
DEBUG ((EFI_D_INFO, "(TXT) UpdateSinitAcCmd - %02x\n", (UINTN)ExtDataExtBios->UpdateSinitAcCmd));
DEBUG ((EFI_D_INFO, "(TXT) GetStmStatusCmd - %02x\n", (UINTN)ExtDataExtBios->GetStmStatusCmd));
DEBUG ((EFI_D_INFO, "(TXT) UpdateStmCmd - %02x\n", (UINTN)ExtDataExtBios->UpdateStmCmd));
DEBUG ((EFI_D_INFO, "(TXT) HandleBiosResourcesCmd - %02x\n", (UINTN)ExtDataExtBios->HandleBiosResourcesCmd));
DEBUG ((EFI_D_INFO, "(TXT) AccessResourcesCmd - %02x\n", (UINTN)ExtDataExtBios->AccessResourcesCmd));
DEBUG ((EFI_D_INFO, "(TXT) LoadStmCmd - %02x\n", (UINTN)ExtDataExtBios->LoadStmCmd));
break;
case TXT_HEAP_EXTDATA_TYPE_CUSTOM:
ExtDataCustomer = (TXT_HEAP_CUSTOM_ELEMENT *)(ExtDataElement + 1);
DEBUG ((EFI_D_INFO, "(TXT) ExtDataTypeCustom:\n"));
DEBUG ((EFI_D_INFO, "(TXT) Type - %08x\n", (UINTN)ExtDataElement->Type));
DEBUG ((EFI_D_INFO, "(TXT) Size - %08x\n", (UINTN)ExtDataElement->Size));
DEBUG ((EFI_D_INFO, "(TXT) Uuid - %08x-%04x-%04x-%04x-%02x%02x%02x%02x%02x%02x\n",
(UINTN)ExtDataCustomer->Uuid.Data1,
(UINTN)ExtDataCustomer->Uuid.Data2,
(UINTN)ExtDataCustomer->Uuid.Data3,
(UINTN)ExtDataCustomer->Uuid.Data4,
(UINTN)ExtDataCustomer->Uuid.Data5[0],
(UINTN)ExtDataCustomer->Uuid.Data5[1],
(UINTN)ExtDataCustomer->Uuid.Data5[2],
(UINTN)ExtDataCustomer->Uuid.Data5[3],
(UINTN)ExtDataCustomer->Uuid.Data5[4],
(UINTN)ExtDataCustomer->Uuid.Data5[5]
));
break;
case TXT_HEAP_EXTDATA_TYPE_EVENTLOG_PTR:
ExtDataEventLog = (TXT_HEAP_EVENTLOG_EXT_ELEMENT *)(ExtDataElement + 1);
DEBUG ((EFI_D_INFO, "(TXT) ExtDataTypeEventLog:\n"));
DEBUG ((EFI_D_INFO, "(TXT) Type - %08x\n", (UINTN)ExtDataElement->Type));
DEBUG ((EFI_D_INFO, "(TXT) Size - %08x\n", (UINTN)ExtDataElement->Size));
DEBUG ((EFI_D_INFO, "(TXT) EventLogAddress - %016lx\n", (UINTN)ExtDataEventLog->EventLogAddress));
EventLogContainer = (TXT_EVENT_LOG_CONTAINER *)(UINTN)ExtDataEventLog->EventLogAddress;
DEBUG ((EFI_D_INFO, "(TXT) EventLogContainer:\n"));
DEBUG ((EFI_D_INFO, "(TXT) Signature - '"));
for (Index = 0; Index < sizeof(EventLogContainer->Signature); Index++) {
DEBUG ((EFI_D_INFO, "%c", EventLogContainer->Signature[Index]));
}
DEBUG ((EFI_D_INFO, "'\n"));
DEBUG ((EFI_D_INFO, "(TXT) ContainerVersion - %02x.%02x\n", (UINTN)EventLogContainer->ContainerVersionMajor, (UINTN)EventLogContainer->ContainerVersionMinor));
DEBUG ((EFI_D_INFO, "(TXT) PcrEventVersion - %02x.%02x\n", (UINTN)EventLogContainer->PcrEventVersionMajor, (UINTN)EventLogContainer->PcrEventVersionMinor));
DEBUG ((EFI_D_INFO, "(TXT) Size - %08x\n", (UINTN)EventLogContainer->Size));
DEBUG ((EFI_D_INFO, "(TXT) PcrEventsOffset - %08x\n", (UINTN)EventLogContainer->PcrEventsOffset));
DEBUG ((EFI_D_INFO, "(TXT) NextEventOffset - %08x\n", (UINTN)EventLogContainer->NextEventOffset));
break;
case TXT_HEAP_EXTDATA_TYPE_MADT:
DEBUG ((EFI_D_INFO, "(TXT) ExtDataEventMadt:\n"));
DEBUG ((EFI_D_INFO, "(TXT) Type - %08x\n", (UINTN)ExtDataElement->Type));
DEBUG ((EFI_D_INFO, "(TXT) Size - %08x\n", (UINTN)ExtDataElement->Size));
DumpMadt ((EFI_ACPI_1_0_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER *)(ExtDataElement + 1));
break;
case TXT_HEAP_EXTDATA_TYPE_EVENT_LOG_POINTER2:
ExtDataEventLogPointerElement2 = (TXT_HEAP_EVENT_LOG_POINTER_ELEMENT2 *)(ExtDataElement + 1);
DEBUG ((EFI_D_INFO, "(TXT) ExtDataEventLogPointerElement2:\n"));
DEBUG ((EFI_D_INFO, "(TXT) Type - %08x\n", (UINTN)ExtDataElement->Type));
DEBUG ((EFI_D_INFO, "(TXT) Size - %08x\n", (UINTN)ExtDataElement->Size));
DEBUG ((EFI_D_INFO, "(TXT) Count - %08x\n", (UINTN)ExtDataEventLogPointerElement2->Count));
EventLogDesc = (TXT_HEAP_EVENT_LOG_DESCR *)(ExtDataEventLogPointerElement2 + 1);
for (Index = 0; Index < ExtDataEventLogPointerElement2->Count; Index++, EventLogDesc++) {
DEBUG ((EFI_D_INFO, "(TXT) HashAlgID(%d) - %04x\n", Index, EventLogDesc->HashAlgID));
DEBUG ((EFI_D_INFO, "(TXT) PhysicalAddress - %016lx\n", EventLogDesc->PhysicalAddress));
DEBUG ((EFI_D_INFO, "(TXT) AllocatedEventContainSize- %08x\n", EventLogDesc->AllocatedEventContainerSize));
DEBUG ((EFI_D_INFO, "(TXT) FirstRecordOffset - %08x\n", EventLogDesc->FirstRecordOffset));
DEBUG ((EFI_D_INFO, "(TXT) NextRecordOffset - %08x\n", EventLogDesc->NextRecordOffset));
}
break;
case TXT_HEAP_EXTDATA_TYPE_EVENT_LOG_POINTER2_1:
ExtDataEventLogPointerElement2_1 = (TXT_HEAP_EVENT_LOG_POINTER_ELEMENT2_1 *)(ExtDataElement + 1);
DEBUG ((EFI_D_INFO, "(TXT) ExtDataEventLogPointerElement2_1:\n"));
DEBUG ((EFI_D_INFO, "(TXT) Type - %08x\n", (UINTN)ExtDataElement->Type));
DEBUG ((EFI_D_INFO, "(TXT) Size - %08x\n", (UINTN)ExtDataElement->Size));
DEBUG ((EFI_D_INFO, "(TXT) PhysicalAddress - %016lx\n", ExtDataEventLogPointerElement2_1->PhysicalAddress));
DEBUG ((EFI_D_INFO, "(TXT) AllocatedEventContainSize- %08x\n", ExtDataEventLogPointerElement2_1->AllocatedEventContainerSize));
DEBUG ((EFI_D_INFO, "(TXT) FirstRecordOffset - %08x\n", ExtDataEventLogPointerElement2_1->FirstRecordOffset));
DEBUG ((EFI_D_INFO, "(TXT) NextRecordOffset - %08x\n", ExtDataEventLogPointerElement2_1->NextRecordOffset));
break;
case TXT_HEAP_EXTDATA_TYPE_MCFG:
DEBUG ((EFI_D_INFO, "(TXT) ExtDataEventMcfg:\n"));
DEBUG ((EFI_D_INFO, "(TXT) Type - %08x\n", (UINTN)ExtDataElement->Type));
DEBUG ((EFI_D_INFO, "(TXT) Size - %08x\n", (UINTN)ExtDataElement->Size));
DumpMcfg ((EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE_HEADER *)(ExtDataElement + 1));
break;
default:
break;
}
if (ExtDataElement->Type == TXT_HEAP_EXTDATA_TYPE_END) {
break;
} else {
ExtDataElement = (TXT_HEAP_EXT_DATA_ELEMENT *)((UINTN)ExtDataElement + ExtDataElement->Size);
}
}
}
/**
This function dump TXT BiosToOs data.
@param Data TXT BiosToOs data
**/
VOID
DumpBiosToOsData (
IN UINT64 *Data
)
{
TXT_BIOS_TO_OS_DATA *BiosToOsData;
TXT_HEAP_EXT_DATA_ELEMENT *ExtDataElement;
UINTN TotalBiosToOsDataSize;
DEBUG ((EFI_D_INFO,
"(TXT) *****************************************************************************\n"
"(TXT) * BIOS TO OS Data *\n"
"(TXT) *****************************************************************************\n"
));
DEBUG ((EFI_D_INFO, "(TXT) BiosToOsData: (%08x)\n", Data));
DEBUG ((EFI_D_INFO, "(TXT) Size - %016lx\n", *Data));
BiosToOsData = (TXT_BIOS_TO_OS_DATA *)(Data + 1);
DEBUG ((EFI_D_INFO, "(TXT) Version - %08x\n", (UINTN)BiosToOsData->Version));
DEBUG ((EFI_D_INFO, "(TXT) BiosSinitSize - %08x\n", (UINTN)BiosToOsData->BiosSinitSize));
if (BiosToOsData->Version < TXT_BIOS_TO_OS_DATA_VERSION_2) {
return ;
}
DEBUG ((EFI_D_INFO, "(TXT) LcpPdBase - %08x\n", (UINTN)BiosToOsData->LcpPdBase));
DEBUG ((EFI_D_INFO, "(TXT) LcpPdSize - %08x\n", (UINTN)BiosToOsData->LcpPdSize));
DEBUG ((EFI_D_INFO, "(TXT) NumLogProcs - %08x\n", (UINTN)BiosToOsData->NumLogProcs));
if (BiosToOsData->Version < TXT_BIOS_TO_OS_DATA_VERSION_3) {
return ;
}
if (BiosToOsData->Version < TXT_BIOS_TO_OS_DATA_VERSION_5) {
DEBUG ((EFI_D_INFO, "(TXT) SinitFlags - %08x\n", (UINTN)BiosToOsData->SinitFlags));
}
if (BiosToOsData->Version >= TXT_BIOS_TO_OS_DATA_VERSION_5) {
DEBUG ((EFI_D_INFO, "(TXT) MleFlags - %08x\n", (UINTN)BiosToOsData->MleFlags));
}
if (BiosToOsData->Version >= TXT_BIOS_TO_OS_DATA_VERSION_4) {
TotalBiosToOsDataSize = (UINTN)*((UINT64 *)BiosToOsData - 1) - sizeof(UINT64);
ExtDataElement = (TXT_HEAP_EXT_DATA_ELEMENT *)(BiosToOsData + 1);
DumpExtDataElement (ExtDataElement, (UINTN)BiosToOsData + TotalBiosToOsDataSize - (UINTN)ExtDataElement);
}
DEBUG ((EFI_D_INFO,
"(TXT) *****************************************************************************\n\n"
));
return ;
}
/**
This function dump TXT OsToSinit data.
@param Data TXT OsToSinit data
**/
VOID
DumpOsToSinitData (
IN UINT64 *Data
)
{
TXT_OS_TO_SINIT_DATA *OsToSinitData;
TXT_HEAP_EXT_DATA_ELEMENT *ExtDataElement;
UINTN TotalOsToSinitDataSize;
UINTN Index;
EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER *Rsdp;
DEBUG ((EFI_D_INFO,
"(TXT) *****************************************************************************\n"
"(TXT) * OS TO SINIT Data *\n"
"(TXT) *****************************************************************************\n"
));
DEBUG ((EFI_D_INFO, "(TXT) OsToSinitData: (%08x)\n", Data));
DEBUG ((EFI_D_INFO, "(TXT) Size - %016lx\n", *Data));
OsToSinitData = (TXT_OS_TO_SINIT_DATA *)(Data + 1);
DEBUG ((EFI_D_INFO, "(TXT) Version - %08x\n", (UINTN)OsToSinitData->Version));
if (OsToSinitData->Version >= TXT_OS_TO_SINIT_DATA_VERSION_7) {
DEBUG ((EFI_D_INFO, "(TXT) Flags - %08x\n", (UINTN)OsToSinitData->Flags));
}
DEBUG ((EFI_D_INFO, "(TXT) MLEPageTableBase - %016lx\n", OsToSinitData->MLEPageTableBase));
DEBUG ((EFI_D_INFO, "(TXT) MLESize - %016lx\n", OsToSinitData->MLESize));
DEBUG ((EFI_D_INFO, "(TXT) MLEHeaderBase - %016lx\n", OsToSinitData->MLEHeaderBase));
if (OsToSinitData->Version < TXT_OS_TO_SINIT_DATA_VERSION_3) {
return ;
}
DEBUG ((EFI_D_INFO, "(TXT) PMRLowBase - %016lx\n", OsToSinitData->PMRLowBase));
DEBUG ((EFI_D_INFO, "(TXT) PMRLowSize - %016lx\n", OsToSinitData->PMRLowSize));
DEBUG ((EFI_D_INFO, "(TXT) PMRHighBase - %016lx\n", OsToSinitData->PMRHighBase));
DEBUG ((EFI_D_INFO, "(TXT) PMRHighSize - %016lx\n", OsToSinitData->PMRHighSize));
DEBUG ((EFI_D_INFO, "(TXT) LCPPOBase - %016lx\n", OsToSinitData->LCPPOBase));
DEBUG ((EFI_D_INFO, "(TXT) LCPPOSize - %016lx\n", OsToSinitData->LCPPOSize));
if (OsToSinitData->Version < TXT_OS_TO_SINIT_DATA_VERSION_4) {
return ;
}
DEBUG ((EFI_D_INFO, "(TXT) Capabilities - %08x\n", (UINTN)OsToSinitData->Capabilities));
for (Index = 0; Index < sizeof(mCapabilityStr)/sizeof(mCapabilityStr[0]); Index++) {
if (mCapabilityStr[Index] == NULL) {
continue;
}
DEBUG ((EFI_D_INFO,
"(TXT) %s- %08x\n",
mCapabilityStr[Index],
(UINTN)(OsToSinitData->Capabilities & (1 << Index))
));
}
if (OsToSinitData->Version < TXT_OS_TO_SINIT_DATA_VERSION_5) {
return ;
}
DEBUG ((EFI_D_INFO, "(TXT) RsdpPtr - %016lx\n", OsToSinitData->RsdpPtr));
if (OsToSinitData->Version >= TXT_OS_TO_SINIT_DATA_VERSION_6) {
TotalOsToSinitDataSize = (UINTN)*((UINT64 *)OsToSinitData - 1) - sizeof(UINT64);
ExtDataElement = (TXT_HEAP_EXT_DATA_ELEMENT *)(OsToSinitData + 1);
DumpExtDataElement (ExtDataElement, (UINTN)OsToSinitData + TotalOsToSinitDataSize - (UINTN)ExtDataElement);
}
DEBUG ((EFI_D_INFO,
"(TXT) *****************************************************************************\n\n"
));
Rsdp = FindAcpiRsdPtr ();
DEBUG ((EFI_D_INFO, "(TXT) Uefi RsdpPtr - %016lx\n", Rsdp));
DumpAcpiRSDP (Rsdp);
DumpAcpiRSDT ((VOID *)(UINTN)Rsdp->RsdtAddress);
DumpAcpiXSDT ((VOID *)(UINTN)Rsdp->XsdtAddress);
return ;
}
//
// This table defines the TXT policy control string
//
GLOBAL_REMOVE_IF_UNREFERENCED CHAR16 *mPolicyControlStr[] = {
L"Unsigned LCP to PCR17 ",
L"Allow PreProduction ",
L"Capabilities to PCR17 ",
L"PO LCP required ",
};
//
// This table defines the TXT SinitMdr type string
//
GLOBAL_REMOVE_IF_UNREFERENCED CHAR16 *mSinitMdrTypeStr[] = {
L"Usable - Good memory",
L"SMRAM - Overlayed",
L"SMRAM - Non-Overlayed",
L"PCIe - PCIe Extended Config Region",
L"Protected - Protected memory",
};
/**
This function dump TXT SinitToMle data.
@param Data TXT SinitToMle data
**/
VOID
DumpSinitToMleData (
IN UINT64 *Data
)
{
TXT_SINIT_TO_MLE_DATA *SinitToMleData;
TXT_SINIT_MEMORY_DESCRIPTOR_RECORD *SinitMemoryDescriptor;
UINT32 Index;
TXT_HEAP_EXT_DATA_ELEMENT *ExtDataElement;
UINTN TotalSinitToMleDataSize;
DEBUG ((EFI_D_INFO,
"(TXT) *****************************************************************************\n"
"(TXT) * SINIT TO MLE Data *\n"
"(TXT) *****************************************************************************\n"
));
DEBUG ((EFI_D_INFO, "(TXT) SinitToMleData: (%08x)\n", Data));
DEBUG ((EFI_D_INFO, "(TXT) Size - %016lx\n", *Data));
SinitToMleData = (TXT_SINIT_TO_MLE_DATA *)(Data + 1);
DEBUG ((EFI_D_INFO, "(TXT) Version - %08x\n", (UINTN)SinitToMleData->Version));
if (SinitToMleData->Version <= TXT_SINIT_TO_MLE_DATA_VERSION_8) {
DEBUG ((EFI_D_INFO, "(TXT) BiosAcmID - "));
DumpData (SinitToMleData->BiosAcmID, sizeof(SinitToMleData->BiosAcmID));
DEBUG ((EFI_D_INFO, "\n"));
DEBUG ((EFI_D_INFO, "(TXT) EdxSenterFlags - %08x\n", (UINTN)SinitToMleData->EdxSenterFlags));
DEBUG ((EFI_D_INFO, "(TXT) MsegValid - %016lx\n", SinitToMleData->MsegValid));
DEBUG ((EFI_D_INFO, "(TXT) SinitHash - "));
DumpData (SinitToMleData->SinitHash, sizeof(SinitToMleData->SinitHash));
DEBUG ((EFI_D_INFO, "\n"));
DEBUG ((EFI_D_INFO, "(TXT) MleHash - "));
DumpData (SinitToMleData->MleHash, sizeof(SinitToMleData->MleHash));
DEBUG ((EFI_D_INFO, "\n"));
DEBUG ((EFI_D_INFO, "(TXT) StmHash - "));
DumpData (SinitToMleData->StmHash, sizeof(SinitToMleData->StmHash));
DEBUG ((EFI_D_INFO, "\n"));
if (SinitToMleData->Version < TXT_SINIT_TO_MLE_DATA_VERSION_3) {
return ;
}
DEBUG ((EFI_D_INFO, "(TXT) LcpPolicyHash - "));
DumpData (SinitToMleData->LcpPolicyHash, sizeof(SinitToMleData->LcpPolicyHash));
DEBUG ((EFI_D_INFO, "\n"));
DEBUG ((EFI_D_INFO, "(TXT) PolicyControl - %08x\n", (UINTN)SinitToMleData->PolicyControl));
for (Index = 0; Index < sizeof(mPolicyControlStr)/sizeof(mPolicyControlStr[0]); Index++) {
if (mPolicyControlStr[Index] == NULL) {
continue;
}
DEBUG ((EFI_D_INFO,
"(TXT) %s- %08x\n",
mPolicyControlStr[Index],
(UINTN)(SinitToMleData->PolicyControl & (1 << Index))
));
}
}
if (SinitToMleData->Version >= TXT_SINIT_TO_MLE_DATA_VERSION_5) {
DEBUG ((EFI_D_INFO, "(TXT) RlpWakeupAddr - %08x\n", (UINTN)SinitToMleData->RlpWakeupAddr));
}
DEBUG ((EFI_D_INFO, "(TXT) NumberOfSinitMdrs - %08x\n", (UINTN)SinitToMleData->NumberOfSinitMdrs));
DEBUG ((EFI_D_INFO, "(TXT) SinitMdrTableOffset - %08x\n", (UINTN)SinitToMleData->SinitMdrTableOffset));
DEBUG ((EFI_D_INFO, "(TXT) SinitVtdDmarTableSize - %08x\n", (UINTN)SinitToMleData->SinitVtdDmarTableSize));
DEBUG ((EFI_D_INFO, "(TXT) SinitVtdDmarTableOffset - %08x\n", (UINTN)SinitToMleData->SinitVtdDmarTableOffset));
if (SinitToMleData->Version >= TXT_SINIT_TO_MLE_DATA_VERSION_8) {
DEBUG ((EFI_D_INFO, "(TXT) ProcessorSCRTMStatus - %08x\n", (UINTN)SinitToMleData->ProcessorSCRTMStatus));
}
SinitMemoryDescriptor = (TXT_SINIT_MEMORY_DESCRIPTOR_RECORD *)((UINTN)Data + SinitToMleData->SinitMdrTableOffset);
for (Index = 0; Index < SinitToMleData->NumberOfSinitMdrs; Index++) {
DEBUG ((EFI_D_INFO, "(TXT) SinitMdr[%d]:\n", (UINTN)Index));
DEBUG ((EFI_D_INFO, "(TXT) Address - %016lx\n", SinitMemoryDescriptor[Index].Address));
DEBUG ((EFI_D_INFO, "(TXT) Length - %016lx\n", SinitMemoryDescriptor[Index].Length));
DEBUG ((EFI_D_INFO, "(TXT) Type - %02x\n", (UINTN)SinitMemoryDescriptor[Index].Type));
if (SinitMemoryDescriptor[Index].Type < sizeof(mSinitMdrTypeStr)/sizeof(mSinitMdrTypeStr[0])) {
DEBUG ((EFI_D_INFO, "(TXT) %s\n", mSinitMdrTypeStr[SinitMemoryDescriptor[Index].Type]));
}
}
if (SinitToMleData->Version >= TXT_SINIT_TO_MLE_DATA_VERSION_9) {
TotalSinitToMleDataSize = (UINTN)*((UINT64 *)SinitToMleData - 1) - sizeof(UINT64);
ExtDataElement = (TXT_HEAP_EXT_DATA_ELEMENT *)(SinitToMleData + 1);
DumpExtDataElement(ExtDataElement, (UINTN)SinitToMleData + TotalSinitToMleDataSize - (UINTN)ExtDataElement);
}
DEBUG ((EFI_D_INFO,
"(TXT) *****************************************************************************\n\n"
));
if (SinitToMleData->SinitVtdDmarTableOffset != 0) {
DumpDmar ((EFI_ACPI_DMAR_DESCRIPTION_TABLE *)((UINTN)Data + SinitToMleData->SinitVtdDmarTableOffset));
}
return ;
}
//
// This table defines the GETSEC capabilities string
//
GLOBAL_REMOVE_IF_UNREFERENCED CHAR16 *mCapabilitiesStr[] = {
L"Chipset Present ",
NULL, // 1
L"ENTERACCS ",
L"EXITAC ",
L"SENTER ",
L"SEXIT ",
L"PARAMETERS ",
L"SMCTRL ",
L"WAKEUP ",
NULL, // 9
NULL, // 10
NULL, // 11
NULL, // 12
NULL, // 13
NULL, // 14
NULL, // 15
NULL, // 16
NULL, // 17
NULL, // 18
NULL, // 19
NULL, // 20
NULL, // 21
NULL, // 22
NULL, // 23
NULL, // 24
NULL, // 25
NULL, // 26
NULL, // 27
NULL, // 28
NULL, // 29
NULL, // 30
L"Extended Leafs ",
};
/**
This function dump GETSEC capabilities.
@param Index GETSEC index
@param Capabilities GETSEC capabilities
**/
VOID
DumpGetSecCapabilities (
IN UINT32 Index,
IN UINT32 Capabilities
)
{
DEBUG ((EFI_D_INFO, "(TXT) GETSEC Capabilities (%08x) - 0x%08x\n", (UINTN)Index, (UINTN)Capabilities));
if (Index == 0) {
// Capability 0
for (Index = 0; Index < sizeof(mCapabilitiesStr)/sizeof(mCapabilitiesStr[0]); Index++) {
if (mCapabilitiesStr[Index] == NULL) {
continue;
}
DEBUG ((EFI_D_INFO,
"(TXT) %s - 0x%08x\n",
mCapabilitiesStr[Index],
(UINTN)(Capabilities & (1 << Index))
));
}
}
return ;
}
//
// This table defines the GETSEC parameter string
//
GLOBAL_REMOVE_IF_UNREFERENCED CHAR16 *mParameterStr[] = {
NULL, // 0
L"Supported AC module versions",
L"Max size of authenticated code execution area",
L"External memory types supported during AC mode",
L"Selective SENTER functionality control",
L"TXT extensions support",
};
//
// This table defines the GETSEC extern memory type string
//
GLOBAL_REMOVE_IF_UNREFERENCED CHAR16 *mParameterExternMemTypeStr[] = {
NULL, // 0
NULL, // 1
NULL, // 2
NULL, // 3
NULL, // 4
NULL, // 5
NULL, // 6
NULL, // 7
L"Uncacheable ",
L"Write Combining ",
NULL, // 10
NULL, // 11
L"Write-through ",
L"Write-protected ",
L"Write-back ",
};
//
// This table defines the GETSEC senter disable control string
//
GLOBAL_REMOVE_IF_UNREFERENCED CHAR16 *mParameterSenterDisableControlStr[] = {
NULL, // 0
NULL, // 1
NULL, // 2
NULL, // 3
NULL, // 4
NULL, // 5
NULL, // 6
NULL, // 7
L"CAPABILITIES ",
NULL, // 9
L"ENTERACCS ",
L"EXITAC ",
L"SENTER ",
L"SEXIT ",
L"PARAMETERS ",
L"SMCTRL ",
L"WAKEUP ",
};
//
// This table defines the GETSEC extensions string
//
GLOBAL_REMOVE_IF_UNREFERENCED CHAR16 *mParameterTxtExtensionsStr[] = {
NULL, // 0
NULL, // 1
NULL, // 2
NULL, // 3
NULL, // 4
L"Processor CRTM support ",
L"Machine Check Handling ",
};
/**
This function dump GETSEC parameters.
@param RegEax GETSEC parameters RegEax
@param RegEbx GETSEC parameters RegEbx
@param RegEcx GETSEC parameters RegEcx
**/
VOID
DumpGetSecParameters (
IN UINT32 RegEax,
IN UINT32 RegEbx,
IN UINT32 RegEcx
)
{
UINT32 Index;
UINT32 EaxValue;
Index = RegEax & GETSEC_PARAMETER_TYPE_MASK;
EaxValue = RegEax & ~GETSEC_PARAMETER_TYPE_MASK;
DEBUG ((EFI_D_INFO,
"(TXT) GETSEC Parameter (%08x) - 0x%08x, 0x%08x, 0x%08x\n",
(UINTN)Index,
(UINTN)EaxValue,
(UINTN)RegEbx,
(UINTN)RegEcx
));
if (Index < sizeof(mParameterStr)/sizeof(mParameterStr[0])) {
if (mParameterStr[Index] != NULL) {
DEBUG ((EFI_D_INFO,
"(TXT) %s\n",
mParameterStr[Index]
));
}
}
switch (Index) {
case GETSEC_PARAMETER_TYPE_ACM_VERSION:
DEBUG ((EFI_D_INFO, "(TXT) Version comparison mask - 0x%08x\n", (UINTN)RegEbx));
DEBUG ((EFI_D_INFO, "(TXT) Version numbers supported - 0x%08x\n", (UINTN)RegEcx));
break;
case GETSEC_PARAMETER_TYPE_ACM_MAX_SIZE:
DEBUG ((EFI_D_INFO, "(TXT) AC execution region size - 0x%08x\n", (UINTN)EaxValue));
break;
case GETSEC_PARAMETER_TYPE_EXTERN_MEM_TYPE:
DEBUG ((EFI_D_INFO, "(TXT) Memory type bit mask - 0x%08x\n", (UINTN)EaxValue));
for (Index = 0; Index < sizeof(mParameterExternMemTypeStr)/sizeof(mParameterExternMemTypeStr[0]); Index++) {
if (mParameterExternMemTypeStr[Index] == NULL) {
continue;
}
DEBUG ((EFI_D_INFO,
"(TXT) %s - 0x%08x\n",
mParameterExternMemTypeStr[Index],
(UINTN)(EaxValue & (1 << Index))
));
}
break;
case GETSEC_PARAMETER_TYPE_SENTER_DIS_CONTOL:
DEBUG ((EFI_D_INFO, "(TXT) SENTER disable controls - 0x%08x\n", (UINTN)EaxValue));
#if 0
for (Index = 0; Index < sizeof(mParameterSenterDisableControlStr)/sizeof(mParameterSenterDisableControlStr[0]); Index++) {
if (mParameterSenterDisableControlStr[Index] == NULL) {
continue;
}
DEBUG ((EFI_D_INFO,
"(TXT) %s - 0x%08x\n",
mParameterSenterDisableControlStr[Index],
(UINTN)(EaxValue & (1 << Index))
));
}
#endif
break;
case GETSEC_PARAMETER_TYPE_EXTERNSION:
DEBUG ((EFI_D_INFO, "(TXT) TXT Extensions Flags - 0x%08x\n", (UINTN)EaxValue));
for (Index = 0; Index < sizeof(mParameterTxtExtensionsStr)/sizeof(mParameterTxtExtensionsStr[0]); Index++) {
if (mParameterTxtExtensionsStr[Index] == NULL) {
continue;
}
DEBUG ((EFI_D_INFO,
"(TXT) %s - 0x%08x\n",
mParameterTxtExtensionsStr[Index],
(UINTN)(EaxValue & (1 << Index))
));
}
break;
default:
break;
}
return ;
}
GLOBAL_REMOVE_IF_UNREFERENCED CHAR16 *mEventTypeName[] = {
NULL,
NULL,
NULL,
L"NO_ACTION",
L"SEPARATOR",
};
GLOBAL_REMOVE_IF_UNREFERENCED CHAR16 *mTxtEventTypeName[] = {
NULL,
L"PCRMAPPING",
L"HASH_START",
L"COMBINED_HASH",
L"MLE_HASH",
NULL,
NULL,
NULL,
NULL,
NULL,
L"BIOSAC_REG_DATA",
L"CPU_SCRTM_STAT",
L"LCP_CONTROL_HASH",
L"ELEMENTS_HASH",
L"STM_HASH",
L"OSSINITDATA_CAP_HASH",
L"SINIT_PUBKEY_HASH",
L"LCP_HASH",
L"LCP_DETAILS_HASH",
L"LCP_AUTHORITIES_HASH",
L"NV_INFO_HASH",
};
/**
This function conver TCG Event Type to string.
@param EventType TCG Event Type
@return TCG Event Type string
**/
CHAR16 *
EventTypeToString(
IN UINT32 EventType
)
{
if ((EventType >= TXT_EVTYPE_BASE) &&
(EventType < TXT_EVTYPE_BASE + sizeof(mTxtEventTypeName)/sizeof(mTxtEventTypeName[0]))) {
return mTxtEventTypeName[EventType - TXT_EVTYPE_BASE];
} else if (EventType == TXT_EVTYPE_CAP_VALUE) {
return L"CAP_VALUE";
} else {
if (EventType < sizeof(mEventTypeName) / sizeof(mEventTypeName[0])) {
return mEventTypeName[EventType];
}
return L"Unknown";
}
}
/**
This function dump TPM2 event log entry.
@param PcrEvent PCR event
@param DigestSize Digest size
**/
VOID
DumpTpm2EventLogEntry (
IN TCG_PCR_EVENT_EX *PcrEvent,
IN UINT32 DigestSize
)
{
UINT8 *Buffer;
UINT32 EventDataSize;
DEBUG((EFI_D_INFO, "(TXT) Event: (0x%x)\n", PcrEvent));
DEBUG((EFI_D_INFO, "(TXT) PCRIndex - 0x%08x\n", PcrEvent->PCRIndex));
DEBUG((EFI_D_INFO, "(TXT) EventType - 0x%08x (%s)\n", PcrEvent->EventType, EventTypeToString(PcrEvent->EventType)));
DEBUG((EFI_D_INFO, "(TXT) Digest - "));
Buffer = (UINT8 *)(PcrEvent + 1);
DumpData(Buffer, DigestSize);
Buffer += DigestSize;
DEBUG((EFI_D_INFO, "\n"));
EventDataSize = ReadUnaligned32((UINT32 *)Buffer);
DEBUG((EFI_D_INFO, "(TXT) EventSize - 0x%08x\n", EventDataSize));
Buffer += sizeof(UINT32);
DEBUG((EFI_D_INFO, "(TXT) EventData - "));
DumpData(Buffer, EventDataSize);
Buffer += EventDataSize;
DEBUG((EFI_D_INFO, "\n"));
}
/**
This function dump TPM2 TCG log descriptor.
@param TcgLogDesc TPM2 TCG log descriptor
**/
VOID
DumpTpm2TcgLogDesc(
IN TCG_LOG_DESCRIPTOR *TcgLogDesc
)
{
UINTN Index;
DEBUG((EFI_D_INFO, "(TXT) TcgLogDescriptor: (0x%x)\n", TcgLogDesc));
DEBUG((EFI_D_INFO, "(TXT) Signature - '", TcgLogDesc->Signature));
for (Index = 0; Index < sizeof(TcgLogDesc->Signature); Index++) {
DEBUG((EFI_D_INFO, "%c", TcgLogDesc->Signature[Index]));
}
DEBUG((EFI_D_INFO, "'\n"));
DEBUG((EFI_D_INFO, "(TXT) Revision - 0x%08x\n", TcgLogDesc->Revision));
DEBUG((EFI_D_INFO, "(TXT) DigestAlgID - 0x%08x\n", TcgLogDesc->DigestAlgID));
DEBUG((EFI_D_INFO, "(TXT) DigestSize - 0x%08x\n", TcgLogDesc->DigestSize));
}
/**
This function dump TPM2 Event log.
@param EventLog TPM2 event log
@param MaxSize TPM2 event log max size
**/
VOID
DumpTpm2EventLog(
IN VOID *EventLog,
IN UINTN MaxSize
)
{
TCG_LOG_DESCRIPTOR *TcgLogDesc;
TCG_PCR_EVENT_EX *PcrEvent;
UINT8 *Buffer;
UINT32 EventDataSize;
PcrEvent = (TCG_PCR_EVENT_EX *)EventLog;
DumpTpm2EventLogEntry ((TCG_PCR_EVENT_EX *)PcrEvent, SHA1_DIGEST_SIZE);
TcgLogDesc = (TCG_LOG_DESCRIPTOR *)((UINT8 *)PcrEvent + sizeof(TCG_PCR_EVENT_HDR));
DumpTpm2TcgLogDesc(TcgLogDesc);
PcrEvent = (TCG_PCR_EVENT_EX *)(TcgLogDesc + 1);
while (PcrEvent->PCRIndex != 0 || PcrEvent->EventType != 0) {
DumpTpm2EventLogEntry((TCG_PCR_EVENT_EX *)PcrEvent, TcgLogDesc->DigestSize);
Buffer = (UINT8 *)(PcrEvent + 1);
Buffer += TcgLogDesc->DigestSize;
EventDataSize = ReadUnaligned32((UINT32 *)Buffer);
Buffer += sizeof(UINT32) + EventDataSize;
PcrEvent = (TCG_PCR_EVENT_EX *)(Buffer);
if ((UINTN)PcrEvent >= (UINTN)EventLog + MaxSize) {
break;
}
}
}
/**
This function dump PCR event.
@param[in] EventHdr TCG PCR event structure.
**/
VOID
DumpEvent (
IN TCG_PCR_EVENT_HDR *EventHdr
)
{
UINTN Index;
DEBUG ((EFI_D_INFO, "(TXT) Event: (0x%x)\n", EventHdr));
DEBUG ((EFI_D_INFO, "(TXT) PCRIndex - %d\n", EventHdr->PCRIndex));
DEBUG ((EFI_D_INFO, "(TXT) EventType - 0x%08x (%s)\n", EventHdr->EventType, EventTypeToString(EventHdr->EventType)));
DEBUG ((EFI_D_INFO, "(TXT) Digest - "));
for (Index = 0; Index < sizeof(TCG_DIGEST); Index++) {
DEBUG ((EFI_D_INFO, "%02x ", EventHdr->Digest.digest[Index]));
}
DEBUG ((EFI_D_INFO, "\n"));
DEBUG ((EFI_D_INFO, "(TXT) EventSize - 0x%08x\n", EventHdr->EventSize));
DEBUG ((EFI_D_INFO, "(TXT) EventData - "));
DumpData((UINT8 *)(EventHdr + 1), EventHdr->EventSize);
DEBUG((EFI_D_INFO, "\n"));
}
/**
This function dump TCG_EfiSpecIDEventStruct.
@param[in] TcgEfiSpecIdEventStruct A pointer to TCG_EfiSpecIDEventStruct.
**/
VOID
DumpTcgEfiSpecIdEventStruct (
IN TCG_EfiSpecIDEventStruct *TcgEfiSpecIdEventStruct
)
{
TCG_EfiSpecIdEventAlgorithmSize *DigestSize;
UINTN Index;
UINT8 *VendorInfoSize;
UINT8 *VendorInfo;
UINT32 NumberOfAlgorithms;
DEBUG ((EFI_D_INFO, "(TXT) TCG_EfiSpecIDEventStruct: (0x%x)\n", TcgEfiSpecIdEventStruct));
DEBUG ((EFI_D_INFO, "(TXT) signature - '"));
for (Index = 0; Index < sizeof(TcgEfiSpecIdEventStruct->signature); Index++) {
DEBUG ((EFI_D_INFO, "%c", TcgEfiSpecIdEventStruct->signature[Index]));
}
DEBUG ((EFI_D_INFO, "'\n"));
DEBUG ((EFI_D_INFO, "(TXT) platformClass - 0x%08x\n", TcgEfiSpecIdEventStruct->platformClass));
DEBUG ((EFI_D_INFO, "(TXT) specVersion - %d.%d%d\n", TcgEfiSpecIdEventStruct->specVersionMajor, TcgEfiSpecIdEventStruct->specVersionMinor, TcgEfiSpecIdEventStruct->specErrata));
DEBUG ((EFI_D_INFO, "(TXT) uintnSize - 0x%02x\n", TcgEfiSpecIdEventStruct->uintnSize));
CopyMem (&NumberOfAlgorithms, TcgEfiSpecIdEventStruct + 1, sizeof(NumberOfAlgorithms));
DEBUG ((EFI_D_INFO, "(TXT) NumberOfAlgorithms - 0x%08x\n", NumberOfAlgorithms));
DigestSize = (TCG_EfiSpecIdEventAlgorithmSize *)((UINT8 *)TcgEfiSpecIdEventStruct + sizeof(*TcgEfiSpecIdEventStruct) + sizeof(NumberOfAlgorithms));
for (Index = 0; Index < NumberOfAlgorithms; Index++) {
DEBUG ((EFI_D_INFO, "(TXT) digest(%d)\n", Index));
DEBUG ((EFI_D_INFO, "(TXT) algorithmId - 0x%04x\n", DigestSize[Index].algorithmId));
DEBUG ((EFI_D_INFO, "(TXT) digestSize - 0x%04x\n", DigestSize[Index].digestSize));
}
VendorInfoSize = (UINT8 *)&DigestSize[NumberOfAlgorithms];
DEBUG ((EFI_D_INFO, "(TXT) VendorInfoSize - 0x%02x\n", *VendorInfoSize));
VendorInfo = VendorInfoSize + 1;
DEBUG ((EFI_D_INFO, "(TXT) VendorInfo - "));
for (Index = 0; Index < *VendorInfoSize; Index++) {
DEBUG ((EFI_D_INFO, "%02x ", VendorInfo[Index]));
}
DEBUG ((EFI_D_INFO, "\n"));
}
/**
This function get size of TCG_EfiSpecIDEventStruct.
@param[in] TcgEfiSpecIdEventStruct A pointer to TCG_EfiSpecIDEventStruct.
**/
UINTN
GetTcgEfiSpecIdEventStructSize (
IN TCG_EfiSpecIDEventStruct *TcgEfiSpecIdEventStruct
)
{
TCG_EfiSpecIdEventAlgorithmSize *DigestSize;
UINT8 *VendorInfoSize;
UINT32 NumberOfAlgorithms;
CopyMem (&NumberOfAlgorithms, TcgEfiSpecIdEventStruct + 1, sizeof(NumberOfAlgorithms));
DigestSize = (TCG_EfiSpecIdEventAlgorithmSize *)((UINT8 *)TcgEfiSpecIdEventStruct + sizeof(*TcgEfiSpecIdEventStruct) + sizeof(NumberOfAlgorithms));
VendorInfoSize = (UINT8 *)&DigestSize[NumberOfAlgorithms];
return sizeof(TCG_EfiSpecIDEventStruct) + sizeof(UINT32) + (NumberOfAlgorithms * sizeof(TCG_EfiSpecIdEventAlgorithmSize)) + sizeof(UINT8) + (*VendorInfoSize);
}
/**
This function dump PCR event 2.
@param[in] TcgPcrEvent2 TCG PCR event 2 structure.
**/
VOID
DumpEvent2 (
IN TCG_PCR_EVENT2 *TcgPcrEvent2
)
{
UINTN Index;
UINT32 DigestIndex;
UINT32 DigestCount;
TPMI_ALG_HASH HashAlgo;
UINT32 DigestSize;
UINT8 *DigestBuffer;
UINT32 EventSize;
UINT8 *EventBuffer;
DEBUG ((EFI_D_INFO, "(TXT) Event: (0x%x)\n", TcgPcrEvent2));
DEBUG ((EFI_D_INFO, "(TXT) PCRIndex - %d\n", TcgPcrEvent2->PCRIndex));
DEBUG ((EFI_D_INFO, "(TXT) EventType - 0x%08x (%s)\n", TcgPcrEvent2->EventType, EventTypeToString(TcgPcrEvent2->EventType)));
DEBUG ((EFI_D_INFO, "(TXT) DigestCount: 0x%08x\n", TcgPcrEvent2->Digest.count));
DigestCount = TcgPcrEvent2->Digest.count;
HashAlgo = TcgPcrEvent2->Digest.digests[0].hashAlg;
DigestBuffer = (UINT8 *)&TcgPcrEvent2->Digest.digests[0].digest;
for (DigestIndex = 0; DigestIndex < DigestCount; DigestIndex++) {
DEBUG ((EFI_D_INFO, "(TXT) HashAlgo : 0x%04x\n", HashAlgo));
DEBUG ((EFI_D_INFO, "(TXT) Digest(%d): ", DigestIndex));
DigestSize = GetHashSizeFromAlgo (HashAlgo);
for (Index = 0; Index < DigestSize; Index++) {
DEBUG ((EFI_D_INFO, "%02x ", DigestBuffer[Index]));
}
DEBUG ((EFI_D_INFO, "\n"));
//
// Prepare next
//
CopyMem (&HashAlgo, DigestBuffer + DigestSize, sizeof(TPMI_ALG_HASH));
DigestBuffer = DigestBuffer + DigestSize + sizeof(TPMI_ALG_HASH);
}
DEBUG ((EFI_D_INFO, "\n"));
DigestBuffer = DigestBuffer - sizeof(TPMI_ALG_HASH);
CopyMem (&EventSize, DigestBuffer, sizeof(TcgPcrEvent2->EventSize));
DEBUG ((EFI_D_INFO, "(TXT) EventSize - 0x%08x\n", EventSize));
EventBuffer = DigestBuffer + sizeof(TcgPcrEvent2->EventSize);
DEBUG ((EFI_D_INFO, "(TXT) EventData - "));
DumpData(EventBuffer, EventSize);
DEBUG ((EFI_D_INFO, "\n"));
}
/**
This function returns size of TCG PCR event 2.
@param[in] TcgPcrEvent2 TCG PCR event 2 structure.
@return size of TCG PCR event 2.
**/
UINTN
GetPcrEvent2Size (
IN TCG_PCR_EVENT2 *TcgPcrEvent2
)
{
UINT32 DigestIndex;
UINT32 DigestCount;
TPMI_ALG_HASH HashAlgo;
UINT32 DigestSize;
UINT8 *DigestBuffer;
UINT32 EventSize;
UINT8 *EventBuffer;
DigestCount = TcgPcrEvent2->Digest.count;
HashAlgo = TcgPcrEvent2->Digest.digests[0].hashAlg;
DigestBuffer = (UINT8 *)&TcgPcrEvent2->Digest.digests[0].digest;
for (DigestIndex = 0; DigestIndex < DigestCount; DigestIndex++) {
DigestSize = GetHashSizeFromAlgo (HashAlgo);
//
// Prepare next
//
CopyMem (&HashAlgo, DigestBuffer + DigestSize, sizeof(TPMI_ALG_HASH));
DigestBuffer = DigestBuffer + DigestSize + sizeof(TPMI_ALG_HASH);
}
DigestBuffer = DigestBuffer - sizeof(TPMI_ALG_HASH);
CopyMem (&EventSize, DigestBuffer, sizeof(TcgPcrEvent2->EventSize));
EventBuffer = DigestBuffer + sizeof(TcgPcrEvent2->EventSize);
return (UINTN)EventBuffer + EventSize - (UINTN)TcgPcrEvent2;
}
/**
This function dump TPM2 TCG2 Event log.
@param EventLog TPM2 TCG2 event log
@param MaxSize TPM2 TCG2 event log max size
**/
VOID
DumpTpm2Tcg2EventLog(
IN VOID *EventLog,
IN UINTN MaxSize
)
{
TCG_PCR_EVENT_HDR *EventHdr;
TCG_PCR_EVENT2 *TcgPcrEvent2;
TCG_EfiSpecIDEventStruct *TcgEfiSpecIdEventStruct;
//
// Dump first event
//
EventHdr = (TCG_PCR_EVENT_HDR *)(UINTN)EventLog;
DumpEvent (EventHdr);
TcgEfiSpecIdEventStruct = (TCG_EfiSpecIDEventStruct *)(EventHdr + 1);
DumpTcgEfiSpecIdEventStruct (TcgEfiSpecIdEventStruct);
TcgPcrEvent2 = (TCG_PCR_EVENT2 *)((UINTN)TcgEfiSpecIdEventStruct + GetTcgEfiSpecIdEventStructSize (TcgEfiSpecIdEventStruct));
while (TcgPcrEvent2->PCRIndex != 0 || TcgPcrEvent2->EventType != 0) {
DumpEvent2 (TcgPcrEvent2);
TcgPcrEvent2 = (TCG_PCR_EVENT2 *)((UINTN)TcgPcrEvent2 + GetPcrEvent2Size (TcgPcrEvent2));
if ((UINTN)TcgPcrEvent2 >= (UINTN)EventLog + MaxSize) {
break;
}
}
}
/**
This function dump TPM12 Event log.
@param EventLog TPM12 event log
@param MaxSize TPM12 event log max size
**/
VOID
DumpTpm12EventLog(
IN VOID *EventLog,
IN UINTN MaxSize
)
{
TXT_EVENT_LOG_CONTAINER *EventLogContainer;
TCG_PCR_EVENT_HDR *EventHdr;
UINTN Index;
EventLogContainer = (TXT_EVENT_LOG_CONTAINER *)(UINTN)EventLog;
DEBUG((EFI_D_INFO, "(TXT) EventLogContainer:\n"));
DEBUG((EFI_D_INFO, "(TXT) Signature - '"));
for (Index = 0; Index < sizeof(EventLogContainer->Signature); Index++) {
DEBUG((EFI_D_INFO, "%c", EventLogContainer->Signature[Index]));
}
DEBUG((EFI_D_INFO, "'\n"));
DEBUG((EFI_D_INFO, "(TXT) ContainerVersion - %02x.%02x\n", (UINTN)EventLogContainer->ContainerVersionMajor, (UINTN)EventLogContainer->ContainerVersionMinor));
DEBUG((EFI_D_INFO, "(TXT) PcrEventVersion - %02x.%02x\n", (UINTN)EventLogContainer->PcrEventVersionMajor, (UINTN)EventLogContainer->PcrEventVersionMinor));
DEBUG((EFI_D_INFO, "(TXT) Size - %08x\n", (UINTN)EventLogContainer->Size));
DEBUG((EFI_D_INFO, "(TXT) PcrEventsOffset - %08x\n", (UINTN)EventLogContainer->PcrEventsOffset));
DEBUG((EFI_D_INFO, "(TXT) NextEventOffset - %08x\n", (UINTN)EventLogContainer->NextEventOffset));
EventHdr = (TCG_PCR_EVENT_HDR *)(EventLogContainer + 1);
while (EventHdr->PCRIndex != 0 || EventHdr->EventType != 0) {
DumpEvent(EventHdr);
EventHdr = (TCG_PCR_EVENT_HDR *)((UINTN)EventHdr + EventHdr->EventSize);
if ((UINTN)EventHdr >= (UINTN)EventLog + MaxSize) {
break;
}
}
}
/**
This function dump TPM event log buffer.
**/
VOID
DumpTpmEventLogBuffer(
VOID
)
{
MLE_PRIVATE_DATA *MlePrivateData;
DCE_PRIVATE_DATA *DcePrivateData;
TXT_EVENT_LOG_CONTAINER *EventLog;
UINTN Index;
TXT_HEAP_EVENTLOG_EXT_ELEMENT *EventLogElement;
TXT_HEAP_EVENT_LOG_POINTER_ELEMENT2 *EventLogPointerElement2;
TXT_HEAP_EVENT_LOG_POINTER_ELEMENT2_1 *EventLogPointerElement2_1;
TXT_HEAP_EVENT_LOG_DESCR *EventLogDesc;
MlePrivateData = GetMlePrivateData();
DcePrivateData = &MlePrivateData->DcePrivateData;
if (DcePrivateData->TpmType == FRM_TPM_TYPE_TPM12) {
DEBUG((EFI_D_INFO, "(TXT) DumpEventLog (TPM1.2):\n"));
EventLogElement = DcePrivateData->EventLogElement;
EventLog = (TXT_EVENT_LOG_CONTAINER *)(UINTN)EventLogElement->EventLogAddress;
DumpTpm12EventLog((UINT8 *)(UINTN)EventLogElement->EventLogAddress, EventLog->Size);
}
if (DcePrivateData->TpmType == FRM_TPM_TYPE_TPM2) {
if ((DcePrivateData->AcmCapabilities & TXT_MLE_SINIT_CAPABILITY_TCG2_COMPATIBILE_EVENTLOG) == 0) {
DEBUG((EFI_D_INFO, "(TXT) DumpEventLog (TPM2.0):\n"));
EventLogPointerElement2 = DcePrivateData->EventLogPointerElement2;
EventLogDesc = (TXT_HEAP_EVENT_LOG_DESCR *)(EventLogPointerElement2 + 1);
for (Index = 0; Index < EventLogPointerElement2->Count; Index++, EventLogDesc++) {
DEBUG((EFI_D_INFO, "(TXT) DumpEventLog (TPM2.0) (Algo - 0x%x):\n", EventLogDesc->HashAlgID));
DEBUG((EFI_D_INFO, "(TXT) FirstRecordOffset - 0x%x\n", EventLogDesc->FirstRecordOffset));
DEBUG((EFI_D_INFO, "(TXT) NextRecordOffset - 0x%x\n", EventLogDesc->NextRecordOffset));
DumpTpm2EventLog((UINT8 *)(UINTN)EventLogDesc->PhysicalAddress, EventLogDesc->AllocatedEventContainerSize);
}
} else {
DEBUG((EFI_D_INFO, "(TXT) DumpEventLog (TPM2.0):\n"));
EventLogPointerElement2_1 = DcePrivateData->EventLogPointerElement2_1;
DEBUG((EFI_D_INFO, "(TXT) FirstRecordOffset - 0x%x\n", EventLogPointerElement2_1->FirstRecordOffset));
DEBUG((EFI_D_INFO, "(TXT) NextRecordOffset - 0x%x\n", EventLogPointerElement2_1->NextRecordOffset));
DumpTpm2Tcg2EventLog((UINT8 *)(UINTN)EventLogPointerElement2_1->PhysicalAddress, EventLogPointerElement2_1->AllocatedEventContainerSize);
}
}
}