]> git.proxmox.com Git - mirror_edk2.git/blobdiff - AppPkg/Applications/Sockets/WebServer/ACPI.c
Fix @return Doxygen commands to be singular instead of plural.
[mirror_edk2.git] / AppPkg / Applications / Sockets / WebServer / ACPI.c
index a7da233e225cdd735ef558b17e6ddd268bfa8c74..bcb56d0ded9e38dcc9038e74f4cc8fd49c884e3e 100644 (file)
-/*++
-  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