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 SMBiosView (
    246   IN  UINT8   QueryType,
    247   IN  UINT16  QueryHandle,
    248   IN  UINT8   Option,
    249   IN  BOOLEAN RandomView
    250   )
    251 {
    252   UINT16                    Handle;
    253   UINT8                     *Buffer;
    254   UINT16                    Length;
    255   UINTN                     Index;
    256 
    257   SMBIOS_STRUCTURE_POINTER  SmbiosStruct;
    258   SMBIOS_TABLE_ENTRY_POINT  *SMBiosTable;
    259 
    260   SMBiosTable = NULL;
    261   LibSmbiosGetEPS (&SMBiosTable);
    262   if (SMBiosTable == NULL) {
    263     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_TABLE), gShellDebug1HiiHandle);
    264     return EFI_BAD_BUFFER_SIZE;
    265   }
    266 
    267   if (CompareMem (SMBiosTable->AnchorString, "_SM_", 4) == 0) {
    268     //
    269     // Have got SMBIOS table
    270     //
    271     SmbiosPrintEPSInfo (SMBiosTable, Option);
    272 
    273     SmbiosMajorVersion = SMBiosTable->MajorVersion;
    274     SmbiosMinorVersion = SMBiosTable->MinorVersion;
    275 
    276     ShellPrintEx(-1,-1,L"=========================================================\n");
    277     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERY_STRUCT_COND), gShellDebug1HiiHandle);
    278 
    279     if (QueryType == STRUCTURE_TYPE_RANDOM) {
    280       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYTYPE_RANDOM), gShellDebug1HiiHandle);
    281     } else {
    282       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYTYPE), gShellDebug1HiiHandle, QueryType);
    283     }
    284 
    285     if (RandomView) {
    286       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYHANDLE_RANDOM), gShellDebug1HiiHandle);
    287     } else {
    288       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYHANDLE), gShellDebug1HiiHandle, QueryHandle);
    289     }
    290 
    291     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_SHOWTYPE), gShellDebug1HiiHandle);
    292     ShellPrintEx(-1,-1,GetShowTypeString (gShowType));
    293     ShellPrintEx(-1,-1,L"\n\n");
    294 
    295 /*
    296     //
    297     // Get internal commands, such as change options.
    298     //
    299     Status = WaitEnter ();
    300     if (EFI_ERROR (Status)) {
    301       if (Status == EFI_ABORTED) {
    302         return EFI_SUCCESS;
    303       }
    304 
    305       return Status;
    306     }
    307 */
    308 
    309     //
    310     // Searching and display structure info
    311     //
    312     Handle    = QueryHandle;
    313     for (Index = 0; Index < SMBiosTable->NumberOfSmbiosStructures; Index++) {
    314       //
    315       // if reach the end of table, break..
    316       //
    317       if (Handle == INVALID_HANDLE) {
    318         break;
    319       }
    320       //
    321       // handle then point to the next!
    322       //
    323       if (LibGetSmbiosStructure (&Handle, &Buffer, &Length) != DMI_SUCCESS) {
    324         break;
    325       }
    326 
    327       SmbiosStruct.Raw = Buffer;
    328 
    329       //
    330       // if QueryType==Random, print this structure.
    331       // if QueryType!=Random, but Hdr->Type==QueryType, also print it.
    332       // only if QueryType != Random and Hdr->Type != QueryType, skiped it.
    333       //
    334       if (QueryType != STRUCTURE_TYPE_RANDOM && SmbiosStruct.Hdr->Type != QueryType) {
    335         continue;
    336       }
    337 
    338       ShellPrintEx(-1,-1,L"\n=========================================================\n");
    339       ShellPrintHiiEx(-1,-1,NULL,
    340         STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_TYPE_HANDLE_DUMP_STRUCT),
    341         gShellDebug1HiiHandle,
    342         SmbiosStruct.Hdr->Type,
    343         SmbiosStruct.Hdr->Handle
    344        );
    345       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_INDEX_LENGTH), gShellDebug1HiiHandle, Index, Length);
    346       //
    347       // Addr of structure in structure in table
    348       //
    349       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_ADDR), gShellDebug1HiiHandle, (UINTN) Buffer);
    350       DumpHex (0, 0, Length, Buffer);
    351 
    352 /*
    353       //
    354       // Get internal commands, such as change options.
    355       //
    356       Status = WaitEnter ();
    357       if (EFI_ERROR (Status)) {
    358         if (Status == EFI_ABORTED) {
    359           return EFI_SUCCESS;
    360         }
    361 
    362         return Status;
    363       }
    364 */
    365 
    366       if (gShowType != SHOW_NONE) {
    367         //
    368         // Print structure information
    369         //
    370         SmbiosPrintStructure (&SmbiosStruct, gShowType);
    371         ShellPrintEx(-1,-1,L"\n");
    372 
    373 /*
    374         //
    375         // Get internal commands, such as change options.
    376         //
    377         Status = WaitEnter ();
    378         if (EFI_ERROR (Status)) {
    379           if (Status == EFI_ABORTED) {
    380             return EFI_SUCCESS;
    381           }
    382 
    383           return Status;
    384         }
    385 */
    386       }
    387       if (!RandomView) {
    388         break;
    389       }
    390       //
    391       // Support Execution Interrupt.
    392       //
    393       if (ShellGetExecutionBreakFlag ()) {
    394         return EFI_ABORTED;
    395       }
    396     }
    397 
    398     ShellPrintEx(-1,-1,L"\n=========================================================\n");
    399     return EFI_SUCCESS;
    400   }
    401 
    402   return EFI_BAD_BUFFER_SIZE;
    403 }
    404 
    405 /**
    406   Query all structures Data from SMBIOS table and Display
    407   the information to users as required display option.
    408 
    409   @param[in] QueryType      Structure type to view.
    410   @param[in] QueryHandle    Structure handle to view.
    411   @param[in] Option         Display option: none,outline,normal,detail.
    412   @param[in] RandomView     Support for -h parameter.
    413 
    414   @retval EFI_SUCCESS           print is successful.
    415   @retval EFI_BAD_BUFFER_SIZE   structure is out of the range of SMBIOS table.
    416 **/
    417 EFI_STATUS
    418 SMBios64View (
    419   IN  UINT8   QueryType,
    420   IN  UINT16  QueryHandle,
    421   IN  UINT8   Option,
    422   IN  BOOLEAN RandomView
    423   )
    424 {
    425   UINT16                        Handle;
    426   UINT8                         *Buffer;
    427   UINT16                        Length;
    428   UINTN                         Index;
    429   SMBIOS_STRUCTURE_POINTER      SmbiosStruct;
    430   SMBIOS_TABLE_3_0_ENTRY_POINT  *SMBiosTable;
    431 
    432   SMBiosTable = NULL;
    433   LibSmbios64BitGetEPS (&SMBiosTable);
    434   if (SMBiosTable == NULL) {
    435     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_TABLE), gShellDebug1HiiHandle);
    436     return EFI_BAD_BUFFER_SIZE;
    437   }
    438 
    439   if (CompareMem (SMBiosTable->AnchorString, "_SM3_", 5) == 0) {
    440     //
    441     // Have got SMBIOS table
    442     //
    443     Smbios64BitPrintEPSInfo (SMBiosTable, Option);
    444 
    445     SmbiosMajorVersion = SMBiosTable->MajorVersion;
    446     SmbiosMinorVersion = SMBiosTable->MinorVersion;
    447 
    448     ShellPrintEx(-1,-1,L"=========================================================\n");
    449     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERY_STRUCT_COND), gShellDebug1HiiHandle);
    450 
    451     if (QueryType == STRUCTURE_TYPE_RANDOM) {
    452       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYTYPE_RANDOM), gShellDebug1HiiHandle);
    453     } else {
    454       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYTYPE), gShellDebug1HiiHandle, QueryType);
    455     }
    456 
    457     if (RandomView) {
    458       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYHANDLE_RANDOM), gShellDebug1HiiHandle);
    459     } else {
    460       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYHANDLE), gShellDebug1HiiHandle, QueryHandle);
    461     }
    462 
    463     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_SHOWTYPE), gShellDebug1HiiHandle);
    464     ShellPrintEx(-1,-1,GetShowTypeString (gShowType));
    465     ShellPrintEx(-1,-1,L"\n\n");
    466 
    467 /*
    468     //
    469     // Get internal commands, such as change options.
    470     //
    471     Status = WaitEnter ();
    472     if (EFI_ERROR (Status)) {
    473       if (Status == EFI_ABORTED) {
    474         return EFI_SUCCESS;
    475       }
    476 
    477       return Status;
    478     }
    479 */
    480 
    481     //
    482     // Searching and display structure info
    483     //
    484     Handle    = QueryHandle;
    485     for (Index = 0; Index < mNumberOfSmbios64BitStructures; Index++) {
    486       //
    487       // if reach the end of table, break..
    488       //
    489       if (Handle == INVALID_HANDLE) {
    490         break;
    491       }
    492       //
    493       // handle then point to the next!
    494       //
    495       if (LibGetSmbios64BitStructure (&Handle, &Buffer, &Length) != DMI_SUCCESS) {
    496         break;
    497       }
    498 
    499       SmbiosStruct.Raw = Buffer;
    500 
    501       //
    502       // if QueryType==Random, print this structure.
    503       // if QueryType!=Random, but Hdr->Type==QueryType, also print it.
    504       // only if QueryType != Random and Hdr->Type != QueryType, skiped it.
    505       //
    506       if (QueryType != STRUCTURE_TYPE_RANDOM && SmbiosStruct.Hdr->Type != QueryType) {
    507         continue;
    508       }
    509 
    510       ShellPrintEx(-1,-1,L"\n=========================================================\n");
    511       ShellPrintHiiEx(-1,-1,NULL,
    512         STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_TYPE_HANDLE_DUMP_STRUCT),
    513         gShellDebug1HiiHandle,
    514         SmbiosStruct.Hdr->Type,
    515         SmbiosStruct.Hdr->Handle
    516        );
    517       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_INDEX_LENGTH), gShellDebug1HiiHandle, Index, Length);
    518       //
    519       // Addr of structure in structure in table
    520       //
    521       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_ADDR), gShellDebug1HiiHandle, (UINTN) Buffer);
    522       DumpHex (0, 0, Length, Buffer);
    523 
    524 /*
    525       //
    526       // Get internal commands, such as change options.
    527       //
    528       Status = WaitEnter ();
    529       if (EFI_ERROR (Status)) {
    530         if (Status == EFI_ABORTED) {
    531           return EFI_SUCCESS;
    532         }
    533 
    534         return Status;
    535       }
    536 */
    537 
    538       if (gShowType != SHOW_NONE) {
    539         //
    540         // Print structure information
    541         //
    542         SmbiosPrintStructure (&SmbiosStruct, gShowType);
    543         ShellPrintEx(-1,-1,L"\n");
    544 
    545 /*
    546         //
    547         // Get internal commands, such as change options.
    548         //
    549         Status = WaitEnter ();
    550         if (EFI_ERROR (Status)) {
    551           if (Status == EFI_ABORTED) {
    552             return EFI_SUCCESS;
    553           }
    554 
    555           return Status;
    556         }
    557 */
    558       }
    559       if (!RandomView) {
    560         break;
    561       }
    562       //
    563       // Support Execution Interrupt.
    564       //
    565       if (ShellGetExecutionBreakFlag ()) {
    566         return EFI_ABORTED;
    567       }
    568     }
    569 
    570     ShellPrintEx(-1,-1,L"\n=========================================================\n");
    571     return EFI_SUCCESS;
    572   }
    573 
    574   return EFI_BAD_BUFFER_SIZE;
    575 }
    576 
    577 /**
    578   Function to initialize the global mStatisticsTable object.
    579 
    580   @retval EFI_SUCCESS           print is successful.
    581 **/
    582 EFI_STATUS
    583 InitSmbiosTableStatistics (
    584   VOID
    585   )
    586 {
    587   UINT16                    Handle;
    588   UINT8                     *Buffer;
    589   UINT16                    Length;
    590   UINT16                    Offset;
    591   UINT16                    Index;
    592 
    593   SMBIOS_STRUCTURE_POINTER  SmbiosStruct;
    594   SMBIOS_TABLE_ENTRY_POINT  *SMBiosTable;
    595   STRUCTURE_STATISTICS      *StatisticsPointer;
    596 
    597   SMBiosTable = NULL;
    598   LibSmbiosGetEPS (&SMBiosTable);
    599   if (SMBiosTable == NULL) {
    600     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_TABLE), gShellDebug1HiiHandle);
    601     return EFI_NOT_FOUND;
    602   }
    603 
    604   if (CompareMem (SMBiosTable->AnchorString, "_SM_", 4) != 0) {
    605     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_SMBIOS_TABLE), gShellDebug1HiiHandle);
    606     return EFI_INVALID_PARAMETER;
    607   }
    608   //
    609   // Allocate memory to mStatisticsTable
    610   //
    611   if (mStatisticsTable != NULL) {
    612     FreePool (mStatisticsTable);
    613     mStatisticsTable = NULL;
    614   }
    615 
    616   mStatisticsTable = (STRUCTURE_STATISTICS *) AllocateZeroPool (SMBiosTable->NumberOfSmbiosStructures * sizeof (STRUCTURE_STATISTICS));
    617 
    618   if (mStatisticsTable == NULL) {
    619     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_OUT_OF_MEM), gShellDebug1HiiHandle);
    620     return EFI_OUT_OF_RESOURCES;
    621   }
    622 
    623   Offset      = 0;
    624   StatisticsPointer = mStatisticsTable;
    625 
    626   //
    627   // search from the first one
    628   //
    629   Handle = INVALID_HANDLE;
    630   LibGetSmbiosStructure (&Handle, NULL, NULL);
    631   for (Index = 1; Index <= SMBiosTable->NumberOfSmbiosStructures; Index++) {
    632     //
    633     // If reach the end of table, break..
    634     //
    635     if (Handle == INVALID_HANDLE) {
    636       break;
    637     }
    638     //
    639     // After LibGetSmbiosStructure(), handle then point to the next!
    640     //
    641     if (LibGetSmbiosStructure (&Handle, &Buffer, &Length) != DMI_SUCCESS) {
    642       break;
    643     }
    644 
    645     SmbiosStruct.Raw = Buffer;
    646 
    647     //
    648     // general statistics
    649     //
    650     StatisticsPointer->Index  = Index;
    651     StatisticsPointer->Type   = SmbiosStruct.Hdr->Type;
    652     StatisticsPointer->Handle = SmbiosStruct.Hdr->Handle;
    653     StatisticsPointer->Length = Length;
    654     StatisticsPointer->Addr   = Offset;
    655 
    656     Offset = (UINT16) (Offset + Length);
    657 
    658     StatisticsPointer         = &mStatisticsTable[Index];
    659   }
    660 
    661   return EFI_SUCCESS;
    662 }
    663 
    664 /**
    665   @param[in]  Smbios64EntryPoint          SMBIOS 64-bit entry point.
    666   @param[out] NumberOfSmbios64Structures  The number of structures in 64-bit SMBIOS table.
    667   @param[out] Smbios64TableLength         The total length of 64-bit SMBIOS table.
    668 
    669   @retval EFI_SUCCESS           					Calculation was successful.
    670 **/
    671 EFI_STATUS
    672 CalculateSmbios64BitStructureCountAndLength (
    673   SMBIOS_TABLE_3_0_ENTRY_POINT    *Smbios64EntryPoint,
    674   UINTN                           *NumberOfSmbios64Structures,
    675   UINTN                           *Smbios64TableLength
    676 )
    677 {
    678   SMBIOS_STRUCTURE_POINTER        Smbios;
    679   UINT8                           *Raw;
    680 
    681   *Smbios64TableLength = 0;
    682   *NumberOfSmbios64Structures = 0;
    683 
    684   Smbios.Raw = (UINT8 *)(UINTN)(Smbios64EntryPoint->TableAddress);
    685   while (TRUE) {
    686     if (Smbios.Hdr->Type == 127) {
    687       //
    688       // Reach the end of table type 127
    689       //
    690       (*NumberOfSmbios64Structures)++;
    691       (*Smbios64TableLength) += sizeof (SMBIOS_STRUCTURE);
    692       return EFI_SUCCESS;
    693     }
    694 
    695     Raw = Smbios.Raw;
    696     //
    697     // Walk to next structure
    698     //
    699     LibGetSmbiosString (&Smbios, (UINT16) (-1));
    700     //
    701     // Length = Next structure head - this structure head
    702     //
    703     (*Smbios64TableLength) += (UINTN) (Smbios.Raw - Raw);
    704     if ((*Smbios64TableLength) > Smbios64EntryPoint->TableMaximumSize) {
    705     	//
    706     	// The actual table length exceeds maximum table size,
    707     	// There should be something wrong with SMBIOS table.
    708     	//
    709     	return EFI_INVALID_PARAMETER;
    710     }
    711     (*NumberOfSmbios64Structures)++;
    712   }
    713 }
    714 
    715 /**
    716   Function to initialize the global mSmbios64BitStatisticsTable object.
    717 
    718   @retval EFI_SUCCESS           print is successful.
    719 **/
    720 EFI_STATUS
    721 InitSmbios64BitTableStatistics (
    722   VOID
    723   )
    724 {
    725   UINT16                    Handle;
    726   UINT8                     *Buffer;
    727   UINT16                    Length;
    728   UINT16                    Offset;
    729   UINT16                    Index;
    730 	EFI_STATUS								Status;
    731   SMBIOS_STRUCTURE_POINTER      SmbiosStruct;
    732   SMBIOS_TABLE_3_0_ENTRY_POINT  *SMBiosTable;
    733   STRUCTURE_STATISTICS          *StatisticsPointer;
    734 
    735   SMBiosTable = NULL;
    736   LibSmbios64BitGetEPS (&SMBiosTable);
    737   if (SMBiosTable == NULL) {
    738     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_TABLE), gShellDebug1HiiHandle);
    739     return EFI_NOT_FOUND;
    740   }
    741 
    742   if (CompareMem (SMBiosTable->AnchorString, "_SM3_", 5) != 0) {
    743     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_SMBIOS_TABLE), gShellDebug1HiiHandle);
    744     return EFI_INVALID_PARAMETER;
    745   }
    746   //
    747   // Allocate memory to mSmbios64BitStatisticsTable
    748   //
    749   if (mSmbios64BitStatisticsTable != NULL) {
    750     FreePool (mSmbios64BitStatisticsTable);
    751     mSmbios64BitStatisticsTable = NULL;
    752   }
    753   //
    754   // Calculate number of smbios structures
    755   //
    756   Status = CalculateSmbios64BitStructureCountAndLength (SMBiosTable, &mNumberOfSmbios64BitStructures, &mSmbios64BitTableLength);
    757   if ((EFI_ERROR (Status)) || (mSmbios64BitTableLength > SMBiosTable->TableMaximumSize)) {
    758   	return EFI_INVALID_PARAMETER;
    759   }
    760 
    761   mSmbios64BitStatisticsTable = (STRUCTURE_STATISTICS *) AllocateZeroPool (mNumberOfSmbios64BitStructures * sizeof (STRUCTURE_STATISTICS));
    762 
    763   if (mSmbios64BitStatisticsTable == NULL) {
    764     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_OUT_OF_MEM), gShellDebug1HiiHandle);
    765     return EFI_OUT_OF_RESOURCES;
    766   }
    767 
    768   Offset      = 0;
    769   StatisticsPointer = mSmbios64BitStatisticsTable;
    770 
    771   //
    772   // search from the first one
    773   //
    774   Handle = INVALID_HANDLE;
    775   LibGetSmbios64BitStructure (&Handle, NULL, NULL);
    776   for (Index = 1; Index <= mNumberOfSmbios64BitStructures; Index++) {
    777     //
    778     // If reach the end of table, break..
    779     //
    780     if (Handle == INVALID_HANDLE) {
    781       break;
    782     }
    783     //
    784     // After LibGetSmbios64BitStructure(), handle then point to the next!
    785     //
    786     if (LibGetSmbios64BitStructure (&Handle, &Buffer, &Length) != DMI_SUCCESS) {
    787       break;
    788     }
    789 
    790     SmbiosStruct.Raw = Buffer;
    791 
    792     //
    793     // general statistics
    794     //
    795     StatisticsPointer->Index  = Index;
    796     StatisticsPointer->Type   = SmbiosStruct.Hdr->Type;
    797     StatisticsPointer->Handle = SmbiosStruct.Hdr->Handle;
    798     StatisticsPointer->Length = Length;
    799     StatisticsPointer->Addr   = Offset;
    800 
    801     Offset = (UINT16) (Offset + Length);
    802 
    803     StatisticsPointer         = &mSmbios64BitStatisticsTable[Index];
    804   }
    805 
    806   return EFI_SUCCESS;
    807 }
    808 
    809 /**
    810   Function to display the global mStatisticsTable object.
    811 
    812   @param[in] Option             ECHO, NORMAL, or DETAIL control the amount of detail displayed.
    813 
    814   @retval EFI_SUCCESS           print is successful.
    815 **/
    816 EFI_STATUS
    817 DisplayStatisticsTable (
    818   IN   UINT8   Option
    819   )
    820 {
    821   UINTN                    Index;
    822   UINTN                    Num;
    823   STRUCTURE_STATISTICS     *StatisticsPointer;
    824   SMBIOS_TABLE_ENTRY_POINT *SMBiosTable;
    825 
    826   SMBiosTable = NULL;
    827   if (Option < SHOW_OUTLINE) {
    828     return EFI_SUCCESS;
    829   }
    830   //
    831   // display EPS information firstly
    832   //
    833   LibSmbiosGetEPS (&SMBiosTable);
    834   if (SMBiosTable == NULL) {
    835     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_TABLE), gShellDebug1HiiHandle);
    836     return EFI_UNSUPPORTED;
    837   }
    838 
    839   ShellPrintEx(-1,-1,L"\n============================================================\n");
    840   SmbiosPrintEPSInfo (SMBiosTable, Option);
    841 
    842   if (Option < SHOW_NORMAL) {
    843     return EFI_SUCCESS;
    844   }
    845 
    846   if (mStatisticsTable == NULL) {
    847     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_STATS), gShellDebug1HiiHandle);
    848     return EFI_NOT_FOUND;
    849   }
    850 
    851   ShellPrintEx(-1,-1,L"============================================================\n");
    852   StatisticsPointer = &mStatisticsTable[0];
    853   Num         = SMBiosTable->NumberOfSmbiosStructures;
    854   //
    855   // display statistics table content
    856   //
    857   for (Index = 1; Index <= Num; Index++) {
    858     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_INDEX), gShellDebug1HiiHandle, StatisticsPointer->Index);
    859     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_TYPE), gShellDebug1HiiHandle, StatisticsPointer->Type);
    860     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_HANDLE), gShellDebug1HiiHandle, StatisticsPointer->Handle);
    861     if (Option >= SHOW_DETAIL) {
    862       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_OFFSET), gShellDebug1HiiHandle, StatisticsPointer->Addr);
    863       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_LENGTH), gShellDebug1HiiHandle, StatisticsPointer->Length);
    864     }
    865 
    866     ShellPrintEx(-1,-1,L"\n");
    867     StatisticsPointer = &mStatisticsTable[Index];
    868 /*
    869     //
    870     // Display 20 lines and wait for a page break
    871     //
    872     if (Index % 20 == 0) {
    873       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_ENTER_CONTINUE), gShellDebug1HiiHandle);
    874       Status = WaitEnter ();
    875       if (EFI_ERROR (Status)) {
    876         if (Status == EFI_ABORTED) {
    877           return EFI_SUCCESS;
    878         }
    879 
    880         return Status;
    881       }
    882     }
    883 */
    884   }
    885 
    886   return EFI_SUCCESS;
    887 }
    888 
    889 /**
    890   Function to display the global mSmbios64BitStatisticsTable object.
    891 
    892   @param[in] Option             ECHO, NORMAL, or DETAIL control the amount of detail displayed.
    893 
    894   @retval EFI_SUCCESS           print is successful.
    895 **/
    896 EFI_STATUS
    897 DisplaySmbios64BitStatisticsTable (
    898   IN   UINT8   Option
    899   )
    900 {
    901   UINTN                    Index;
    902   UINTN                    Num;
    903   STRUCTURE_STATISTICS     *StatisticsPointer;
    904   SMBIOS_TABLE_3_0_ENTRY_POINT *SMBiosTable;
    905 
    906   SMBiosTable = NULL;
    907   if (Option < SHOW_OUTLINE) {
    908     return EFI_SUCCESS;
    909   }
    910   //
    911   // display EPS information firstly
    912   //
    913   LibSmbios64BitGetEPS (&SMBiosTable);
    914   if (SMBiosTable == NULL) {
    915     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_TABLE), gShellDebug1HiiHandle);
    916     return EFI_UNSUPPORTED;
    917   }
    918 
    919   ShellPrintEx(-1,-1,L"\n============================================================\n");
    920   Smbios64BitPrintEPSInfo (SMBiosTable, Option);
    921 
    922   if (Option < SHOW_NORMAL) {
    923     return EFI_SUCCESS;
    924   }
    925 
    926   if (mSmbios64BitStatisticsTable == NULL) {
    927     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_STATS), gShellDebug1HiiHandle);
    928     return EFI_NOT_FOUND;
    929   }
    930 
    931   ShellPrintEx(-1,-1,L"============================================================\n");
    932   StatisticsPointer = &mSmbios64BitStatisticsTable[0];
    933   Num         = mNumberOfSmbios64BitStructures;
    934   //
    935   // display statistics table content
    936   //
    937   for (Index = 1; Index <= Num; Index++) {
    938     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_INDEX), gShellDebug1HiiHandle, StatisticsPointer->Index);
    939     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_TYPE), gShellDebug1HiiHandle, StatisticsPointer->Type);
    940     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_HANDLE), gShellDebug1HiiHandle, StatisticsPointer->Handle);
    941     if (Option >= SHOW_DETAIL) {
    942       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_OFFSET), gShellDebug1HiiHandle, StatisticsPointer->Addr);
    943       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_LENGTH), gShellDebug1HiiHandle, StatisticsPointer->Length);
    944     }
    945 
    946     ShellPrintEx(-1,-1,L"\n");
    947     StatisticsPointer = &mSmbios64BitStatisticsTable[Index];
    948 /*
    949     //
    950     // Display 20 lines and wait for a page break
    951     //
    952     if (Index % 20 == 0) {
    953       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_ENTER_CONTINUE), gShellDebug1HiiHandle);
    954       Status = WaitEnter ();
    955       if (EFI_ERROR (Status)) {
    956         if (Status == EFI_ABORTED) {
    957           return EFI_SUCCESS;
    958         }
    959 
    960         return Status;
    961       }
    962     }
    963 */
    964   }
    965 
    966   return EFI_SUCCESS;
    967 }
    968 
    969 /**
    970   function to return a string of the detail level.
    971 
    972   @param[in] ShowType         The detail level whose name is desired in clear text.
    973 
    974   @return   A pointer to a string representing the ShowType (or 'undefined type' if not known).
    975 **/
    976 CHAR16 *
    977 GetShowTypeString (
    978   UINT8 ShowType
    979   )
    980 {
    981   //
    982   // show type
    983   //
    984   switch (ShowType) {
    985 
    986   case SHOW_NONE:
    987     return L"SHOW_NONE";
    988 
    989   case SHOW_OUTLINE:
    990     return L"SHOW_OUTLINE";
    991 
    992   case SHOW_NORMAL:
    993     return L"SHOW_NORMAL";
    994 
    995   case SHOW_DETAIL:
    996     return L"SHOW_DETAIL";
    997 
    998   case SHOW_ALL:
    999     return L"SHOW_ALL";
   1000 
   1001   default:
   1002     return L"Undefined type";
   1003   }
   1004 }
   1005 
   1006