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