• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
ShellCommandRunSmbiosView(IN EFI_HANDLE ImageHandle,IN EFI_SYSTEM_TABLE * SystemTable)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
SMBiosView(IN UINT8 QueryType,IN UINT16 QueryHandle,IN UINT8 Option,IN BOOLEAN RandomView)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
SMBios64View(IN UINT8 QueryType,IN UINT16 QueryHandle,IN UINT8 Option,IN BOOLEAN RandomView)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
InitSmbiosTableStatistics(VOID)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
CalculateSmbios64BitStructureCountAndLength(SMBIOS_TABLE_3_0_ENTRY_POINT * Smbios64EntryPoint,UINTN * NumberOfSmbios64Structures,UINTN * Smbios64TableLength)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
InitSmbios64BitTableStatistics(VOID)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
DisplayStatisticsTable(IN UINT8 Option)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
DisplaySmbios64BitStatisticsTable(IN UINT8 Option)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
GetShowTypeString(UINT8 ShowType)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