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