-/*++
- This file contains an 'Intel UEFI Application' and is
- licensed for Intel CPUs and chipsets under the terms of your
- license agreement with Intel or your vendor. This file may
- be modified by the user, subject to additional terms of the
- license agreement
---*/
-/*++
-
-Copyright (c) 2011 Intel Corporation. All rights reserved
-This software and associated documentation (if any) is furnished
-under a license and may only be used or copied in accordance
-with the terms of the license. Except as permitted by such
-license, no part of this software or documentation may be
-reproduced, stored in a retrieval system, or transmitted in any
-form or by any means without the express written consent of
-Intel Corporation.
-
---*/
-
-/** @file
- Display the runtime services table
-
-**/
-
-#include <WebServer.h>
-#include <Guid/Acpi.h>
-#include <IndustryStandard/Acpi10.h>
-#include <IndustryStandard/Acpi30.h>
-
-#pragma warning ( disable : 4305 )
-
-//
-// 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;
-
-
-#pragma pack()
-
-
-typedef struct {
- UINT32 Signature;
- CONST CHAR8 * pTableName;
- CONST CHAR16 * pWebPage;
-} TABLE_SIGNATURE;
-
-
-CONST TABLE_SIGNATURE mTableId [] = {
- { DSDT_SIGNATURE, "DSDT", PAGE_ACPI_DSDT },
- { FADT_SIGNATURE, "FADT", PAGE_ACPI_FADT }
-};
-
-
-/**
- Locate the RSDT table
-
- @returns 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 *)pRsdp30->RsdtAddress;
- }
- else {
- Status = EfiGetSystemConfigurationTable (&gEfiAcpi10TableGuid, (VOID **)&pRsdp10b );
- if ( EFI_ERROR ( Status )) {
- break;
- }
- pRsdt = (ACPI_RSDT *)pRsdp10b->RsdtAddress;
- }
- break;
- }
-
- //
- // The entry was not found
- //
- return pRsdt;
-}
-
-
-/**
- Locate the specified table
-
- @param [in] Signature Table signature
-
- @returns 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 *)pRsdp30->RsdtAddress;
- }
- else {
- Status = EfiGetSystemConfigurationTable (&gEfiAcpi10TableGuid, (VOID **)&pRsdp10b );
- if ( EFI_ERROR ( Status )) {
- break;
- }
- pRsdt = (ACPI_RSDT *)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 *)*pEntry;
- if ( *pSignature == Signature ) {
- return (CONST VOID *) *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
-
- @returns 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 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 *)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 ),
- &pDsdt->OemId [ 0 ]);
- if ( EFI_ERROR ( Status )) {
- break;
- }
- Status = RowAnsiArray ( SocketFD,
- pPort,
- "OEM Table ID",
- sizeof ( pDsdt->OemTableId ),
- &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 ),
- &pFadt->OemId [ 0 ]);
- if ( EFI_ERROR ( Status )) {
- break;
- }
- Status = RowAnsiArray ( SocketFD,
- pPort,
- "OEM Table ID",
- sizeof ( pFadt->OemTableId ),
- &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 *)pFadt->FirmwareCtrl,
- NULL );
- if ( EFI_ERROR ( Status )) {
- break;
- }
- Status = RowPointer ( SocketFD,
- pPort,
- "DSDT",
- (CONST VOID *)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 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 ),
- &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 *)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 ),
- &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 *)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 *)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 ),
- &pRsdt->OemId [ 0 ]);
- if ( EFI_ERROR ( Status )) {
- break;
- }
- Status = RowAnsiArray ( SocketFD,
- pPort,
- "OEM Table ID",
- sizeof ( pRsdt->OemTableId ),
- &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 *)*pEntry;
- pWebPage = SignatureLookup ( &TableName [ 0 ], &pTableName );
-
- //
- // Display the table address
- //
- Status = RowPointer ( SocketFD,
- pPort,
- pTableName,
- (VOID *)*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;
-}
-
-
+/*++\r
+ This file contains an 'Intel UEFI Application' and is\r
+ licensed for Intel CPUs and chipsets under the terms of your\r
+ license agreement with Intel or your vendor. This file may\r
+ be modified by the user, subject to additional terms of the\r
+ license agreement\r
+--*/\r
+/*++\r
+\r
+Copyright (c) 2011 Intel Corporation. All rights reserved\r
+This software and associated documentation (if any) is furnished\r
+under a license and may only be used or copied in accordance\r
+with the terms of the license. Except as permitted by such\r
+license, no part of this software or documentation may be\r
+reproduced, stored in a retrieval system, or transmitted in any\r
+form or by any means without the express written consent of\r
+Intel Corporation.\r
+\r
+--*/\r
+\r
+/** @file\r
+ Display the runtime services table\r
+\r
+**/\r
+\r
+#include <WebServer.h>\r
+#include <Guid/Acpi.h>\r
+#include <IndustryStandard/Acpi10.h>\r
+#include <IndustryStandard/Acpi30.h>\r
+\r
+#pragma warning ( disable : 4305 )\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
+#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
+ { DSDT_SIGNATURE, "DSDT", PAGE_ACPI_DSDT },\r
+ { FADT_SIGNATURE, "FADT", PAGE_ACPI_FADT }\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 *)pRsdp30->RsdtAddress;\r
+ }\r
+ else {\r
+ Status = EfiGetSystemConfigurationTable (&gEfiAcpi10TableGuid, (VOID **)&pRsdp10b );\r
+ if ( EFI_ERROR ( Status )) {\r
+ break;\r
+ }\r
+ pRsdt = (ACPI_RSDT *)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 *)pRsdp30->RsdtAddress;\r
+ }\r
+ else {\r
+ Status = EfiGetSystemConfigurationTable (&gEfiAcpi10TableGuid, (VOID **)&pRsdp10b );\r
+ if ( EFI_ERROR ( Status )) {\r
+ break;\r
+ }\r
+ pRsdt = (ACPI_RSDT *)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 *)*pEntry;\r
+ if ( *pSignature == Signature ) {\r
+ return (CONST VOID *) *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 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 *)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
+ &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
+ &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
+ &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
+ &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 *)pFadt->FirmwareCtrl,\r
+ NULL );\r
+ if ( EFI_ERROR ( Status )) {\r
+ break;\r
+ }\r
+ Status = RowPointer ( SocketFD,\r
+ pPort,\r
+ "DSDT",\r
+ (CONST VOID *)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 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
+ &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 *)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
+ &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 *)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 *)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
+ &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
+ &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 *)*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 *)*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