4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Implementation of collecting the statistics on a network interface.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCopyright (c) 2004 - 2010, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncThis program and the accompanying materials are licensed
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncand made available under the terms and conditions of the BSD License which
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncaccompanies this distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynchttp://opensource.org/licenses/bsd-license.php
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "Snp.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Resets or collects the statistics on a network interface.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function resets or collects the statistics on a network interface. If the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync size of the statistics table specified by StatisticsSize is not big enough for
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync all the statistics that are collected by the network interface, then a partial
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync buffer of statistics is returned in StatisticsTable, StatisticsSize is set to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the size required to collect all the available statistics, and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_BUFFER_TOO_SMALL is returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If StatisticsSize is big enough for all the statistics, then StatisticsTable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync will be filled, StatisticsSize will be set to the size of the returned
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StatisticsTable structure, and EFI_SUCCESS is returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If the driver has not been initialized, EFI_DEVICE_ERROR will be returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Reset is FALSE, and both StatisticsSize and StatisticsTable are NULL, then
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync no operations will be performed, and EFI_SUCCESS will be returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Reset is TRUE, then all of the supported statistics counters on this network
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync interface will be reset to zero.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param This A pointer to the EFI_SIMPLE_NETWORK_PROTOCOL instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Reset Set to TRUE to reset the statistics for the network interface.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param StatisticsSize On input the size, in bytes, of StatisticsTable. On output
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the size, in bytes, of the resulting table of statistics.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param StatisticsTable A pointer to the EFI_NETWORK_STATISTICS structure that
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync contains the statistics. Type EFI_NETWORK_STATISTICS is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync defined in "Related Definitions" below.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The requested operation succeeded.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_STARTED The Simple Network Protocol interface has not been
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync started by calling Start().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_BUFFER_TOO_SMALL StatisticsSize is not NULL and StatisticsTable is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL. The current buffer size that is needed to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync hold all the statistics is returned in StatisticsSize.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_BUFFER_TOO_SMALL StatisticsSize is not NULL and StatisticsTable is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync not NULL. The current buffer size that is needed
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync to hold all the statistics is returned in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StatisticsSize. A partial set of statistics is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync returned in StatisticsTable.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER StatisticsSize is NULL and StatisticsTable is not
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR The Simple Network Protocol interface has not
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync been initialized by calling Initialize().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR An error was encountered collecting statistics
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync from the NIC.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED The NIC does not support collecting statistics
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync from the network interface.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSnpUndi32Statistics (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN BOOLEAN Reset,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINTN *StatisticsSize, OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT EFI_NETWORK_STATISTICS *StatisticsTable OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SNP_DRIVER *Snp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PXE_DB_STATISTICS *Db;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT64 *Stp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT64 Mask;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Size;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_TPL OldTpl;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get pointer to SNP driver instance for *This.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (This == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Snp = EFI_SIMPLE_NETWORK_DEV_FROM_THIS (This);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Return error if the SNP is not initialized.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (Snp->Mode.State) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EfiSimpleNetworkInitialized:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EfiSimpleNetworkStopped:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_NOT_STARTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto ON_EXIT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_DEVICE_ERROR;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto ON_EXIT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // if we are not resetting the counters, we have to have a valid stat table
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // with >0 size. if no reset, no table and no size, return success.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!Reset && StatisticsSize == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = (StatisticsTable != NULL) ? EFI_INVALID_PARAMETER : EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto ON_EXIT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Initialize UNDI Statistics CDB
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Snp->Cdb.OpCode = PXE_OPCODE_STATISTICS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Snp->Cdb.CPBsize = PXE_CPBSIZE_NOT_USED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Snp->Cdb.CPBaddr = PXE_CPBADDR_NOT_USED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Snp->Cdb.StatCode = PXE_STATCODE_INITIALIZE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Snp->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Snp->Cdb.IFnum = Snp->IfNum;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Snp->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Reset) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Snp->Cdb.OpFlags = PXE_OPFLAGS_STATISTICS_RESET;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Snp->Cdb.DBsize = PXE_DBSIZE_NOT_USED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Snp->Cdb.DBaddr = PXE_DBADDR_NOT_USED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Db = Snp->Db;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Snp->Cdb.OpFlags = PXE_OPFLAGS_STATISTICS_READ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Snp->Cdb.DBsize = (UINT16) sizeof (PXE_DB_STATISTICS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Snp->Cdb.DBaddr = (UINT64)(UINTN) (Db = Snp->Db);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Issue UNDI command and check result.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_NET, "\nsnp->undi.statistics() "));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (*Snp->IssueUndi32Command) ((UINT64)(UINTN) &Snp->Cdb);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (Snp->Cdb.StatCode) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case PXE_STATCODE_SUCCESS:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case PXE_STATCODE_UNSUPPORTED:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (EFI_D_ERROR,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "\nsnp->undi.statistics() %xh:%xh\n",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Snp->Cdb.StatFlags,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Snp->Cdb.StatCode)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_UNSUPPORTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto ON_EXIT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (EFI_D_ERROR,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "\nsnp->undi.statistics() %xh:%xh\n",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Snp->Cdb.StatFlags,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Snp->Cdb.StatCode)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_DEVICE_ERROR;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto ON_EXIT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Reset) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto ON_EXIT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StatisticsTable == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *StatisticsSize = sizeof (EFI_NETWORK_STATISTICS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_BUFFER_TOO_SMALL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto ON_EXIT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Convert the UNDI statistics information to SNP statistics
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // information.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (StatisticsTable, *StatisticsSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Stp = (UINT64 *) StatisticsTable;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0, Mask = 1; Index < 64; Index++, Mask = LShiftU64 (Mask, 1), Stp++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // There must be room for a full UINT64. Partial
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // numbers will not be stored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Index + 1) * sizeof (UINT64) > *StatisticsSize) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Db->Supported & Mask) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Stp = Db->Data[Index];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size = Index + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetMem (Stp, sizeof (UINT64), 0xFF);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Compute size up to last supported statistic.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (++Index < 64) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Db->Supported & (Mask = LShiftU64 (Mask, 1))) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size = Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size *= sizeof (UINT64);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*StatisticsSize >= Size) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *StatisticsSize = Size;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *StatisticsSize = Size;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_BUFFER_TOO_SMALL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncON_EXIT:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->RestoreTPL (OldTpl);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}