Home | History | Annotate | Download | only in SmbiosView
      1 /** @file
      2   Tools of clarify the content of the smbios table.
      3 
      4   (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>
      5   Copyright (c) 2005 - 2012, Intel Corporation. All rights reserved.<BR>
      6   This program and the accompanying materials
      7   are licensed and made available under the terms and conditions of the BSD License
      8   which accompanies this distribution.  The full text of the license may be found at
      9   http://opensource.org/licenses/bsd-license.php
     10 
     11   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     12   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     13 
     14 **/
     15 
     16 #include "../UefiShellDebug1CommandsLib.h"
     17 #include "LibSmbiosView.h"
     18 #include "SmbiosView.h"
     19 #include "PrintInfo.h"
     20 #include "QueryTable.h"
     21 
     22 UINT8                       gShowType         = SHOW_DETAIL;
     23 STATIC STRUCTURE_STATISTICS *mStatisticsTable = NULL;
     24 STATIC STRUCTURE_STATISTICS *mSmbios64BitStatisticsTable = NULL;
     25 
     26 UINT8  SmbiosMajorVersion;
     27 UINT8  SmbiosMinorVersion;
     28 
     29 UINTN  mNumberOfSmbios64BitStructures;
     30 UINTN  mSmbios64BitTableLength;
     31 
     32 STATIC CONST SHELL_PARAM_ITEM ParamList[] = {
     33   {L"-t", TypeValue},
     34   {L"-h", TypeValue},
     35   {L"-s", TypeFlag},
     36   {L"-a", TypeFlag},
     37   {NULL, TypeMax}
     38   };
     39 
     40 /**
     41   Function for 'smbiosview' command.
     42 
     43   @param[in] ImageHandle  Handle to the Image (NULL if Internal).
     44   @param[in] SystemTable  Pointer to the System Table (NULL if Internal).
     45 **/
     46 SHELL_STATUS
     47 EFIAPI
     48 ShellCommandRunSmbiosView (
     49   IN EFI_HANDLE        ImageHandle,
     50   IN EFI_SYSTEM_TABLE  *SystemTable
     51   )
     52 {
     53   UINT8               StructType;
     54   UINT16              StructHandle;
     55   EFI_STATUS          Status;
     56   EFI_STATUS          Status1;
     57   EFI_STATUS          Status2;
     58   BOOLEAN             RandomView;
     59   LIST_ENTRY          *Package;
     60   CHAR16              *ProblemParam;
     61   SHELL_STATUS        ShellStatus;
     62   CONST CHAR16        *Temp;
     63 
     64   mStatisticsTable            = NULL;
     65   mSmbios64BitStatisticsTable = NULL;
     66   Package                     = NULL;
     67   ShellStatus                 = SHELL_SUCCESS;
     68 
     69   Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);
     70   if (EFI_ERROR(Status)) {
     71     if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {
     72       ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"smbiosview", ProblemParam);
     73       FreePool(ProblemParam);
     74       ShellStatus = SHELL_INVALID_PARAMETER;
     75     } else {
     76       ASSERT(FALSE);
     77     }
     78   } else {
     79     if (ShellCommandLineGetCount(Package) > 1) {
     80       ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"smbiosview");
     81       ShellStatus = SHELL_INVALID_PARAMETER;
     82     } else if (ShellCommandLineGetFlag(Package, L"-t") && ShellCommandLineGetValue(Package, L"-t") == NULL) {
     83       ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDebug1HiiHandle, L"smbiosview", L"-t");
     84       ShellStatus = SHELL_INVALID_PARAMETER;
     85     } else if (ShellCommandLineGetFlag(Package, L"-h") && ShellCommandLineGetValue(Package, L"-h") == NULL) {
     86       ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDebug1HiiHandle,  L"smbiosview", L"-h");
     87       ShellStatus = SHELL_INVALID_PARAMETER;
     88     } else if (
     89         (ShellCommandLineGetFlag(Package, L"-t") && ShellCommandLineGetFlag(Package, L"-h")) ||
     90         (ShellCommandLineGetFlag(Package, L"-t") && ShellCommandLineGetFlag(Package, L"-s")) ||
     91         (ShellCommandLineGetFlag(Package, L"-t") && ShellCommandLineGetFlag(Package, L"-a")) ||
     92         (ShellCommandLineGetFlag(Package, L"-h") && ShellCommandLineGetFlag(Package, L"-s")) ||
     93         (ShellCommandLineGetFlag(Package, L"-h") && ShellCommandLineGetFlag(Package, L"-a")) ||
     94         (ShellCommandLineGetFlag(Package, L"-s") && ShellCommandLineGetFlag(Package, L"-a"))
     95       ) {
     96       ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"smbiosview");
     97       ShellStatus = SHELL_INVALID_PARAMETER;
     98     } else {
     99 
    100       //
    101       // Init Lib
    102       //
    103       Status1 = LibSmbiosInit ();
    104       Status2 = LibSmbios64BitInit ();
    105       if (EFI_ERROR (Status1) && EFI_ERROR (Status2)) {
    106       	ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_LIBSMBIOSVIEW_CANNOT_GET_TABLE), gShellDebug1HiiHandle);
    107         ShellStatus = SHELL_NOT_FOUND;
    108         goto Done;
    109       }
    110 
    111       StructType    = STRUCTURE_TYPE_RANDOM;
    112       RandomView    = TRUE;
    113 
    114       Temp          = ShellCommandLineGetValue(Package, L"-t");
    115       if (Temp != NULL) {
    116         StructType = (UINT8) ShellStrToUintn (Temp);
    117       }
    118 
    119       if (ShellCommandLineGetFlag(Package, L"-a")) {
    120         gShowType = SHOW_ALL;
    121       }
    122 
    123       if (!EFI_ERROR (Status1)) {
    124         //
    125         // Initialize the StructHandle to be the first handle
    126         //
    127         StructHandle  = INVALID_HANDLE;
    128         LibGetSmbiosStructure (&StructHandle, NULL, NULL);
    129 
    130         Temp = ShellCommandLineGetValue(Package, L"-h");
    131         if (Temp != NULL) {
    132           RandomView   = FALSE;
    133           StructHandle = (UINT16) ShellStrToUintn(Temp);
    134         }
    135         //
    136         // build statistics table
    137         //
    138         Status = InitSmbiosTableStatistics ();
    139         if (EFI_ERROR (Status)) {
    140           ShellStatus = SHELL_NOT_FOUND;
    141           goto Done;
    142         }
    143 
    144         if (ShellCommandLineGetFlag(Package, L"-s")) {
    145           Status = DisplayStatisticsTable (SHOW_DETAIL);
    146           if (EFI_ERROR(Status)) {
    147             ShellStatus = SHELL_NOT_FOUND;
    148           }
    149           goto Show64Bit;
    150         }
    151 
    152         //
    153         // Show SMBIOS structure information
    154         //
    155         Status = SMBiosView (StructType, StructHandle, gShowType, RandomView);
    156         if (EFI_ERROR(Status)) {
    157           ShellStatus = SHELL_NOT_FOUND;
    158           goto Done;
    159         }
    160       }
    161 
    162 Show64Bit:
    163       if (!EFI_ERROR (Status2)) {
    164         //
    165         // build statistics table
    166         //
    167         Status = InitSmbios64BitTableStatistics ();
    168         if (EFI_ERROR (Status)) {
    169           ShellStatus = SHELL_NOT_FOUND;
    170           goto Done;
    171         }
    172         //
    173         // Initialize the StructHandle to be the first handle
    174         //
    175         StructHandle  = INVALID_HANDLE;
    176         LibGetSmbios64BitStructure (&StructHandle, NULL, NULL);
    177 
    178         Temp = ShellCommandLineGetValue(Package, L"-h");
    179         if (Temp != NULL) {
    180           RandomView   = FALSE;
    181           StructHandle = (UINT16) ShellStrToUintn(Temp);
    182         }
    183 
    184         if (ShellCommandLineGetFlag(Package, L"-s")) {
    185           Status = DisplaySmbios64BitStatisticsTable (SHOW_DETAIL);
    186           if (EFI_ERROR(Status)) {
    187             ShellStatus = SHELL_NOT_FOUND;
    188           }
    189           goto Done;
    190         }
    191 
    192         //
    193         // Show SMBIOS structure information
    194         //
    195         Status = SMBios64View (StructType, StructHandle, gShowType, RandomView);
    196         if (EFI_ERROR(Status)) {
    197           ShellStatus = SHELL_NOT_FOUND;
    198         }
    199       }
    200     }
    201   }
    202 Done:
    203   //
    204   // Release resources
    205   //
    206   if (mStatisticsTable != NULL) {
    207     //
    208     // Release statistics table
    209     //
    210     FreePool (mStatisticsTable);
    211     mStatisticsTable = NULL;
    212   }
    213 
    214   if (mSmbios64BitStatisticsTable != NULL) {
    215     //
    216     // Release statistics table
    217     //
    218     FreePool (mSmbios64BitStatisticsTable);
    219     mSmbios64BitStatisticsTable = NULL;
    220   }
    221 
    222   if (Package != NULL) {
    223     ShellCommandLineFreeVarList (Package);
    224   }
    225 
    226   LibSmbiosCleanup ();
    227   LibSmbios64BitCleanup ();
    228 
    229   return ShellStatus;
    230 }
    231 
    232 /**
    233   Query all structures Data from SMBIOS table and Display
    234   the information to users as required display option.
    235 
    236   @param[in] QueryType      Structure type to view.
    237   @param[in] QueryHandle    Structure handle to view.
    238   @param[in] Option         Display option: none,outline,normal,detail.
    239   @param[in] RandomView     Support for -h parameter.
    240 
    241   @retval EFI_SUCCESS           print is successful.
    242   @retval EFI_BAD_BUFFER_SIZE   structure is out of the range of SMBIOS table.
    243 **/
    244 EFI_STATUS
    245 EFIAPI
    246 SMBiosView (
    247   IN  UINT8   QueryType,
    248   IN  UINT16  QueryHandle,
    249   IN  UINT8   Option,
    250   IN  BOOLEAN RandomView
    251   )
    252 {
    253   UINT16                    Handle;
    254   UINT8                     *Buffer;
    255   UINT16                    Length;
    256   UINTN                     Index;
    257 
    258   SMBIOS_STRUCTURE_POINTER  SmbiosStruct;
    259   SMBIOS_TABLE_ENTRY_POINT  *SMBiosTable;
    260 
    261   SMBiosTable = NULL;
    262   LibSmbiosGetEPS (&SMBiosTable);
    263   if (SMBiosTable == NULL) {
    264     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_TABLE), gShellDebug1HiiHandle);
    265     return EFI_BAD_BUFFER_SIZE;
    266   }
    267 
    268   if (CompareMem (SMBiosTable->AnchorString, "_SM_", 4) == 0) {
    269     //
    270     // Have got SMBIOS table
    271     //
    272     SmbiosPrintEPSInfo (SMBiosTable, Option);
    273 
    274     SmbiosMajorVersion = SMBiosTable->MajorVersion;
    275     SmbiosMinorVersion = SMBiosTable->MinorVersion;
    276 
    277     ShellPrintEx(-1,-1,L"=========================================================\n");
    278     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERY_STRUCT_COND), gShellDebug1HiiHandle);
    279 
    280     if (QueryType == STRUCTURE_TYPE_RANDOM) {
    281       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYTYPE_RANDOM), gShellDebug1HiiHandle);
    282     } else {
    283       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYTYPE), gShellDebug1HiiHandle, QueryType);
    284     }
    285 
    286     if (RandomView) {
    287       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYHANDLE_RANDOM), gShellDebug1HiiHandle);
    288     } else {
    289       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYHANDLE), gShellDebug1HiiHandle, QueryHandle);
    290     }
    291 
    292     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_SHOWTYPE), gShellDebug1HiiHandle);
    293     ShellPrintEx(-1,-1,GetShowTypeString (gShowType));
    294     ShellPrintEx(-1,-1,L"\n\n");
    295 
    296 /*
    297     //
    298     // Get internal commands, such as change options.
    299     //
    300     Status = WaitEnter ();
    301     if (EFI_ERROR (Status)) {
    302       if (Status == EFI_ABORTED) {
    303         return EFI_SUCCESS;
    304       }
    305 
    306       return Status;
    307     }
    308 */
    309 
    310     //
    311     // Searching and display structure info
    312     //
    313     Handle    = QueryHandle;
    314     for (Index = 0; Index < SMBiosTable->NumberOfSmbiosStructures; Index++) {
    315       //
    316       // if reach the end of table, break..
    317       //
    318       if (Handle == INVALID_HANDLE) {
    319         break;
    320       }
    321       //
    322       // handle then point to the next!
    323       //
    324       if (LibGetSmbiosStructure (&Handle, &Buffer, &Length) != DMI_SUCCESS) {
    325         break;
    326       }
    327 
    328       SmbiosStruct.Raw = Buffer;
    329 
    330       //
    331       // if QueryType==Random, print this structure.
    332       // if QueryType!=Random, but Hdr->Type==QueryType, also print it.
    333       // only if QueryType != Random and Hdr->Type != QueryType, skiped it.
    334       //
    335       if (QueryType != STRUCTURE_TYPE_RANDOM && SmbiosStruct.Hdr->Type != QueryType) {
    336         continue;
    337       }
    338 
    339       ShellPrintEx(-1,-1,L"\n=========================================================\n");
    340       ShellPrintHiiEx(-1,-1,NULL,
    341         STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_TYPE_HANDLE_DUMP_STRUCT),
    342         gShellDebug1HiiHandle,
    343         SmbiosStruct.Hdr->Type,
    344         SmbiosStruct.Hdr->Handle
    345        );
    346       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_INDEX_LENGTH), gShellDebug1HiiHandle, Index, Length);
    347       //
    348       // Addr of structure in structure in table
    349       //
    350       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_ADDR), gShellDebug1HiiHandle, (UINTN) Buffer);
    351       DumpHex (0, 0, Length, Buffer);
    352 
    353 /*
    354       //
    355       // Get internal commands, such as change options.
    356       //
    357       Status = WaitEnter ();
    358       if (EFI_ERROR (Status)) {
    359         if (Status == EFI_ABORTED) {
    360           return EFI_SUCCESS;
    361         }
    362 
    363         return Status;
    364       }
    365 */
    366 
    367       if (gShowType != SHOW_NONE) {
    368         //
    369         // Print structure information
    370         //
    371         SmbiosPrintStructure (&SmbiosStruct, gShowType);
    372         ShellPrintEx(-1,-1,L"\n");
    373 
    374 /*
    375         //
    376         // Get internal commands, such as change options.
    377         //
    378         Status = WaitEnter ();
    379         if (EFI_ERROR (Status)) {
    380           if (Status == EFI_ABORTED) {
    381             return EFI_SUCCESS;
    382           }
    383 
    384           return Status;
    385         }
    386 */
    387       }
    388       if (!RandomView) {
    389         break;
    390       }
    391       //
    392       // Support Execution Interrupt.
    393       //
    394       if (ShellGetExecutionBreakFlag ()) {
    395         return EFI_ABORTED;
    396       }
    397     }
    398 
    399     ShellPrintEx(-1,-1,L"\n=========================================================\n");
    400     return EFI_SUCCESS;
    401   }
    402 
    403   return EFI_BAD_BUFFER_SIZE;
    404 }
    405 
    406 /**
    407   Query all structures Data from SMBIOS table and Display
    408   the information to users as required display option.
    409 
    410   @param[in] QueryType      Structure type to view.
    411   @param[in] QueryHandle    Structure handle to view.
    412   @param[in] Option         Display option: none,outline,normal,detail.
    413   @param[in] RandomView     Support for -h parameter.
    414 
    415   @retval EFI_SUCCESS           print is successful.
    416   @retval EFI_BAD_BUFFER_SIZE   structure is out of the range of SMBIOS table.
    417 **/
    418 EFI_STATUS
    419 EFIAPI
    420 SMBios64View (
    421   IN  UINT8   QueryType,
    422   IN  UINT16  QueryHandle,
    423   IN  UINT8   Option,
    424   IN  BOOLEAN RandomView
    425   )
    426 {
    427   UINT16                        Handle;
    428   UINT8                         *Buffer;
    429   UINT16                        Length;
    430   UINTN                         Index;
    431   SMBIOS_STRUCTURE_POINTER      SmbiosStruct;
    432   SMBIOS_TABLE_3_0_ENTRY_POINT  *SMBiosTable;
    433 
    434   SMBiosTable = NULL;
    435   LibSmbios64BitGetEPS (&SMBiosTable);
    436   if (SMBiosTable == NULL) {
    437     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_TABLE), gShellDebug1HiiHandle);
    438     return EFI_BAD_BUFFER_SIZE;
    439   }
    440 
    441   if (CompareMem (SMBiosTable->AnchorString, "_SM3_", 5) == 0) {
    442     //
    443     // Have got SMBIOS table
    444     //
    445     Smbios64BitPrintEPSInfo (SMBiosTable, Option);
    446 
    447     SmbiosMajorVersion = SMBiosTable->MajorVersion;
    448     SmbiosMinorVersion = SMBiosTable->MinorVersion;
    449 
    450     ShellPrintEx(-1,-1,L"=========================================================\n");
    451     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERY_STRUCT_COND), gShellDebug1HiiHandle);
    452 
    453     if (QueryType == STRUCTURE_TYPE_RANDOM) {
    454       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYTYPE_RANDOM), gShellDebug1HiiHandle);
    455     } else {
    456       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYTYPE), gShellDebug1HiiHandle, QueryType);
    457     }
    458 
    459     if (RandomView) {
    460       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYHANDLE_RANDOM), gShellDebug1HiiHandle);
    461     } else {
    462       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYHANDLE), gShellDebug1HiiHandle, QueryHandle);
    463     }
    464 
    465     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_SHOWTYPE), gShellDebug1HiiHandle);
    466     ShellPrintEx(-1,-1,GetShowTypeString (gShowType));
    467     ShellPrintEx(-1,-1,L"\n\n");
    468 
    469 /*
    470     //
    471     // Get internal commands, such as change options.
    472     //
    473     Status = WaitEnter ();
    474     if (EFI_ERROR (Status)) {
    475       if (Status == EFI_ABORTED) {
    476         return EFI_SUCCESS;
    477       }
    478 
    479       return Status;
    480     }
    481 */
    482 
    483     //
    484     // Searching and display structure info
    485     //
    486     Handle    = QueryHandle;
    487     for (Index = 0; Index < mNumberOfSmbios64BitStructures; Index++) {
    488       //
    489       // if reach the end of table, break..
    490       //
    491       if (Handle == INVALID_HANDLE) {
    492         break;
    493       }
    494       //
    495       // handle then point to the next!
    496       //
    497       if (LibGetSmbios64BitStructure (&Handle, &Buffer, &Length) != DMI_SUCCESS) {
    498         break;
    499       }
    500 
    501       SmbiosStruct.Raw = Buffer;
    502 
    503       //
    504       // if QueryType==Random, print this structure.
    505       // if QueryType!=Random, but Hdr->Type==QueryType, also print it.
    506       // only if QueryType != Random and Hdr->Type != QueryType, skiped it.
    507       //
    508       if (QueryType != STRUCTURE_TYPE_RANDOM && SmbiosStruct.Hdr->Type != QueryType) {
    509         continue;
    510       }
    511 
    512       ShellPrintEx(-1,-1,L"\n=========================================================\n");
    513       ShellPrintHiiEx(-1,-1,NULL,
    514         STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_TYPE_HANDLE_DUMP_STRUCT),
    515         gShellDebug1HiiHandle,
    516         SmbiosStruct.Hdr->Type,
    517         SmbiosStruct.Hdr->Handle
    518        );
    519       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_INDEX_LENGTH), gShellDebug1HiiHandle, Index, Length);
    520       //
    521       // Addr of structure in structure in table
    522       //
    523       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_ADDR), gShellDebug1HiiHandle, (UINTN) Buffer);
    524       DumpHex (0, 0, Length, Buffer);
    525 
    526 /*
    527       //
    528       // Get internal commands, such as change options.
    529       //
    530       Status = WaitEnter ();
    531       if (EFI_ERROR (Status)) {
    532         if (Status == EFI_ABORTED) {
    533           return EFI_SUCCESS;
    534         }
    535 
    536         return Status;
    537       }
    538 */
    539 
    540       if (gShowType != SHOW_NONE) {
    541         //
    542         // Print structure information
    543         //
    544         SmbiosPrintStructure (&SmbiosStruct, gShowType);
    545         ShellPrintEx(-1,-1,L"\n");
    546 
    547 /*
    548         //
    549         // Get internal commands, such as change options.
    550         //
    551         Status = WaitEnter ();
    552         if (EFI_ERROR (Status)) {
    553           if (Status == EFI_ABORTED) {
    554             return EFI_SUCCESS;
    555           }
    556 
    557           return Status;
    558         }
    559 */
    560       }
    561       if (!RandomView) {
    562         break;
    563       }
    564       //
    565       // Support Execution Interrupt.
    566       //
    567       if (ShellGetExecutionBreakFlag ()) {
    568         return EFI_ABORTED;
    569       }
    570     }
    571 
    572     ShellPrintEx(-1,-1,L"\n=========================================================\n");
    573     return EFI_SUCCESS;
    574   }
    575 
    576   return EFI_BAD_BUFFER_SIZE;
    577 }
    578 
    579 /**
    580   Function to initialize the global mStatisticsTable object.
    581 
    582   @retval EFI_SUCCESS           print is successful.
    583 **/
    584 EFI_STATUS
    585 EFIAPI
    586 InitSmbiosTableStatistics (
    587   VOID
    588   )
    589 {
    590   UINT16                    Handle;
    591   UINT8                     *Buffer;
    592   UINT16                    Length;
    593   UINT16                    Offset;
    594   UINT16                    Index;
    595 
    596   SMBIOS_STRUCTURE_POINTER  SmbiosStruct;
    597   SMBIOS_TABLE_ENTRY_POINT  *SMBiosTable;
    598   STRUCTURE_STATISTICS      *StatisticsPointer;
    599 
    600   SMBiosTable = NULL;
    601   LibSmbiosGetEPS (&SMBiosTable);
    602   if (SMBiosTable == NULL) {
    603     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_TABLE), gShellDebug1HiiHandle);
    604     return EFI_NOT_FOUND;
    605   }
    606 
    607   if (CompareMem (SMBiosTable->AnchorString, "_SM_", 4) != 0) {
    608     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_SMBIOS_TABLE), gShellDebug1HiiHandle);
    609     return EFI_INVALID_PARAMETER;
    610   }
    611   //
    612   // Allocate memory to mStatisticsTable
    613   //
    614   if (mStatisticsTable != NULL) {
    615     FreePool (mStatisticsTable);
    616     mStatisticsTable = NULL;
    617   }
    618 
    619   mStatisticsTable = (STRUCTURE_STATISTICS *) AllocateZeroPool (SMBiosTable->NumberOfSmbiosStructures * sizeof (STRUCTURE_STATISTICS));
    620 
    621   if (mStatisticsTable == NULL) {
    622     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_OUT_OF_MEM), gShellDebug1HiiHandle);
    623     return EFI_OUT_OF_RESOURCES;
    624   }
    625 
    626   Offset      = 0;
    627   StatisticsPointer = mStatisticsTable;
    628 
    629   //
    630   // search from the first one
    631   //
    632   Handle = INVALID_HANDLE;
    633   LibGetSmbiosStructure (&Handle, NULL, NULL);
    634   for (Index = 1; Index <= SMBiosTable->NumberOfSmbiosStructures; Index++) {
    635     //
    636     // If reach the end of table, break..
    637     //
    638     if (Handle == INVALID_HANDLE) {
    639       break;
    640     }
    641     //
    642     // After LibGetSmbiosStructure(), handle then point to the next!
    643     //
    644     if (LibGetSmbiosStructure (&Handle, &Buffer, &Length) != DMI_SUCCESS) {
    645       break;
    646     }
    647 
    648     SmbiosStruct.Raw = Buffer;
    649 
    650     //
    651     // general statistics
    652     //
    653     StatisticsPointer->Index  = Index;
    654     StatisticsPointer->Type   = SmbiosStruct.Hdr->Type;
    655     StatisticsPointer->Handle = SmbiosStruct.Hdr->Handle;
    656     StatisticsPointer->Length = Length;
    657     StatisticsPointer->Addr   = Offset;
    658 
    659     Offset = (UINT16) (Offset + Length);
    660 
    661     StatisticsPointer         = &mStatisticsTable[Index];
    662   }
    663 
    664   return EFI_SUCCESS;
    665 }
    666 
    667 /**
    668   @param[in]  Smbios64EntryPoint          SMBIOS 64-bit entry point.
    669   @param[out] NumberOfSmbios64Structures  The number of structures in 64-bit SMBIOS table.
    670   @param[out] Smbios64TableLength         The total length of 64-bit SMBIOS table.
    671 
    672   @retval EFI_SUCCESS           					Calculation was successful.
    673 **/
    674 EFI_STATUS
    675 EFIAPI
    676 CalculateSmbios64BitStructureCountAndLength (
    677   SMBIOS_TABLE_3_0_ENTRY_POINT    *Smbios64EntryPoint,
    678   UINTN                           *NumberOfSmbios64Structures,
    679   UINTN                           *Smbios64TableLength
    680 )
    681 {
    682   SMBIOS_STRUCTURE_POINTER        Smbios;
    683   UINT8                           *Raw;
    684 
    685   *Smbios64TableLength = 0;
    686   *NumberOfSmbios64Structures = 0;
    687 
    688   Smbios.Raw = (UINT8 *)(UINTN)(Smbios64EntryPoint->TableAddress);
    689   while (TRUE) {
    690     if (Smbios.Hdr->Type == 127) {
    691       //
    692       // Reach the end of table type 127
    693       //
    694       (*NumberOfSmbios64Structures)++;
    695       (*Smbios64TableLength) += sizeof (SMBIOS_STRUCTURE);
    696       return EFI_SUCCESS;
    697     }
    698 
    699     Raw = Smbios.Raw;
    700     //
    701     // Walk to next structure
    702     //
    703     LibGetSmbiosString (&Smbios, (UINT16) (-1));
    704     //
    705     // Length = Next structure head - this structure head
    706     //
    707     (*Smbios64TableLength) += (UINTN) (Smbios.Raw - Raw);
    708     if ((*Smbios64TableLength) > Smbios64EntryPoint->TableMaximumSize) {
    709     	//
    710     	// The actual table length exceeds maximum table size,
    711     	// There should be something wrong with SMBIOS table.
    712     	//
    713     	return EFI_INVALID_PARAMETER;
    714     }
    715     (*NumberOfSmbios64Structures)++;
    716   }
    717 }
    718 
    719 /**
    720   Function to initialize the global mSmbios64BitStatisticsTable object.
    721 
    722   @retval EFI_SUCCESS           print is successful.
    723 **/
    724 EFI_STATUS
    725 EFIAPI
    726 InitSmbios64BitTableStatistics (
    727   VOID
    728   )
    729 {
    730   UINT16                    Handle;
    731   UINT8                     *Buffer;
    732   UINT16                    Length;
    733   UINT16                    Offset;
    734   UINT16                    Index;
    735 	EFI_STATUS								Status;
    736   SMBIOS_STRUCTURE_POINTER      SmbiosStruct;
    737   SMBIOS_TABLE_3_0_ENTRY_POINT  *SMBiosTable;
    738   STRUCTURE_STATISTICS          *StatisticsPointer;
    739 
    740   SMBiosTable = NULL;
    741   LibSmbios64BitGetEPS (&SMBiosTable);
    742   if (SMBiosTable == NULL) {
    743     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_TABLE), gShellDebug1HiiHandle);
    744     return EFI_NOT_FOUND;
    745   }
    746 
    747   if (CompareMem (SMBiosTable->AnchorString, "_SM3_", 5) != 0) {
    748     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_SMBIOS_TABLE), gShellDebug1HiiHandle);
    749     return EFI_INVALID_PARAMETER;
    750   }
    751   //
    752   // Allocate memory to mSmbios64BitStatisticsTable
    753   //
    754   if (mSmbios64BitStatisticsTable != NULL) {
    755     FreePool (mSmbios64BitStatisticsTable);
    756     mSmbios64BitStatisticsTable = NULL;
    757   }
    758   //
    759   // Calculate number of smbios structures
    760   //
    761   Status = CalculateSmbios64BitStructureCountAndLength (SMBiosTable, &mNumberOfSmbios64BitStructures, &mSmbios64BitTableLength);
    762   if ((EFI_ERROR (Status)) || (mSmbios64BitTableLength > SMBiosTable->TableMaximumSize)) {
    763   	return EFI_INVALID_PARAMETER;
    764   }
    765 
    766   mSmbios64BitStatisticsTable = (STRUCTURE_STATISTICS *) AllocateZeroPool (mNumberOfSmbios64BitStructures * sizeof (STRUCTURE_STATISTICS));
    767 
    768   if (mSmbios64BitStatisticsTable == NULL) {
    769     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_OUT_OF_MEM), gShellDebug1HiiHandle);
    770     return EFI_OUT_OF_RESOURCES;
    771   }
    772 
    773   Offset      = 0;
    774   StatisticsPointer = mSmbios64BitStatisticsTable;
    775 
    776   //
    777   // search from the first one
    778   //
    779   Handle = INVALID_HANDLE;
    780   LibGetSmbios64BitStructure (&Handle, NULL, NULL);
    781   for (Index = 1; Index <= mNumberOfSmbios64BitStructures; Index++) {
    782     //
    783     // If reach the end of table, break..
    784     //
    785     if (Handle == INVALID_HANDLE) {
    786       break;
    787     }
    788     //
    789     // After LibGetSmbios64BitStructure(), handle then point to the next!
    790     //
    791     if (LibGetSmbios64BitStructure (&Handle, &Buffer, &Length) != DMI_SUCCESS) {
    792       break;
    793     }
    794 
    795     SmbiosStruct.Raw = Buffer;
    796 
    797     //
    798     // general statistics
    799     //
    800     StatisticsPointer->Index  = Index;
    801     StatisticsPointer->Type   = SmbiosStruct.Hdr->Type;
    802     StatisticsPointer->Handle = SmbiosStruct.Hdr->Handle;
    803     StatisticsPointer->Length = Length;
    804     StatisticsPointer->Addr   = Offset;
    805 
    806     Offset = (UINT16) (Offset + Length);
    807 
    808     StatisticsPointer         = &mSmbios64BitStatisticsTable[Index];
    809   }
    810 
    811   return EFI_SUCCESS;
    812 }
    813 
    814 /**
    815   Function to display the global mStatisticsTable object.
    816 
    817   @param[in] Option             ECHO, NORMAL, or DETAIL control the amount of detail displayed.
    818 
    819   @retval EFI_SUCCESS           print is successful.
    820 **/
    821 EFI_STATUS
    822 EFIAPI
    823 DisplayStatisticsTable (
    824   IN   UINT8   Option
    825   )
    826 {
    827   UINTN                    Index;
    828   UINTN                    Num;
    829   STRUCTURE_STATISTICS     *StatisticsPointer;
    830   SMBIOS_TABLE_ENTRY_POINT *SMBiosTable;
    831 
    832   SMBiosTable = NULL;
    833   if (Option < SHOW_OUTLINE) {
    834     return EFI_SUCCESS;
    835   }
    836   //
    837   // display EPS information firstly
    838   //
    839   LibSmbiosGetEPS (&SMBiosTable);
    840   if (SMBiosTable == NULL) {
    841     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_TABLE), gShellDebug1HiiHandle);
    842     return EFI_UNSUPPORTED;
    843   }
    844 
    845   ShellPrintEx(-1,-1,L"\n============================================================\n");
    846   SmbiosPrintEPSInfo (SMBiosTable, Option);
    847 
    848   if (Option < SHOW_NORMAL) {
    849     return EFI_SUCCESS;
    850   }
    851 
    852   if (mStatisticsTable == NULL) {
    853     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_STATS), gShellDebug1HiiHandle);
    854     return EFI_NOT_FOUND;
    855   }
    856 
    857   ShellPrintEx(-1,-1,L"============================================================\n");
    858   StatisticsPointer = &mStatisticsTable[0];
    859   Num         = SMBiosTable->NumberOfSmbiosStructures;
    860   //
    861   // display statistics table content
    862   //
    863   for (Index = 1; Index <= Num; Index++) {
    864     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_INDEX), gShellDebug1HiiHandle, StatisticsPointer->Index);
    865     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_TYPE), gShellDebug1HiiHandle, StatisticsPointer->Type);
    866     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_HANDLE), gShellDebug1HiiHandle, StatisticsPointer->Handle);
    867     if (Option >= SHOW_DETAIL) {
    868       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_OFFSET), gShellDebug1HiiHandle, StatisticsPointer->Addr);
    869       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_LENGTH), gShellDebug1HiiHandle, StatisticsPointer->Length);
    870     }
    871 
    872     ShellPrintEx(-1,-1,L"\n");
    873     StatisticsPointer = &mStatisticsTable[Index];
    874 /*
    875     //
    876     // Display 20 lines and wait for a page break
    877     //
    878     if (Index % 20 == 0) {
    879       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_ENTER_CONTINUE), gShellDebug1HiiHandle);
    880       Status = WaitEnter ();
    881       if (EFI_ERROR (Status)) {
    882         if (Status == EFI_ABORTED) {
    883           return EFI_SUCCESS;
    884         }
    885 
    886         return Status;
    887       }
    888     }
    889 */
    890   }
    891 
    892   return EFI_SUCCESS;
    893 }
    894 
    895 /**
    896   Function to display the global mSmbios64BitStatisticsTable object.
    897 
    898   @param[in] Option             ECHO, NORMAL, or DETAIL control the amount of detail displayed.
    899 
    900   @retval EFI_SUCCESS           print is successful.
    901 **/
    902 EFI_STATUS
    903 EFIAPI
    904 DisplaySmbios64BitStatisticsTable (
    905   IN   UINT8   Option
    906   )
    907 {
    908   UINTN                    Index;
    909   UINTN                    Num;
    910   STRUCTURE_STATISTICS     *StatisticsPointer;
    911   SMBIOS_TABLE_3_0_ENTRY_POINT *SMBiosTable;
    912 
    913   SMBiosTable = NULL;
    914   if (Option < SHOW_OUTLINE) {
    915     return EFI_SUCCESS;
    916   }
    917   //
    918   // display EPS information firstly
    919   //
    920   LibSmbios64BitGetEPS (&SMBiosTable);
    921   if (SMBiosTable == NULL) {
    922     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_TABLE), gShellDebug1HiiHandle);
    923     return EFI_UNSUPPORTED;
    924   }
    925 
    926   ShellPrintEx(-1,-1,L"\n============================================================\n");
    927   Smbios64BitPrintEPSInfo (SMBiosTable, Option);
    928 
    929   if (Option < SHOW_NORMAL) {
    930     return EFI_SUCCESS;
    931   }
    932 
    933   if (mSmbios64BitStatisticsTable == NULL) {
    934     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_STATS), gShellDebug1HiiHandle);
    935     return EFI_NOT_FOUND;
    936   }
    937 
    938   ShellPrintEx(-1,-1,L"============================================================\n");
    939   StatisticsPointer = &mSmbios64BitStatisticsTable[0];
    940   Num         = mNumberOfSmbios64BitStructures;
    941   //
    942   // display statistics table content
    943   //
    944   for (Index = 1; Index <= Num; Index++) {
    945     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_INDEX), gShellDebug1HiiHandle, StatisticsPointer->Index);
    946     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_TYPE), gShellDebug1HiiHandle, StatisticsPointer->Type);
    947     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_HANDLE), gShellDebug1HiiHandle, StatisticsPointer->Handle);
    948     if (Option >= SHOW_DETAIL) {
    949       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_OFFSET), gShellDebug1HiiHandle, StatisticsPointer->Addr);
    950       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_LENGTH), gShellDebug1HiiHandle, StatisticsPointer->Length);
    951     }
    952 
    953     ShellPrintEx(-1,-1,L"\n");
    954     StatisticsPointer = &mSmbios64BitStatisticsTable[Index];
    955 /*
    956     //
    957     // Display 20 lines and wait for a page break
    958     //
    959     if (Index % 20 == 0) {
    960       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_ENTER_CONTINUE), gShellDebug1HiiHandle);
    961       Status = WaitEnter ();
    962       if (EFI_ERROR (Status)) {
    963         if (Status == EFI_ABORTED) {
    964           return EFI_SUCCESS;
    965         }
    966 
    967         return Status;
    968       }
    969     }
    970 */
    971   }
    972 
    973   return EFI_SUCCESS;
    974 }
    975 
    976 /**
    977   function to return a string of the detail level.
    978 
    979   @param[in] ShowType         The detail level whose name is desired in clear text.
    980 
    981   @return   A pointer to a string representing the ShowType (or 'undefined type' if not known).
    982 **/
    983 CHAR16 *
    984 EFIAPI
    985 GetShowTypeString (
    986   UINT8 ShowType
    987   )
    988 {
    989   //
    990   // show type
    991   //
    992   switch (ShowType) {
    993 
    994   case SHOW_NONE:
    995     return L"SHOW_NONE";
    996 
    997   case SHOW_OUTLINE:
    998     return L"SHOW_OUTLINE";
    999 
   1000   case SHOW_NORMAL:
   1001     return L"SHOW_NORMAL";
   1002 
   1003   case SHOW_DETAIL:
   1004     return L"SHOW_DETAIL";
   1005 
   1006   case SHOW_ALL:
   1007     return L"SHOW_ALL";
   1008 
   1009   default:
   1010     return L"Undefined type";
   1011   }
   1012 }
   1013 
   1014