]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/SmbiosView.c
initialize variable before error returns.
[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
3737ac2b 4 Copyright (c) 2005 - 2011, Intel Corporation. All rights reserved.<BR>\r
5d73d92f 5 This program and the accompanying materials\r
6 are licensed and made available under the terms and conditions of the BSD License\r
7 which accompanies this distribution. The full text of the license may be found at\r
8 http://opensource.org/licenses/bsd-license.php\r
9\r
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "../UefiShellDebug1CommandsLib.h"\r
16#include "LibSmbiosView.h"\r
17#include "smbiosview.h"\r
18#include "PrintInfo.h"\r
19#include "QueryTable.h"\r
20\r
21UINT8 gShowType = SHOW_DETAIL;\r
22STATIC STRUCTURE_STATISTICS *mStatisticsTable = NULL;\r
23\r
24UINT8 SmbiosMajorVersion;\r
25UINT8 SmbiosMinorVersion;\r
26\r
27STATIC CONST SHELL_PARAM_ITEM ParamList[] = {\r
28 {L"-t", TypeValue},\r
29 {L"-h", TypeValue},\r
30 {L"-s", TypeFlag},\r
31 {L"-a", TypeFlag},\r
32 {NULL, TypeMax}\r
33 };\r
34\r
35SHELL_STATUS\r
36EFIAPI\r
37ShellCommandRunSmbiosView (\r
38 IN EFI_HANDLE ImageHandle,\r
39 IN EFI_SYSTEM_TABLE *SystemTable\r
40 )\r
41{\r
42 UINT8 StructType;\r
43 UINT16 StructHandle;\r
44 EFI_STATUS Status;\r
45 BOOLEAN RandomView;\r
46 LIST_ENTRY *Package;\r
47 CHAR16 *ProblemParam;\r
48 SHELL_STATUS ShellStatus;\r
49 CONST CHAR16 *Temp;\r
50\r
51 mStatisticsTable = NULL;\r
52 Package = NULL;\r
53 ShellStatus = SHELL_SUCCESS;\r
54\r
3737ac2b 55 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
5d73d92f 56 if (EFI_ERROR(Status)) {\r
57 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
58 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, ProblemParam);\r
59 FreePool(ProblemParam);\r
60 ShellStatus = SHELL_INVALID_PARAMETER;\r
61 } else {\r
62 ASSERT(FALSE);\r
63 }\r
64 } else {\r
65 if (ShellCommandLineGetCount(Package) > 1) {\r
66 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle);\r
67 ShellStatus = SHELL_INVALID_PARAMETER;\r
3737ac2b 68 } else if (\r
69 (ShellCommandLineGetFlag(Package, L"-t") && ShellCommandLineGetFlag(Package, L"-h")) ||\r
70 (ShellCommandLineGetFlag(Package, L"-t") && ShellCommandLineGetFlag(Package, L"-s")) ||\r
71 (ShellCommandLineGetFlag(Package, L"-t") && ShellCommandLineGetFlag(Package, L"-a")) ||\r
72 (ShellCommandLineGetFlag(Package, L"-h") && ShellCommandLineGetFlag(Package, L"-s")) ||\r
73 (ShellCommandLineGetFlag(Package, L"-h") && ShellCommandLineGetFlag(Package, L"-a")) ||\r
74 (ShellCommandLineGetFlag(Package, L"-s") && ShellCommandLineGetFlag(Package, L"-a"))\r
75 ) {\r
76 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle);\r
77 ShellStatus = SHELL_INVALID_PARAMETER;\r
5d73d92f 78 } else {\r
79\r
80 //\r
81 // Init Lib\r
3737ac2b 82 \r
5d73d92f 83 Status = LibSmbiosInit ();\r
84 if (EFI_ERROR (Status)) {\r
85 ShellStatus = SHELL_NOT_FOUND;\r
86 goto Done;\r
87 }\r
88 //\r
89 // build statistics table\r
90 //\r
91 Status = InitSmbiosTableStatistics ();\r
92 if (EFI_ERROR (Status)) {\r
93 ShellStatus = SHELL_NOT_FOUND;\r
94 goto Done;\r
95 }\r
96\r
97 StructType = STRUCTURE_TYPE_RANDOM;\r
98 RandomView = TRUE;\r
99 //\r
100 // Initialize the StructHandle to be the first handle\r
101 //\r
102 StructHandle = STRUCTURE_HANDLE_INVALID;\r
103 LibGetSmbiosStructure (&StructHandle, NULL, NULL);\r
104\r
105 Temp = ShellCommandLineGetValue(Package, L"-t");\r
106 if (Temp != NULL) {\r
107 StructType = (UINT8) ShellStrToUintn (Temp);\r
108 }\r
109\r
110 Temp = ShellCommandLineGetValue(Package, L"-h");\r
111 if (Temp != NULL) {\r
112 RandomView = FALSE;\r
113 StructHandle = (UINT16) ShellStrToUintn(Temp);\r
114 }\r
115\r
116 if (ShellCommandLineGetFlag(Package, L"-s")) {\r
117 Status = DisplayStatisticsTable (SHOW_DETAIL);\r
118 if (EFI_ERROR(Status)) {\r
119 ShellStatus = SHELL_NOT_FOUND;\r
120 }\r
121 goto Done;\r
122 }\r
123\r
124 if (ShellCommandLineGetFlag(Package, L"-a")) {\r
125 gShowType = SHOW_ALL;\r
126 }\r
127 //\r
128 // Show SMBIOS structure information\r
129 //\r
130 Status = SMBiosView (StructType, StructHandle, gShowType, RandomView);\r
131 if (EFI_ERROR(Status)) {\r
132 ShellStatus = SHELL_NOT_FOUND;\r
133 }\r
134 }\r
135 }\r
136Done:\r
137 //\r
138 // Release resources\r
139 //\r
140 if (mStatisticsTable != NULL) {\r
141 //\r
142 // Release statistics table\r
143 //\r
144 FreePool (mStatisticsTable);\r
145 mStatisticsTable = NULL;\r
146 }\r
147\r
148 if (Package != NULL) {\r
149 ShellCommandLineFreeVarList (Package);\r
150 }\r
151\r
152 LibSmbiosCleanup ();\r
153\r
154 return ShellStatus;\r
155}\r
156\r
157/**\r
158 Query all structures Data from SMBIOS table and Display\r
159 the information to users as required display option.\r
160\r
161 @param[in] QueryType Structure type to view.\r
162 @param[in] QueryHandle Structure handle to view.\r
163 @param[in] Option Display option: none,outline,normal,detail.\r
164 @param[in] RandomView Support for -h parameter.\r
165\r
166 @retval EFI_SUCCESS print is successful.\r
167 @retval EFI_BAD_BUFFER_SIZE structure is out of the range of SMBIOS table.\r
168**/\r
169EFI_STATUS\r
170EFIAPI\r
171SMBiosView (\r
172 IN UINT8 QueryType,\r
173 IN UINT16 QueryHandle,\r
174 IN UINT8 Option,\r
175 IN BOOLEAN RandomView\r
176 )\r
177{\r
178 UINT16 Handle;\r
179 UINT8 Buffer[1024];\r
180 //\r
181 // bigger than SMBIOS_STRUCTURE_TABLE.MaxStructureSize\r
182 //\r
183 UINT16 Length;\r
184 UINTN Index;\r
185 UINT16 Offset;\r
186 //\r
187 // address offset from structure table head.\r
188 //\r
189 UINT32 TableHead;\r
190 //\r
191 // structure table head.\r
192 //\r
193\r
194 SMBIOS_STRUCTURE_POINTER pStruct;\r
195 SMBIOS_STRUCTURE_TABLE *SMBiosTable;\r
196\r
197 SMBiosTable = NULL;\r
198 LibSmbiosGetEPS (&SMBiosTable);\r
199 if (SMBiosTable == NULL) {\r
200 ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_TABLE), gShellDebug1HiiHandle);\r
201 return EFI_BAD_BUFFER_SIZE;\r
202 }\r
203\r
204 if (CompareMem (SMBiosTable->AnchorString, "_SM_", 4) == 0) {\r
205 //\r
206 // Have get SMBIOS table\r
207 //\r
208 SmbiosPrintEPSInfo (SMBiosTable, Option);\r
209\r
210 SmbiosMajorVersion = SMBiosTable->MajorVersion;\r
211 SmbiosMinorVersion = SMBiosTable->MinorVersion;\r
212\r
213 ShellPrintEx(-1,-1,L"=========================================================\n");\r
214 ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERY_STRUCT_COND), gShellDebug1HiiHandle);\r
215\r
216 if (QueryType == STRUCTURE_TYPE_RANDOM) {\r
217 ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYTYPE_RANDOM), gShellDebug1HiiHandle);\r
218 } else {\r
219 ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYTYPE), gShellDebug1HiiHandle, QueryType);\r
220 }\r
221\r
222 if (RandomView) {\r
223 ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYHANDLE_RANDOM), gShellDebug1HiiHandle);\r
224 } else {\r
225 ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYHANDLE), gShellDebug1HiiHandle, QueryHandle);\r
226 }\r
227\r
228 ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_SHOWTYPE), gShellDebug1HiiHandle);\r
229 ShellPrintEx(-1,-1,GetShowTypeString (gShowType));\r
230 ShellPrintEx(-1,-1,L"\n\n");\r
231\r
232/*\r
233 //\r
234 // Get internal commands, such as change options.\r
235 //\r
236 Status = WaitEnter ();\r
237 if (EFI_ERROR (Status)) {\r
238 if (Status == EFI_ABORTED) {\r
239 return EFI_SUCCESS;\r
240 }\r
241\r
242 return Status;\r
243 }\r
244*/\r
245\r
246 //\r
247 // Searching and display structure info\r
248 //\r
249 Handle = QueryHandle;\r
250 TableHead = SMBiosTable->TableAddress;\r
251 Offset = 0;\r
252 for (Index = 0; Index < SMBiosTable->NumberOfSmbiosStructures; Index++) {\r
253 //\r
254 // if reach the end of table, break..\r
255 //\r
256 if (Handle == STRUCTURE_HANDLE_INVALID) {\r
257 break;\r
258 }\r
259 //\r
260 // handle then point to the next!\r
261 //\r
262 if (LibGetSmbiosStructure (&Handle, Buffer, &Length) != DMI_SUCCESS) {\r
263 break;\r
264 }\r
265 Offset = (UINT16) (Offset + Length);\r
266 pStruct.Raw = Buffer;\r
267\r
268 //\r
269 // if QueryType==Random, print this structure.\r
270 // if QueryType!=Random, but Hdr->Type==QueryType, also print it.\r
271 // only if QueryType != Random and Hdr->Type != QueryType, skiped it.\r
272 //\r
273 if (QueryType != STRUCTURE_TYPE_RANDOM && pStruct.Hdr->Type != QueryType) {\r
274 continue;\r
275 }\r
276\r
277 ShellPrintEx(-1,-1,L"\n=========================================================\n");\r
278 ShellPrintHiiEx(-1,-1,NULL,\r
279 STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_TYPE_HANDLE_DUMP_STRUCT),\r
280 gShellDebug1HiiHandle,\r
281 pStruct.Hdr->Type,\r
282 pStruct.Hdr->Handle\r
283 );\r
284 ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_INDEX_LENGTH), gShellDebug1HiiHandle, Index, Length);\r
285 //\r
286 // Addr of structure in structure in table\r
287 //\r
288 ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_ADDR), gShellDebug1HiiHandle, TableHead + Offset);\r
289 DumpHex (0, 0, Length, Buffer);\r
290\r
291/*\r
292 //\r
293 // Get internal commands, such as change options.\r
294 //\r
295 Status = WaitEnter ();\r
296 if (EFI_ERROR (Status)) {\r
297 if (Status == EFI_ABORTED) {\r
298 return EFI_SUCCESS;\r
299 }\r
300\r
301 return Status;\r
302 }\r
303*/\r
304\r
305 if (gShowType != SHOW_NONE) {\r
306 //\r
307 // check structure legality\r
308 //\r
309 SmbiosCheckStructure (&pStruct);\r
310\r
311 //\r
312 // Print structure information\r
313 //\r
314 SmbiosPrintStructure (&pStruct, gShowType);\r
315 ShellPrintEx(-1,-1,L"\n");\r
316\r
317/*\r
318 //\r
319 // Get internal commands, such as change options.\r
320 //\r
321 Status = WaitEnter ();\r
322 if (EFI_ERROR (Status)) {\r
323 if (Status == EFI_ABORTED) {\r
324 return EFI_SUCCESS;\r
325 }\r
326\r
327 return Status;\r
328 }\r
329*/\r
330 }\r
331 if (!RandomView) {\r
332 break;\r
333 }\r
334 }\r
335\r
336 ShellPrintEx(-1,-1,L"\n=========================================================\n");\r
337 return EFI_SUCCESS;\r
338 }\r
339\r
340 return EFI_BAD_BUFFER_SIZE;\r
341}\r
342\r
343/**\r
344 Function to initialize the global mStatisticsTable object.\r
345\r
346 @retval EFI_SUCCESS print is successful.\r
347**/\r
348EFI_STATUS\r
349EFIAPI\r
350InitSmbiosTableStatistics (\r
351 VOID\r
352 )\r
353{\r
354 UINT16 Handle;\r
355 UINT8 Buffer[1024];\r
356 UINT16 Length;\r
357 UINT16 Offset;\r
358 UINT16 Index;\r
359\r
360 SMBIOS_STRUCTURE_POINTER pStruct;\r
361 SMBIOS_STRUCTURE_TABLE *SMBiosTable;\r
362 STRUCTURE_STATISTICS *pStatistics;\r
363\r
364 SMBiosTable = NULL;\r
365 LibSmbiosGetEPS (&SMBiosTable);\r
366 if (SMBiosTable == NULL) {\r
367 ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_TABLE), gShellDebug1HiiHandle);\r
368 return EFI_NOT_FOUND;\r
369 }\r
370\r
371 if (CompareMem (SMBiosTable->AnchorString, "_SM_", 4) != 0) {\r
372 ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_SMBIOS_TABLE), gShellDebug1HiiHandle);\r
373 return EFI_INVALID_PARAMETER;\r
374 }\r
375 //\r
376 // Allocate memory to mStatisticsTable\r
377 //\r
378 if (mStatisticsTable != NULL) {\r
379 FreePool (mStatisticsTable);\r
380 mStatisticsTable = NULL;\r
381 }\r
382\r
3737ac2b 383 mStatisticsTable = (STRUCTURE_STATISTICS *) AllocateZeroPool (SMBiosTable->NumberOfSmbiosStructures * sizeof (STRUCTURE_STATISTICS));\r
5d73d92f 384\r
385 if (mStatisticsTable == NULL) {\r
386 ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_OUT_OF_MEM), gShellDebug1HiiHandle);\r
387 return EFI_OUT_OF_RESOURCES;\r
388 }\r
389\r
390 Offset = 0;\r
391 pStatistics = mStatisticsTable;\r
392\r
393 //\r
394 // search from the first one\r
395 //\r
396 Handle = STRUCTURE_HANDLE_INVALID;\r
397 LibGetSmbiosStructure (&Handle, NULL, NULL);\r
398 for (Index = 1; Index <= SMBiosTable->NumberOfSmbiosStructures; Index++) {\r
399 //\r
400 // If reach the end of table, break..\r
401 //\r
402 if (Handle == STRUCTURE_HANDLE_INVALID) {\r
403 break;\r
404 }\r
405 //\r
406 // After LibGetSmbiosStructure(), handle then point to the next!\r
407 //\r
408 if (LibGetSmbiosStructure (&Handle, Buffer, &Length) != DMI_SUCCESS) {\r
409 break;\r
410 }\r
411\r
412 pStruct.Raw = Buffer;\r
413 Offset = (UINT16) (Offset + Length);\r
414\r
415 //\r
416 // general statistics\r
417 //\r
418 pStatistics->Index = Index;\r
419 pStatistics->Type = pStruct.Hdr->Type;\r
420 pStatistics->Handle = pStruct.Hdr->Handle;\r
421 pStatistics->Length = Length;\r
422 pStatistics->Addr = Offset;\r
423\r
424 pStatistics = &mStatisticsTable[Index];\r
425 }\r
426\r
427 return EFI_SUCCESS;\r
428}\r
429\r
430/**\r
431 Function to display the global mStatisticsTable object.\r
432\r
433 @param[in] Option ECHO, NORMAL, or DETAIL control the amount of detail displayed.\r
434\r
435 @retval EFI_SUCCESS print is successful.\r
436**/\r
437EFI_STATUS\r
438EFIAPI\r
439DisplayStatisticsTable (\r
440 IN UINT8 Option\r
441 )\r
442{\r
443 UINTN Index;\r
444 UINTN Num;\r
445 STRUCTURE_STATISTICS *pStatistics;\r
446 SMBIOS_STRUCTURE_TABLE *SMBiosTable;\r
447\r
448 SMBiosTable = NULL;\r
449 if (Option < SHOW_OUTLINE) {\r
450 return EFI_SUCCESS;\r
451 }\r
452 //\r
453 // display EPS information firstly\r
454 //\r
455 LibSmbiosGetEPS (&SMBiosTable);\r
456 if (SMBiosTable == NULL) {\r
457 ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_TABLE), gShellDebug1HiiHandle);\r
458 return EFI_UNSUPPORTED;\r
459 }\r
460\r
461 ShellPrintEx(-1,-1,L"\n============================================================\n");\r
462 SmbiosPrintEPSInfo (SMBiosTable, Option);\r
463\r
464 if (Option < SHOW_NORMAL) {\r
465 return EFI_SUCCESS;\r
466 }\r
467\r
468 if (mStatisticsTable == NULL) {\r
469 ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_STATS), gShellDebug1HiiHandle);\r
470 return EFI_NOT_FOUND;\r
471 }\r
472\r
473 ShellPrintEx(-1,-1,L"============================================================\n");\r
474 pStatistics = &mStatisticsTable[0];\r
475 Num = SMBiosTable->NumberOfSmbiosStructures;\r
476 //\r
477 // display statistics table content\r
478 //\r
479 for (Index = 1; Index <= Num; Index++) {\r
480 ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_INDEX), gShellDebug1HiiHandle, pStatistics->Index);\r
481 ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_TYPE), gShellDebug1HiiHandle, pStatistics->Type);\r
482 ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_HANDLE), gShellDebug1HiiHandle, pStatistics->Handle);\r
483 if (Option >= SHOW_DETAIL) {\r
484 ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_OFFSET), gShellDebug1HiiHandle, pStatistics->Addr);\r
485 ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_LENGTH), gShellDebug1HiiHandle, pStatistics->Length);\r
486 }\r
487\r
488 ShellPrintEx(-1,-1,L"\n");\r
489 pStatistics = &mStatisticsTable[Index];\r
490/*\r
491 //\r
492 // Display 20 lines and wait for a page break\r
493 //\r
494 if (Index % 20 == 0) {\r
495 ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_ENTER_CONTINUE), gShellDebug1HiiHandle);\r
496 Status = WaitEnter ();\r
497 if (EFI_ERROR (Status)) {\r
498 if (Status == EFI_ABORTED) {\r
499 return EFI_SUCCESS;\r
500 }\r
501\r
502 return Status;\r
503 }\r
504 }\r
505*/\r
506 }\r
507\r
508 return EFI_SUCCESS;\r
509}\r
510\r
511/**\r
512 function to return a string of the detail level.\r
513\r
514 @param[in] ShowType The detail level whose name is desired in clear text.\r
515\r
516 @return A pointer to a string representing the ShowType (or 'undefined type' if not known).\r
517**/\r
518CHAR16 *\r
519EFIAPI\r
520GetShowTypeString (\r
521 UINT8 ShowType\r
522 )\r
523{\r
524 //\r
525 // show type\r
526 //\r
527 switch (ShowType) {\r
528\r
529 case SHOW_NONE:\r
530 return L"SHOW_NONE";\r
531\r
532 case SHOW_OUTLINE:\r
533 return L"SHOW_OUTLINE";\r
534\r
535 case SHOW_NORMAL:\r
536 return L"SHOW_NORMAL";\r
537\r
538 case SHOW_DETAIL:\r
539 return L"SHOW_DETAIL";\r
540\r
541 case SHOW_ALL:\r
542 return L"SHOW_ALL";\r
543\r
544 default:\r
545 return L"Undefined type";\r
546 }\r
547}\r
548\r
549/*\r
550EFI_STATUS\r
551InitializeSmbiosViewApplicationGetLineHelp (\r
552 OUT CHAR16 **Str\r
553 )\r
554{\r
555 return LibCmdGetStringByToken (STRING_ARRAY_NAME, &EfiSmbiosViewGuid, STRING_TOKEN (STR_SMBIOSVIEW_LINE_HELP), Str);\r
556}\r
557*/\r