4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/*++
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This file contains an 'Intel UEFI Application' and is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync licensed for Intel CPUs and chipsets under the terms of your
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync license agreement with Intel or your vendor. This file may
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync be modified by the user, subject to additional terms of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync license agreement
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync--*/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/*++
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCopyright (c) 2011 Intel Corporation. All rights reserved
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncThis software and associated documentation (if any) is furnished
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncunder a license and may only be used or copied in accordance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncwith the terms of the license. Except as permitted by such
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynclicense, no part of this software or documentation may be
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncreproduced, stored in a retrieval system, or transmitted in any
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncform or by any means without the express written consent of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIntel Corporation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync--*/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Display the runtime services table
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <WebServer.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/UefiRuntimeServicesTableLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Respond with the runtime services table
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param [in] SocketFD The socket's file descriptor to add to the list.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param [in] pPort The WSDT_PORT structure address
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param [out] pbDone Address to receive the request completion status
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The request was successfully processed
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRuntimeSservicesTablePage (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN int SocketFD,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN WSDT_PORT * pPort,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT BOOLEAN * pbDone
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DBG_ENTER ( );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Send the runtime services page
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for ( ; ; ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Send the page and table header
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = TableHeader ( SocketFD, pPort, L"Runtime Services Table", gRT );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( EFI_ERROR ( Status )) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ///
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /// The table header for the EFI Runtime Services Table.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ///
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EfiTableHeader ( SocketFD,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pPort,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gRT->Hdr );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( EFI_ERROR ( Status )) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Time Services
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = RowPointer ( SocketFD,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pPort,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "GetTime",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID *)gRT->GetTime,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( EFI_ERROR ( Status )) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = RowPointer ( SocketFD,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pPort,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "SetTime",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID *)gRT->SetTime,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( EFI_ERROR ( Status )) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = RowPointer ( SocketFD,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pPort,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "GetWakeupTime",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID *)gRT->GetWakeupTime,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( EFI_ERROR ( Status )) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = RowPointer ( SocketFD,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pPort,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "SetWakeupTime",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID *)gRT->SetWakeupTime,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( EFI_ERROR ( Status )) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Virtual Memory Services
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = RowPointer ( SocketFD,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pPort,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "SetVirtualAddressMap",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID *)gRT->SetVirtualAddressMap,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( EFI_ERROR ( Status )) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = RowPointer ( SocketFD,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pPort,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "ConvertPointer",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID *)gRT->ConvertPointer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( EFI_ERROR ( Status )) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Variable Services
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = RowPointer ( SocketFD,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pPort,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "GetVariable",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID *)gRT->GetVariable,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( EFI_ERROR ( Status )) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = RowPointer ( SocketFD,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pPort,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "GetNextVariableName",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID *)gRT->GetNextVariableName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( EFI_ERROR ( Status )) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = RowPointer ( SocketFD,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pPort,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "SetVariable",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID *)gRT->SetVariable,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( EFI_ERROR ( Status )) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Miscellaneous Services
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = RowPointer ( SocketFD,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pPort,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "GetNextHighNonotonicCount",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID *)gRT->GetNextHighMonotonicCount,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( EFI_ERROR ( Status )) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = RowPointer ( SocketFD,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pPort,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "ResetSystem",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID *)gRT->ResetSystem,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( EFI_ERROR ( Status )) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Determine if the structures supports 2.0 services
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( 2 <= ( gRT->Hdr.Revision >> 16 )) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // UEFI 2.0 Capsule Services
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = RowPointer ( SocketFD,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pPort,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "UpdateCapsule",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID *)gRT->UpdateCapsule,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( EFI_ERROR ( Status )) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = RowPointer ( SocketFD,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pPort,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "QueryCapsuleCapabilities",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID *)gRT->QueryCapsuleCapabilities,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( EFI_ERROR ( Status )) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Miscellaneous UEFI 2.0 Service
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = RowPointer ( SocketFD,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pPort,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "QueryVariableInfo",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID *)gRT->QueryVariableInfo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( EFI_ERROR ( Status )) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Build the table trailer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = TableTrailer ( SocketFD,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pPort,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pbDone );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Return the operation status
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DBG_EXIT_STATUS ( Status );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}