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