diff options
Diffstat (limited to 'AppPkg/Applications/Sockets/WebServer/SystemTable.c')
-rw-r--r-- | AppPkg/Applications/Sockets/WebServer/SystemTable.c | 863 |
1 files changed, 863 insertions, 0 deletions
diff --git a/AppPkg/Applications/Sockets/WebServer/SystemTable.c b/AppPkg/Applications/Sockets/WebServer/SystemTable.c new file mode 100644 index 0000000000..0d2a1f2040 --- /dev/null +++ b/AppPkg/Applications/Sockets/WebServer/SystemTable.c @@ -0,0 +1,863 @@ +/*++ + This file contains an 'Intel UEFI Application' and is + licensed for Intel CPUs and chipsets under the terms of your + license agreement with Intel or your vendor. This file may + be modified by the user, subject to additional terms of the + license agreement +--*/ +/*++ + +Copyright (c) 2011 Intel Corporation. All rights reserved +This software and associated documentation (if any) is furnished +under a license and may only be used or copied in accordance +with the terms of the license. Except as permitted by such +license, no part of this software or documentation may be +reproduced, stored in a retrieval system, or transmitted in any +form or by any means without the express written consent of +Intel Corporation. + +--*/ + +/** @file + Display the system table + +**/ + +#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) 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)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; +} |