]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/SmbiosView.c
ShellPkg: update smbiosview for SMBIOS 3.0.
[mirror_edk2.git] / ShellPkg / Library / UefiShellDebug1CommandsLib / SmbiosView / SmbiosView.c
index 8fabaa6e316d2a801fb950288b21f065f7195a01..a06339452a37b19853a2aaac9047decdc32bdd3c 100644 (file)
 \r
 UINT8                       gShowType         = SHOW_DETAIL;\r
 STATIC STRUCTURE_STATISTICS *mStatisticsTable = NULL;\r
+STATIC STRUCTURE_STATISTICS *mSmbios64BitStatisticsTable = NULL;\r
 \r
 UINT8  SmbiosMajorVersion;\r
 UINT8  SmbiosMinorVersion;\r
 \r
+UINTN  mNumberOfSmbios64BitStructures;\r
+UINTN  mSmbios64BitTableLength;\r
+\r
 STATIC CONST SHELL_PARAM_ITEM ParamList[] = {\r
   {L"-t", TypeValue},\r
   {L"-h", TypeValue},\r
@@ -49,15 +53,18 @@ ShellCommandRunSmbiosView (
   UINT8               StructType;\r
   UINT16              StructHandle;\r
   EFI_STATUS          Status;\r
+  EFI_STATUS          Status1;\r
+  EFI_STATUS          Status2;\r
   BOOLEAN             RandomView;\r
   LIST_ENTRY          *Package;\r
   CHAR16              *ProblemParam;\r
   SHELL_STATUS        ShellStatus;\r
   CONST CHAR16        *Temp;\r
 \r
-  mStatisticsTable    = NULL;\r
-  Package             = NULL;\r
-  ShellStatus         = SHELL_SUCCESS;\r
+  mStatisticsTable            = NULL;\r
+  mSmbios64BitStatisticsTable = NULL;\r
+  Package                     = NULL;\r
+  ShellStatus                 = SHELL_SUCCESS;\r
 \r
   Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
   if (EFI_ERROR(Status)) {\r
@@ -92,57 +99,103 @@ ShellCommandRunSmbiosView (
 \r
       //\r
       // Init Lib\r
-      \r
-      Status = LibSmbiosInit ();\r
-      if (EFI_ERROR (Status)) {\r
-        ShellStatus = SHELL_NOT_FOUND;\r
-        goto Done;\r
-      }\r
       //\r
-      // build statistics table\r
-      //\r
-      Status = InitSmbiosTableStatistics ();\r
-      if (EFI_ERROR (Status)) {\r
+      Status1 = LibSmbiosInit ();\r
+      Status2 = LibSmbios64BitInit ();\r
+      if (EFI_ERROR (Status1) && EFI_ERROR (Status2)) {\r
+       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_LIBSMBIOSVIEW_CANNOT_GET_TABLE), gShellDebug1HiiHandle);\r
         ShellStatus = SHELL_NOT_FOUND;\r
         goto Done;\r
       }\r
-\r
+      \r
       StructType    = STRUCTURE_TYPE_RANDOM;\r
       RandomView    = TRUE;\r
-      //\r
-      // Initialize the StructHandle to be the first handle\r
-      //\r
-      StructHandle  = INVALID_HANDLE;\r
-      LibGetSmbiosStructure (&StructHandle, NULL, NULL);\r
-\r
+      \r
       Temp          = ShellCommandLineGetValue(Package, L"-t");\r
       if (Temp != NULL) {\r
         StructType = (UINT8) ShellStrToUintn (Temp);\r
       }\r
-\r
-      Temp = ShellCommandLineGetValue(Package, L"-h");\r
-      if (Temp != NULL) {\r
-        RandomView   = FALSE;\r
-        StructHandle = (UINT16) ShellStrToUintn(Temp);\r
+      \r
+      if (ShellCommandLineGetFlag(Package, L"-a")) {\r
+        gShowType = SHOW_ALL;\r
       }\r
-\r
-      if (ShellCommandLineGetFlag(Package, L"-s")) {\r
-        Status = DisplayStatisticsTable (SHOW_DETAIL);\r
+      \r
+      if (!EFI_ERROR (Status1)) {\r
+        //\r
+        // Initialize the StructHandle to be the first handle\r
+        //\r
+        StructHandle  = INVALID_HANDLE;\r
+        LibGetSmbiosStructure (&StructHandle, NULL, NULL);\r
+        \r
+        Temp = ShellCommandLineGetValue(Package, L"-h");\r
+        if (Temp != NULL) {\r
+          RandomView   = FALSE;\r
+          StructHandle = (UINT16) ShellStrToUintn(Temp);\r
+        }\r
+        //\r
+        // build statistics table\r
+        //\r
+        Status = InitSmbiosTableStatistics ();\r
+        if (EFI_ERROR (Status)) {\r
+          ShellStatus = SHELL_NOT_FOUND;\r
+          goto Done;\r
+        }\r
+        \r
+        if (ShellCommandLineGetFlag(Package, L"-s")) {\r
+          Status = DisplayStatisticsTable (SHOW_DETAIL);\r
+          if (EFI_ERROR(Status)) {\r
+            ShellStatus = SHELL_NOT_FOUND;\r
+          }\r
+          goto Show64Bit;\r
+        }\r
+        \r
+        //\r
+        // Show SMBIOS structure information\r
+        //\r
+        Status = SMBiosView (StructType, StructHandle, gShowType, RandomView);\r
         if (EFI_ERROR(Status)) {\r
           ShellStatus = SHELL_NOT_FOUND;\r
+          goto Done;\r
         }\r
-        goto Done;\r
       }\r
 \r
-      if (ShellCommandLineGetFlag(Package, L"-a")) {\r
-        gShowType = SHOW_ALL;\r
-      }\r
-      //\r
-      // Show SMBIOS structure information\r
-      //\r
-      Status = SMBiosView (StructType, StructHandle, gShowType, RandomView);\r
-      if (EFI_ERROR(Status)) {\r
-        ShellStatus = SHELL_NOT_FOUND;\r
+Show64Bit:\r
+      if (!EFI_ERROR (Status2)) {\r
+        //\r
+        // build statistics table\r
+        //\r
+        Status = InitSmbios64BitTableStatistics ();\r
+        if (EFI_ERROR (Status)) {\r
+          ShellStatus = SHELL_NOT_FOUND;\r
+          goto Done;\r
+        }\r
+        //\r
+        // Initialize the StructHandle to be the first handle\r
+        //\r
+        StructHandle  = INVALID_HANDLE;\r
+        LibGetSmbios64BitStructure (&StructHandle, NULL, NULL);\r
+        \r
+        Temp = ShellCommandLineGetValue(Package, L"-h");\r
+        if (Temp != NULL) {\r
+          RandomView   = FALSE;\r
+          StructHandle = (UINT16) ShellStrToUintn(Temp);\r
+        }\r
+        \r
+        if (ShellCommandLineGetFlag(Package, L"-s")) {\r
+          Status = DisplaySmbios64BitStatisticsTable (SHOW_DETAIL);\r
+          if (EFI_ERROR(Status)) {\r
+            ShellStatus = SHELL_NOT_FOUND;\r
+          }\r
+          goto Done;\r
+        }\r
+        \r
+        //\r
+        // Show SMBIOS structure information\r
+        //\r
+        Status = SMBios64View (StructType, StructHandle, gShowType, RandomView);\r
+        if (EFI_ERROR(Status)) {\r
+          ShellStatus = SHELL_NOT_FOUND;\r
+        }\r
       }\r
     }\r
   }\r
@@ -158,11 +211,20 @@ Done:
     mStatisticsTable = NULL;\r
   }\r
 \r
+  if (mSmbios64BitStatisticsTable != NULL) {\r
+    //\r
+    // Release statistics table\r
+    //\r
+    FreePool (mSmbios64BitStatisticsTable);\r
+    mSmbios64BitStatisticsTable = NULL;\r
+  }\r
+\r
   if (Package != NULL) {\r
     ShellCommandLineFreeVarList (Package);\r
   }\r
 \r
   LibSmbiosCleanup ();\r
+  LibSmbios64BitCleanup ();\r
 \r
   return ShellStatus;\r
 }\r
@@ -341,6 +403,179 @@ SMBiosView (
   return EFI_BAD_BUFFER_SIZE;\r
 }\r
 \r
+/**\r
+  Query all structures Data from SMBIOS table and Display\r
+  the information to users as required display option.\r
+\r
+  @param[in] QueryType      Structure type to view.\r
+  @param[in] QueryHandle    Structure handle to view.\r
+  @param[in] Option         Display option: none,outline,normal,detail.\r
+  @param[in] RandomView     Support for -h parameter.\r
+\r
+  @retval EFI_SUCCESS           print is successful.\r
+  @retval EFI_BAD_BUFFER_SIZE   structure is out of the range of SMBIOS table.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+SMBios64View (\r
+  IN  UINT8   QueryType,\r
+  IN  UINT16  QueryHandle,\r
+  IN  UINT8   Option,\r
+  IN  BOOLEAN RandomView\r
+  )\r
+{\r
+  UINT16                        Handle;\r
+  UINT8                         *Buffer;\r
+  UINT16                        Length;\r
+  UINTN                         Index;\r
+  SMBIOS_STRUCTURE_POINTER      SmbiosStruct;\r
+  SMBIOS_TABLE_3_0_ENTRY_POINT  *SMBiosTable;\r
+\r
+  SMBiosTable = NULL;\r
+  LibSmbios64BitGetEPS (&SMBiosTable);\r
+  if (SMBiosTable == NULL) {\r
+    ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_TABLE), gShellDebug1HiiHandle);\r
+    return EFI_BAD_BUFFER_SIZE;\r
+  }\r
+\r
+  if (CompareMem (SMBiosTable->AnchorString, "_SM3_", 5) == 0) {\r
+    //\r
+    // Have got SMBIOS table\r
+    //\r
+    Smbios64BitPrintEPSInfo (SMBiosTable, Option);\r
+\r
+    SmbiosMajorVersion = SMBiosTable->MajorVersion;\r
+    SmbiosMinorVersion = SMBiosTable->MinorVersion;\r
+\r
+    ShellPrintEx(-1,-1,L"=========================================================\n");\r
+    ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERY_STRUCT_COND), gShellDebug1HiiHandle);\r
+\r
+    if (QueryType == STRUCTURE_TYPE_RANDOM) {\r
+      ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYTYPE_RANDOM), gShellDebug1HiiHandle);\r
+    } else {\r
+      ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYTYPE), gShellDebug1HiiHandle, QueryType);\r
+    }\r
+\r
+    if (RandomView) {\r
+      ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYHANDLE_RANDOM), gShellDebug1HiiHandle);\r
+    } else {\r
+      ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYHANDLE), gShellDebug1HiiHandle, QueryHandle);\r
+    }\r
+\r
+    ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_SHOWTYPE), gShellDebug1HiiHandle);\r
+    ShellPrintEx(-1,-1,GetShowTypeString (gShowType));\r
+    ShellPrintEx(-1,-1,L"\n\n");\r
+\r
+/*\r
+    //\r
+    // Get internal commands, such as change options.\r
+    //\r
+    Status = WaitEnter ();\r
+    if (EFI_ERROR (Status)) {\r
+      if (Status == EFI_ABORTED) {\r
+        return EFI_SUCCESS;\r
+      }\r
+\r
+      return Status;\r
+    }\r
+*/\r
+\r
+    //\r
+    // Searching and display structure info\r
+    //\r
+    Handle    = QueryHandle;\r
+    for (Index = 0; Index < mNumberOfSmbios64BitStructures; Index++) {\r
+      //\r
+      // if reach the end of table, break..\r
+      //\r
+      if (Handle == INVALID_HANDLE) {\r
+        break;\r
+      }\r
+      //\r
+      // handle then point to the next!\r
+      //\r
+      if (LibGetSmbios64BitStructure (&Handle, &Buffer, &Length) != DMI_SUCCESS) {\r
+        break;\r
+      }\r
+\r
+      SmbiosStruct.Raw = Buffer;\r
+\r
+      //\r
+      // if QueryType==Random, print this structure.\r
+      // if QueryType!=Random, but Hdr->Type==QueryType, also print it.\r
+      // only if QueryType != Random and Hdr->Type != QueryType, skiped it.\r
+      //\r
+      if (QueryType != STRUCTURE_TYPE_RANDOM && SmbiosStruct.Hdr->Type != QueryType) {\r
+        continue;\r
+      }\r
+\r
+      ShellPrintEx(-1,-1,L"\n=========================================================\n");\r
+      ShellPrintHiiEx(-1,-1,NULL,\r
+        STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_TYPE_HANDLE_DUMP_STRUCT),\r
+        gShellDebug1HiiHandle,\r
+        SmbiosStruct.Hdr->Type,\r
+        SmbiosStruct.Hdr->Handle\r
+       );\r
+      ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_INDEX_LENGTH), gShellDebug1HiiHandle, Index, Length);\r
+      //\r
+      // Addr of structure in structure in table\r
+      //\r
+      ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_ADDR), gShellDebug1HiiHandle, (UINTN) Buffer);\r
+      DumpHex (0, 0, Length, Buffer);\r
+\r
+/*\r
+      //\r
+      // Get internal commands, such as change options.\r
+      //\r
+      Status = WaitEnter ();\r
+      if (EFI_ERROR (Status)) {\r
+        if (Status == EFI_ABORTED) {\r
+          return EFI_SUCCESS;\r
+        }\r
+\r
+        return Status;\r
+      }\r
+*/\r
+\r
+      if (gShowType != SHOW_NONE) {\r
+        //\r
+        // Print structure information\r
+        //\r
+        SmbiosPrintStructure (&SmbiosStruct, gShowType);\r
+        ShellPrintEx(-1,-1,L"\n");\r
+\r
+/*\r
+        //\r
+        // Get internal commands, such as change options.\r
+        //\r
+        Status = WaitEnter ();\r
+        if (EFI_ERROR (Status)) {\r
+          if (Status == EFI_ABORTED) {\r
+            return EFI_SUCCESS;\r
+          }\r
+\r
+          return Status;\r
+        }\r
+*/\r
+      }\r
+      if (!RandomView) {\r
+        break;\r
+      }\r
+      //\r
+      // Support Execution Interrupt.\r
+      //\r
+      if (ShellGetExecutionBreakFlag ()) {\r
+        return EFI_ABORTED;\r
+      }\r
+    }\r
+\r
+    ShellPrintEx(-1,-1,L"\n=========================================================\n");\r
+    return EFI_SUCCESS;\r
+  }\r
+\r
+  return EFI_BAD_BUFFER_SIZE;\r
+}\r
+\r
 /**\r
   Function to initialize the global mStatisticsTable object.\r
 \r
@@ -429,6 +664,153 @@ InitSmbiosTableStatistics (
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  @param[in]  Smbios64EntryPoint          SMBIOS 64-bit entry point.\r
+  @param[out] NumberOfSmbios64Structures  The number of structures in 64-bit SMBIOS table.\r
+  @param[out] Smbios64TableLength         The total length of 64-bit SMBIOS table.\r
+\r
+  @retval EFI_SUCCESS                                                  Calculation was successful.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+CalculateSmbios64BitStructureCountAndLength (\r
+  SMBIOS_TABLE_3_0_ENTRY_POINT    *Smbios64EntryPoint,\r
+  UINTN                           *NumberOfSmbios64Structures,\r
+  UINTN                           *Smbios64TableLength\r
+)\r
+{\r
+  SMBIOS_STRUCTURE_POINTER        Smbios;\r
+  UINT8                           *Raw;\r
+  \r
+  *Smbios64TableLength = 0;\r
+  *NumberOfSmbios64Structures = 0;\r
+  \r
+  Smbios.Raw = (UINT8 *)(UINTN)(Smbios64EntryPoint->TableAddress);\r
+  while (TRUE) {\r
+    if (Smbios.Hdr->Type == 127) {\r
+      //\r
+      // Reach the end of table type 127\r
+      //\r
+      (*NumberOfSmbios64Structures)++;\r
+      (*Smbios64TableLength) += sizeof (SMBIOS_STRUCTURE);\r
+      return EFI_SUCCESS;\r
+    }\r
+\r
+    Raw = Smbios.Raw;\r
+    //\r
+    // Walk to next structure\r
+    //\r
+    LibGetSmbiosString (&Smbios, (UINT16) (-1));\r
+    //\r
+    // Length = Next structure head - this structure head\r
+    //\r
+    (*Smbios64TableLength) += (UINTN) (Smbios.Raw - Raw);\r
+    if ((*Smbios64TableLength) > Smbios64EntryPoint->TableMaximumSize) {\r
+       //\r
+       // The actual table length exceeds maximum table size,\r
+       // There should be something wrong with SMBIOS table.\r
+       //\r
+       return EFI_INVALID_PARAMETER;\r
+    }\r
+    (*NumberOfSmbios64Structures)++;\r
+  }\r
+}\r
+\r
+/**\r
+  Function to initialize the global mSmbios64BitStatisticsTable object.\r
+\r
+  @retval EFI_SUCCESS           print is successful.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+InitSmbios64BitTableStatistics (\r
+  VOID\r
+  )\r
+{\r
+  UINT16                    Handle;\r
+  UINT8                     *Buffer;\r
+  UINT16                    Length;\r
+  UINT16                    Offset;\r
+  UINT16                    Index;\r
+       EFI_STATUS                                                              Status;\r
+  SMBIOS_STRUCTURE_POINTER      SmbiosStruct;\r
+  SMBIOS_TABLE_3_0_ENTRY_POINT  *SMBiosTable;\r
+  STRUCTURE_STATISTICS          *StatisticsPointer;\r
+\r
+  SMBiosTable = NULL;\r
+  LibSmbios64BitGetEPS (&SMBiosTable);\r
+  if (SMBiosTable == NULL) {\r
+    ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_TABLE), gShellDebug1HiiHandle);\r
+    return EFI_NOT_FOUND;\r
+  }\r
+\r
+  if (CompareMem (SMBiosTable->AnchorString, "_SM3_", 5) != 0) {\r
+    ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_SMBIOS_TABLE), gShellDebug1HiiHandle);\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+  //\r
+  // Allocate memory to mSmbios64BitStatisticsTable\r
+  //\r
+  if (mSmbios64BitStatisticsTable != NULL) {\r
+    FreePool (mSmbios64BitStatisticsTable);\r
+    mSmbios64BitStatisticsTable = NULL;\r
+  }\r
+  //\r
+  // Calculate number of smbios structures\r
+  //\r
+  Status = CalculateSmbios64BitStructureCountAndLength (SMBiosTable, &mNumberOfSmbios64BitStructures, &mSmbios64BitTableLength);\r
+  if ((EFI_ERROR (Status)) || (mSmbios64BitTableLength > SMBiosTable->TableMaximumSize)) {\r
+       return EFI_INVALID_PARAMETER;\r
+  }\r
+  \r
+  mSmbios64BitStatisticsTable = (STRUCTURE_STATISTICS *) AllocateZeroPool (mNumberOfSmbios64BitStructures * sizeof (STRUCTURE_STATISTICS));\r
+\r
+  if (mSmbios64BitStatisticsTable == NULL) {\r
+    ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_OUT_OF_MEM), gShellDebug1HiiHandle);\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+\r
+  Offset      = 0;\r
+  StatisticsPointer = mSmbios64BitStatisticsTable;\r
+\r
+  //\r
+  // search from the first one\r
+  //\r
+  Handle = INVALID_HANDLE;\r
+  LibGetSmbios64BitStructure (&Handle, NULL, NULL);\r
+  for (Index = 1; Index <= mNumberOfSmbios64BitStructures; Index++) {\r
+    //\r
+    // If reach the end of table, break..\r
+    //\r
+    if (Handle == INVALID_HANDLE) {\r
+      break;\r
+    }\r
+    //\r
+    // After LibGetSmbios64BitStructure(), handle then point to the next!\r
+    //\r
+    if (LibGetSmbios64BitStructure (&Handle, &Buffer, &Length) != DMI_SUCCESS) {\r
+      break;\r
+    }\r
+\r
+    SmbiosStruct.Raw = Buffer;\r
+\r
+    //\r
+    // general statistics\r
+    //\r
+    StatisticsPointer->Index  = Index;\r
+    StatisticsPointer->Type   = SmbiosStruct.Hdr->Type;\r
+    StatisticsPointer->Handle = SmbiosStruct.Hdr->Handle;\r
+    StatisticsPointer->Length = Length;\r
+    StatisticsPointer->Addr   = Offset;\r
+\r
+    Offset = (UINT16) (Offset + Length);\r
+\r
+    StatisticsPointer         = &mSmbios64BitStatisticsTable[Index];\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
 /**\r
   Function to display the global mStatisticsTable object.\r
 \r
@@ -510,6 +892,87 @@ DisplayStatisticsTable (
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Function to display the global mSmbios64BitStatisticsTable object.\r
+\r
+  @param[in] Option             ECHO, NORMAL, or DETAIL control the amount of detail displayed.\r
+\r
+  @retval EFI_SUCCESS           print is successful.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+DisplaySmbios64BitStatisticsTable (\r
+  IN   UINT8   Option\r
+  )\r
+{\r
+  UINTN                    Index;\r
+  UINTN                    Num;\r
+  STRUCTURE_STATISTICS     *StatisticsPointer;\r
+  SMBIOS_TABLE_3_0_ENTRY_POINT *SMBiosTable;\r
+\r
+  SMBiosTable = NULL;\r
+  if (Option < SHOW_OUTLINE) {\r
+    return EFI_SUCCESS;\r
+  }\r
+  //\r
+  // display EPS information firstly\r
+  //\r
+  LibSmbios64BitGetEPS (&SMBiosTable);\r
+  if (SMBiosTable == NULL) {\r
+    ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_TABLE), gShellDebug1HiiHandle);\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
+  ShellPrintEx(-1,-1,L"\n============================================================\n");\r
+  Smbios64BitPrintEPSInfo (SMBiosTable, Option);\r
+\r
+  if (Option < SHOW_NORMAL) {\r
+    return EFI_SUCCESS;\r
+  }\r
+\r
+  if (mSmbios64BitStatisticsTable == NULL) {\r
+    ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_STATS), gShellDebug1HiiHandle);\r
+    return EFI_NOT_FOUND;\r
+  }\r
+\r
+  ShellPrintEx(-1,-1,L"============================================================\n");\r
+  StatisticsPointer = &mSmbios64BitStatisticsTable[0];\r
+  Num         = mNumberOfSmbios64BitStructures;\r
+  //\r
+  // display statistics table content\r
+  //\r
+  for (Index = 1; Index <= Num; Index++) {\r
+    ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_INDEX), gShellDebug1HiiHandle, StatisticsPointer->Index);\r
+    ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_TYPE), gShellDebug1HiiHandle, StatisticsPointer->Type);\r
+    ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_HANDLE), gShellDebug1HiiHandle, StatisticsPointer->Handle);\r
+    if (Option >= SHOW_DETAIL) {\r
+      ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_OFFSET), gShellDebug1HiiHandle, StatisticsPointer->Addr);\r
+      ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_LENGTH), gShellDebug1HiiHandle, StatisticsPointer->Length);\r
+    }\r
+\r
+    ShellPrintEx(-1,-1,L"\n");\r
+    StatisticsPointer = &mSmbios64BitStatisticsTable[Index];\r
+/*\r
+    //\r
+    // Display 20 lines and wait for a page break\r
+    //\r
+    if (Index % 20 == 0) {\r
+      ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_ENTER_CONTINUE), gShellDebug1HiiHandle);\r
+      Status = WaitEnter ();\r
+      if (EFI_ERROR (Status)) {\r
+        if (Status == EFI_ABORTED) {\r
+          return EFI_SUCCESS;\r
+        }\r
+\r
+        return Status;\r
+      }\r
+    }\r
+*/\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
 /**\r
   function to return a string of the detail level.\r
 \r