summaryrefslogtreecommitdiff
path: root/AppPkg/Applications/Sockets/WebServer/SystemTable.c
diff options
context:
space:
mode:
Diffstat (limited to 'AppPkg/Applications/Sockets/WebServer/SystemTable.c')
-rw-r--r--AppPkg/Applications/Sockets/WebServer/SystemTable.c863
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;
+}