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