/** @file Display the system table Copyright (c) 2011-2012, Intel Corporation. All rights reserved. SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include /** Display the EFI Table Header @param [in] SocketFD The socket's file descriptor to add to the list. @param [in] pPort The WSDT_PORT structure address @param [in] pHeader Address of the EFI_TABLE_HEADER structure @retval EFI_SUCCESS The request was successfully processed **/ EFI_STATUS EfiTableHeader ( IN int SocketFD, IN WSDT_PORT * pPort, IN EFI_TABLE_HEADER * pHeader ) { EFI_STATUS Status; DBG_ENTER ( ); // // Send the handles page // for ( ; ; ) { /// /// A 64-bit signature that identifies the type of table that follows. /// Unique signatures have been generated for the EFI System Table, /// the EFI Boot Services Table, and the EFI Runtime Services Table. /// Status = RowHexValue ( SocketFD, pPort, "Hdr.Signature", pHeader->Signature, NULL ); if ( EFI_ERROR ( Status )) { break; } /// /// The revision of the EFI Specification to which this table /// conforms. The upper 16 bits of this field contain the major /// revision value, and the lower 16 bits contain the minor revision /// value. The minor revision values are limited to the range of 00..99. /// Status = RowRevision ( SocketFD, pPort, "Hdr.Revision", pHeader->Revision ); if ( EFI_ERROR ( Status )) { break; } /// /// The size, in bytes, of the entire table including the EFI_TABLE_HEADER. /// Status = RowDecimalValue ( SocketFD, pPort, "Hdr.HeaderSize", pHeader->HeaderSize ); if ( EFI_ERROR ( Status )) { break; } /// /// The 32-bit CRC for the entire table. This value is computed by /// setting this field to 0, and computing the 32-bit CRC for HeaderSize bytes. /// Status = RowHexValue ( SocketFD, pPort, "Hdr.CRC", pHeader->CRC32, NULL ); if ( EFI_ERROR ( Status )) { break; } /// /// Reserved field that must be set to 0. /// Status = RowHexValue ( SocketFD, pPort, "Hdr.Reserved", pHeader->Reserved, NULL ); break; } // // Return the operation status // DBG_EXIT_STATUS ( Status ); return Status; } /** Display a row containing a decimal 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] Value The value to display @retval EFI_SUCCESS The request was successfully processed **/ EFI_STATUS RowDecimalValue ( IN int SocketFD, IN WSDT_PORT * pPort, IN CONST CHAR8 * pName, IN UINT64 Value ) { EFI_STATUS Status; DBG_ENTER ( ); // // Use for/break instead of goto // for ( ; ; ) { Status = HttpSendAnsiString ( SocketFD, pPort, "" ); if ( EFI_ERROR ( Status )) { break; } Status = HttpSendAnsiString ( SocketFD, pPort, pName ); if ( EFI_ERROR ( Status )) { break; } Status = HttpSendAnsiString ( SocketFD, pPort, "" ); if ( EFI_ERROR ( Status )) { break; } Status = HttpSendValue ( SocketFD, pPort, Value ); if ( EFI_ERROR ( Status )) { break; } Status = HttpSendAnsiString ( SocketFD, pPort, "\r\n" ); break; } // // Return the operation status // DBG_EXIT_STATUS ( Status ); return Status; } /** 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] Value The value to display @param [in] pWebPage Address of a zero terminated web page name @retval EFI_SUCCESS The request was successfully processed **/ EFI_STATUS RowHexValue ( IN int SocketFD, IN WSDT_PORT * pPort, IN CONST CHAR8 * pName, IN UINT64 Value, IN CONST CHAR16 * pWebPage ) { EFI_STATUS Status; DBG_ENTER ( ); // // Use for/break instead of goto // for ( ; ; ) { Status = HttpSendAnsiString ( SocketFD, pPort, "" ); if ( EFI_ERROR ( Status )) { break; } Status = HttpSendAnsiString ( SocketFD, pPort, pName ); if ( EFI_ERROR ( Status )) { break; } Status = HttpSendAnsiString ( SocketFD, pPort, "0x" ); if ( EFI_ERROR ( Status )) { break; } if ( NULL != pWebPage ) { Status = HttpSendAnsiString ( SocketFD, pPort, "" ); if ( EFI_ERROR ( Status )) { break; } } Status = HttpSendHexValue ( SocketFD, pPort, Value ); if ( EFI_ERROR ( Status )) { break; } if ( NULL != pWebPage ) { Status = HttpSendAnsiString ( SocketFD, pPort, "" ); if ( EFI_ERROR ( Status )) { break; } } Status = HttpSendAnsiString ( SocketFD, pPort, "\r\n" ); break; } // // Return the operation status // DBG_EXIT_STATUS ( Status ); return Status; } /** Display a row containing a pointer @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] pAddress The address to display @param [in] pWebPage Address of a zero terminated web page name @retval EFI_SUCCESS The request was successfully processed **/ EFI_STATUS RowPointer ( IN int SocketFD, IN WSDT_PORT * pPort, IN CONST CHAR8 * pName, IN CONST VOID * pAddress, IN CONST CHAR16 * pWebPage ) { EFI_STATUS Status; DBG_ENTER ( ); // // Use for/break instead of goto // for ( ; ; ) { Status = HttpSendAnsiString ( SocketFD, pPort, "" ); if ( EFI_ERROR ( Status )) { break; } Status = HttpSendAnsiString ( SocketFD, pPort, pName ); if ( EFI_ERROR ( Status )) { break; } Status = HttpSendAnsiString ( SocketFD, pPort, "" ); if ( EFI_ERROR ( Status )) { break; } if ( NULL != pWebPage ) { Status = HttpSendAnsiString ( SocketFD, pPort, "" ); if ( EFI_ERROR ( Status )) { break; } } Status = HttpSendAnsiString ( SocketFD, pPort, "0x" ); if ( EFI_ERROR ( Status )) { break; } Status = HttpSendHexBits ( SocketFD, pPort, sizeof ( pAddress ) * 8, (UINT64)(UINTN)pAddress ); if ( EFI_ERROR ( Status )) { break; } if ( NULL != pWebPage ) { Status = HttpSendAnsiString ( SocketFD, pPort, "" ); if ( EFI_ERROR ( Status )) { break; } } Status = HttpSendAnsiString ( SocketFD, pPort, "\r\n" ); break; } // // Return the operation status // DBG_EXIT_STATUS ( Status ); return Status; } /** Display a row containing a revision @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] Revision The revision to display @retval EFI_SUCCESS The request was successfully processed **/ EFI_STATUS RowRevision ( IN int SocketFD, IN WSDT_PORT * pPort, IN CONST CHAR8 * pName, IN UINT32 Revision ) { EFI_STATUS Status; DBG_ENTER ( ); // // Use for/break instead of goto // for ( ; ; ) { Status = HttpSendAnsiString ( SocketFD, pPort, "" ); if ( EFI_ERROR ( Status )) { break; } Status = HttpSendAnsiString ( SocketFD, pPort, pName ); if ( EFI_ERROR ( Status )) { break; } Status = HttpSendAnsiString ( SocketFD, pPort, "" ); if ( EFI_ERROR ( Status )) { break; } Status = HttpSendValue ( SocketFD, pPort, Revision >> 16 ); if ( EFI_ERROR ( Status )) { break; } Status = HttpSendByte ( SocketFD, pPort, '.' ); if ( EFI_ERROR ( Status )) { break; } Status = HttpSendValue ( SocketFD, pPort, Revision & 0xFFFF ); if ( EFI_ERROR ( Status )) { break; } Status = HttpSendAnsiString ( SocketFD, pPort, "\r\n" ); break; } // // Return the operation status // DBG_EXIT_STATUS ( Status ); return Status; } /** Display a row containing a unicode string @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] pString Address of a zero terminated unicode string @retval EFI_SUCCESS The request was successfully processed **/ EFI_STATUS RowUnicodeString ( IN int SocketFD, IN WSDT_PORT * pPort, IN CONST CHAR8 * pName, IN CONST CHAR16 * pString ) { EFI_STATUS Status; DBG_ENTER ( ); // // Use for/break instead of goto // for ( ; ; ) { Status = HttpSendAnsiString ( SocketFD, pPort, "" ); if ( EFI_ERROR ( Status )) { break; } Status = HttpSendAnsiString ( SocketFD, pPort, pName ); if ( EFI_ERROR ( Status )) { break; } Status = HttpSendAnsiString ( SocketFD, pPort, "" ); if ( EFI_ERROR ( Status )) { break; } Status = HttpSendUnicodeString ( SocketFD, pPort, pString ); if ( EFI_ERROR ( Status )) { break; } Status = HttpSendAnsiString ( SocketFD, pPort, "\r\n" ); break; } // // Return the operation status // DBG_EXIT_STATUS ( Status ); return Status; } /** Start the table page @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] pTable Address of the table @retval EFI_SUCCESS The request was successfully processed **/ EFI_STATUS TableHeader ( IN int SocketFD, IN WSDT_PORT * pPort, IN CONST CHAR16 * pName, IN CONST VOID * pTable ) { EFI_STATUS Status; DBG_ENTER ( ); // // Use for/break instead of goto // for ( ; ; ) { // // Send the page header // Status = HttpPageHeader ( SocketFD, pPort, pName ); if ( EFI_ERROR ( Status )) { break; } // // Build the table header // Status = HttpSendAnsiString ( SocketFD, pPort, "

" ); if ( EFI_ERROR ( Status )) { break; } Status = HttpSendUnicodeString ( SocketFD, pPort, pName ); if ( EFI_ERROR ( Status )) { break; } if ( NULL != pTable ) { Status = HttpSendAnsiString ( SocketFD, pPort, ": 0x" ); if ( EFI_ERROR ( Status )) { break; } Status = HttpSendHexBits ( SocketFD, pPort, sizeof ( pTable ) * 8, (UINT64)(UINTN)pTable ); if ( EFI_ERROR ( Status )) { break; } } Status = HttpSendAnsiString ( SocketFD, pPort, "

\r\n" "\r\n" " \r\n" ); break; } // // Return the operation status // DBG_EXIT_STATUS ( Status ); return Status; } /** End the table page @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 TableTrailer ( IN int SocketFD, IN WSDT_PORT * pPort, OUT BOOLEAN *pbDone ) { EFI_STATUS Status; DBG_ENTER ( ); // // Use for/break instead of goto // for ( ; ; ) { // // Build the table trailer // Status = HttpSendAnsiString ( SocketFD, pPort, "
Field NameValue
\r\n" ); if ( EFI_ERROR ( Status )) { break; } // // Send the page trailer // Status = HttpPageTrailer ( SocketFD, pPort, pbDone ); break; } // // Return the operation status // DBG_EXIT_STATUS ( Status ); return Status; } /** Respond with the system 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 SystemTablePage ( IN int SocketFD, IN WSDT_PORT * pPort, OUT BOOLEAN * pbDone ) { EFI_STATUS Status; DBG_ENTER ( ); // // Send the system table page // for ( ; ; ) { // // Send the page and table header // Status = TableHeader ( SocketFD, pPort, L"System Table", gST ); if ( EFI_ERROR ( Status )) { break; } /// /// The table header for the EFI System Table. /// Status = EfiTableHeader ( SocketFD, pPort, &gST->Hdr ); if ( EFI_ERROR ( Status )) { break; } /// /// A pointer to a null terminated string that identifies the vendor /// that produces the system firmware for the platform. /// Status = RowUnicodeString ( SocketFD, pPort, "FirmwareVendor", gST->FirmwareVendor ); if ( EFI_ERROR ( Status )) { break; } /// /// A firmware vendor specific value that identifies the revision /// of the system firmware for the platform. /// Status = RowRevision ( SocketFD, pPort, "FirmwareRevision", gST->FirmwareRevision ); if ( EFI_ERROR ( Status )) { break; } /// /// The handle for the active console input device. This handle must support /// EFI_SIMPLE_TEXT_INPUT_PROTOCOL and EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL. /// Status = RowPointer ( SocketFD, pPort, "ConsoleInHandle", (VOID *)gST->ConsoleInHandle, NULL ); if ( EFI_ERROR ( Status )) { break; } /// /// A pointer to the EFI_SIMPLE_TEXT_INPUT_PROTOCOL interface that is /// associated with ConsoleInHandle. /// Status = RowPointer ( SocketFD, pPort, "ConIn", (VOID *)gST->ConIn, NULL ); if ( EFI_ERROR ( Status )) { break; } /// /// The handle for the active console output device. /// Status = RowPointer ( SocketFD, pPort, "ConsoleOutHandle", (VOID *)gST->ConsoleOutHandle, NULL ); if ( EFI_ERROR ( Status )) { break; } /// /// A pointer to the EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL interface /// that is associated with ConsoleOutHandle. /// Status = RowPointer ( SocketFD, pPort, "ConOut", (VOID *)gST->ConOut, NULL ); if ( EFI_ERROR ( Status )) { break; } /// /// The handle for the active standard error console device. /// This handle must support the EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL. /// Status = RowPointer ( SocketFD, pPort, "StandardErrorHandle", (VOID *)gST->StandardErrorHandle, NULL ); if ( EFI_ERROR ( Status )) { break; } /// /// A pointer to the EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL interface /// that is associated with StandardErrorHandle. /// Status = RowPointer ( SocketFD, pPort, "StdErr", (VOID *)gST->StdErr, NULL ); if ( EFI_ERROR ( Status )) { break; } /// /// A pointer to the EFI Runtime Services Table. /// Status = RowPointer ( SocketFD, pPort, "RuntimeServices", (VOID *)gST->RuntimeServices, PAGE_RUNTIME_SERVICES_TABLE ); /// /// A pointer to the EFI Boot Services Table. /// Status = RowPointer ( SocketFD, pPort, "BootServices", (VOID *)gST->BootServices, PAGE_BOOT_SERVICES_TABLE ); if ( EFI_ERROR ( Status )) { break; } /// /// The number of system configuration tables in the buffer ConfigurationTable. /// Status = RowDecimalValue ( SocketFD, pPort, "NumberOfTableEntries", gST->NumberOfTableEntries ); if ( EFI_ERROR ( Status )) { break; } /// /// A pointer to the system configuration tables. /// The number of entries in the table is NumberOfTableEntries. /// Status = RowPointer ( SocketFD, pPort, "ConfigurationTable", (VOID *)gST->ConfigurationTable, PAGE_CONFIGURATION_TABLE ); 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; }