Files
system76-edk2/AppPkg/Applications/Sockets/WebServer/SystemTable.c
2019-04-09 10:58:32 -07:00

848 lines
22 KiB
C

/**
@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;
}