/** | |
@file | |
Display the ACPI tables | |
Copyright (c) 2011-2012, Intel Corporation | |
All rights reserved. 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 <WebServer.h> | |
#include <Guid/Acpi.h> | |
#include <IndustryStandard/Acpi10.h> | |
#include <IndustryStandard/Acpi30.h> | |
#if defined(_MSC_VER) // Handle Microsoft VC++ compiler specifics. | |
#pragma warning ( disable : 4305 ) | |
#endif // defined(_MSC_VER) | |
// | |
// Ensure proper structure formats | |
// | |
#pragma pack(1) | |
typedef struct { | |
UINT8 AddressSpaceId; | |
UINT8 RegisterBitWidth; | |
UINT8 RegisterBitOffset; | |
UINT8 AccessSize; | |
UINT64 Address; | |
} GENERIC_ADDRESS; | |
typedef struct { | |
UINT32 Signature; // 0 | |
UINT32 Length; // 4 | |
UINT8 Revision; // 8 | |
UINT8 Checksum; // 9 | |
UINT8 OemId[6]; // 10 | |
UINT8 OemTableId[8]; // 16 | |
UINT32 OemRevision; // 24 | |
UINT32 CreatorId; // 28 | |
UINT32 CreatorRevision; // 32 | |
UINT8 DefinitionBlock[1]; // 36 | |
} ACPI_DSDT; | |
typedef struct { | |
UINT32 Signature; // 0 | |
UINT32 Length; // 4 | |
UINT8 Revision; // 8 | |
UINT8 Checksum; // 9 | |
UINT8 OemId[6]; // 10 | |
UINT8 OemTableId[8]; // 16 | |
UINT32 OemRevision; // 24 | |
UINT32 CreatorId; // 28 | |
UINT32 CreatorRevision; // 32 | |
UINT32 FirmwareCtrl; // 36 | |
UINT32 DSDT; // 40 | |
UINT8 Reserved; // 44 | |
UINT8 PreferredPmProfile; // 45 | |
UINT16 SciInt; // 46 | |
UINT32 SmiCmd; // 48 | |
UINT8 AcpiEnable; // 52 | |
UINT8 AcpiDisable; // 53 | |
UINT8 S4BiosReq; // 54 | |
UINT8 PStateCnt; // 55 | |
UINT32 Pm1aEvtBlk; // 56 | |
UINT32 Pm1bEvtBlk; // 60 | |
UINT32 Pm1aCntBlk; // 64 | |
UINT32 Pm1bCntBlk; // 68 | |
UINT32 Pm2CntBlk; // 72 | |
UINT32 PmTmrBlk; // 76 | |
UINT32 Gpe0Blk; // 80 | |
UINT32 Gpe1Blk; // 84 | |
UINT8 Pm1EvtLen; // 88 | |
UINT8 Pm1CntLen; // 89 | |
UINT8 PM2CntLen; // 90 | |
UINT8 PmTmrLen; // 91 | |
UINT8 Gpe0BlkLen; // 92 | |
UINT8 Gpe1BlkLen; // 93 | |
UINT8 Gpe1Base; // 94 | |
UINT8 CstCnt; // 95 | |
UINT16 PLvl2Lat; // 96 | |
UINT16 PLvl3Lat; // 98 | |
UINT16 FlushSize; // 100 | |
UINT16 FlushStride; // 102 | |
UINT8 DutyOffset; // 104 | |
UINT8 DutyWidth; // 105 | |
UINT8 DayAlrm; // 106 | |
UINT8 MonAlrm; // 107 | |
UINT8 Century; // 108 | |
UINT16 IapcBootArch; // 109 | |
UINT8 Reserved2; // 111 | |
UINT32 Flags; // 112 | |
UINT32 ResetReg[3]; // 116 | |
UINT8 ResetValue; // 128 | |
UINT8 Reserved3[3]; // 129 | |
UINT64 XFirmwareCtrl; // 132 | |
UINT64 XDsdt; // 140 | |
UINT32 XPm1aEvtBlk[3]; // 148 | |
UINT32 XPm1bEvtBlk[3]; // 160 | |
UINT32 XPm1aCntBlk[3]; // 172 | |
UINT32 XPm1bCntBlk[3]; // 184 | |
UINT32 XPm2CntBlk[3]; // 196 | |
UINT32 XPmTmrBlk[3]; // 208 | |
UINT32 XGpe0Blk[3]; // 220 | |
UINT32 XGpe1Blk[3]; // 232 | |
} ACPI_FADT; | |
typedef struct { | |
UINT32 Signature; | |
UINT32 Length; | |
UINT8 Revision; | |
UINT8 Checksum; | |
UINT8 OemId[6]; | |
UINT8 OemTableId[8]; | |
UINT32 OemRevision; | |
UINT32 CreatorId; | |
UINT32 CreatorRevision; | |
UINT32 Entry[1]; | |
} ACPI_RSDT; | |
typedef struct { | |
UINT32 Signature; // 0 | |
UINT32 Length; // 4 | |
} ACPI_UNKNOWN; | |
#pragma pack() | |
typedef struct { | |
UINT32 Signature; | |
CONST CHAR8 * pTableName; | |
CONST CHAR16 * pWebPage; | |
} TABLE_SIGNATURE; | |
CONST TABLE_SIGNATURE mTableId[] = { | |
{ APIC_SIGNATURE, "APIC", PAGE_ACPI_APIC }, | |
{ BGRT_SIGNATURE, "BGRT", PAGE_ACPI_BGRT }, | |
{ DSDT_SIGNATURE, "DSDT", PAGE_ACPI_DSDT }, | |
{ FADT_SIGNATURE, "FADT", PAGE_ACPI_FADT }, | |
{ HPET_SIGNATURE, "HPET", PAGE_ACPI_HPET }, | |
{ MCFG_SIGNATURE, "MCFG", PAGE_ACPI_MCFG }, | |
{ SSDT_SIGNATURE, "SSDT", PAGE_ACPI_SSDT }, | |
{ TCPA_SIGNATURE, "TCPA", PAGE_ACPI_TCPA }, | |
{ UEFI_SIGNATURE, "UEFI", PAGE_ACPI_UEFI } | |
}; | |
/** | |
Locate the RSDT table | |
@return Table address or NULL if not found | |
**/ | |
CONST ACPI_RSDT * | |
LocateRsdt ( | |
VOID | |
) | |
{ | |
CONST EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER * pRsdp10b; | |
CONST EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER * pRsdp30; | |
CONST ACPI_RSDT * pRsdt; | |
EFI_STATUS Status; | |
// | |
// Use for/break instead of goto | |
// | |
pRsdt = NULL; | |
for ( ; ; ) { | |
// | |
// Locate the RSDT | |
// | |
Status = EfiGetSystemConfigurationTable ( &gEfiAcpiTableGuid, (VOID **)&pRsdp30 ); | |
if ( !EFI_ERROR ( Status )) { | |
pRsdt = (ACPI_RSDT *)(UINTN)pRsdp30->RsdtAddress; | |
} | |
else { | |
Status = EfiGetSystemConfigurationTable (&gEfiAcpi10TableGuid, (VOID **)&pRsdp10b ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
pRsdt = (ACPI_RSDT *)(UINTN)pRsdp10b->RsdtAddress; | |
} | |
break; | |
} | |
// | |
// The entry was not found | |
// | |
return pRsdt; | |
} | |
/** | |
Locate the specified table | |
@param [in] Signature Table signature | |
@return Table address or NULL if not found | |
**/ | |
CONST VOID * | |
LocateTable ( | |
IN UINT32 Signature | |
) | |
{ | |
CONST UINT32 * pEnd; | |
CONST UINT32 * pEntry; | |
CONST EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER * pRsdp10b; | |
CONST EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER * pRsdp30; | |
CONST ACPI_RSDT * pRsdt; | |
CONST UINT32 * pSignature; | |
EFI_STATUS Status; | |
// | |
// Use for/break instead of goto | |
// | |
for ( ; ; ) { | |
// | |
// Locate the RSDT | |
// | |
Status = EfiGetSystemConfigurationTable ( &gEfiAcpiTableGuid, (VOID **)&pRsdp30 ); | |
if ( !EFI_ERROR ( Status )) { | |
pRsdt = (ACPI_RSDT *)(UINTN)pRsdp30->RsdtAddress; | |
} | |
else { | |
Status = EfiGetSystemConfigurationTable (&gEfiAcpi10TableGuid, (VOID **)&pRsdp10b ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
pRsdt = (ACPI_RSDT *)(UINTN)pRsdp10b->RsdtAddress; | |
} | |
// | |
// Walk the list of entries | |
// | |
pEntry = &pRsdt->Entry[ 0 ]; | |
pEnd = &pEntry[(( pRsdt->Length - sizeof ( *pRsdt )) >> 2 ) + 1 ]; | |
while ( pEnd > pEntry ) { | |
// | |
// The entry is actually a 32-bit physical table address | |
// The first entry in the table is the 32-bit table signature | |
// | |
pSignature = (UINT32 *)(UINTN)*pEntry; | |
if ( *pSignature == Signature ) { | |
return (CONST VOID *)(UINTN)*pEntry; | |
} | |
// | |
// Set the next entry | |
// | |
pEntry++; | |
} | |
break; | |
} | |
// | |
// The entry was not found | |
// | |
return NULL; | |
} | |
/** | |
Display a row containing a hex value | |
@param [in] SocketFD The socket's file descriptor to add to the list. | |
@param [in] pPort The WSDT_PORT structure address | |
@param [in] pName Address of a zero terminated name string | |
@param [in] Length Length in bytes | |
@param [in] pChar Address of the first character | |
@retval EFI_SUCCESS The request was successfully processed | |
**/ | |
EFI_STATUS | |
RowAnsiArray ( | |
IN int SocketFD, | |
IN WSDT_PORT * pPort, | |
IN CONST CHAR8 * pName, | |
IN UINTN Length, | |
IN CONST CHAR8 * pChar | |
) | |
{ | |
CONST CHAR8 * pData; | |
CONST CHAR8 * pEnd; | |
EFI_STATUS Status; | |
DBG_ENTER ( ); | |
// | |
// Use for/break instead of goto | |
// | |
for ( ; ; ) { | |
// | |
// Start the row | |
// | |
Status = HttpSendAnsiString ( SocketFD, | |
pPort, | |
"<tr><td>" ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = HttpSendAnsiString ( SocketFD, | |
pPort, | |
pName ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = HttpSendAnsiString ( SocketFD, | |
pPort, | |
"</td><td><code>" ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Display the characters | |
// | |
pData = pChar; | |
pEnd = &pChar[ Length ]; | |
while ( pEnd > pData ) { | |
Status = HttpSendCharacter ( SocketFD, | |
pPort, | |
*pData++, | |
" " ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
} | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Display the byte values | |
// | |
Status = HttpSendAnsiString ( SocketFD, | |
pPort, | |
"<br/>0x" ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
pData = pChar; | |
while ( pEnd > pData ) { | |
Status = HttpSendHexBits ( SocketFD, | |
pPort, | |
8, | |
*pData++ ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
if ( pEnd > pData ) { | |
Status = HttpSendAnsiString ( SocketFD, | |
pPort, | |
" 0x" ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
} | |
} | |
// | |
// Terminate the row | |
// | |
Status = HttpSendAnsiString ( SocketFD, | |
pPort, | |
"</code></td></tr>\r\n" ); | |
break; | |
} | |
// | |
// Return the operation status | |
// | |
DBG_EXIT_STATUS ( Status ); | |
return Status; | |
} | |
/** | |
Format a row with a list of bytes | |
@param [in] SocketFD The socket's file descriptor to add to the list. | |
@param [in] pPort The WSDT_PORT structure address | |
@param [in] pName Zero terminated name string | |
@param [in] ByteCount The number of bytes to display | |
@param [in] pData Address of the byte array | |
@retval EFI_SUCCESS The request was successfully processed | |
**/ | |
EFI_STATUS | |
RowBytes ( | |
IN int SocketFD, | |
IN WSDT_PORT * pPort, | |
IN CHAR8 * pName, | |
IN UINTN ByteCount, | |
IN CONST UINT8 * pData | |
) | |
{ | |
CONST UINT8 * pEnd; | |
EFI_STATUS Status; | |
// | |
// Use for/break instead of goto | |
// | |
for ( ; ; ) { | |
// | |
// Start the row | |
// | |
Status = HttpSendAnsiString ( SocketFD, | |
pPort, | |
"<tr><td>" ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Display the field name | |
// | |
Status = HttpSendAnsiString ( SocketFD, | |
pPort, | |
pName ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Display the field value | |
// | |
Status = HttpSendAnsiString ( SocketFD, | |
pPort, | |
"</td><td><code>0x" ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
pEnd = &pData[ ByteCount ]; | |
while ( pEnd > pData ) { | |
Status = HttpSendHexBits ( SocketFD, | |
pPort, | |
8, | |
*pData++ ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
if ( pEnd > pData ) { | |
Status = HttpSendAnsiString ( SocketFD, | |
pPort, | |
" 0x" ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
} | |
} | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Terminate the row | |
// | |
Status = HttpSendAnsiString ( SocketFD, | |
pPort, | |
"</code></td></tr>\r\n" ); | |
break; | |
} | |
// | |
// Return the operation status | |
// | |
return Status; | |
} | |
/** | |
Format a row with a list of bytes | |
@param [in] SocketFD The socket's file descriptor to add to the list. | |
@param [in] pPort The WSDT_PORT structure address | |
@param [in] pName Zero terminated name string | |
@param [in] ByteCount The number of bytes to display | |
@param [in] pData Address of the byte array | |
@retval EFI_SUCCESS The request was successfully processed | |
**/ | |
EFI_STATUS | |
RowDump ( | |
IN int SocketFD, | |
IN WSDT_PORT * pPort, | |
IN CHAR8 * pName, | |
IN UINTN ByteCount, | |
IN CONST UINT8 * pData | |
) | |
{ | |
EFI_STATUS Status; | |
// | |
// Use for/break instead of goto | |
// | |
for ( ; ; ) { | |
// | |
// Start the row | |
// | |
Status = HttpSendAnsiString ( SocketFD, | |
pPort, | |
"<tr><td>" ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Display the field name | |
// | |
Status = HttpSendAnsiString ( SocketFD, | |
pPort, | |
pName ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Start the field value | |
// | |
Status = HttpSendAnsiString ( SocketFD, | |
pPort, | |
"</td><td>" ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Dump the buffer | |
// | |
Status = HttpSendDump ( SocketFD, | |
pPort, | |
ByteCount, | |
pData ); | |
// | |
// Terminate the field value and row | |
// | |
Status = HttpSendAnsiString ( SocketFD, | |
pPort, | |
"</td></tr>\r\n" ); | |
break; | |
} | |
// | |
// Return the operation status | |
// | |
return Status; | |
} | |
/** | |
Format a row with a general address | |
@param [in] SocketFD The socket's file descriptor to add to the list. | |
@param [in] pPort The WSDT_PORT structure address | |
@param [in] pName Zero terminated name string | |
@param [in] pAddr Address of the general address buffer | |
@param [in] pWebPage Zero terminated web page address | |
@retval EFI_SUCCESS The request was successfully processed | |
**/ | |
EFI_STATUS | |
RowGenericAddress ( | |
IN int SocketFD, | |
IN WSDT_PORT * pPort, | |
IN CHAR8 * pName, | |
IN CONST UINT32 * pAddr, | |
IN CONST CHAR16 * pWebPage | |
) | |
{ | |
CONST GENERIC_ADDRESS * pGenericAddress; | |
EFI_STATUS Status; | |
// | |
// Use for/break instead of goto | |
// | |
for ( ; ; ) { | |
// | |
// Start the row | |
// | |
Status = HttpSendAnsiString ( SocketFD, | |
pPort, | |
"<tr><td>" ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Display the field name | |
// | |
Status = HttpSendAnsiString ( SocketFD, | |
pPort, | |
pName ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Display the field value | |
// | |
Status = HttpSendAnsiString ( SocketFD, | |
pPort, | |
"</td><td><code>" ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Determine the type of address | |
// | |
pGenericAddress = (CONST GENERIC_ADDRESS *)pAddr; | |
if ( 0 == pGenericAddress->AddressSpaceId ) { | |
Status = HttpSendAnsiString ( SocketFD, pPort, "System Memory" ); | |
} | |
else if ( 1 == pGenericAddress->AddressSpaceId ) { | |
Status = HttpSendAnsiString ( SocketFD, pPort, "I/O Space" ); | |
} | |
else if ( 2 == pGenericAddress->AddressSpaceId ) { | |
Status = HttpSendAnsiString ( SocketFD, pPort, "PCI Configuration Space" ); | |
} | |
else if ( 3 == pGenericAddress->AddressSpaceId ) { | |
Status = HttpSendAnsiString ( SocketFD, pPort, "Embedded Controller" ); | |
} | |
else if ( 4 == pGenericAddress->AddressSpaceId ) { | |
Status = HttpSendAnsiString ( SocketFD, pPort, "SMBus" ); | |
} | |
else if ( 0x7f == pGenericAddress->AddressSpaceId ) { | |
Status = HttpSendAnsiString ( SocketFD, pPort, "Functional Fixed Hardware" ); | |
} | |
else if (( 0xc0 <= pGenericAddress->AddressSpaceId ) | |
&& ( 0xff >= pGenericAddress->AddressSpaceId )) { | |
Status = HttpSendAnsiString ( SocketFD, pPort, "OEM Defined" ); | |
} | |
else { | |
Status = HttpSendAnsiString ( SocketFD, pPort, "Reserved" ); | |
} | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = HttpSendAnsiString ( SocketFD, | |
pPort, | |
"<br/>Register Bit Width: " ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = HttpSendValue ( SocketFD, | |
pPort, | |
pGenericAddress->RegisterBitWidth ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = HttpSendAnsiString ( SocketFD, | |
pPort, | |
"<br/>Register Bit Offset: " ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = HttpSendHexValue ( SocketFD, | |
pPort, | |
pGenericAddress->RegisterBitOffset ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = HttpSendAnsiString ( SocketFD, | |
pPort, | |
"<br/>Access Size: " ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = HttpSendValue ( SocketFD, | |
pPort, | |
pGenericAddress->AccessSize ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = HttpSendAnsiString ( SocketFD, | |
pPort, | |
"<br/>Address: " ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Add the web-page link if necessary | |
// | |
if ( NULL != pWebPage ) { | |
Status = HttpSendAnsiString ( SocketFD, | |
pPort, | |
"<a target=\"_blank\" href=\"" ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = HttpSendUnicodeString ( SocketFD, | |
pPort, | |
pWebPage ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = HttpSendAnsiString ( SocketFD, | |
pPort, | |
"\">" ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
} | |
// | |
// Display the address | |
// | |
Status = HttpSendAnsiString ( SocketFD, | |
pPort, | |
"0x" ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = HttpSendHexBits ( SocketFD, | |
pPort, | |
64, | |
pGenericAddress->Address ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Finish the web-page link if necessary | |
// | |
if ( NULL != pWebPage ) { | |
Status = HttpSendAnsiString ( SocketFD, | |
pPort, | |
"</a>" ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
} | |
// | |
// Terminate the row | |
// | |
Status = HttpSendAnsiString ( SocketFD, | |
pPort, | |
"</code></td></tr>\r\n" ); | |
break; | |
} | |
// | |
// Return the operation status | |
// | |
return Status; | |
} | |
/** | |
Translate a table address into a web page | |
@param [in] pSignature Address of the table signature | |
@param [out] ppTableName Address to receive the table name address | |
@return Zero terminated web page address or NULL if not found | |
**/ | |
CONST CHAR16 * | |
SignatureLookup ( | |
IN UINT32 * pSignature, | |
OUT CONST CHAR8 ** ppTableName | |
) | |
{ | |
CONST TABLE_SIGNATURE * pTableId; | |
CONST TABLE_SIGNATURE * pEnd; | |
UINT32 Signature; | |
// | |
// Walk the list of tables | |
// | |
Signature = *pSignature; | |
pTableId = &mTableId[ 0 ]; | |
pEnd = &pTableId[ sizeof ( mTableId ) / sizeof ( mTableId[ 0 ])]; | |
while ( pEnd > pTableId ) { | |
// | |
// Attempt to locate the table signature | |
// | |
if ( pTableId->Signature == Signature ) { | |
// | |
// The signature was found | |
// Return the web page | |
// | |
*ppTableName = pTableId->pTableName; | |
return pTableId->pWebPage; | |
} | |
// | |
// Set the next table | |
// | |
pTableId += 1; | |
} | |
// | |
// The table was not found | |
// | |
*ppTableName = (CONST CHAR8 *)pSignature; | |
return NULL; | |
} | |
/** | |
Respond with the APIC table | |
@param [in] SocketFD The socket's file descriptor to add to the list. | |
@param [in] pPort The WSDT_PORT structure address | |
@param [out] pbDone Address to receive the request completion status | |
@retval EFI_SUCCESS The request was successfully processed | |
**/ | |
EFI_STATUS | |
AcpiApicPage ( | |
IN int SocketFD, | |
IN WSDT_PORT * pPort, | |
OUT BOOLEAN * pbDone | |
) | |
{ | |
CONST ACPI_UNKNOWN * pApic; | |
EFI_STATUS Status; | |
DBG_ENTER ( ); | |
// | |
// Send the APIC page | |
// | |
for ( ; ; ) { | |
// | |
// Locate the APIC | |
// | |
pApic = (ACPI_UNKNOWN *)LocateTable ( APIC_SIGNATURE ); | |
if ( NULL == pApic ) { | |
Status = EFI_NOT_FOUND; | |
break; | |
} | |
// | |
// Send the page and table header | |
// | |
Status = TableHeader ( SocketFD, pPort, L"APIC Table", pApic ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Display the header | |
// | |
Status = RowAnsiArray ( SocketFD, | |
pPort, | |
"Signature", | |
sizeof ( pApic->Signature ), | |
(CHAR8 *)&pApic->Signature ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowDecimalValue ( SocketFD, | |
pPort, | |
"Length", | |
pApic->Length ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Display the data from the table | |
// | |
Status = RowDump ( SocketFD, | |
pPort, | |
"Data", | |
pApic->Length - sizeof ( *pApic ) + 1, | |
(UINT8 *)( pApic + 1 )); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Build the table trailer | |
// | |
Status = TableTrailer ( SocketFD, | |
pPort, | |
pbDone ); | |
break; | |
} | |
// | |
// Return the operation status | |
// | |
DBG_EXIT_STATUS ( Status ); | |
return Status; | |
} | |
/** | |
Respond with the BGRT table | |
@param [in] SocketFD The socket's file descriptor to add to the list. | |
@param [in] pPort The WSDT_PORT structure address | |
@param [out] pbDone Address to receive the request completion status | |
@retval EFI_SUCCESS The request was successfully processed | |
**/ | |
EFI_STATUS | |
AcpiBgrtPage ( | |
IN int SocketFD, | |
IN WSDT_PORT * pPort, | |
OUT BOOLEAN * pbDone | |
) | |
{ | |
CONST ACPI_UNKNOWN * pBgrt; | |
EFI_STATUS Status; | |
DBG_ENTER ( ); | |
// | |
// Send the BGRT page | |
// | |
for ( ; ; ) { | |
// | |
// Locate the BGRT | |
// | |
pBgrt = (ACPI_UNKNOWN *)LocateTable ( BGRT_SIGNATURE ); | |
if ( NULL == pBgrt ) { | |
Status = EFI_NOT_FOUND; | |
break; | |
} | |
// | |
// Send the page and table header | |
// | |
Status = TableHeader ( SocketFD, pPort, L"BGRT Table", pBgrt ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Display the header | |
// | |
Status = RowAnsiArray ( SocketFD, | |
pPort, | |
"Signature", | |
sizeof ( pBgrt->Signature ), | |
(CHAR8 *)&pBgrt->Signature ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowDecimalValue ( SocketFD, | |
pPort, | |
"Length", | |
pBgrt->Length ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Display the data from the table | |
// | |
Status = RowDump ( SocketFD, | |
pPort, | |
"Data", | |
pBgrt->Length - sizeof ( *pBgrt ) + 1, | |
(UINT8 *)( pBgrt + 1 )); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Build the table trailer | |
// | |
Status = TableTrailer ( SocketFD, | |
pPort, | |
pbDone ); | |
break; | |
} | |
// | |
// Return the operation status | |
// | |
DBG_EXIT_STATUS ( Status ); | |
return Status; | |
} | |
/** | |
Respond with the ACPI DSDT table | |
@param [in] SocketFD The socket's file descriptor to add to the list. | |
@param [in] pPort The WSDT_PORT structure address | |
@param [out] pbDone Address to receive the request completion status | |
@retval EFI_SUCCESS The request was successfully processed | |
**/ | |
EFI_STATUS | |
AcpiDsdtPage ( | |
IN int SocketFD, | |
IN WSDT_PORT * pPort, | |
OUT BOOLEAN * pbDone | |
) | |
{ | |
CONST ACPI_DSDT * pDsdt; | |
CONST ACPI_FADT * pFadt; | |
EFI_STATUS Status; | |
DBG_ENTER ( ); | |
// | |
// Send the DADT page | |
// | |
for ( ; ; ) { | |
// | |
// Locate the DADT | |
// | |
pFadt = (ACPI_FADT *)LocateTable ( FADT_SIGNATURE ); | |
if ( NULL == pFadt ) { | |
Status = EFI_NOT_FOUND; | |
break; | |
} | |
pDsdt = (VOID *)(UINTN)pFadt->XDsdt; | |
// | |
// Send the page and table header | |
// | |
Status = TableHeader ( SocketFD, pPort, L"DSDT - Differentiated System Description Table", pDsdt ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Display the DSDT header | |
// | |
Status = RowAnsiArray ( SocketFD, | |
pPort, | |
"Signature", | |
sizeof ( pDsdt->Signature ), | |
(CHAR8 *)&pDsdt->Signature ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowDecimalValue ( SocketFD, | |
pPort, | |
"Length", | |
pDsdt->Length ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowDecimalValue ( SocketFD, | |
pPort, | |
"Revision", | |
pDsdt->Revision ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowHexValue ( SocketFD, | |
pPort, | |
"Checksum", | |
pDsdt->Checksum, | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowAnsiArray ( SocketFD, | |
pPort, | |
"OEMID", | |
sizeof ( pDsdt->OemId ), | |
(CONST CHAR8 *)&pDsdt->OemId[ 0 ]); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowAnsiArray ( SocketFD, | |
pPort, | |
"OEM Table ID", | |
sizeof ( pDsdt->OemTableId ), | |
(CONST CHAR8 *)&pDsdt->OemTableId[ 0 ]); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowRevision ( SocketFD, | |
pPort, | |
"OEM Revision", | |
pDsdt->OemRevision ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowAnsiArray ( SocketFD, | |
pPort, | |
"Creator ID", | |
sizeof ( pDsdt->CreatorId ), | |
(CHAR8 *)&pDsdt->CreatorId ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowRevision ( SocketFD, | |
pPort, | |
"Creator Revision", | |
pDsdt->CreatorRevision ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Display the data from the DSDT | |
// | |
Status = RowDump ( SocketFD, | |
pPort, | |
"Definition Block", | |
pDsdt->Length - sizeof ( *pDsdt ) + 1, | |
&pDsdt->DefinitionBlock[0]); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Build the table trailer | |
// | |
Status = TableTrailer ( SocketFD, | |
pPort, | |
pbDone ); | |
break; | |
} | |
// | |
// Return the operation status | |
// | |
DBG_EXIT_STATUS ( Status ); | |
return Status; | |
} | |
/** | |
Respond with the ACPI FADT table | |
@param [in] SocketFD The socket's file descriptor to add to the list. | |
@param [in] pPort The WSDT_PORT structure address | |
@param [out] pbDone Address to receive the request completion status | |
@retval EFI_SUCCESS The request was successfully processed | |
**/ | |
EFI_STATUS | |
AcpiFadtPage ( | |
IN int SocketFD, | |
IN WSDT_PORT * pPort, | |
OUT BOOLEAN * pbDone | |
) | |
{ | |
CONST ACPI_FADT * pFadt; | |
EFI_STATUS Status; | |
DBG_ENTER ( ); | |
// | |
// Send the FADT page | |
// | |
for ( ; ; ) { | |
// | |
// Locate the FADT | |
// | |
pFadt = (ACPI_FADT *)LocateTable ( FADT_SIGNATURE ); | |
if ( NULL == pFadt ) { | |
Status = EFI_NOT_FOUND; | |
break; | |
} | |
// | |
// Send the page and table header | |
// | |
Status = TableHeader ( SocketFD, pPort, L"FADT - Fixed ACPI Description Table", pFadt ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Display the FSDT header | |
// | |
Status = RowAnsiArray ( SocketFD, | |
pPort, | |
"Signature", | |
sizeof ( pFadt->Signature ), | |
(CHAR8 *)&pFadt->Signature ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowDecimalValue ( SocketFD, | |
pPort, | |
"Length", | |
pFadt->Length ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowDecimalValue ( SocketFD, | |
pPort, | |
"Revision", | |
pFadt->Revision ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowHexValue ( SocketFD, | |
pPort, | |
"Checksum", | |
pFadt->Checksum, | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowAnsiArray ( SocketFD, | |
pPort, | |
"OEMID", | |
sizeof ( pFadt->OemId ), | |
(CONST CHAR8 *)&pFadt->OemId[ 0 ]); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowAnsiArray ( SocketFD, | |
pPort, | |
"OEM Table ID", | |
sizeof ( pFadt->OemTableId ), | |
(CONST CHAR8 *)&pFadt->OemTableId[ 0 ]); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowRevision ( SocketFD, | |
pPort, | |
"OEM Revision", | |
pFadt->OemRevision ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowAnsiArray ( SocketFD, | |
pPort, | |
"Creator ID", | |
sizeof ( pFadt->CreatorId ), | |
(CHAR8 *)&pFadt->CreatorId ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowRevision ( SocketFD, | |
pPort, | |
"Creator Revision", | |
pFadt->CreatorRevision ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Display the data from the FADT | |
// | |
Status = RowPointer ( SocketFD, | |
pPort, | |
"FIRMWARE_CTRL", | |
(CONST VOID *)(UINTN)pFadt->FirmwareCtrl, | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowPointer ( SocketFD, | |
pPort, | |
"DSDT", | |
(CONST VOID *)(UINTN)pFadt->DSDT, | |
( pFadt->DSDT == pFadt->XDsdt ) ? PAGE_ACPI_DSDT : NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowHexValue ( SocketFD, | |
pPort, | |
"Reserved", | |
pFadt->Reserved, | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowHexValue ( SocketFD, | |
pPort, | |
"Preferred_PM_Profile", | |
pFadt->PreferredPmProfile, | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowHexValue ( SocketFD, | |
pPort, | |
"SCI_INT", | |
pFadt->SciInt, | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowHexValue ( SocketFD, | |
pPort, | |
"SMI_CMD", | |
pFadt->SmiCmd, | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowHexValue ( SocketFD, | |
pPort, | |
"ACPI_ENABLE", | |
pFadt->AcpiEnable, | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowHexValue ( SocketFD, | |
pPort, | |
"ACPI_DISABLE", | |
pFadt->AcpiDisable, | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowHexValue ( SocketFD, | |
pPort, | |
"S4BIOS_REQ", | |
pFadt->S4BiosReq, | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowHexValue ( SocketFD, | |
pPort, | |
"PSTATE_CNT", | |
pFadt->PStateCnt, | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowHexValue ( SocketFD, | |
pPort, | |
"PM1a_EVT_BLK", | |
pFadt->Pm1aEvtBlk, | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowHexValue ( SocketFD, | |
pPort, | |
"PM1b_EVT_BLK", | |
pFadt->Pm1bEvtBlk, | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowHexValue ( SocketFD, | |
pPort, | |
"PM1a_CNT_BLK", | |
pFadt->Pm1aCntBlk, | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowHexValue ( SocketFD, | |
pPort, | |
"PM1b_CNT_BLK", | |
pFadt->Pm1bCntBlk, | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowHexValue ( SocketFD, | |
pPort, | |
"PM2_CNT_BLK", | |
pFadt->Pm2CntBlk, | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowHexValue ( SocketFD, | |
pPort, | |
"PM_TMR_BLK", | |
pFadt->PmTmrBlk, | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowHexValue ( SocketFD, | |
pPort, | |
"GPE0_BLK", | |
pFadt->Gpe0Blk, | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowHexValue ( SocketFD, | |
pPort, | |
"GPE1_BLK", | |
pFadt->Gpe1Blk, | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowDecimalValue ( SocketFD, | |
pPort, | |
"PM1_EVT_LEN", | |
pFadt->Pm1EvtLen ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowDecimalValue ( SocketFD, | |
pPort, | |
"PM1_CNT_LEN", | |
pFadt->Pm1CntLen ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowDecimalValue ( SocketFD, | |
pPort, | |
"PM2_CNT_LEN", | |
pFadt->PM2CntLen ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowDecimalValue ( SocketFD, | |
pPort, | |
"PM_TMR_LEN", | |
pFadt->PmTmrLen ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowDecimalValue ( SocketFD, | |
pPort, | |
"GPE0_BLK_LEN", | |
pFadt->Gpe0BlkLen ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowDecimalValue ( SocketFD, | |
pPort, | |
"GPE1_BLK_LEN", | |
pFadt->Gpe1BlkLen ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowHexValue ( SocketFD, | |
pPort, | |
"GPE1_BASE", | |
pFadt->Gpe1Base, | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowDecimalValue ( SocketFD, | |
pPort, | |
"CST_CNT", | |
pFadt->CstCnt ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowHexValue ( SocketFD, | |
pPort, | |
"P_LVL2_LAT", | |
pFadt->PLvl2Lat, | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowHexValue ( SocketFD, | |
pPort, | |
"P_LVL3_LAT", | |
pFadt->PLvl3Lat, | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowDecimalValue ( SocketFD, | |
pPort, | |
"FLUSH_SIZE", | |
pFadt->FlushSize ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowDecimalValue ( SocketFD, | |
pPort, | |
"FLUSH_Stride", | |
pFadt->FlushStride ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowHexValue ( SocketFD, | |
pPort, | |
"DUTY_OFFSET", | |
pFadt->DutyOffset, | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowHexValue ( SocketFD, | |
pPort, | |
"DUTY_WIDTH", | |
pFadt->DutyWidth, | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowHexValue ( SocketFD, | |
pPort, | |
"DAY_ALRM", | |
pFadt->DayAlrm, | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowHexValue ( SocketFD, | |
pPort, | |
"MON_ALRM", | |
pFadt->MonAlrm, | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowHexValue ( SocketFD, | |
pPort, | |
"CENTURY", | |
pFadt->Century, | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowHexValue ( SocketFD, | |
pPort, | |
"IAPC_BOOT_ARCH", | |
pFadt->IapcBootArch, | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowHexValue ( SocketFD, | |
pPort, | |
"Reserved", | |
pFadt->Reserved2, | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowHexValue ( SocketFD, | |
pPort, | |
"Flags", | |
pFadt->Flags, | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowGenericAddress ( SocketFD, | |
pPort, | |
"RESET_REG", | |
&pFadt->ResetReg[0], | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowHexValue ( SocketFD, | |
pPort, | |
"RESET_VALUE", | |
pFadt->ResetValue, | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowHexValue ( SocketFD, | |
pPort, | |
"Reserved", | |
pFadt->Reserved3[0], | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowHexValue ( SocketFD, | |
pPort, | |
"Reserved", | |
pFadt->Reserved3[1], | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowHexValue ( SocketFD, | |
pPort, | |
"Reserved", | |
pFadt->Reserved3[2], | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowHexValue ( SocketFD, | |
pPort, | |
"X_FIRMWARE_CTRL", | |
pFadt->XFirmwareCtrl, | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowHexValue ( SocketFD, | |
pPort, | |
"X_DSDT", | |
pFadt->XDsdt, | |
PAGE_ACPI_DSDT ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowGenericAddress ( SocketFD, | |
pPort, | |
"X_PM1a_EVT_BLK", | |
&pFadt->XPm1aEvtBlk[0], | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowGenericAddress ( SocketFD, | |
pPort, | |
"X_PM1b_EVT_BLK", | |
&pFadt->XPm1bEvtBlk[0], | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowGenericAddress ( SocketFD, | |
pPort, | |
"X_PM1a_CNT_BLK", | |
&pFadt->XPm1aCntBlk[0], | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowGenericAddress ( SocketFD, | |
pPort, | |
"X_PM1b_CNT_BLK", | |
&pFadt->XPm1bCntBlk[0], | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowGenericAddress ( SocketFD, | |
pPort, | |
"X_PM2_CNT_BLK", | |
&pFadt->XPm2CntBlk[0], | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowGenericAddress ( SocketFD, | |
pPort, | |
"X_PM_TMR_BLK", | |
&pFadt->XPmTmrBlk[0], | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowGenericAddress ( SocketFD, | |
pPort, | |
"X_GPE0_BLK", | |
&pFadt->XGpe0Blk[0], | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowGenericAddress ( SocketFD, | |
pPort, | |
"X_GPE1_BLK", | |
&pFadt->XGpe1Blk[0], | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Build the table trailer | |
// | |
Status = TableTrailer ( SocketFD, | |
pPort, | |
pbDone ); | |
break; | |
} | |
// | |
// Return the operation status | |
// | |
DBG_EXIT_STATUS ( Status ); | |
return Status; | |
} | |
/** | |
Respond with the HPET table | |
@param [in] SocketFD The socket's file descriptor to add to the list. | |
@param [in] pPort The WSDT_PORT structure address | |
@param [out] pbDone Address to receive the request completion status | |
@retval EFI_SUCCESS The request was successfully processed | |
**/ | |
EFI_STATUS | |
AcpiHpetPage ( | |
IN int SocketFD, | |
IN WSDT_PORT * pPort, | |
OUT BOOLEAN * pbDone | |
) | |
{ | |
CONST ACPI_UNKNOWN * pHpet; | |
EFI_STATUS Status; | |
DBG_ENTER ( ); | |
// | |
// Send the HPET page | |
// | |
for ( ; ; ) { | |
// | |
// Locate the HPET | |
// | |
pHpet = (ACPI_UNKNOWN *)LocateTable ( HPET_SIGNATURE ); | |
if ( NULL == pHpet ) { | |
Status = EFI_NOT_FOUND; | |
break; | |
} | |
// | |
// Send the page and table header | |
// | |
Status = TableHeader ( SocketFD, pPort, L"HPET Table", pHpet ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Display the header | |
// | |
Status = RowAnsiArray ( SocketFD, | |
pPort, | |
"Signature", | |
sizeof ( pHpet->Signature ), | |
(CHAR8 *)&pHpet->Signature ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowDecimalValue ( SocketFD, | |
pPort, | |
"Length", | |
pHpet->Length ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Display the data from the table | |
// | |
Status = RowDump ( SocketFD, | |
pPort, | |
"Data", | |
pHpet->Length - sizeof ( *pHpet ) + 1, | |
(UINT8 *)( pHpet + 1 )); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Build the table trailer | |
// | |
Status = TableTrailer ( SocketFD, | |
pPort, | |
pbDone ); | |
break; | |
} | |
// | |
// Return the operation status | |
// | |
DBG_EXIT_STATUS ( Status ); | |
return Status; | |
} | |
/** | |
Respond with the MCFG table | |
@param [in] SocketFD The socket's file descriptor to add to the list. | |
@param [in] pPort The WSDT_PORT structure address | |
@param [out] pbDone Address to receive the request completion status | |
@retval EFI_SUCCESS The request was successfully processed | |
**/ | |
EFI_STATUS | |
AcpiMcfgPage ( | |
IN int SocketFD, | |
IN WSDT_PORT * pPort, | |
OUT BOOLEAN * pbDone | |
) | |
{ | |
CONST ACPI_UNKNOWN * pMcfg; | |
EFI_STATUS Status; | |
DBG_ENTER ( ); | |
// | |
// Send the MCFG page | |
// | |
for ( ; ; ) { | |
// | |
// Locate the MCFG | |
// | |
pMcfg = (ACPI_UNKNOWN *)LocateTable ( MCFG_SIGNATURE ); | |
if ( NULL == pMcfg ) { | |
Status = EFI_NOT_FOUND; | |
break; | |
} | |
// | |
// Send the page and table header | |
// | |
Status = TableHeader ( SocketFD, pPort, L"MCFG Table", pMcfg ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Display the header | |
// | |
Status = RowAnsiArray ( SocketFD, | |
pPort, | |
"Signature", | |
sizeof ( pMcfg->Signature ), | |
(CHAR8 *)&pMcfg->Signature ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowDecimalValue ( SocketFD, | |
pPort, | |
"Length", | |
pMcfg->Length ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Display the data from the table | |
// | |
Status = RowDump ( SocketFD, | |
pPort, | |
"Data", | |
pMcfg->Length - sizeof ( *pMcfg ) + 1, | |
(UINT8 *)( pMcfg + 1 )); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Build the table trailer | |
// | |
Status = TableTrailer ( SocketFD, | |
pPort, | |
pbDone ); | |
break; | |
} | |
// | |
// Return the operation status | |
// | |
DBG_EXIT_STATUS ( Status ); | |
return Status; | |
} | |
/** | |
Respond with the ACPI RSDP 1.0b table | |
@param [in] SocketFD The socket's file descriptor to add to the list. | |
@param [in] pPort The WSDT_PORT structure address | |
@param [out] pbDone Address to receive the request completion status | |
@retval EFI_SUCCESS The request was successfully processed | |
**/ | |
EFI_STATUS | |
AcpiRsdp10Page ( | |
IN int SocketFD, | |
IN WSDT_PORT * pPort, | |
OUT BOOLEAN * pbDone | |
) | |
{ | |
CONST EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER * pRsdp10b; | |
EFI_STATUS Status; | |
DBG_ENTER ( ); | |
// | |
// Send the RSDP page | |
// | |
for ( ; ; ) { | |
// | |
// Locate the RSDP | |
// | |
Status = EfiGetSystemConfigurationTable ( &gEfiAcpi10TableGuid, (VOID **) &pRsdp10b ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Send the page and table header | |
// | |
Status = TableHeader ( SocketFD, pPort, L"RSDP - ACPI 1.0b Root System Description Pointer", pRsdp10b ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Display the RSDP | |
// | |
Status = RowAnsiArray ( SocketFD, | |
pPort, | |
"Signature", | |
sizeof ( pRsdp10b->Signature ), | |
(CHAR8 *)&pRsdp10b->Signature ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowHexValue ( SocketFD, | |
pPort, | |
"Checksum", | |
pRsdp10b->Checksum, | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowAnsiArray ( SocketFD, | |
pPort, | |
"OemId", | |
sizeof ( pRsdp10b->OemId ), | |
(CONST CHAR8 *)&pRsdp10b->OemId[ 0 ]); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowHexValue ( SocketFD, | |
pPort, | |
"Reserved", | |
pRsdp10b->Reserved, | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowPointer ( SocketFD, | |
pPort, | |
"RsdtAddress", | |
(VOID *)(UINTN)pRsdp10b->RsdtAddress, | |
PAGE_ACPI_RSDT ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Build the table trailer | |
// | |
Status = TableTrailer ( SocketFD, | |
pPort, | |
pbDone ); | |
break; | |
} | |
// | |
// Return the operation status | |
// | |
DBG_EXIT_STATUS ( Status ); | |
return Status; | |
} | |
/** | |
Respond with the ACPI RSDP 3.0 table | |
@param [in] SocketFD The socket's file descriptor to add to the list. | |
@param [in] pPort The WSDT_PORT structure address | |
@param [out] pbDone Address to receive the request completion status | |
@retval EFI_SUCCESS The request was successfully processed | |
**/ | |
EFI_STATUS | |
AcpiRsdp30Page ( | |
IN int SocketFD, | |
IN WSDT_PORT * pPort, | |
OUT BOOLEAN * pbDone | |
) | |
{ | |
CONST EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER * pRsdp30; | |
EFI_STATUS Status; | |
DBG_ENTER ( ); | |
// | |
// Send the RSDP page | |
// | |
for ( ; ; ) { | |
// | |
// Locate the RSDP | |
// | |
Status = EfiGetSystemConfigurationTable ( &gEfiAcpiTableGuid, (VOID **) &pRsdp30 ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Send the page and table header | |
// | |
Status = TableHeader ( SocketFD, pPort, L"RSDP - ACPI 3.0 Root System Description Pointer", pRsdp30 ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Display the RSDP | |
// | |
Status = RowAnsiArray ( SocketFD, | |
pPort, | |
"Signature", | |
sizeof ( pRsdp30->Signature ), | |
(CHAR8 *)&pRsdp30->Signature ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowHexValue ( SocketFD, | |
pPort, | |
"Checksum", | |
pRsdp30->Checksum, | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowAnsiArray ( SocketFD, | |
pPort, | |
"OemId", | |
sizeof ( pRsdp30->OemId ), | |
(CONST CHAR8 *)&pRsdp30->OemId[ 0 ]); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowHexValue ( SocketFD, | |
pPort, | |
"Revision", | |
pRsdp30->Revision, | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowPointer ( SocketFD, | |
pPort, | |
"RsdtAddress", | |
(VOID *)(UINTN)pRsdp30->RsdtAddress, | |
PAGE_ACPI_RSDT ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowDecimalValue ( SocketFD, | |
pPort, | |
"Length", | |
pRsdp30->Length ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowPointer ( SocketFD, | |
pPort, | |
"XsdtAddress", | |
(VOID *)(UINTN)pRsdp30->XsdtAddress, | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowHexValue ( SocketFD, | |
pPort, | |
"ExtendedChecksum", | |
pRsdp30->ExtendedChecksum, | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowBytes ( SocketFD, | |
pPort, | |
"Reserved", | |
sizeof ( pRsdp30->Reserved ), | |
&pRsdp30->Reserved[ 0 ]); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Build the table trailer | |
// | |
Status = TableTrailer ( SocketFD, | |
pPort, | |
pbDone ); | |
break; | |
} | |
// | |
// Return the operation status | |
// | |
DBG_EXIT_STATUS ( Status ); | |
return Status; | |
} | |
/** | |
Respond with the ACPI RSDT table | |
@param [in] SocketFD The socket's file descriptor to add to the list. | |
@param [in] pPort The WSDT_PORT structure address | |
@param [out] pbDone Address to receive the request completion status | |
@retval EFI_SUCCESS The request was successfully processed | |
**/ | |
EFI_STATUS | |
AcpiRsdtPage ( | |
IN int SocketFD, | |
IN WSDT_PORT * pPort, | |
OUT BOOLEAN * pbDone | |
) | |
{ | |
CONST UINT32 * pEnd; | |
CONST UINT32 * pEntry; | |
CONST ACPI_RSDT * pRsdt; | |
CONST CHAR8 * pTableName; | |
CONST CHAR16 * pWebPage; | |
EFI_STATUS Status; | |
UINT32 TableName[ 2 ]; | |
DBG_ENTER ( ); | |
// | |
// Send the RSDT page | |
// | |
for ( ; ; ) { | |
// | |
// Locate the RSDT | |
// | |
pRsdt = LocateRsdt ( ); | |
if ( NULL == pRsdt ) { | |
Status = EFI_NOT_FOUND; | |
break; | |
} | |
// | |
// Send the page and table header | |
// | |
Status = TableHeader ( SocketFD, pPort, L"RSDT - ACPI Root System Description Table", pRsdt ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Display the RSDT | |
// | |
Status = RowAnsiArray ( SocketFD, | |
pPort, | |
"Signature", | |
sizeof ( pRsdt->Signature ), | |
(CHAR8 *)&pRsdt->Signature ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowDecimalValue ( SocketFD, | |
pPort, | |
"Length", | |
pRsdt->Length ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowDecimalValue ( SocketFD, | |
pPort, | |
"Revision", | |
pRsdt->Revision ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowHexValue ( SocketFD, | |
pPort, | |
"Checksum", | |
pRsdt->Checksum, | |
NULL ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowAnsiArray ( SocketFD, | |
pPort, | |
"OEMID", | |
sizeof ( pRsdt->OemId ), | |
(CONST CHAR8 *)&pRsdt->OemId[ 0 ]); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowAnsiArray ( SocketFD, | |
pPort, | |
"OEM Table ID", | |
sizeof ( pRsdt->OemTableId ), | |
(CONST CHAR8 *)&pRsdt->OemTableId[ 0 ]); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowRevision ( SocketFD, | |
pPort, | |
"OEM Revision", | |
pRsdt->OemRevision ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowAnsiArray ( SocketFD, | |
pPort, | |
"Creator ID", | |
sizeof ( pRsdt->CreatorId ), | |
(CHAR8 *)&pRsdt->CreatorId ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowRevision ( SocketFD, | |
pPort, | |
"Creator Revision", | |
pRsdt->CreatorRevision ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Walk the list of entries | |
// | |
pEntry = &pRsdt->Entry[ 0 ]; | |
pEnd = &pEntry[(( pRsdt->Length - sizeof ( *pRsdt )) >> 2 ) + 1 ]; | |
TableName[ 1 ] = 0; | |
while ( pEnd > pEntry ) { | |
// | |
// The entry is actually a 32-bit physical table address | |
// The first entry in the table is the 32-bit table signature | |
// | |
TableName[ 0 ] = *(UINT32 *)(UINTN)*pEntry; | |
pWebPage = SignatureLookup ( &TableName[ 0 ], &pTableName ); | |
// | |
// Display the table address | |
// | |
Status = RowPointer ( SocketFD, | |
pPort, | |
pTableName, | |
(VOID *)(UINTN)*pEntry, | |
pWebPage ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
pEntry++; | |
} | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Build the table trailer | |
// | |
Status = TableTrailer ( SocketFD, | |
pPort, | |
pbDone ); | |
break; | |
} | |
// | |
// Return the operation status | |
// | |
DBG_EXIT_STATUS ( Status ); | |
return Status; | |
} | |
/** | |
Respond with the SSDT table | |
@param [in] SocketFD The socket's file descriptor to add to the list. | |
@param [in] pPort The WSDT_PORT structure address | |
@param [out] pbDone Address to receive the request completion status | |
@retval EFI_SUCCESS The request was successfully processed | |
**/ | |
EFI_STATUS | |
AcpiSsdtPage ( | |
IN int SocketFD, | |
IN WSDT_PORT * pPort, | |
OUT BOOLEAN * pbDone | |
) | |
{ | |
CONST ACPI_UNKNOWN * pSsdt; | |
EFI_STATUS Status; | |
DBG_ENTER ( ); | |
// | |
// Send the SSDT page | |
// | |
for ( ; ; ) { | |
// | |
// Locate the SSDT | |
// | |
pSsdt = (ACPI_UNKNOWN *)LocateTable ( SSDT_SIGNATURE ); | |
if ( NULL == pSsdt ) { | |
Status = EFI_NOT_FOUND; | |
break; | |
} | |
// | |
// Send the page and table header | |
// | |
Status = TableHeader ( SocketFD, pPort, L"SSDT Table", pSsdt ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Display the header | |
// | |
Status = RowAnsiArray ( SocketFD, | |
pPort, | |
"Signature", | |
sizeof ( pSsdt->Signature ), | |
(CHAR8 *)&pSsdt->Signature ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowDecimalValue ( SocketFD, | |
pPort, | |
"Length", | |
pSsdt->Length ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Display the data from the table | |
// | |
Status = RowDump ( SocketFD, | |
pPort, | |
"Data", | |
pSsdt->Length - sizeof ( *pSsdt ) + 1, | |
(UINT8 *)( pSsdt + 1 )); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Build the table trailer | |
// | |
Status = TableTrailer ( SocketFD, | |
pPort, | |
pbDone ); | |
break; | |
} | |
// | |
// Return the operation status | |
// | |
DBG_EXIT_STATUS ( Status ); | |
return Status; | |
} | |
/** | |
Respond with the TCPA table | |
@param [in] SocketFD The socket's file descriptor to add to the list. | |
@param [in] pPort The WSDT_PORT structure address | |
@param [out] pbDone Address to receive the request completion status | |
@retval EFI_SUCCESS The request was successfully processed | |
**/ | |
EFI_STATUS | |
AcpiTcpaPage ( | |
IN int SocketFD, | |
IN WSDT_PORT * pPort, | |
OUT BOOLEAN * pbDone | |
) | |
{ | |
CONST ACPI_UNKNOWN * pTcpa; | |
EFI_STATUS Status; | |
DBG_ENTER ( ); | |
// | |
// Send the TCPA page | |
// | |
for ( ; ; ) { | |
// | |
// Locate the TCPA | |
// | |
pTcpa = (ACPI_UNKNOWN *)LocateTable ( TCPA_SIGNATURE ); | |
if ( NULL == pTcpa ) { | |
Status = EFI_NOT_FOUND; | |
break; | |
} | |
// | |
// Send the page and table header | |
// | |
Status = TableHeader ( SocketFD, pPort, L"TCPA Table", pTcpa ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Display the header | |
// | |
Status = RowAnsiArray ( SocketFD, | |
pPort, | |
"Signature", | |
sizeof ( pTcpa->Signature ), | |
(CHAR8 *)&pTcpa->Signature ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowDecimalValue ( SocketFD, | |
pPort, | |
"Length", | |
pTcpa->Length ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Display the data from the table | |
// | |
Status = RowDump ( SocketFD, | |
pPort, | |
"Data", | |
pTcpa->Length - sizeof ( *pTcpa ) + 1, | |
(UINT8 *)( pTcpa + 1 )); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Build the table trailer | |
// | |
Status = TableTrailer ( SocketFD, | |
pPort, | |
pbDone ); | |
break; | |
} | |
// | |
// Return the operation status | |
// | |
DBG_EXIT_STATUS ( Status ); | |
return Status; | |
} | |
/** | |
Respond with the UEFI table | |
@param [in] SocketFD The socket's file descriptor to add to the list. | |
@param [in] pPort The WSDT_PORT structure address | |
@param [out] pbDone Address to receive the request completion status | |
@retval EFI_SUCCESS The request was successfully processed | |
**/ | |
EFI_STATUS | |
AcpiUefiPage ( | |
IN int SocketFD, | |
IN WSDT_PORT * pPort, | |
OUT BOOLEAN * pbDone | |
) | |
{ | |
CONST ACPI_UNKNOWN * pUefi; | |
EFI_STATUS Status; | |
DBG_ENTER ( ); | |
// | |
// Send the UEFI page | |
// | |
for ( ; ; ) { | |
// | |
// Locate the UEFI | |
// | |
pUefi = (ACPI_UNKNOWN *)LocateTable ( UEFI_SIGNATURE ); | |
if ( NULL == pUefi ) { | |
Status = EFI_NOT_FOUND; | |
break; | |
} | |
// | |
// Send the page and table header | |
// | |
Status = TableHeader ( SocketFD, pPort, L"UEFI Table", pUefi ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Display the header | |
// | |
Status = RowAnsiArray ( SocketFD, | |
pPort, | |
"Signature", | |
sizeof ( pUefi->Signature ), | |
(CHAR8 *)&pUefi->Signature ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = RowDecimalValue ( SocketFD, | |
pPort, | |
"Length", | |
pUefi->Length ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Display the data from the table | |
// | |
Status = RowDump ( SocketFD, | |
pPort, | |
"Data", | |
pUefi->Length - sizeof ( *pUefi ) + 1, | |
(UINT8 *)( pUefi + 1 )); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Build the table trailer | |
// | |
Status = TableTrailer ( SocketFD, | |
pPort, | |
pbDone ); | |
break; | |
} | |
// | |
// Return the operation status | |
// | |
DBG_EXIT_STATUS ( Status ); | |
return Status; | |
} |