4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If the Variable services have PcdVariableCollectStatistics set to TRUE then
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the EFI system table will contain statistical information about variable usage
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync an this utility will print out the information. You can use console redirection
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync to capture the data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Copyright (c) 2006 - 2007, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This program and the accompanying materials
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync are licensed and made available under the terms and conditions of the BSD License
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync which accompanies this distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync http://opensource.org/licenses/bsd-license.php
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Uefi.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/UefiLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/UefiApplicationEntryPoint.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Guid/VariableFormat.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The user Entry Point for Application. The user code starts with this function
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync as the real entry point for the image goes into a library that calls this
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync function.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ImageHandle The firmware allocated handle for the EFI image.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] SystemTable A pointer to the EFI System Table.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The entry point is executed successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval other Some error occurs when executing this entry point.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUefiMain (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE ImageHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_SYSTEM_TABLE *SystemTable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VARIABLE_INFO_ENTRY *VariableInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VARIABLE_INFO_ENTRY *Entry;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EfiGetSystemConfigurationTable (&gEfiVariableGuid, (VOID **)&Entry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status) && (Entry != NULL)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Print (L"Non-Volatile EFI Variables:\n");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VariableInfo = Entry;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync do {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!VariableInfo->Volatile) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Print (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"%g R%03d(%03d) W%03d D%03d:%s\n",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &VariableInfo->VendorGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VariableInfo->ReadCount,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VariableInfo->CacheCount,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VariableInfo->WriteCount,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VariableInfo->DeleteCount,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VariableInfo->Name
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VariableInfo = VariableInfo->Next;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } while (VariableInfo != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Print (L"Volatile EFI Variables:\n");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VariableInfo = Entry;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync do {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (VariableInfo->Volatile) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Print (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"%g R%03d(%03d) W%03d D%03d:%s\n",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &VariableInfo->VendorGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VariableInfo->ReadCount,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VariableInfo->CacheCount,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VariableInfo->WriteCount,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VariableInfo->DeleteCount,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VariableInfo->Name
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VariableInfo = VariableInfo->Next;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } while (VariableInfo != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Print (L"Warning: Variable Dxe driver doesn't enable the feature of statistical information!\n");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Print (L"If you want to see this info, please:\n");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Print (L" 1. Set PcdVariableCollectStatistics as TRUE\n");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Print (L" 2. Rebuild Variable Dxe driver\n");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Print (L" 3. Run \"VariableInfo\" cmd again\n");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}