audk/AppPkg/Applications/Sockets/WebServer/ConfigurationTable.c

365 lines
9.5 KiB
C

/**
@file
Display the configuration table
Copyright (c) 2011-2012, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include <WebServer.h>
#include <Guid/Acpi.h>
#include <Guid/DebugImageInfoTable.h>
#include <Guid/DxeServices.h>
#include <Guid/HobList.h>
#include <Guid/MemoryTypeInformation.h>
#include <Guid/LoadModuleAtFixedAddress.h>
typedef struct {
CHAR16 * GuidName;
EFI_GUID * pGuid;
CHAR16 * pWebPage;
} GUID_NAME;
CONST GUID_NAME mGuidName[] = {
{ L"gEfiAcpi10TableGuid", &gEfiAcpi10TableGuid, PAGE_ACPI_RSDP_10B },
{ L"gEfiAcpiTableGuid", &gEfiAcpiTableGuid, PAGE_ACPI_RSDP_30 },
{ L"gEfiDebugImageInfoTableGuid", &gEfiDebugImageInfoTableGuid, NULL },
{ L"gEfiDxeServicesTableGuid", &gEfiDxeServicesTableGuid, PAGE_DXE_SERVICES_TABLE },
{ L"gEfiHobListGuid", &gEfiHobListGuid, NULL },
{ L"gEfiMemoryTypeInformationGuid", &gEfiMemoryTypeInformationGuid, NULL },
{ L"gLoadFixedAddressConfigurationTableGuid", &gLoadFixedAddressConfigurationTableGuid, NULL }
};
/**
Display a row containing a GUID 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] pGuid Address of the GUID to display
@retval EFI_SUCCESS The request was successfully processed
**/
EFI_STATUS
RowGuid (
IN int SocketFD,
IN WSDT_PORT * pPort,
IN CONST CHAR8 * pName,
IN CONST EFI_GUID * pGuid
)
{
CONST GUID_NAME * pGuidName;
CONST GUID_NAME * pGuidNameEnd;
EFI_STATUS Status;
UINTN Value;
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;
}
//
// Determine if this is a known GUID
//
pGuidName = &mGuidName[0];
pGuidNameEnd = &pGuidName[ sizeof ( mGuidName ) / sizeof ( mGuidName[0])];
while ( pGuidNameEnd > pGuidName ) {
if ( CompareGuid ( pGuidName->pGuid, pGuid )) {
//
// Display the web link if available
//
if ( NULL != pGuidName->pWebPage ) {
Status = HttpSendAnsiString ( SocketFD,
pPort,
"<a target=\"_blank\" href=\"" );
if ( EFI_ERROR ( Status )) {
break;
}
Status = HttpSendUnicodeString ( SocketFD,
pPort,
pGuidName->pWebPage );
if ( EFI_ERROR ( Status )) {
break;
}
Status = HttpSendAnsiString ( SocketFD,
pPort,
"\">" );
if ( EFI_ERROR ( Status )) {
break;
}
}
//
// Display the GUID name
//
Status = HttpSendUnicodeString ( SocketFD,
pPort,
pGuidName->GuidName );
//
// Complete the web link if available
//
if ( NULL != pGuidName->pWebPage ) {
if ( EFI_ERROR ( Status )) {
break;
}
Status = HttpSendAnsiString ( SocketFD,
pPort,
"</a>" );
}
break;
}
//
// Set the next GUID name
//
pGuidName += 1;
}
if ( EFI_ERROR ( Status )) {
break;
}
//
// Only if the entry is not known, display the GUID and type
//
if ( pGuidNameEnd <= pGuidName ) {
//
// Display the GUID
//
Status = HttpSendGuid ( SocketFD,
pPort,
pGuid );
if ( EFI_ERROR ( Status )) {
break;
}
//
// Display the GUID type
//
Status = HttpSendAnsiString ( SocketFD,
pPort,
"<br/><a target=\"_blank\" href=\"http://www.ietf.org/rfc/rfc4122.txt\">Guid Type</a>: " );
if ( EFI_ERROR ( Status )) {
break;
}
Value = pGuid->Data4[1];
Value >>= 5;
if ( 3 >= Value ) {
//
// Network type
//
Status = HttpSendAnsiString ( SocketFD,
pPort,
"Network " );
}
else if ( 5 >= Value ) {
//
// Standard type
//
Status = HttpSendAnsiString ( SocketFD,
pPort,
"Standard " );
if ( EFI_ERROR ( Status )) {
break;
}
//
// Decode the standard type using RFC 4122
//
Value = pGuid->Data3;
Value >>= 12;
switch ( Value ) {
default:
//
// Display the MAC address
//
Status = HttpSendAnsiString ( SocketFD,
pPort,
"Version " );
if ( EFI_ERROR ( Status )) {
break;
}
Status = HttpSendValue ( SocketFD,
pPort,
pGuid->Data3 >> 12 );
break;
case 1:
Status = HttpSendAnsiString ( SocketFD,
pPort,
"MAC address" );
break;
case 2:
Status = HttpSendAnsiString ( SocketFD,
pPort,
"DCE Security" );
break;
case 3:
Status = HttpSendAnsiString ( SocketFD,
pPort,
"MD5 hash" );
break;
case 4:
Status = HttpSendAnsiString ( SocketFD,
pPort,
"Random" );
break;
case 5:
Status = HttpSendAnsiString ( SocketFD,
pPort,
"SHA-1 hash" );
break;
}
}
else if ( 6 == Value ) {
//
// Microsoft's Component Object Model (COM) type
//
Status = HttpSendAnsiString ( SocketFD,
pPort,
"Microsoft COM" );
}
else {
//
// Reserved type
//
Status = HttpSendAnsiString ( SocketFD,
pPort,
"Reserved" );
}
}
//
// Done with this entry
//
Status = HttpSendAnsiString ( SocketFD,
pPort,
"</code></td></tr>\r\n" );
break;
}
//
// Return the operation status
//
DBG_EXIT_STATUS ( Status );
return Status;
}
/**
Respond with the configuration tables
@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
ConfigurationTablePage (
IN int SocketFD,
IN WSDT_PORT * pPort,
OUT BOOLEAN * pbDone
)
{
EFI_CONFIGURATION_TABLE * pEnd;
EFI_CONFIGURATION_TABLE * pTable;
EFI_STATUS Status;
DBG_ENTER ( );
//
// Send the system table page
//
for ( ; ; ) {
//
// Send the page and table header
//
Status = TableHeader ( SocketFD, pPort, L"Configuration Tables", gST );
if ( EFI_ERROR ( Status )) {
break;
}
//
// Display the table size
//
Status = RowDecimalValue ( SocketFD,
pPort,
"Entries",
gST->NumberOfTableEntries );
if ( EFI_ERROR ( Status )) {
break;
}
//
// Determine the location of the configuration tables
//
pTable = gST->ConfigurationTable;
pEnd = &pTable[ gST->NumberOfTableEntries ];
while ( pEnd > pTable ) {
Status = RowGuid ( SocketFD,
pPort,
"VendorGuid",
&pTable->VendorGuid );
if ( EFI_ERROR ( Status )) {
break;
}
Status = RowPointer ( SocketFD,
pPort,
"VendorTable",
(VOID *)pTable->VendorTable,
NULL );
if ( EFI_ERROR ( Status )) {
break;
}
//
// Set the next row
//
pTable += 1;
}
//
// Build the table trailer
//
Status = TableTrailer ( SocketFD,
pPort,
pbDone );
break;
}
//
// Return the operation status
//
DBG_EXIT_STATUS ( Status );
return Status;
}