+++ /dev/null
-/**
- @file
- Display the system table
-
- Copyright (c) 2011-2012, Intel Corporation. All rights reserved.
- SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include <WebServer.h>
-
-
-/**
- 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,
- "<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;
- }
- Status = HttpSendValue ( SocketFD,
- pPort,
- Value );
- if ( EFI_ERROR ( Status )) {
- break;
- }
- Status = HttpSendAnsiString ( SocketFD,
- pPort,
- "</code></td></tr>\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,
- "<tr><td>" );
- if ( EFI_ERROR ( Status )) {
- break;
- }
- Status = HttpSendAnsiString ( SocketFD,
- pPort,
- pName );
- if ( EFI_ERROR ( Status )) {
- break;
- }
- Status = HttpSendAnsiString ( SocketFD,
- pPort,
- "</td><td><code>0x" );
- if ( EFI_ERROR ( Status )) {
- break;
- }
- 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;
- }
- }
- Status = HttpSendHexValue ( SocketFD,
- pPort,
- Value );
- if ( EFI_ERROR ( Status )) {
- break;
- }
- if ( NULL != pWebPage ) {
- Status = HttpSendAnsiString ( SocketFD,
- pPort,
- "</a>" );
- if ( EFI_ERROR ( Status )) {
- break;
- }
- }
- Status = HttpSendAnsiString ( SocketFD,
- pPort,
- "</code></td></tr>\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,
- "<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;
- }
- 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;
- }
- }
- 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,
- "</a>" );
- if ( EFI_ERROR ( Status )) {
- break;
- }
- }
- Status = HttpSendAnsiString ( SocketFD,
- pPort,
- "</code></td></tr>\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,
- "<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;
- }
- 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,
- "</code></td></tr>\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,
- "<tr><td>" );
- if ( EFI_ERROR ( Status )) {
- break;
- }
- Status = HttpSendAnsiString ( SocketFD,
- pPort,
- pName );
- if ( EFI_ERROR ( Status )) {
- break;
- }
- Status = HttpSendAnsiString ( SocketFD,
- pPort,
- "</td><td>" );
- if ( EFI_ERROR ( Status )) {
- break;
- }
- Status = HttpSendUnicodeString ( SocketFD,
- pPort,
- pString );
- if ( EFI_ERROR ( Status )) {
- break;
- }
- Status = HttpSendAnsiString ( SocketFD,
- pPort,
- "</td></tr>\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,
- "<h1>" );
- 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,
- "</h1>\r\n"
- "<table border=\"1\">\r\n"
- " <tr bgcolor=\"c0c0ff\"><th>Field Name</th><th>Value</th></tr>\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,
- "</table>\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;
-}