| /** | |
| @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; | |
| } |