summaryrefslogtreecommitdiff
path: root/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/SmbiosView.c
diff options
context:
space:
mode:
authorkx <kx@radix.pro>2024-06-04 06:43:08 +0300
committerkx <kx@radix.pro>2024-06-04 06:43:08 +0300
commit7e2ccccace24636f29ddc210b94606abd4c7e42b (patch)
tree545d43ea12671048956cafeb12303e84d601e571 /ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/SmbiosView.c
parent27b044605cd5f6b33a3d231576003850b3fe305b (diff)
downloadedk2-trunk.tar.xz
Renormalized end-of-lines from master@27b044605cd5f6b33a3d231576003850b3fe305btrunk
Diffstat (limited to 'ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/SmbiosView.c')
-rw-r--r--ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/SmbiosView.c2050
1 files changed, 1025 insertions, 1025 deletions
diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/SmbiosView.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/SmbiosView.c
index 7e7eef3fd8..edd33653a1 100644
--- a/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/SmbiosView.c
+++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/SmbiosView.c
@@ -1,1025 +1,1025 @@
-/** @file
- Tools of clarify the content of the smbios table.
-
- (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>
- Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR>
- Copyright (c) 2023 Apple Inc. All rights reserved.<BR>
- SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include "UefiShellDebug1CommandsLib.h"
-#include "LibSmbiosView.h"
-#include "SmbiosView.h"
-#include "PrintInfo.h"
-#include "QueryTable.h"
-
-UINT8 gShowType = SHOW_DETAIL;
-STATIC STRUCTURE_STATISTICS *mStatisticsTable = NULL;
-STATIC STRUCTURE_STATISTICS *mSmbios64BitStatisticsTable = NULL;
-
-UINT8 SmbiosMajorVersion;
-UINT8 SmbiosMinorVersion;
-
-UINTN mNumberOfSmbios64BitStructures;
-UINTN mSmbios64BitTableLength;
-
-STATIC CONST SHELL_PARAM_ITEM ParamList[] = {
- { L"-t", TypeValue },
- { L"-h", TypeValue },
- { L"-s", TypeFlag },
- { L"-a", TypeFlag },
- { NULL, TypeMax }
-};
-
-/**
- Function for 'smbiosview' command.
-
- @param[in] ImageHandle Handle to the Image (NULL if Internal).
- @param[in] SystemTable Pointer to the System Table (NULL if Internal).
-**/
-SHELL_STATUS
-EFIAPI
-ShellCommandRunSmbiosView (
- IN EFI_HANDLE ImageHandle,
- IN EFI_SYSTEM_TABLE *SystemTable
- )
-{
- UINT8 StructType;
- UINT16 StructHandle;
- EFI_STATUS Status;
- EFI_STATUS Status1;
- EFI_STATUS Status2;
- BOOLEAN RandomView;
- LIST_ENTRY *Package;
- CHAR16 *ProblemParam;
- SHELL_STATUS ShellStatus;
- CONST CHAR16 *Temp;
-
- mStatisticsTable = NULL;
- mSmbios64BitStatisticsTable = NULL;
- Package = NULL;
- ShellStatus = SHELL_SUCCESS;
-
- Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);
- if (EFI_ERROR (Status)) {
- if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"smbiosview", ProblemParam);
- FreePool (ProblemParam);
- ShellStatus = SHELL_INVALID_PARAMETER;
- } else {
- ASSERT (FALSE);
- }
- } else {
- if (ShellCommandLineGetCount (Package) > 1) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"smbiosview");
- ShellStatus = SHELL_INVALID_PARAMETER;
- } else if (ShellCommandLineGetFlag (Package, L"-t") && (ShellCommandLineGetValue (Package, L"-t") == NULL)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDebug1HiiHandle, L"smbiosview", L"-t");
- ShellStatus = SHELL_INVALID_PARAMETER;
- } else if (ShellCommandLineGetFlag (Package, L"-h") && (ShellCommandLineGetValue (Package, L"-h") == NULL)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDebug1HiiHandle, L"smbiosview", L"-h");
- ShellStatus = SHELL_INVALID_PARAMETER;
- } else if (
- (ShellCommandLineGetFlag (Package, L"-t") && ShellCommandLineGetFlag (Package, L"-h")) ||
- (ShellCommandLineGetFlag (Package, L"-t") && ShellCommandLineGetFlag (Package, L"-s")) ||
- (ShellCommandLineGetFlag (Package, L"-t") && ShellCommandLineGetFlag (Package, L"-a")) ||
- (ShellCommandLineGetFlag (Package, L"-h") && ShellCommandLineGetFlag (Package, L"-s")) ||
- (ShellCommandLineGetFlag (Package, L"-h") && ShellCommandLineGetFlag (Package, L"-a")) ||
- (ShellCommandLineGetFlag (Package, L"-s") && ShellCommandLineGetFlag (Package, L"-a"))
- )
- {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"smbiosview");
- ShellStatus = SHELL_INVALID_PARAMETER;
- } else {
- //
- // Init Lib
- //
- Status1 = LibSmbiosInit ();
- Status2 = LibSmbios64BitInit ();
- if (EFI_ERROR (Status1) && EFI_ERROR (Status2)) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_LIBSMBIOSVIEW_CANNOT_GET_TABLE), gShellDebug1HiiHandle);
- ShellStatus = SHELL_NOT_FOUND;
- goto Done;
- }
-
- StructType = STRUCTURE_TYPE_RANDOM;
- RandomView = TRUE;
-
- Temp = ShellCommandLineGetValue (Package, L"-t");
- if (Temp != NULL) {
- StructType = (UINT8)ShellStrToUintn (Temp);
- }
-
- if (ShellCommandLineGetFlag (Package, L"-a")) {
- gShowType = SHOW_ALL;
- }
-
- if (!EFI_ERROR (Status1)) {
- //
- // Initialize the StructHandle to be the first handle
- //
- StructHandle = INVALID_HANDLE;
- LibGetSmbiosStructure (&StructHandle, NULL, NULL);
-
- Temp = ShellCommandLineGetValue (Package, L"-h");
- if (Temp != NULL) {
- RandomView = FALSE;
- StructHandle = (UINT16)ShellStrToUintn (Temp);
- }
-
- //
- // build statistics table
- //
- Status = InitSmbiosTableStatistics ();
- if (EFI_ERROR (Status)) {
- ShellStatus = SHELL_NOT_FOUND;
- goto Done;
- }
-
- if (ShellCommandLineGetFlag (Package, L"-s")) {
- Status = DisplayStatisticsTable (SHOW_DETAIL);
- if (EFI_ERROR (Status)) {
- ShellStatus = SHELL_NOT_FOUND;
- }
-
- goto Show64Bit;
- }
-
- //
- // Show SMBIOS structure information
- //
- Status = SMBiosView (StructType, StructHandle, gShowType, RandomView);
- if (EFI_ERROR (Status)) {
- ShellStatus = SHELL_NOT_FOUND;
- goto Done;
- }
- }
-
-Show64Bit:
- if (!EFI_ERROR (Status2)) {
- //
- // build statistics table
- //
- Status = InitSmbios64BitTableStatistics ();
- if (EFI_ERROR (Status)) {
- ShellStatus = SHELL_NOT_FOUND;
- goto Done;
- }
-
- //
- // Initialize the StructHandle to be the first handle
- //
- StructHandle = INVALID_HANDLE;
- LibGetSmbios64BitStructure (&StructHandle, NULL, NULL);
-
- Temp = ShellCommandLineGetValue (Package, L"-h");
- if (Temp != NULL) {
- RandomView = FALSE;
- StructHandle = (UINT16)ShellStrToUintn (Temp);
- }
-
- if (ShellCommandLineGetFlag (Package, L"-s")) {
- Status = DisplaySmbios64BitStatisticsTable (SHOW_DETAIL);
- if (EFI_ERROR (Status)) {
- ShellStatus = SHELL_NOT_FOUND;
- }
-
- goto Done;
- }
-
- //
- // Show SMBIOS structure information
- //
- Status = SMBios64View (StructType, StructHandle, gShowType, RandomView);
- if (EFI_ERROR (Status)) {
- ShellStatus = SHELL_NOT_FOUND;
- }
- }
- }
- }
-
-Done:
- //
- // Release resources
- //
- if (mStatisticsTable != NULL) {
- //
- // Release statistics table
- //
- FreePool (mStatisticsTable);
- mStatisticsTable = NULL;
- }
-
- if (mSmbios64BitStatisticsTable != NULL) {
- //
- // Release statistics table
- //
- FreePool (mSmbios64BitStatisticsTable);
- mSmbios64BitStatisticsTable = NULL;
- }
-
- if (Package != NULL) {
- ShellCommandLineFreeVarList (Package);
- }
-
- LibSmbiosCleanup ();
- LibSmbios64BitCleanup ();
-
- return ShellStatus;
-}
-
-/**
- Query all structures Data from SMBIOS table and Display
- the information to users as required display option.
-
- @param[in] QueryType Structure type to view.
- @param[in] QueryHandle Structure handle to view.
- @param[in] Option Display option: none,outline,normal,detail.
- @param[in] RandomView Support for -h parameter.
-
- @retval EFI_SUCCESS print is successful.
- @retval EFI_BAD_BUFFER_SIZE structure is out of the range of SMBIOS table.
-**/
-EFI_STATUS
-SMBiosView (
- IN UINT8 QueryType,
- IN UINT16 QueryHandle,
- IN UINT8 Option,
- IN BOOLEAN RandomView
- )
-{
- UINT16 Handle;
- UINT8 *Buffer;
- UINT16 Length;
- UINTN Index;
-
- SMBIOS_STRUCTURE_POINTER SmbiosStruct;
- SMBIOS_TABLE_ENTRY_POINT *SMBiosTable;
-
- SMBiosTable = NULL;
- LibSmbiosGetEPS (&SMBiosTable);
- if (SMBiosTable == NULL) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_TABLE), gShellDebug1HiiHandle);
- return EFI_BAD_BUFFER_SIZE;
- }
-
- if (CompareMem (SMBiosTable->AnchorString, SMBIOS_ANCHOR_STRING, SMBIOS_ANCHOR_STRING_LENGTH) == 0) {
- //
- // Have got SMBIOS table
- //
- SmbiosPrintEPSInfo (SMBiosTable, Option);
-
- SmbiosMajorVersion = SMBiosTable->MajorVersion;
- SmbiosMinorVersion = SMBiosTable->MinorVersion;
-
- ShellPrintEx (-1, -1, L"=========================================================\n");
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERY_STRUCT_COND), gShellDebug1HiiHandle);
-
- if (QueryType == STRUCTURE_TYPE_RANDOM) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYTYPE_RANDOM), gShellDebug1HiiHandle);
- } else {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYTYPE), gShellDebug1HiiHandle, QueryType);
- }
-
- if (RandomView) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYHANDLE_RANDOM), gShellDebug1HiiHandle);
- } else {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYHANDLE), gShellDebug1HiiHandle, QueryHandle);
- }
-
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_SHOWTYPE), gShellDebug1HiiHandle);
- ShellPrintEx (-1, -1, GetShowTypeString (gShowType));
- ShellPrintEx (-1, -1, L"\n\n");
-
- /*
- //
- // Get internal commands, such as change options.
- //
- Status = WaitEnter ();
- if (EFI_ERROR (Status)) {
- if (Status == EFI_ABORTED) {
- return EFI_SUCCESS;
- }
-
- return Status;
- }
- */
-
- //
- // Searching and display structure info
- //
- Handle = QueryHandle;
- for (Index = 0; Index < SMBiosTable->NumberOfSmbiosStructures; Index++) {
- //
- // if reach the end of table, break..
- //
- if (Handle == INVALID_HANDLE) {
- break;
- }
-
- //
- // handle then point to the next!
- //
- if (LibGetSmbiosStructure (&Handle, &Buffer, &Length) != DMI_SUCCESS) {
- break;
- }
-
- SmbiosStruct.Raw = Buffer;
-
- //
- // if QueryType==Random, print this structure.
- // if QueryType!=Random, but Hdr->Type==QueryType, also print it.
- // only if QueryType != Random and Hdr->Type != QueryType, skiped it.
- //
- if ((QueryType != STRUCTURE_TYPE_RANDOM) && (SmbiosStruct.Hdr->Type != QueryType)) {
- continue;
- }
-
- ShellPrintEx (-1, -1, L"\n=========================================================\n");
- ShellPrintHiiEx (
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_TYPE_HANDLE_DUMP_STRUCT),
- gShellDebug1HiiHandle,
- SmbiosStruct.Hdr->Type,
- SmbiosStruct.Hdr->Handle
- );
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_INDEX_LENGTH), gShellDebug1HiiHandle, Index, Length);
- //
- // Addr of structure in structure in table
- //
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_ADDR), gShellDebug1HiiHandle, (UINTN)Buffer);
- DumpHex (0, 0, Length, Buffer);
-
- /*
- //
- // Get internal commands, such as change options.
- //
- Status = WaitEnter ();
- if (EFI_ERROR (Status)) {
- if (Status == EFI_ABORTED) {
- return EFI_SUCCESS;
- }
-
- return Status;
- }
- */
-
- if (gShowType != SHOW_NONE) {
- //
- // Print structure information
- //
- SmbiosPrintStructure (&SmbiosStruct, gShowType);
- ShellPrintEx (-1, -1, L"\n");
-
- /*
- //
- // Get internal commands, such as change options.
- //
- Status = WaitEnter ();
- if (EFI_ERROR (Status)) {
- if (Status == EFI_ABORTED) {
- return EFI_SUCCESS;
- }
-
- return Status;
- }
- */
- }
-
- if (!RandomView) {
- break;
- }
-
- //
- // Support Execution Interrupt.
- //
- if (ShellGetExecutionBreakFlag ()) {
- return EFI_ABORTED;
- }
- }
-
- ShellPrintEx (-1, -1, L"\n=========================================================\n");
- return EFI_SUCCESS;
- }
-
- return EFI_BAD_BUFFER_SIZE;
-}
-
-/**
- Query all structures Data from SMBIOS table and Display
- the information to users as required display option.
-
- @param[in] QueryType Structure type to view.
- @param[in] QueryHandle Structure handle to view.
- @param[in] Option Display option: none,outline,normal,detail.
- @param[in] RandomView Support for -h parameter.
-
- @retval EFI_SUCCESS print is successful.
- @retval EFI_BAD_BUFFER_SIZE structure is out of the range of SMBIOS table.
-**/
-EFI_STATUS
-SMBios64View (
- IN UINT8 QueryType,
- IN UINT16 QueryHandle,
- IN UINT8 Option,
- IN BOOLEAN RandomView
- )
-{
- UINT16 Handle;
- UINT8 *Buffer;
- UINT16 Length;
- UINTN Index;
- SMBIOS_STRUCTURE_POINTER SmbiosStruct;
- SMBIOS_TABLE_3_0_ENTRY_POINT *SMBiosTable;
-
- SMBiosTable = NULL;
- LibSmbios64BitGetEPS (&SMBiosTable);
- if (SMBiosTable == NULL) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_TABLE), gShellDebug1HiiHandle);
- return EFI_BAD_BUFFER_SIZE;
- }
-
- if (CompareMem (SMBiosTable->AnchorString, SMBIOS_3_0_ANCHOR_STRING, SMBIOS_3_0_ANCHOR_STRING_LENGTH) == 0) {
- //
- // Have got SMBIOS table
- //
- Smbios64BitPrintEPSInfo (SMBiosTable, Option);
-
- SmbiosMajorVersion = SMBiosTable->MajorVersion;
- SmbiosMinorVersion = SMBiosTable->MinorVersion;
-
- ShellPrintEx (-1, -1, L"=========================================================\n");
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERY_STRUCT_COND), gShellDebug1HiiHandle);
-
- if (QueryType == STRUCTURE_TYPE_RANDOM) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYTYPE_RANDOM), gShellDebug1HiiHandle);
- } else {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYTYPE), gShellDebug1HiiHandle, QueryType);
- }
-
- if (RandomView) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYHANDLE_RANDOM), gShellDebug1HiiHandle);
- } else {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYHANDLE), gShellDebug1HiiHandle, QueryHandle);
- }
-
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_SHOWTYPE), gShellDebug1HiiHandle);
- ShellPrintEx (-1, -1, GetShowTypeString (gShowType));
- ShellPrintEx (-1, -1, L"\n\n");
-
- /*
- //
- // Get internal commands, such as change options.
- //
- Status = WaitEnter ();
- if (EFI_ERROR (Status)) {
- if (Status == EFI_ABORTED) {
- return EFI_SUCCESS;
- }
-
- return Status;
- }
- */
-
- //
- // Searching and display structure info
- //
- Handle = QueryHandle;
- for (Index = 0; Index < mNumberOfSmbios64BitStructures; Index++) {
- //
- // if reach the end of table, break..
- //
- if (Handle == INVALID_HANDLE) {
- break;
- }
-
- //
- // handle then point to the next!
- //
- if (LibGetSmbios64BitStructure (&Handle, &Buffer, &Length) != DMI_SUCCESS) {
- break;
- }
-
- SmbiosStruct.Raw = Buffer;
-
- //
- // if QueryType==Random, print this structure.
- // if QueryType!=Random, but Hdr->Type==QueryType, also print it.
- // only if QueryType != Random and Hdr->Type != QueryType, skiped it.
- //
- if ((QueryType != STRUCTURE_TYPE_RANDOM) && (SmbiosStruct.Hdr->Type != QueryType)) {
- continue;
- }
-
- ShellPrintEx (-1, -1, L"\n=========================================================\n");
- ShellPrintHiiEx (
- -1,
- -1,
- NULL,
- STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_TYPE_HANDLE_DUMP_STRUCT),
- gShellDebug1HiiHandle,
- SmbiosStruct.Hdr->Type,
- SmbiosStruct.Hdr->Handle
- );
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_INDEX_LENGTH), gShellDebug1HiiHandle, Index, Length);
- //
- // Addr of structure in structure in table
- //
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_ADDR), gShellDebug1HiiHandle, (UINTN)Buffer);
- DumpHex (0, 0, Length, Buffer);
-
- /*
- //
- // Get internal commands, such as change options.
- //
- Status = WaitEnter ();
- if (EFI_ERROR (Status)) {
- if (Status == EFI_ABORTED) {
- return EFI_SUCCESS;
- }
-
- return Status;
- }
- */
-
- if (gShowType != SHOW_NONE) {
- //
- // Print structure information
- //
- SmbiosPrintStructure (&SmbiosStruct, gShowType);
- ShellPrintEx (-1, -1, L"\n");
-
- /*
- //
- // Get internal commands, such as change options.
- //
- Status = WaitEnter ();
- if (EFI_ERROR (Status)) {
- if (Status == EFI_ABORTED) {
- return EFI_SUCCESS;
- }
-
- return Status;
- }
- */
- }
-
- if (!RandomView) {
- break;
- }
-
- //
- // Support Execution Interrupt.
- //
- if (ShellGetExecutionBreakFlag ()) {
- return EFI_ABORTED;
- }
- }
-
- ShellPrintEx (-1, -1, L"\n=========================================================\n");
- return EFI_SUCCESS;
- }
-
- return EFI_BAD_BUFFER_SIZE;
-}
-
-/**
- Function to initialize the global mStatisticsTable object.
-
- @retval EFI_SUCCESS print is successful.
-**/
-EFI_STATUS
-InitSmbiosTableStatistics (
- VOID
- )
-{
- UINT16 Handle;
- UINT8 *Buffer;
- UINT16 Length;
- UINT16 Offset;
- UINT16 Index;
-
- SMBIOS_STRUCTURE_POINTER SmbiosStruct;
- SMBIOS_TABLE_ENTRY_POINT *SMBiosTable;
- STRUCTURE_STATISTICS *StatisticsPointer;
-
- SMBiosTable = NULL;
- LibSmbiosGetEPS (&SMBiosTable);
- if (SMBiosTable == NULL) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_TABLE), gShellDebug1HiiHandle);
- return EFI_NOT_FOUND;
- }
-
- if (CompareMem (SMBiosTable->AnchorString, SMBIOS_ANCHOR_STRING, SMBIOS_ANCHOR_STRING_LENGTH) != 0) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_SMBIOS_TABLE), gShellDebug1HiiHandle);
- return EFI_INVALID_PARAMETER;
- }
-
- //
- // Allocate memory to mStatisticsTable
- //
- if (mStatisticsTable != NULL) {
- FreePool (mStatisticsTable);
- mStatisticsTable = NULL;
- }
-
- mStatisticsTable = (STRUCTURE_STATISTICS *)AllocateZeroPool (SMBiosTable->NumberOfSmbiosStructures * sizeof (STRUCTURE_STATISTICS));
-
- if (mStatisticsTable == NULL) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_OUT_OF_MEM), gShellDebug1HiiHandle);
- return EFI_OUT_OF_RESOURCES;
- }
-
- Offset = 0;
- StatisticsPointer = mStatisticsTable;
-
- //
- // search from the first one
- //
- Handle = INVALID_HANDLE;
- LibGetSmbiosStructure (&Handle, NULL, NULL);
- for (Index = 1; Index <= SMBiosTable->NumberOfSmbiosStructures; Index++) {
- //
- // If reach the end of table, break..
- //
- if (Handle == INVALID_HANDLE) {
- break;
- }
-
- //
- // After LibGetSmbiosStructure(), handle then point to the next!
- //
- if (LibGetSmbiosStructure (&Handle, &Buffer, &Length) != DMI_SUCCESS) {
- break;
- }
-
- SmbiosStruct.Raw = Buffer;
-
- //
- // general statistics
- //
- StatisticsPointer->Index = Index;
- StatisticsPointer->Type = SmbiosStruct.Hdr->Type;
- StatisticsPointer->Handle = SmbiosStruct.Hdr->Handle;
- StatisticsPointer->Length = Length;
- StatisticsPointer->Addr = Offset;
-
- Offset = (UINT16)(Offset + Length);
-
- StatisticsPointer = &mStatisticsTable[Index];
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- @param[in] Smbios64EntryPoint SMBIOS 64-bit entry point.
- @param[out] NumberOfSmbios64Structures The number of structures in 64-bit SMBIOS table.
- @param[out] Smbios64TableLength The total length of 64-bit SMBIOS table.
-
- @retval EFI_SUCCESS Calculation was successful.
-**/
-EFI_STATUS
-CalculateSmbios64BitStructureCountAndLength (
- SMBIOS_TABLE_3_0_ENTRY_POINT *Smbios64EntryPoint,
- UINTN *NumberOfSmbios64Structures,
- UINTN *Smbios64TableLength
- )
-{
- SMBIOS_STRUCTURE_POINTER Smbios;
- UINT8 *Raw;
-
- *Smbios64TableLength = 0;
- *NumberOfSmbios64Structures = 0;
-
- Smbios.Raw = (UINT8 *)(UINTN)(Smbios64EntryPoint->TableAddress);
- while (TRUE) {
- if (Smbios.Hdr->Type == 127) {
- //
- // Reach the end of table type 127
- //
- (*NumberOfSmbios64Structures)++;
- (*Smbios64TableLength) += sizeof (SMBIOS_STRUCTURE);
- return EFI_SUCCESS;
- }
-
- Raw = Smbios.Raw;
- //
- // Walk to next structure
- //
- LibGetSmbiosString (&Smbios, (UINT16)(-1));
- //
- // Length = Next structure head - this structure head
- //
- (*Smbios64TableLength) += ((UINTN)Smbios.Raw - (UINTN)Raw);
- if ((*Smbios64TableLength) > Smbios64EntryPoint->TableMaximumSize) {
- //
- // The actual table length exceeds maximum table size,
- // There should be something wrong with SMBIOS table.
- //
- return EFI_INVALID_PARAMETER;
- }
-
- (*NumberOfSmbios64Structures)++;
- }
-}
-
-/**
- Function to initialize the global mSmbios64BitStatisticsTable object.
-
- @retval EFI_SUCCESS print is successful.
-**/
-EFI_STATUS
-InitSmbios64BitTableStatistics (
- VOID
- )
-{
- UINT16 Handle;
- UINT8 *Buffer;
- UINT16 Length;
- UINT16 Offset;
- UINT16 Index;
- EFI_STATUS Status;
- SMBIOS_STRUCTURE_POINTER SmbiosStruct;
- SMBIOS_TABLE_3_0_ENTRY_POINT *SMBiosTable;
- STRUCTURE_STATISTICS *StatisticsPointer;
-
- SMBiosTable = NULL;
- LibSmbios64BitGetEPS (&SMBiosTable);
- if (SMBiosTable == NULL) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_TABLE), gShellDebug1HiiHandle);
- return EFI_NOT_FOUND;
- }
-
- if (CompareMem (SMBiosTable->AnchorString, SMBIOS_3_0_ANCHOR_STRING, SMBIOS_3_0_ANCHOR_STRING_LENGTH) != 0) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_SMBIOS_TABLE), gShellDebug1HiiHandle);
- return EFI_INVALID_PARAMETER;
- }
-
- //
- // Allocate memory to mSmbios64BitStatisticsTable
- //
- if (mSmbios64BitStatisticsTable != NULL) {
- FreePool (mSmbios64BitStatisticsTable);
- mSmbios64BitStatisticsTable = NULL;
- }
-
- //
- // Calculate number of smbios structures
- //
- Status = CalculateSmbios64BitStructureCountAndLength (SMBiosTable, &mNumberOfSmbios64BitStructures, &mSmbios64BitTableLength);
- if ((EFI_ERROR (Status)) || (mSmbios64BitTableLength > SMBiosTable->TableMaximumSize)) {
- return EFI_INVALID_PARAMETER;
- }
-
- mSmbios64BitStatisticsTable = (STRUCTURE_STATISTICS *)AllocateZeroPool (mNumberOfSmbios64BitStructures * sizeof (STRUCTURE_STATISTICS));
-
- if (mSmbios64BitStatisticsTable == NULL) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_OUT_OF_MEM), gShellDebug1HiiHandle);
- return EFI_OUT_OF_RESOURCES;
- }
-
- Offset = 0;
- StatisticsPointer = mSmbios64BitStatisticsTable;
-
- //
- // search from the first one
- //
- Handle = INVALID_HANDLE;
- LibGetSmbios64BitStructure (&Handle, NULL, NULL);
- for (Index = 1; Index <= mNumberOfSmbios64BitStructures; Index++) {
- //
- // If reach the end of table, break..
- //
- if (Handle == INVALID_HANDLE) {
- break;
- }
-
- //
- // After LibGetSmbios64BitStructure(), handle then point to the next!
- //
- if (LibGetSmbios64BitStructure (&Handle, &Buffer, &Length) != DMI_SUCCESS) {
- break;
- }
-
- SmbiosStruct.Raw = Buffer;
-
- //
- // general statistics
- //
- StatisticsPointer->Index = Index;
- StatisticsPointer->Type = SmbiosStruct.Hdr->Type;
- StatisticsPointer->Handle = SmbiosStruct.Hdr->Handle;
- StatisticsPointer->Length = Length;
- StatisticsPointer->Addr = Offset;
-
- Offset = (UINT16)(Offset + Length);
-
- StatisticsPointer = &mSmbios64BitStatisticsTable[Index];
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Function to display the global mStatisticsTable object.
-
- @param[in] Option ECHO, NORMAL, or DETAIL control the amount of detail displayed.
-
- @retval EFI_SUCCESS print is successful.
-**/
-EFI_STATUS
-DisplayStatisticsTable (
- IN UINT8 Option
- )
-{
- UINTN Index;
- UINTN Num;
- STRUCTURE_STATISTICS *StatisticsPointer;
- SMBIOS_TABLE_ENTRY_POINT *SMBiosTable;
-
- SMBiosTable = NULL;
- if (Option < SHOW_OUTLINE) {
- return EFI_SUCCESS;
- }
-
- //
- // display EPS information firstly
- //
- LibSmbiosGetEPS (&SMBiosTable);
- if (SMBiosTable == NULL) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_TABLE), gShellDebug1HiiHandle);
- return EFI_UNSUPPORTED;
- }
-
- ShellPrintEx (-1, -1, L"\n============================================================\n");
- SmbiosPrintEPSInfo (SMBiosTable, Option);
-
- if (Option < SHOW_NORMAL) {
- return EFI_SUCCESS;
- }
-
- if (mStatisticsTable == NULL) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_STATS), gShellDebug1HiiHandle);
- return EFI_NOT_FOUND;
- }
-
- ShellPrintEx (-1, -1, L"============================================================\n");
- StatisticsPointer = &mStatisticsTable[0];
- Num = SMBiosTable->NumberOfSmbiosStructures;
- //
- // display statistics table content
- //
- for (Index = 1; Index <= Num; Index++) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_INDEX), gShellDebug1HiiHandle, StatisticsPointer->Index);
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_TYPE), gShellDebug1HiiHandle, StatisticsPointer->Type);
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_HANDLE), gShellDebug1HiiHandle, StatisticsPointer->Handle);
- if (Option >= SHOW_DETAIL) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_OFFSET), gShellDebug1HiiHandle, StatisticsPointer->Addr);
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_LENGTH), gShellDebug1HiiHandle, StatisticsPointer->Length);
- }
-
- ShellPrintEx (-1, -1, L"\n");
- StatisticsPointer = &mStatisticsTable[Index];
-
- /*
- //
- // Display 20 lines and wait for a page break
- //
- if (Index % 20 == 0) {
- ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_ENTER_CONTINUE), gShellDebug1HiiHandle);
- Status = WaitEnter ();
- if (EFI_ERROR (Status)) {
- if (Status == EFI_ABORTED) {
- return EFI_SUCCESS;
- }
-
- return Status;
- }
- }
- */
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Function to display the global mSmbios64BitStatisticsTable object.
-
- @param[in] Option ECHO, NORMAL, or DETAIL control the amount of detail displayed.
-
- @retval EFI_SUCCESS print is successful.
-**/
-EFI_STATUS
-DisplaySmbios64BitStatisticsTable (
- IN UINT8 Option
- )
-{
- UINTN Index;
- UINTN Num;
- STRUCTURE_STATISTICS *StatisticsPointer;
- SMBIOS_TABLE_3_0_ENTRY_POINT *SMBiosTable;
-
- SMBiosTable = NULL;
- if (Option < SHOW_OUTLINE) {
- return EFI_SUCCESS;
- }
-
- //
- // display EPS information firstly
- //
- LibSmbios64BitGetEPS (&SMBiosTable);
- if (SMBiosTable == NULL) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_TABLE), gShellDebug1HiiHandle);
- return EFI_UNSUPPORTED;
- }
-
- ShellPrintEx (-1, -1, L"\n============================================================\n");
- Smbios64BitPrintEPSInfo (SMBiosTable, Option);
-
- if (Option < SHOW_NORMAL) {
- return EFI_SUCCESS;
- }
-
- if (mSmbios64BitStatisticsTable == NULL) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_STATS), gShellDebug1HiiHandle);
- return EFI_NOT_FOUND;
- }
-
- ShellPrintEx (-1, -1, L"============================================================\n");
- StatisticsPointer = &mSmbios64BitStatisticsTable[0];
- Num = mNumberOfSmbios64BitStructures;
- //
- // display statistics table content
- //
- for (Index = 1; Index <= Num; Index++) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_INDEX), gShellDebug1HiiHandle, StatisticsPointer->Index);
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_TYPE), gShellDebug1HiiHandle, StatisticsPointer->Type);
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_HANDLE), gShellDebug1HiiHandle, StatisticsPointer->Handle);
- if (Option >= SHOW_DETAIL) {
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_OFFSET), gShellDebug1HiiHandle, StatisticsPointer->Addr);
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_LENGTH), gShellDebug1HiiHandle, StatisticsPointer->Length);
- }
-
- ShellPrintEx (-1, -1, L"\n");
- StatisticsPointer = &mSmbios64BitStatisticsTable[Index];
-
- /*
- //
- // Display 20 lines and wait for a page break
- //
- if (Index % 20 == 0) {
- ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_ENTER_CONTINUE), gShellDebug1HiiHandle);
- Status = WaitEnter ();
- if (EFI_ERROR (Status)) {
- if (Status == EFI_ABORTED) {
- return EFI_SUCCESS;
- }
-
- return Status;
- }
- }
- */
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- function to return a string of the detail level.
-
- @param[in] ShowType The detail level whose name is desired in clear text.
-
- @return A pointer to a string representing the ShowType (or 'undefined type' if not known).
-**/
-CHAR16 *
-GetShowTypeString (
- UINT8 ShowType
- )
-{
- //
- // show type
- //
- switch (ShowType) {
- case SHOW_NONE:
- return L"SHOW_NONE";
-
- case SHOW_OUTLINE:
- return L"SHOW_OUTLINE";
-
- case SHOW_NORMAL:
- return L"SHOW_NORMAL";
-
- case SHOW_DETAIL:
- return L"SHOW_DETAIL";
-
- case SHOW_ALL:
- return L"SHOW_ALL";
-
- default:
- return L"Undefined type";
- }
-}
+/** @file
+ Tools of clarify the content of the smbios table.
+
+ (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>
+ Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2023 Apple Inc. All rights reserved.<BR>
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include "UefiShellDebug1CommandsLib.h"
+#include "LibSmbiosView.h"
+#include "SmbiosView.h"
+#include "PrintInfo.h"
+#include "QueryTable.h"
+
+UINT8 gShowType = SHOW_DETAIL;
+STATIC STRUCTURE_STATISTICS *mStatisticsTable = NULL;
+STATIC STRUCTURE_STATISTICS *mSmbios64BitStatisticsTable = NULL;
+
+UINT8 SmbiosMajorVersion;
+UINT8 SmbiosMinorVersion;
+
+UINTN mNumberOfSmbios64BitStructures;
+UINTN mSmbios64BitTableLength;
+
+STATIC CONST SHELL_PARAM_ITEM ParamList[] = {
+ { L"-t", TypeValue },
+ { L"-h", TypeValue },
+ { L"-s", TypeFlag },
+ { L"-a", TypeFlag },
+ { NULL, TypeMax }
+};
+
+/**
+ Function for 'smbiosview' command.
+
+ @param[in] ImageHandle Handle to the Image (NULL if Internal).
+ @param[in] SystemTable Pointer to the System Table (NULL if Internal).
+**/
+SHELL_STATUS
+EFIAPI
+ShellCommandRunSmbiosView (
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_SYSTEM_TABLE *SystemTable
+ )
+{
+ UINT8 StructType;
+ UINT16 StructHandle;
+ EFI_STATUS Status;
+ EFI_STATUS Status1;
+ EFI_STATUS Status2;
+ BOOLEAN RandomView;
+ LIST_ENTRY *Package;
+ CHAR16 *ProblemParam;
+ SHELL_STATUS ShellStatus;
+ CONST CHAR16 *Temp;
+
+ mStatisticsTable = NULL;
+ mSmbios64BitStatisticsTable = NULL;
+ Package = NULL;
+ ShellStatus = SHELL_SUCCESS;
+
+ Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);
+ if (EFI_ERROR (Status)) {
+ if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"smbiosview", ProblemParam);
+ FreePool (ProblemParam);
+ ShellStatus = SHELL_INVALID_PARAMETER;
+ } else {
+ ASSERT (FALSE);
+ }
+ } else {
+ if (ShellCommandLineGetCount (Package) > 1) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"smbiosview");
+ ShellStatus = SHELL_INVALID_PARAMETER;
+ } else if (ShellCommandLineGetFlag (Package, L"-t") && (ShellCommandLineGetValue (Package, L"-t") == NULL)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDebug1HiiHandle, L"smbiosview", L"-t");
+ ShellStatus = SHELL_INVALID_PARAMETER;
+ } else if (ShellCommandLineGetFlag (Package, L"-h") && (ShellCommandLineGetValue (Package, L"-h") == NULL)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDebug1HiiHandle, L"smbiosview", L"-h");
+ ShellStatus = SHELL_INVALID_PARAMETER;
+ } else if (
+ (ShellCommandLineGetFlag (Package, L"-t") && ShellCommandLineGetFlag (Package, L"-h")) ||
+ (ShellCommandLineGetFlag (Package, L"-t") && ShellCommandLineGetFlag (Package, L"-s")) ||
+ (ShellCommandLineGetFlag (Package, L"-t") && ShellCommandLineGetFlag (Package, L"-a")) ||
+ (ShellCommandLineGetFlag (Package, L"-h") && ShellCommandLineGetFlag (Package, L"-s")) ||
+ (ShellCommandLineGetFlag (Package, L"-h") && ShellCommandLineGetFlag (Package, L"-a")) ||
+ (ShellCommandLineGetFlag (Package, L"-s") && ShellCommandLineGetFlag (Package, L"-a"))
+ )
+ {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"smbiosview");
+ ShellStatus = SHELL_INVALID_PARAMETER;
+ } else {
+ //
+ // Init Lib
+ //
+ Status1 = LibSmbiosInit ();
+ Status2 = LibSmbios64BitInit ();
+ if (EFI_ERROR (Status1) && EFI_ERROR (Status2)) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_LIBSMBIOSVIEW_CANNOT_GET_TABLE), gShellDebug1HiiHandle);
+ ShellStatus = SHELL_NOT_FOUND;
+ goto Done;
+ }
+
+ StructType = STRUCTURE_TYPE_RANDOM;
+ RandomView = TRUE;
+
+ Temp = ShellCommandLineGetValue (Package, L"-t");
+ if (Temp != NULL) {
+ StructType = (UINT8)ShellStrToUintn (Temp);
+ }
+
+ if (ShellCommandLineGetFlag (Package, L"-a")) {
+ gShowType = SHOW_ALL;
+ }
+
+ if (!EFI_ERROR (Status1)) {
+ //
+ // Initialize the StructHandle to be the first handle
+ //
+ StructHandle = INVALID_HANDLE;
+ LibGetSmbiosStructure (&StructHandle, NULL, NULL);
+
+ Temp = ShellCommandLineGetValue (Package, L"-h");
+ if (Temp != NULL) {
+ RandomView = FALSE;
+ StructHandle = (UINT16)ShellStrToUintn (Temp);
+ }
+
+ //
+ // build statistics table
+ //
+ Status = InitSmbiosTableStatistics ();
+ if (EFI_ERROR (Status)) {
+ ShellStatus = SHELL_NOT_FOUND;
+ goto Done;
+ }
+
+ if (ShellCommandLineGetFlag (Package, L"-s")) {
+ Status = DisplayStatisticsTable (SHOW_DETAIL);
+ if (EFI_ERROR (Status)) {
+ ShellStatus = SHELL_NOT_FOUND;
+ }
+
+ goto Show64Bit;
+ }
+
+ //
+ // Show SMBIOS structure information
+ //
+ Status = SMBiosView (StructType, StructHandle, gShowType, RandomView);
+ if (EFI_ERROR (Status)) {
+ ShellStatus = SHELL_NOT_FOUND;
+ goto Done;
+ }
+ }
+
+Show64Bit:
+ if (!EFI_ERROR (Status2)) {
+ //
+ // build statistics table
+ //
+ Status = InitSmbios64BitTableStatistics ();
+ if (EFI_ERROR (Status)) {
+ ShellStatus = SHELL_NOT_FOUND;
+ goto Done;
+ }
+
+ //
+ // Initialize the StructHandle to be the first handle
+ //
+ StructHandle = INVALID_HANDLE;
+ LibGetSmbios64BitStructure (&StructHandle, NULL, NULL);
+
+ Temp = ShellCommandLineGetValue (Package, L"-h");
+ if (Temp != NULL) {
+ RandomView = FALSE;
+ StructHandle = (UINT16)ShellStrToUintn (Temp);
+ }
+
+ if (ShellCommandLineGetFlag (Package, L"-s")) {
+ Status = DisplaySmbios64BitStatisticsTable (SHOW_DETAIL);
+ if (EFI_ERROR (Status)) {
+ ShellStatus = SHELL_NOT_FOUND;
+ }
+
+ goto Done;
+ }
+
+ //
+ // Show SMBIOS structure information
+ //
+ Status = SMBios64View (StructType, StructHandle, gShowType, RandomView);
+ if (EFI_ERROR (Status)) {
+ ShellStatus = SHELL_NOT_FOUND;
+ }
+ }
+ }
+ }
+
+Done:
+ //
+ // Release resources
+ //
+ if (mStatisticsTable != NULL) {
+ //
+ // Release statistics table
+ //
+ FreePool (mStatisticsTable);
+ mStatisticsTable = NULL;
+ }
+
+ if (mSmbios64BitStatisticsTable != NULL) {
+ //
+ // Release statistics table
+ //
+ FreePool (mSmbios64BitStatisticsTable);
+ mSmbios64BitStatisticsTable = NULL;
+ }
+
+ if (Package != NULL) {
+ ShellCommandLineFreeVarList (Package);
+ }
+
+ LibSmbiosCleanup ();
+ LibSmbios64BitCleanup ();
+
+ return ShellStatus;
+}
+
+/**
+ Query all structures Data from SMBIOS table and Display
+ the information to users as required display option.
+
+ @param[in] QueryType Structure type to view.
+ @param[in] QueryHandle Structure handle to view.
+ @param[in] Option Display option: none,outline,normal,detail.
+ @param[in] RandomView Support for -h parameter.
+
+ @retval EFI_SUCCESS print is successful.
+ @retval EFI_BAD_BUFFER_SIZE structure is out of the range of SMBIOS table.
+**/
+EFI_STATUS
+SMBiosView (
+ IN UINT8 QueryType,
+ IN UINT16 QueryHandle,
+ IN UINT8 Option,
+ IN BOOLEAN RandomView
+ )
+{
+ UINT16 Handle;
+ UINT8 *Buffer;
+ UINT16 Length;
+ UINTN Index;
+
+ SMBIOS_STRUCTURE_POINTER SmbiosStruct;
+ SMBIOS_TABLE_ENTRY_POINT *SMBiosTable;
+
+ SMBiosTable = NULL;
+ LibSmbiosGetEPS (&SMBiosTable);
+ if (SMBiosTable == NULL) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_TABLE), gShellDebug1HiiHandle);
+ return EFI_BAD_BUFFER_SIZE;
+ }
+
+ if (CompareMem (SMBiosTable->AnchorString, SMBIOS_ANCHOR_STRING, SMBIOS_ANCHOR_STRING_LENGTH) == 0) {
+ //
+ // Have got SMBIOS table
+ //
+ SmbiosPrintEPSInfo (SMBiosTable, Option);
+
+ SmbiosMajorVersion = SMBiosTable->MajorVersion;
+ SmbiosMinorVersion = SMBiosTable->MinorVersion;
+
+ ShellPrintEx (-1, -1, L"=========================================================\n");
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERY_STRUCT_COND), gShellDebug1HiiHandle);
+
+ if (QueryType == STRUCTURE_TYPE_RANDOM) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYTYPE_RANDOM), gShellDebug1HiiHandle);
+ } else {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYTYPE), gShellDebug1HiiHandle, QueryType);
+ }
+
+ if (RandomView) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYHANDLE_RANDOM), gShellDebug1HiiHandle);
+ } else {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYHANDLE), gShellDebug1HiiHandle, QueryHandle);
+ }
+
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_SHOWTYPE), gShellDebug1HiiHandle);
+ ShellPrintEx (-1, -1, GetShowTypeString (gShowType));
+ ShellPrintEx (-1, -1, L"\n\n");
+
+ /*
+ //
+ // Get internal commands, such as change options.
+ //
+ Status = WaitEnter ();
+ if (EFI_ERROR (Status)) {
+ if (Status == EFI_ABORTED) {
+ return EFI_SUCCESS;
+ }
+
+ return Status;
+ }
+ */
+
+ //
+ // Searching and display structure info
+ //
+ Handle = QueryHandle;
+ for (Index = 0; Index < SMBiosTable->NumberOfSmbiosStructures; Index++) {
+ //
+ // if reach the end of table, break..
+ //
+ if (Handle == INVALID_HANDLE) {
+ break;
+ }
+
+ //
+ // handle then point to the next!
+ //
+ if (LibGetSmbiosStructure (&Handle, &Buffer, &Length) != DMI_SUCCESS) {
+ break;
+ }
+
+ SmbiosStruct.Raw = Buffer;
+
+ //
+ // if QueryType==Random, print this structure.
+ // if QueryType!=Random, but Hdr->Type==QueryType, also print it.
+ // only if QueryType != Random and Hdr->Type != QueryType, skiped it.
+ //
+ if ((QueryType != STRUCTURE_TYPE_RANDOM) && (SmbiosStruct.Hdr->Type != QueryType)) {
+ continue;
+ }
+
+ ShellPrintEx (-1, -1, L"\n=========================================================\n");
+ ShellPrintHiiEx (
+ -1,
+ -1,
+ NULL,
+ STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_TYPE_HANDLE_DUMP_STRUCT),
+ gShellDebug1HiiHandle,
+ SmbiosStruct.Hdr->Type,
+ SmbiosStruct.Hdr->Handle
+ );
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_INDEX_LENGTH), gShellDebug1HiiHandle, Index, Length);
+ //
+ // Addr of structure in structure in table
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_ADDR), gShellDebug1HiiHandle, (UINTN)Buffer);
+ DumpHex (0, 0, Length, Buffer);
+
+ /*
+ //
+ // Get internal commands, such as change options.
+ //
+ Status = WaitEnter ();
+ if (EFI_ERROR (Status)) {
+ if (Status == EFI_ABORTED) {
+ return EFI_SUCCESS;
+ }
+
+ return Status;
+ }
+ */
+
+ if (gShowType != SHOW_NONE) {
+ //
+ // Print structure information
+ //
+ SmbiosPrintStructure (&SmbiosStruct, gShowType);
+ ShellPrintEx (-1, -1, L"\n");
+
+ /*
+ //
+ // Get internal commands, such as change options.
+ //
+ Status = WaitEnter ();
+ if (EFI_ERROR (Status)) {
+ if (Status == EFI_ABORTED) {
+ return EFI_SUCCESS;
+ }
+
+ return Status;
+ }
+ */
+ }
+
+ if (!RandomView) {
+ break;
+ }
+
+ //
+ // Support Execution Interrupt.
+ //
+ if (ShellGetExecutionBreakFlag ()) {
+ return EFI_ABORTED;
+ }
+ }
+
+ ShellPrintEx (-1, -1, L"\n=========================================================\n");
+ return EFI_SUCCESS;
+ }
+
+ return EFI_BAD_BUFFER_SIZE;
+}
+
+/**
+ Query all structures Data from SMBIOS table and Display
+ the information to users as required display option.
+
+ @param[in] QueryType Structure type to view.
+ @param[in] QueryHandle Structure handle to view.
+ @param[in] Option Display option: none,outline,normal,detail.
+ @param[in] RandomView Support for -h parameter.
+
+ @retval EFI_SUCCESS print is successful.
+ @retval EFI_BAD_BUFFER_SIZE structure is out of the range of SMBIOS table.
+**/
+EFI_STATUS
+SMBios64View (
+ IN UINT8 QueryType,
+ IN UINT16 QueryHandle,
+ IN UINT8 Option,
+ IN BOOLEAN RandomView
+ )
+{
+ UINT16 Handle;
+ UINT8 *Buffer;
+ UINT16 Length;
+ UINTN Index;
+ SMBIOS_STRUCTURE_POINTER SmbiosStruct;
+ SMBIOS_TABLE_3_0_ENTRY_POINT *SMBiosTable;
+
+ SMBiosTable = NULL;
+ LibSmbios64BitGetEPS (&SMBiosTable);
+ if (SMBiosTable == NULL) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_TABLE), gShellDebug1HiiHandle);
+ return EFI_BAD_BUFFER_SIZE;
+ }
+
+ if (CompareMem (SMBiosTable->AnchorString, SMBIOS_3_0_ANCHOR_STRING, SMBIOS_3_0_ANCHOR_STRING_LENGTH) == 0) {
+ //
+ // Have got SMBIOS table
+ //
+ Smbios64BitPrintEPSInfo (SMBiosTable, Option);
+
+ SmbiosMajorVersion = SMBiosTable->MajorVersion;
+ SmbiosMinorVersion = SMBiosTable->MinorVersion;
+
+ ShellPrintEx (-1, -1, L"=========================================================\n");
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERY_STRUCT_COND), gShellDebug1HiiHandle);
+
+ if (QueryType == STRUCTURE_TYPE_RANDOM) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYTYPE_RANDOM), gShellDebug1HiiHandle);
+ } else {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYTYPE), gShellDebug1HiiHandle, QueryType);
+ }
+
+ if (RandomView) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYHANDLE_RANDOM), gShellDebug1HiiHandle);
+ } else {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYHANDLE), gShellDebug1HiiHandle, QueryHandle);
+ }
+
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_SHOWTYPE), gShellDebug1HiiHandle);
+ ShellPrintEx (-1, -1, GetShowTypeString (gShowType));
+ ShellPrintEx (-1, -1, L"\n\n");
+
+ /*
+ //
+ // Get internal commands, such as change options.
+ //
+ Status = WaitEnter ();
+ if (EFI_ERROR (Status)) {
+ if (Status == EFI_ABORTED) {
+ return EFI_SUCCESS;
+ }
+
+ return Status;
+ }
+ */
+
+ //
+ // Searching and display structure info
+ //
+ Handle = QueryHandle;
+ for (Index = 0; Index < mNumberOfSmbios64BitStructures; Index++) {
+ //
+ // if reach the end of table, break..
+ //
+ if (Handle == INVALID_HANDLE) {
+ break;
+ }
+
+ //
+ // handle then point to the next!
+ //
+ if (LibGetSmbios64BitStructure (&Handle, &Buffer, &Length) != DMI_SUCCESS) {
+ break;
+ }
+
+ SmbiosStruct.Raw = Buffer;
+
+ //
+ // if QueryType==Random, print this structure.
+ // if QueryType!=Random, but Hdr->Type==QueryType, also print it.
+ // only if QueryType != Random and Hdr->Type != QueryType, skiped it.
+ //
+ if ((QueryType != STRUCTURE_TYPE_RANDOM) && (SmbiosStruct.Hdr->Type != QueryType)) {
+ continue;
+ }
+
+ ShellPrintEx (-1, -1, L"\n=========================================================\n");
+ ShellPrintHiiEx (
+ -1,
+ -1,
+ NULL,
+ STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_TYPE_HANDLE_DUMP_STRUCT),
+ gShellDebug1HiiHandle,
+ SmbiosStruct.Hdr->Type,
+ SmbiosStruct.Hdr->Handle
+ );
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_INDEX_LENGTH), gShellDebug1HiiHandle, Index, Length);
+ //
+ // Addr of structure in structure in table
+ //
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_ADDR), gShellDebug1HiiHandle, (UINTN)Buffer);
+ DumpHex (0, 0, Length, Buffer);
+
+ /*
+ //
+ // Get internal commands, such as change options.
+ //
+ Status = WaitEnter ();
+ if (EFI_ERROR (Status)) {
+ if (Status == EFI_ABORTED) {
+ return EFI_SUCCESS;
+ }
+
+ return Status;
+ }
+ */
+
+ if (gShowType != SHOW_NONE) {
+ //
+ // Print structure information
+ //
+ SmbiosPrintStructure (&SmbiosStruct, gShowType);
+ ShellPrintEx (-1, -1, L"\n");
+
+ /*
+ //
+ // Get internal commands, such as change options.
+ //
+ Status = WaitEnter ();
+ if (EFI_ERROR (Status)) {
+ if (Status == EFI_ABORTED) {
+ return EFI_SUCCESS;
+ }
+
+ return Status;
+ }
+ */
+ }
+
+ if (!RandomView) {
+ break;
+ }
+
+ //
+ // Support Execution Interrupt.
+ //
+ if (ShellGetExecutionBreakFlag ()) {
+ return EFI_ABORTED;
+ }
+ }
+
+ ShellPrintEx (-1, -1, L"\n=========================================================\n");
+ return EFI_SUCCESS;
+ }
+
+ return EFI_BAD_BUFFER_SIZE;
+}
+
+/**
+ Function to initialize the global mStatisticsTable object.
+
+ @retval EFI_SUCCESS print is successful.
+**/
+EFI_STATUS
+InitSmbiosTableStatistics (
+ VOID
+ )
+{
+ UINT16 Handle;
+ UINT8 *Buffer;
+ UINT16 Length;
+ UINT16 Offset;
+ UINT16 Index;
+
+ SMBIOS_STRUCTURE_POINTER SmbiosStruct;
+ SMBIOS_TABLE_ENTRY_POINT *SMBiosTable;
+ STRUCTURE_STATISTICS *StatisticsPointer;
+
+ SMBiosTable = NULL;
+ LibSmbiosGetEPS (&SMBiosTable);
+ if (SMBiosTable == NULL) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_TABLE), gShellDebug1HiiHandle);
+ return EFI_NOT_FOUND;
+ }
+
+ if (CompareMem (SMBiosTable->AnchorString, SMBIOS_ANCHOR_STRING, SMBIOS_ANCHOR_STRING_LENGTH) != 0) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_SMBIOS_TABLE), gShellDebug1HiiHandle);
+ return EFI_INVALID_PARAMETER;
+ }
+
+ //
+ // Allocate memory to mStatisticsTable
+ //
+ if (mStatisticsTable != NULL) {
+ FreePool (mStatisticsTable);
+ mStatisticsTable = NULL;
+ }
+
+ mStatisticsTable = (STRUCTURE_STATISTICS *)AllocateZeroPool (SMBiosTable->NumberOfSmbiosStructures * sizeof (STRUCTURE_STATISTICS));
+
+ if (mStatisticsTable == NULL) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_OUT_OF_MEM), gShellDebug1HiiHandle);
+ return EFI_OUT_OF_RESOURCES;
+ }
+
+ Offset = 0;
+ StatisticsPointer = mStatisticsTable;
+
+ //
+ // search from the first one
+ //
+ Handle = INVALID_HANDLE;
+ LibGetSmbiosStructure (&Handle, NULL, NULL);
+ for (Index = 1; Index <= SMBiosTable->NumberOfSmbiosStructures; Index++) {
+ //
+ // If reach the end of table, break..
+ //
+ if (Handle == INVALID_HANDLE) {
+ break;
+ }
+
+ //
+ // After LibGetSmbiosStructure(), handle then point to the next!
+ //
+ if (LibGetSmbiosStructure (&Handle, &Buffer, &Length) != DMI_SUCCESS) {
+ break;
+ }
+
+ SmbiosStruct.Raw = Buffer;
+
+ //
+ // general statistics
+ //
+ StatisticsPointer->Index = Index;
+ StatisticsPointer->Type = SmbiosStruct.Hdr->Type;
+ StatisticsPointer->Handle = SmbiosStruct.Hdr->Handle;
+ StatisticsPointer->Length = Length;
+ StatisticsPointer->Addr = Offset;
+
+ Offset = (UINT16)(Offset + Length);
+
+ StatisticsPointer = &mStatisticsTable[Index];
+ }
+
+ return EFI_SUCCESS;
+}
+
+/**
+ @param[in] Smbios64EntryPoint SMBIOS 64-bit entry point.
+ @param[out] NumberOfSmbios64Structures The number of structures in 64-bit SMBIOS table.
+ @param[out] Smbios64TableLength The total length of 64-bit SMBIOS table.
+
+ @retval EFI_SUCCESS Calculation was successful.
+**/
+EFI_STATUS
+CalculateSmbios64BitStructureCountAndLength (
+ SMBIOS_TABLE_3_0_ENTRY_POINT *Smbios64EntryPoint,
+ UINTN *NumberOfSmbios64Structures,
+ UINTN *Smbios64TableLength
+ )
+{
+ SMBIOS_STRUCTURE_POINTER Smbios;
+ UINT8 *Raw;
+
+ *Smbios64TableLength = 0;
+ *NumberOfSmbios64Structures = 0;
+
+ Smbios.Raw = (UINT8 *)(UINTN)(Smbios64EntryPoint->TableAddress);
+ while (TRUE) {
+ if (Smbios.Hdr->Type == 127) {
+ //
+ // Reach the end of table type 127
+ //
+ (*NumberOfSmbios64Structures)++;
+ (*Smbios64TableLength) += sizeof (SMBIOS_STRUCTURE);
+ return EFI_SUCCESS;
+ }
+
+ Raw = Smbios.Raw;
+ //
+ // Walk to next structure
+ //
+ LibGetSmbiosString (&Smbios, (UINT16)(-1));
+ //
+ // Length = Next structure head - this structure head
+ //
+ (*Smbios64TableLength) += ((UINTN)Smbios.Raw - (UINTN)Raw);
+ if ((*Smbios64TableLength) > Smbios64EntryPoint->TableMaximumSize) {
+ //
+ // The actual table length exceeds maximum table size,
+ // There should be something wrong with SMBIOS table.
+ //
+ return EFI_INVALID_PARAMETER;
+ }
+
+ (*NumberOfSmbios64Structures)++;
+ }
+}
+
+/**
+ Function to initialize the global mSmbios64BitStatisticsTable object.
+
+ @retval EFI_SUCCESS print is successful.
+**/
+EFI_STATUS
+InitSmbios64BitTableStatistics (
+ VOID
+ )
+{
+ UINT16 Handle;
+ UINT8 *Buffer;
+ UINT16 Length;
+ UINT16 Offset;
+ UINT16 Index;
+ EFI_STATUS Status;
+ SMBIOS_STRUCTURE_POINTER SmbiosStruct;
+ SMBIOS_TABLE_3_0_ENTRY_POINT *SMBiosTable;
+ STRUCTURE_STATISTICS *StatisticsPointer;
+
+ SMBiosTable = NULL;
+ LibSmbios64BitGetEPS (&SMBiosTable);
+ if (SMBiosTable == NULL) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_TABLE), gShellDebug1HiiHandle);
+ return EFI_NOT_FOUND;
+ }
+
+ if (CompareMem (SMBiosTable->AnchorString, SMBIOS_3_0_ANCHOR_STRING, SMBIOS_3_0_ANCHOR_STRING_LENGTH) != 0) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_SMBIOS_TABLE), gShellDebug1HiiHandle);
+ return EFI_INVALID_PARAMETER;
+ }
+
+ //
+ // Allocate memory to mSmbios64BitStatisticsTable
+ //
+ if (mSmbios64BitStatisticsTable != NULL) {
+ FreePool (mSmbios64BitStatisticsTable);
+ mSmbios64BitStatisticsTable = NULL;
+ }
+
+ //
+ // Calculate number of smbios structures
+ //
+ Status = CalculateSmbios64BitStructureCountAndLength (SMBiosTable, &mNumberOfSmbios64BitStructures, &mSmbios64BitTableLength);
+ if ((EFI_ERROR (Status)) || (mSmbios64BitTableLength > SMBiosTable->TableMaximumSize)) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ mSmbios64BitStatisticsTable = (STRUCTURE_STATISTICS *)AllocateZeroPool (mNumberOfSmbios64BitStructures * sizeof (STRUCTURE_STATISTICS));
+
+ if (mSmbios64BitStatisticsTable == NULL) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_OUT_OF_MEM), gShellDebug1HiiHandle);
+ return EFI_OUT_OF_RESOURCES;
+ }
+
+ Offset = 0;
+ StatisticsPointer = mSmbios64BitStatisticsTable;
+
+ //
+ // search from the first one
+ //
+ Handle = INVALID_HANDLE;
+ LibGetSmbios64BitStructure (&Handle, NULL, NULL);
+ for (Index = 1; Index <= mNumberOfSmbios64BitStructures; Index++) {
+ //
+ // If reach the end of table, break..
+ //
+ if (Handle == INVALID_HANDLE) {
+ break;
+ }
+
+ //
+ // After LibGetSmbios64BitStructure(), handle then point to the next!
+ //
+ if (LibGetSmbios64BitStructure (&Handle, &Buffer, &Length) != DMI_SUCCESS) {
+ break;
+ }
+
+ SmbiosStruct.Raw = Buffer;
+
+ //
+ // general statistics
+ //
+ StatisticsPointer->Index = Index;
+ StatisticsPointer->Type = SmbiosStruct.Hdr->Type;
+ StatisticsPointer->Handle = SmbiosStruct.Hdr->Handle;
+ StatisticsPointer->Length = Length;
+ StatisticsPointer->Addr = Offset;
+
+ Offset = (UINT16)(Offset + Length);
+
+ StatisticsPointer = &mSmbios64BitStatisticsTable[Index];
+ }
+
+ return EFI_SUCCESS;
+}
+
+/**
+ Function to display the global mStatisticsTable object.
+
+ @param[in] Option ECHO, NORMAL, or DETAIL control the amount of detail displayed.
+
+ @retval EFI_SUCCESS print is successful.
+**/
+EFI_STATUS
+DisplayStatisticsTable (
+ IN UINT8 Option
+ )
+{
+ UINTN Index;
+ UINTN Num;
+ STRUCTURE_STATISTICS *StatisticsPointer;
+ SMBIOS_TABLE_ENTRY_POINT *SMBiosTable;
+
+ SMBiosTable = NULL;
+ if (Option < SHOW_OUTLINE) {
+ return EFI_SUCCESS;
+ }
+
+ //
+ // display EPS information firstly
+ //
+ LibSmbiosGetEPS (&SMBiosTable);
+ if (SMBiosTable == NULL) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_TABLE), gShellDebug1HiiHandle);
+ return EFI_UNSUPPORTED;
+ }
+
+ ShellPrintEx (-1, -1, L"\n============================================================\n");
+ SmbiosPrintEPSInfo (SMBiosTable, Option);
+
+ if (Option < SHOW_NORMAL) {
+ return EFI_SUCCESS;
+ }
+
+ if (mStatisticsTable == NULL) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_STATS), gShellDebug1HiiHandle);
+ return EFI_NOT_FOUND;
+ }
+
+ ShellPrintEx (-1, -1, L"============================================================\n");
+ StatisticsPointer = &mStatisticsTable[0];
+ Num = SMBiosTable->NumberOfSmbiosStructures;
+ //
+ // display statistics table content
+ //
+ for (Index = 1; Index <= Num; Index++) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_INDEX), gShellDebug1HiiHandle, StatisticsPointer->Index);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_TYPE), gShellDebug1HiiHandle, StatisticsPointer->Type);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_HANDLE), gShellDebug1HiiHandle, StatisticsPointer->Handle);
+ if (Option >= SHOW_DETAIL) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_OFFSET), gShellDebug1HiiHandle, StatisticsPointer->Addr);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_LENGTH), gShellDebug1HiiHandle, StatisticsPointer->Length);
+ }
+
+ ShellPrintEx (-1, -1, L"\n");
+ StatisticsPointer = &mStatisticsTable[Index];
+
+ /*
+ //
+ // Display 20 lines and wait for a page break
+ //
+ if (Index % 20 == 0) {
+ ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_ENTER_CONTINUE), gShellDebug1HiiHandle);
+ Status = WaitEnter ();
+ if (EFI_ERROR (Status)) {
+ if (Status == EFI_ABORTED) {
+ return EFI_SUCCESS;
+ }
+
+ return Status;
+ }
+ }
+ */
+ }
+
+ return EFI_SUCCESS;
+}
+
+/**
+ Function to display the global mSmbios64BitStatisticsTable object.
+
+ @param[in] Option ECHO, NORMAL, or DETAIL control the amount of detail displayed.
+
+ @retval EFI_SUCCESS print is successful.
+**/
+EFI_STATUS
+DisplaySmbios64BitStatisticsTable (
+ IN UINT8 Option
+ )
+{
+ UINTN Index;
+ UINTN Num;
+ STRUCTURE_STATISTICS *StatisticsPointer;
+ SMBIOS_TABLE_3_0_ENTRY_POINT *SMBiosTable;
+
+ SMBiosTable = NULL;
+ if (Option < SHOW_OUTLINE) {
+ return EFI_SUCCESS;
+ }
+
+ //
+ // display EPS information firstly
+ //
+ LibSmbios64BitGetEPS (&SMBiosTable);
+ if (SMBiosTable == NULL) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_TABLE), gShellDebug1HiiHandle);
+ return EFI_UNSUPPORTED;
+ }
+
+ ShellPrintEx (-1, -1, L"\n============================================================\n");
+ Smbios64BitPrintEPSInfo (SMBiosTable, Option);
+
+ if (Option < SHOW_NORMAL) {
+ return EFI_SUCCESS;
+ }
+
+ if (mSmbios64BitStatisticsTable == NULL) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_STATS), gShellDebug1HiiHandle);
+ return EFI_NOT_FOUND;
+ }
+
+ ShellPrintEx (-1, -1, L"============================================================\n");
+ StatisticsPointer = &mSmbios64BitStatisticsTable[0];
+ Num = mNumberOfSmbios64BitStructures;
+ //
+ // display statistics table content
+ //
+ for (Index = 1; Index <= Num; Index++) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_INDEX), gShellDebug1HiiHandle, StatisticsPointer->Index);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_TYPE), gShellDebug1HiiHandle, StatisticsPointer->Type);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_HANDLE), gShellDebug1HiiHandle, StatisticsPointer->Handle);
+ if (Option >= SHOW_DETAIL) {
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_OFFSET), gShellDebug1HiiHandle, StatisticsPointer->Addr);
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_LENGTH), gShellDebug1HiiHandle, StatisticsPointer->Length);
+ }
+
+ ShellPrintEx (-1, -1, L"\n");
+ StatisticsPointer = &mSmbios64BitStatisticsTable[Index];
+
+ /*
+ //
+ // Display 20 lines and wait for a page break
+ //
+ if (Index % 20 == 0) {
+ ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_ENTER_CONTINUE), gShellDebug1HiiHandle);
+ Status = WaitEnter ();
+ if (EFI_ERROR (Status)) {
+ if (Status == EFI_ABORTED) {
+ return EFI_SUCCESS;
+ }
+
+ return Status;
+ }
+ }
+ */
+ }
+
+ return EFI_SUCCESS;
+}
+
+/**
+ function to return a string of the detail level.
+
+ @param[in] ShowType The detail level whose name is desired in clear text.
+
+ @return A pointer to a string representing the ShowType (or 'undefined type' if not known).
+**/
+CHAR16 *
+GetShowTypeString (
+ UINT8 ShowType
+ )
+{
+ //
+ // show type
+ //
+ switch (ShowType) {
+ case SHOW_NONE:
+ return L"SHOW_NONE";
+
+ case SHOW_OUTLINE:
+ return L"SHOW_OUTLINE";
+
+ case SHOW_NORMAL:
+ return L"SHOW_NORMAL";
+
+ case SHOW_DETAIL:
+ return L"SHOW_DETAIL";
+
+ case SHOW_ALL:
+ return L"SHOW_ALL";
+
+ default:
+ return L"Undefined type";
+ }
+}