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