1 /** @file
2   Module for clarifying the content of the smbios structure element information.
3 
4   Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR>
5   (C) Copyright 2014 Hewlett-Packard Development Company, L.P.<BR>
6   (C) Copyright 2015-2017 Hewlett Packard Enterprise Development LP<BR>
7   SPDX-License-Identifier: BSD-2-Clause-Patent
8 
9 **/
10 
11 #include "UefiShellDebug1CommandsLib.h"
12 #include "PrintInfo.h"
13 #include "LibSmbiosView.h"
14 #include "QueryTable.h"
15 #include "EventLogInfo.h"
16 
17 
18 //
19 // Get the certain bit of 'value'
20 //
21 #define BIT(value, bit) ((value) & ((UINT64) 1) << (bit))
22 
23 //
24 // Check if above or equal to version
25 //
26 #define AE_SMBIOS_VERSION(MajorVersion, MinorVersion) \
27   (SmbiosMajorVersion > (MajorVersion) || (SmbiosMajorVersion == (MajorVersion) && SmbiosMinorVersion >= (MinorVersion)))
28 
29 //
30 //////////////////////////////////////////////////////////
31 //  Macros of print structure element, simplify coding.
32 //
33 #define PRINT_PENDING_STRING(pStruct, type, element) \
34   do { \
35     CHAR8 *StringBuf; \
36     StringBuf = LibGetSmbiosString ((pStruct), (pStruct->type->element)); \
37     ShellPrintEx(-1,-1,L"%a",#element); \
38     ShellPrintEx(-1,-1,L": %a\n", (StringBuf != NULL) ? StringBuf: ""); \
39   } while (0);
40 
41 #define PRINT_SMBIOS_STRING(pStruct, stringnumber, element) \
42   do { \
43     CHAR8 *StringBuf; \
44     StringBuf = LibGetSmbiosString ((pStruct), (stringnumber)); \
45     ShellPrintEx(-1,-1,L"%a",#element); \
46     ShellPrintEx(-1,-1,L": %a\n", (StringBuf != NULL) ? StringBuf: ""); \
47   } while (0);
48 
49 #define PRINT_STRUCT_VALUE(pStruct, type, element) \
50   do { \
51     ShellPrintEx(-1,-1,L"%a",#element); \
52     ShellPrintEx(-1,-1,L": %d\n", (pStruct->type->element)); \
53   } while (0);
54 
55 #define PRINT_STRUCT_VALUE_H(pStruct, type, element) \
56   do { \
57     ShellPrintEx(-1,-1,L"%a",#element); \
58     ShellPrintEx(-1,-1,L": 0x%x\n", (pStruct->type->element)); \
59   } while (0);
60 
61 #define PRINT_STRUCT_VALUE_LH(pStruct, type, element) \
62   do { \
63     ShellPrintEx(-1,-1,L"%a",#element); \
64     ShellPrintEx(-1,-1,L": 0x%lx\n", (pStruct->type->element)); \
65   } while (0);
66 
67 #define PRINT_BIT_FIELD(pStruct, type, element, size) \
68   do { \
69     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_DUMP), gShellDebug1HiiHandle); \
70     ShellPrintEx(-1,-1,L"%a",#element); \
71     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SIZE), gShellDebug1HiiHandle, size); \
72     DumpHex (0, 0, size, &(pStruct->type->element)); \
73   } while (0);
74 
75 #define PRINT_SMBIOS_BIT_FIELD(pStruct, startaddress, element, size) \
76   do { \
77     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_DUMP), gShellDebug1HiiHandle); \
78     ShellPrintEx(-1,-1,L"%a",#element); \
79     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SIZE), gShellDebug1HiiHandle, size); \
80     DumpHex (0, 0, size, startaddress); \
81   } while (0);
82 
83 //
84 /////////////////////////////////////////
85 //
86 
87 /**
88   Copy Length of Src buffer to Dest buffer,
89   add a NULL termination to Dest buffer.
90 
91   @param[in, out] Dest  Destination buffer head.
92   @param[in] Src        Source buffer head.
93   @param[in] Length     Length of buffer to be copied.
94 **/
95 VOID
MemToString(IN OUT VOID * Dest,IN VOID * Src,IN UINTN Length)96 MemToString (
97   IN OUT VOID   *Dest,
98   IN VOID       *Src,
99   IN UINTN      Length
100   )
101 {
102   UINT8 *SrcBuffer;
103   UINT8 *DestBuffer;
104   SrcBuffer   = (UINT8 *) Src;
105   DestBuffer  = (UINT8 *) Dest;
106   //
107   // copy byte by byte
108   //
109   while ((Length--)!=0) {
110     *DestBuffer++ = *SrcBuffer++;
111   }
112   //
113   // append a NULL terminator
114   //
115   *DestBuffer = '\0';
116 }
117 
118 //
119 //////////////////////////////////////////////
120 //
121 // Functions below is to show the information
122 //
123 
124 /**
125   Print the info of EPS(Entry Point Structure).
126 
127   @param[in] SmbiosTable    Pointer to the SMBIOS table entry point.
128   @param[in] Option         Display option.
129 **/
130 VOID
SmbiosPrintEPSInfo(IN SMBIOS_TABLE_ENTRY_POINT * SmbiosTable,IN UINT8 Option)131 SmbiosPrintEPSInfo (
132   IN  SMBIOS_TABLE_ENTRY_POINT  *SmbiosTable,
133   IN  UINT8                     Option
134   )
135 {
136   UINT8 Anchor[5];
137   UINT8 InAnchor[6];
138 
139   if (SmbiosTable == NULL) {
140     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SMBIOSTABLE_NULL), gShellDebug1HiiHandle);
141     return ;
142   }
143 
144   if (Option == SHOW_NONE) {
145     return ;
146   }
147 
148   if (Option >= SHOW_NORMAL) {
149     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ENTRY_POINT_SIGN), gShellDebug1HiiHandle);
150     MemToString (Anchor, SmbiosTable->AnchorString, 4);
151     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ANCHOR_STR), gShellDebug1HiiHandle, Anchor);
152     ShellPrintHiiEx(-1,-1,NULL,
153       STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_EPS_CHECKSUM),
154       gShellDebug1HiiHandle,
155       SmbiosTable->EntryPointStructureChecksum
156      );
157     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ENTRY_POINT_LEN), gShellDebug1HiiHandle, SmbiosTable->EntryPointLength);
158     ShellPrintHiiEx(-1,-1,NULL,
159       STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_VERSION),
160       gShellDebug1HiiHandle,
161       SmbiosTable->MajorVersion,
162       SmbiosTable->MinorVersion
163      );
164     ShellPrintHiiEx(-1,-1,NULL,
165       STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_NUMBER_STRUCT),
166       gShellDebug1HiiHandle,
167       SmbiosTable->NumberOfSmbiosStructures
168      );
169     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_MAX_STRUCT_SIZE), gShellDebug1HiiHandle, SmbiosTable->MaxStructureSize);
170     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_TABLE_ADDR), gShellDebug1HiiHandle, SmbiosTable->TableAddress);
171     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_TABLE_LENGTH), gShellDebug1HiiHandle, SmbiosTable->TableLength);
172 
173   }
174   //
175   // If SHOW_ALL, also print followings.
176   //
177   if (Option >= SHOW_DETAIL) {
178     ShellPrintHiiEx(-1,-1,NULL,
179       STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ENTRY_POINT_REVISION),
180       gShellDebug1HiiHandle,
181       SmbiosTable->EntryPointRevision
182      );
183     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BCD_REVISION), gShellDebug1HiiHandle, SmbiosTable->SmbiosBcdRevision);
184     //
185     // Since raw data is not string, add a NULL terminater.
186     //
187     MemToString (InAnchor, SmbiosTable->IntermediateAnchorString, 5);
188     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTER_ACHOR), gShellDebug1HiiHandle, InAnchor);
189     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTER_CHECKSUM), gShellDebug1HiiHandle, SmbiosTable->IntermediateChecksum);
190     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_FORMATTED_AREA), gShellDebug1HiiHandle);
191     DumpHex (2, 0, 5, SmbiosTable->FormattedArea);
192   }
193 
194   Print (L"\n");
195 }
196 
197 /**
198   Print the info of 64-bit EPS(Entry Point Structure).
199 
200   @param[in] SmbiosTable    Pointer to the SMBIOS table entry point.
201   @param[in] Option         Display option.
202 **/
203 VOID
Smbios64BitPrintEPSInfo(IN SMBIOS_TABLE_3_0_ENTRY_POINT * SmbiosTable,IN UINT8 Option)204 Smbios64BitPrintEPSInfo (
205   IN  SMBIOS_TABLE_3_0_ENTRY_POINT  *SmbiosTable,
206   IN  UINT8                         Option
207   )
208 {
209   UINT8 Anchor[5];
210 
211   if (SmbiosTable == NULL) {
212     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SMBIOSTABLE_NULL), gShellDebug1HiiHandle);
213     return ;
214   }
215 
216   if (Option == SHOW_NONE) {
217     return ;
218   }
219 
220   if (Option >= SHOW_NORMAL) {
221     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_64_BIT_ENTRY_POINT_SIGN), gShellDebug1HiiHandle);
222 
223     MemToString (Anchor, SmbiosTable->AnchorString, 5);
224     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ANCHOR_STR), gShellDebug1HiiHandle, Anchor);
225 
226     ShellPrintHiiEx(-1,-1,NULL,
227       STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_EPS_CHECKSUM),
228       gShellDebug1HiiHandle,
229       SmbiosTable->EntryPointStructureChecksum
230      );
231 
232     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ENTRY_POINT_LEN), gShellDebug1HiiHandle, SmbiosTable->EntryPointLength);
233 
234     ShellPrintHiiEx(-1,-1,NULL,
235       STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_VERSION),
236       gShellDebug1HiiHandle,
237       SmbiosTable->MajorVersion,
238       SmbiosTable->MinorVersion
239      );
240 
241     ShellPrintHiiEx(-1,-1,NULL,
242       STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_DOCREV),
243       gShellDebug1HiiHandle,
244       SmbiosTable->DocRev
245      );
246 
247     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_TABLE_MAX_SIZE), gShellDebug1HiiHandle, SmbiosTable->TableMaximumSize);
248 
249     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_TABLE_ADDR), gShellDebug1HiiHandle, SmbiosTable->TableAddress);
250 
251   }
252   //
253   // If SHOW_ALL, also print followings.
254   //
255   if (Option >= SHOW_DETAIL) {
256     ShellPrintHiiEx(-1,-1,NULL,
257       STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ENTRY_POINT_REVISION),
258       gShellDebug1HiiHandle,
259       SmbiosTable->EntryPointRevision
260      );
261   }
262 
263   Print (L"\n");
264 }
265 
266 /**
267   This function print the content of the structure pointed by Struct.
268 
269   @param[in] Struct       Point to the structure to be printed.
270   @param[in] Option       Print option of information detail.
271 
272   @retval EFI_SUCCESS               Successfully Printing this function.
273   @retval EFI_INVALID_PARAMETER     Invalid Structure.
274   @retval EFI_UNSUPPORTED           Unsupported.
275 **/
276 EFI_STATUS
SmbiosPrintStructure(IN SMBIOS_STRUCTURE_POINTER * Struct,IN UINT8 Option)277 SmbiosPrintStructure (
278   IN  SMBIOS_STRUCTURE_POINTER  *Struct,
279   IN  UINT8                     Option
280   )
281 {
282   UINT8 Index;
283   UINT8 *Buffer;
284 
285   if (Struct == NULL) {
286     return EFI_INVALID_PARAMETER;
287   }
288 
289   if (Option == SHOW_NONE) {
290     return EFI_SUCCESS;
291   }
292 
293   Buffer = (UINT8 *) (UINTN) (Struct->Raw);
294 
295   //
296   // Display structure header
297   //
298   DisplayStructureTypeInfo (Struct->Hdr->Type, SHOW_DETAIL);
299   ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_FORMAT_PART_LEN), gShellDebug1HiiHandle, Struct->Hdr->Length);
300   ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_STRUCT_HANDLE), gShellDebug1HiiHandle, Struct->Hdr->Handle);
301 
302   if (Option == SHOW_OUTLINE) {
303     return EFI_SUCCESS;
304   }
305 
306   switch (Struct->Hdr->Type) {
307   //
308   // BIOS Information (Type 0)
309   //
310   case 0:
311     PRINT_PENDING_STRING (Struct, Type0, Vendor);
312     PRINT_PENDING_STRING (Struct, Type0, BiosVersion);
313     PRINT_STRUCT_VALUE_H (Struct, Type0, BiosSegment);
314     PRINT_PENDING_STRING (Struct, Type0, BiosReleaseDate);
315     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIOS_SIZE), gShellDebug1HiiHandle, 64 * (Struct->Type0->BiosSize + 1));
316 
317     DisplayBiosCharacteristics (ReadUnaligned64 ((UINT64 *) (UINTN) &(Struct->Type0->BiosCharacteristics)), Option);
318 
319     if (Struct->Hdr->Length > 0x12) {
320       DisplayBiosCharacteristicsExt1 (Struct->Type0->BIOSCharacteristicsExtensionBytes[0], Option);
321     }
322     if (Struct->Hdr->Length > 0x13) {
323       DisplayBiosCharacteristicsExt2 (Struct->Type0->BIOSCharacteristicsExtensionBytes[1], Option);
324     }
325 
326     if (AE_SMBIOS_VERSION (0x2, 0x4) && (Struct->Hdr->Length > 0x14)) {
327       PRINT_STRUCT_VALUE (Struct, Type0, SystemBiosMajorRelease);
328       PRINT_STRUCT_VALUE (Struct, Type0, SystemBiosMinorRelease);
329       PRINT_STRUCT_VALUE (Struct, Type0, EmbeddedControllerFirmwareMajorRelease);
330       PRINT_STRUCT_VALUE (Struct, Type0, EmbeddedControllerFirmwareMinorRelease);
331     }
332     if (AE_SMBIOS_VERSION (0x3, 0x1) && (Struct->Hdr->Length > 0x18)) {
333       ShellPrintHiiEx (
334         -1,
335         -1,
336         NULL,
337         STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_EXTENDED_BIOS_SIZE),
338         gShellDebug1HiiHandle,
339         Struct->Type0->ExtendedBiosSize.Size,
340         (Struct->Type0->ExtendedBiosSize.Unit == 0x0) ? L"MB": L"GB"
341         );
342     }
343     break;
344 
345   //
346   // System Information (Type 1)
347   //
348   case 1:
349     PRINT_PENDING_STRING (Struct, Type1, Manufacturer);
350     PRINT_PENDING_STRING (Struct, Type1, ProductName);
351     PRINT_PENDING_STRING (Struct, Type1, Version);
352     PRINT_PENDING_STRING (Struct, Type1, SerialNumber);
353     PRINT_BIT_FIELD (Struct, Type1, Uuid, 16);
354     DisplaySystemWakeupType (Struct->Type1->WakeUpType, Option);
355     if (AE_SMBIOS_VERSION (0x2, 0x4) && (Struct->Hdr->Length > 0x19)) {
356       PRINT_PENDING_STRING (Struct, Type1, SKUNumber);
357       PRINT_PENDING_STRING (Struct, Type1, Family);
358     }
359 
360     break;
361 
362   //
363   // Baseboard Information (Type 2)
364   //
365   case 2:
366     PRINT_PENDING_STRING (Struct, Type2, Manufacturer);
367     PRINT_PENDING_STRING (Struct, Type2, ProductName);
368     PRINT_PENDING_STRING (Struct, Type2, Version);
369     PRINT_PENDING_STRING (Struct, Type2, SerialNumber);
370     if (Struct->Hdr->Length > 0x8) {
371       PRINT_PENDING_STRING (Struct, Type2, AssetTag);
372       DisplayBaseBoardFeatureFlags (*(UINT8 *) &Struct->Type2->FeatureFlag, Option);
373       PRINT_PENDING_STRING (Struct, Type2, LocationInChassis);
374       PRINT_STRUCT_VALUE_H (Struct, Type2, ChassisHandle);
375       DisplayBaseBoardBoardType (Struct->Type2->BoardType, Option);
376     }
377     break;
378 
379   //
380   // System Enclosure (Type 3)
381   //
382   case 3:
383     PRINT_PENDING_STRING (Struct, Type3, Manufacturer);
384     PRINT_STRUCT_VALUE (Struct, Type3, Type);
385     DisplaySystemEnclosureType (Struct->Type3->Type, Option);
386     PRINT_PENDING_STRING (Struct, Type3, Version);
387     PRINT_PENDING_STRING (Struct, Type3, SerialNumber);
388     PRINT_PENDING_STRING (Struct, Type3, AssetTag);
389     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BOOTUP_STATE), gShellDebug1HiiHandle);
390     DisplaySystemEnclosureStatus (Struct->Type3->BootupState, Option);
391     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_POWER_SUPPLY_STATE), gShellDebug1HiiHandle);
392     DisplaySystemEnclosureStatus (Struct->Type3->PowerSupplyState, Option);
393     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_THERMAL_STATE), gShellDebug1HiiHandle);
394     DisplaySystemEnclosureStatus (Struct->Type3->ThermalState, Option);
395     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SECURITY_STATUS), gShellDebug1HiiHandle);
396     DisplaySESecurityStatus (Struct->Type3->SecurityStatus, Option);
397     if (AE_SMBIOS_VERSION (0x2, 0x3)) {
398       if (Struct->Hdr->Length > 0xD) {
399         PRINT_BIT_FIELD (Struct, Type3, OemDefined, 4);
400       }
401       if (Struct->Hdr->Length > 0x11) {
402         PRINT_STRUCT_VALUE (Struct, Type3, Height);
403       }
404       if (Struct->Hdr->Length > 0x12) {
405         PRINT_STRUCT_VALUE (Struct, Type3, NumberofPowerCords);
406       }
407     }
408     if (AE_SMBIOS_VERSION (0x2, 0x7) && (Struct->Hdr->Length > 0x13)) {
409       if (Struct->Hdr->Length > (0x15 + (Struct->Type3->ContainedElementCount * Struct->Type3->ContainedElementRecordLength))) {
410         PRINT_SMBIOS_STRING (Struct, Buffer[0x15 + (Struct->Type3->ContainedElementCount * Struct->Type3->ContainedElementRecordLength)], SKUNumber);
411       }
412     }
413     break;
414 
415   //
416   // Processor Information (Type 4)
417   //
418   case 4:
419     PRINT_SMBIOS_STRING (Struct, Struct->Type4->Socket, SocketDesignation)
420     DisplayProcessorType (Struct->Type4->ProcessorType, Option);
421     if (AE_SMBIOS_VERSION (0x2, 0x6) && (Struct->Hdr->Length > 0x28) &&
422         (Struct->Type4->ProcessorFamily == 0xFE)) {
423       //
424       // Get family from ProcessorFamily2 field
425       //
426       DisplayProcessorFamily2 (Struct->Type4->ProcessorFamily2, Option);
427     } else {
428       DisplayProcessorFamily (Struct->Type4->ProcessorFamily, Option);
429     }
430     PRINT_PENDING_STRING (Struct, Type4, ProcessorManufacture);
431     PRINT_BIT_FIELD (Struct, Type4, ProcessorId, 8);
432     PRINT_PENDING_STRING (Struct, Type4, ProcessorVersion);
433     DisplayProcessorVoltage (*(UINT8 *) &(Struct->Type4->Voltage), Option);
434     PRINT_STRUCT_VALUE (Struct, Type4, ExternalClock);
435     PRINT_STRUCT_VALUE (Struct, Type4, MaxSpeed);
436     PRINT_STRUCT_VALUE (Struct, Type4, CurrentSpeed);
437     DisplayProcessorStatus (Struct->Type4->Status, Option);
438     DisplayProcessorUpgrade (Struct->Type4->ProcessorUpgrade, Option);
439     PRINT_STRUCT_VALUE_H (Struct, Type4, L1CacheHandle);
440     PRINT_STRUCT_VALUE_H (Struct, Type4, L2CacheHandle);
441     PRINT_STRUCT_VALUE_H (Struct, Type4, L3CacheHandle);
442     if (AE_SMBIOS_VERSION (0x2, 0x3) && (Struct->Hdr->Length > 0x20)) {
443       PRINT_PENDING_STRING (Struct, Type4, SerialNumber);
444       PRINT_PENDING_STRING (Struct, Type4, AssetTag);
445       PRINT_PENDING_STRING (Struct, Type4, PartNumber);
446     }
447     if (AE_SMBIOS_VERSION (0x2, 0x5) && (Struct->Hdr->Length > 0x23)) {
448       PRINT_STRUCT_VALUE (Struct, Type4, CoreCount);
449       PRINT_STRUCT_VALUE (Struct, Type4, EnabledCoreCount);
450       PRINT_STRUCT_VALUE (Struct, Type4, ThreadCount);
451       DisplayProcessorCharacteristics (Struct->Type4->ProcessorCharacteristics, Option);
452     }
453     if ((SmbiosMajorVersion >= 0x3) && (Struct->Hdr->Length > 0x2A)) {
454       PRINT_STRUCT_VALUE (Struct, Type4, CoreCount2);
455       PRINT_STRUCT_VALUE (Struct, Type4, EnabledCoreCount2);
456       PRINT_STRUCT_VALUE (Struct, Type4, ThreadCount2);
457     }
458     break;
459 
460   //
461   // Memory Controller Information (Type 5)
462   //
463   case 5:
464     {
465       UINT8 SlotNum;
466       SlotNum = Struct->Type5->AssociatedMemorySlotNum;
467 
468       DisplayMcErrorDetectMethod (Struct->Type5->ErrDetectMethod, Option);
469       DisplayMcErrorCorrectCapability (*(UINT8 *) &(Struct->Type5->ErrCorrectCapability), Option);
470       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SUPOPRT), gShellDebug1HiiHandle);
471       DisplayMcInterleaveSupport (Struct->Type5->SupportInterleave, Option);
472       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CURRENT), gShellDebug1HiiHandle);
473       DisplayMcInterleaveSupport (Struct->Type5->CurrentInterleave, Option);
474       DisplayMaxMemoryModuleSize (Struct->Type5->MaxMemoryModuleSize, SlotNum, Option);
475       DisplayMcMemorySpeeds (*(UINT16 *) &(Struct->Type5->SupportSpeed), Option);
476       DisplayMmMemoryType (Struct->Type5->SupportMemoryType, Option);
477       DisplayMemoryModuleVoltage (Struct->Type5->MemoryModuleVoltage, Option);
478       PRINT_STRUCT_VALUE (Struct, Type5, AssociatedMemorySlotNum);
479       //
480       // According to SMBIOS Specification, offset 0x0F
481       //
482       DisplayMemoryModuleConfigHandles ((UINT16 *) (&Buffer[0x0F]), SlotNum, Option);
483       DisplayMcErrorCorrectCapability (Buffer[0x0F + 2 * SlotNum], Option);
484     }
485     break;
486 
487   //
488   // Memory Module Information (Type 6)
489   //
490   case 6:
491     PRINT_PENDING_STRING (Struct, Type6, SocketDesignation);
492     DisplayMmBankConnections (Struct->Type6->BankConnections, Option);
493     PRINT_STRUCT_VALUE (Struct, Type6, CurrentSpeed);
494     DisplayMmMemoryType (*(UINT16 *) &(Struct->Type6->CurrentMemoryType), Option);
495     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INSTALLED), gShellDebug1HiiHandle);
496     DisplayMmMemorySize (*(UINT8 *) &(Struct->Type6->InstalledSize), Option);
497     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ENABLED), gShellDebug1HiiHandle);
498     DisplayMmMemorySize (*(UINT8 *) &(Struct->Type6->EnabledSize), Option);
499     DisplayMmErrorStatus (Struct->Type6->ErrorStatus, Option);
500     break;
501 
502   //
503   // Cache Information (Type 7)
504   //
505   case 7:
506     PRINT_PENDING_STRING (Struct, Type7, SocketDesignation);
507     DisplayCacheConfiguration (Struct->Type7->CacheConfiguration, Option);
508     PRINT_STRUCT_VALUE_H (Struct, Type7, MaximumCacheSize);
509     PRINT_STRUCT_VALUE_H (Struct, Type7, InstalledSize);
510     PRINT_STRUCT_VALUE_H (Struct, Type7, SupportedSRAMType);
511     PRINT_STRUCT_VALUE_H (Struct, Type7, CurrentSRAMType);
512     DisplayCacheSRAMType (ReadUnaligned16 ((UINT16 *) (UINTN) &(Struct->Type7->CurrentSRAMType)), Option);
513     PRINT_STRUCT_VALUE_H (Struct, Type7, CacheSpeed);
514     DisplayCacheErrCorrectingType (Struct->Type7->ErrorCorrectionType, Option);
515     DisplayCacheSystemCacheType (Struct->Type7->SystemCacheType, Option);
516     DisplayCacheAssociativity (Struct->Type7->Associativity, Option);
517     if (AE_SMBIOS_VERSION (0x3, 0x1) && (Struct->Hdr->Length > 0x13)) {
518       PRINT_STRUCT_VALUE_H (Struct, Type7, MaximumCacheSize2);
519       PRINT_STRUCT_VALUE_H (Struct, Type7, InstalledSize2);
520     }
521     break;
522 
523   //
524   // Port Connector Information  (Type 8)
525   //
526   case 8:
527     PRINT_PENDING_STRING (Struct, Type8, InternalReferenceDesignator);
528     Print (L"Internal ");
529     DisplayPortConnectorType (Struct->Type8->InternalConnectorType, Option);
530     PRINT_PENDING_STRING (Struct, Type8, ExternalReferenceDesignator);
531     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_EXTERNAL), gShellDebug1HiiHandle);
532     DisplayPortConnectorType (Struct->Type8->ExternalConnectorType, Option);
533     DisplayPortType (Struct->Type8->PortType, Option);
534     break;
535 
536   //
537   // System Slots (Type 9)
538   //
539   case 9:
540     {
541       MISC_SLOT_PEER_GROUP  *PeerGroupPtr;
542       UINT8                 PeerGroupCount;
543 
544       PRINT_PENDING_STRING (Struct, Type9, SlotDesignation);
545       DisplaySystemSlotType (Struct->Type9->SlotType, Option);
546       DisplaySystemSlotDataBusWidth (Struct->Type9->SlotDataBusWidth, Option);
547       DisplaySystemSlotCurrentUsage (Struct->Type9->CurrentUsage, Option);
548       DisplaySystemSlotLength (Struct->Type9->SlotLength, Option);
549       DisplaySystemSlotId (
550         Struct->Type9->SlotID,
551         Struct->Type9->SlotType,
552         Option
553        );
554       DisplaySlotCharacteristics1 (*(UINT8 *) &(Struct->Type9->SlotCharacteristics1), Option);
555       DisplaySlotCharacteristics2 (*(UINT8 *) &(Struct->Type9->SlotCharacteristics2), Option);
556       if (AE_SMBIOS_VERSION (0x2, 0x6) && (Struct->Hdr->Length > 0xD)) {
557         PRINT_STRUCT_VALUE_H (Struct, Type9, SegmentGroupNum);
558         PRINT_STRUCT_VALUE_H (Struct, Type9, BusNum);
559         PRINT_STRUCT_VALUE_H (Struct, Type9, DevFuncNum);
560       }
561       if (AE_SMBIOS_VERSION (0x3, 0x2)) {
562         if (Struct->Hdr->Length > 0x11) {
563           PRINT_STRUCT_VALUE (Struct, Type9, DataBusWidth);
564         }
565         if (Struct->Hdr->Length > 0x12) {
566           PRINT_STRUCT_VALUE (Struct, Type9, PeerGroupingCount);
567 
568           PeerGroupCount = Struct->Type9->PeerGroupingCount;
569           PeerGroupPtr   = Struct->Type9->PeerGroups;
570           for (Index = 0; Index < PeerGroupCount; Index++) {
571             ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SLOT_PEER_GROUPS), gShellDebug1HiiHandle, Index + 1);
572             ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SEGMENT_GROUP_NUM), gShellDebug1HiiHandle, PeerGroupPtr[Index].SegmentGroupNum);
573             ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BUS_NUM), gShellDebug1HiiHandle, PeerGroupPtr[Index].BusNum);
574             ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_DEV_FUNC_NUM), gShellDebug1HiiHandle, PeerGroupPtr[Index].DevFuncNum);
575             ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_DATA_BUS_WIDTH), gShellDebug1HiiHandle, PeerGroupPtr[Index].DataBusWidth);
576           }
577         }
578       }
579     }
580     break;
581 
582   //
583   // On Board Devices Information (Type 10)
584   //
585   case 10:
586     {
587       UINTN NumOfDevice;
588       NumOfDevice = (Struct->Type10->Hdr.Length - sizeof (SMBIOS_STRUCTURE)) / (2 * sizeof (UINT8));
589       for (Index = 0; Index < NumOfDevice; Index++) {
590         ShellPrintEx(-1,-1,(((Struct->Type10->Device[Index].DeviceType) & 0x80) != 0) ? L"Device Enabled\n": L"Device Disabled\n");
591         DisplayOnboardDeviceTypes ((Struct->Type10->Device[Index].DeviceType) & 0x7F, Option);
592         ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_DESC_STRING), gShellDebug1HiiHandle);
593         ShellPrintEx(-1,-1,L"%a\n",LibGetSmbiosString (Struct, Struct->Type10->Device[Index].DescriptionString));
594       }
595     }
596     break;
597 
598   //
599   // Oem Strings (Type 11)
600   //
601   case 11:
602     PRINT_STRUCT_VALUE (Struct, Type11, StringCount);
603     for (Index = 1; Index <= Struct->Type11->StringCount; Index++) {
604       ShellPrintEx(-1,-1,L"%a\n", LibGetSmbiosString (Struct, Index));
605     }
606     break;
607 
608   //
609   // System Configuration Options (Type 12)
610   //
611   case 12:
612     PRINT_STRUCT_VALUE (Struct, Type12, StringCount);
613     for (Index = 1; Index <= Struct->Type12->StringCount; Index++) {
614       ShellPrintEx(-1,-1,L"%a\n", LibGetSmbiosString (Struct, Index));
615     }
616     break;
617 
618   //
619   // BIOS Language Information (Type 13)
620   //
621   case 13:
622     PRINT_STRUCT_VALUE (Struct, Type13, InstallableLanguages);
623     PRINT_STRUCT_VALUE (Struct, Type13, Flags);
624     PRINT_BIT_FIELD (Struct, Type13, Reserved, 15);
625     PRINT_PENDING_STRING (Struct, Type13, CurrentLanguages);
626     break;
627 
628   //
629   // Group Associations (Type 14)
630   //
631   case 14:
632     {
633       UINT8 NumOfItem;
634       NumOfItem = (Struct->Type14->Hdr.Length - 5) / 3;
635       PRINT_PENDING_STRING (Struct, Type14, GroupName);
636       for (Index = 0; Index < NumOfItem; Index++) {
637         ShellPrintEx(-1,-1,L"ItemType %d: %d\n", Index + 1, Struct->Type14->Group[Index].ItemType);
638         ShellPrintEx(-1,-1,L"ItemHandle %d: %d\n", Index + 1, Struct->Type14->Group[Index].ItemHandle);
639       }
640     }
641     break;
642 
643   //
644   // System Event Log (Type 15)
645   //
646   case 15:
647     {
648       EVENT_LOG_TYPE  *Ptr;
649       UINT8           Count;
650       UINT8           *AccessMethodAddress;
651 
652       PRINT_STRUCT_VALUE_H (Struct, Type15, LogAreaLength);
653       PRINT_STRUCT_VALUE_H (Struct, Type15, LogHeaderStartOffset);
654       PRINT_STRUCT_VALUE_H (Struct, Type15, LogDataStartOffset);
655       DisplaySELAccessMethod (Struct->Type15->AccessMethod, Option);
656       PRINT_STRUCT_VALUE_H (Struct, Type15, AccessMethodAddress);
657       DisplaySELLogStatus (Struct->Type15->LogStatus, Option);
658       PRINT_STRUCT_VALUE_H (Struct, Type15, LogChangeToken);
659       DisplaySysEventLogHeaderFormat (Struct->Type15->LogHeaderFormat, Option);
660       PRINT_STRUCT_VALUE_H (Struct, Type15, NumberOfSupportedLogTypeDescriptors);
661       PRINT_STRUCT_VALUE_H (Struct, Type15, LengthOfLogTypeDescriptor);
662 
663       Count = Struct->Type15->NumberOfSupportedLogTypeDescriptors;
664       if (Count > 0) {
665         Ptr = Struct->Type15->EventLogTypeDescriptors;
666 
667         //
668         // Display all Event Log type descriptors supported by system
669         //
670         for (Index = 0; Index < Count; Index++, Ptr++) {
671           ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SUPOPRTED_EVENT), gShellDebug1HiiHandle, Index + 1);
672           DisplaySELTypes (Ptr->LogType, Option);
673           DisplaySELVarDataFormatType (Ptr->DataFormatType, Option);
674         }
675 
676         if (Option >= SHOW_DETAIL) {
677           switch (Struct->Type15->AccessMethod) {
678           case 03:
679             AccessMethodAddress = (UINT8 *) (UINTN) (Struct->Type15->AccessMethodAddress);
680             break;
681 
682           case 00:
683           case 01:
684           case 02:
685           case 04:
686           default:
687             ShellPrintHiiEx(-1,-1,NULL,
688               STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ACCESS_METHOD_NOT_SUPOPRTED),
689               gShellDebug1HiiHandle,
690               Struct->Type15->AccessMethod
691              );
692             return EFI_UNSUPPORTED;
693           }
694           //
695           // Display Event Log Header
696           //
697           // Starting offset (or index) within the nonvolatile storage
698           // of the event-log's header, from the Access Method Address
699           //
700           DisplaySysEventLogHeader (
701             Struct->Type15->LogHeaderFormat,
702             AccessMethodAddress + Struct->Type15->LogHeaderStartOffset
703            );
704 
705           //
706           // Display all Event Log data
707           //
708           // Starting offset (or index) within the nonvolatile storage
709           // of the event-log's first data byte, from the Access Method Address(0x14)
710           //
711           DisplaySysEventLogData (
712             AccessMethodAddress + Struct->Type15->LogDataStartOffset,
713             (UINT16)
714             (
715               Struct->Type15->LogAreaLength -
716               (Struct->Type15->LogDataStartOffset - Struct->Type15->LogHeaderStartOffset)
717             )
718            );
719         }
720 
721       }
722     }
723     break;
724 
725   //
726   // Physical Memory Array (Type 16)
727   //
728   case 16:
729     DisplayPMALocation (Struct->Type16->Location, Option);
730     DisplayPMAUse (Struct->Type16->Use, Option);
731     DisplayPMAErrorCorrectionTypes (
732       Struct->Type16->MemoryErrorCorrection,
733       Option
734      );
735     PRINT_STRUCT_VALUE_H (Struct, Type16, MaximumCapacity);
736     PRINT_STRUCT_VALUE_H (Struct, Type16, MemoryErrorInformationHandle);
737     PRINT_STRUCT_VALUE_H (Struct, Type16, NumberOfMemoryDevices);
738     if (AE_SMBIOS_VERSION (0x2, 0x7) && Struct->Hdr->Length > 0xF) {
739       PRINT_STRUCT_VALUE_LH (Struct, Type16, ExtendedMaximumCapacity);
740     }
741     break;
742 
743   //
744   // Memory Device (Type 17)
745   //
746   case 17:
747     PRINT_STRUCT_VALUE_H (Struct, Type17, MemoryArrayHandle);
748     PRINT_STRUCT_VALUE_H (Struct, Type17, MemoryErrorInformationHandle);
749     PRINT_STRUCT_VALUE (Struct, Type17, TotalWidth);
750     PRINT_STRUCT_VALUE (Struct, Type17, DataWidth);
751     PRINT_STRUCT_VALUE (Struct, Type17, Size);
752     DisplayMemoryDeviceFormFactor (Struct->Type17->FormFactor, Option);
753     PRINT_STRUCT_VALUE_H (Struct, Type17, DeviceSet);
754     PRINT_PENDING_STRING (Struct, Type17, DeviceLocator);
755     PRINT_PENDING_STRING (Struct, Type17, BankLocator);
756     DisplayMemoryDeviceType (Struct->Type17->MemoryType, Option);
757     DisplayMemoryDeviceTypeDetail (ReadUnaligned16 ((UINT16 *) (UINTN) &(Struct->Type17->TypeDetail)), Option);
758     PRINT_STRUCT_VALUE_H (Struct, Type17, Speed);
759     PRINT_PENDING_STRING (Struct, Type17, Manufacturer);
760     PRINT_PENDING_STRING (Struct, Type17, SerialNumber);
761     PRINT_PENDING_STRING (Struct, Type17, AssetTag);
762     PRINT_PENDING_STRING (Struct, Type17, PartNumber);
763     if (AE_SMBIOS_VERSION (0x2, 0x6) && (Struct->Hdr->Length > 0x1B)) {
764       PRINT_STRUCT_VALUE_H (Struct, Type17, Attributes);
765     }
766     if (AE_SMBIOS_VERSION (0x2, 0x7) && (Struct->Hdr->Length > 0x1C)) {
767       PRINT_STRUCT_VALUE (Struct, Type17, ExtendedSize);
768       PRINT_STRUCT_VALUE (Struct, Type17, ConfiguredMemoryClockSpeed);
769     }
770     if (AE_SMBIOS_VERSION (0x2, 0x8) && (Struct->Hdr->Length > 0x22)) {
771       PRINT_STRUCT_VALUE (Struct, Type17, MinimumVoltage);
772       PRINT_STRUCT_VALUE (Struct, Type17, MaximumVoltage);
773       PRINT_STRUCT_VALUE (Struct, Type17, ConfiguredVoltage);
774     }
775     if (AE_SMBIOS_VERSION (0x3, 0x2)) {
776       if (Struct->Hdr->Length > 0x28) {
777         DisplayMemoryDeviceMemoryTechnology (Struct->Type17->MemoryTechnology, Option);
778         DisplayMemoryDeviceMemoryOperatingModeCapability (Struct->Type17->MemoryOperatingModeCapability.Uint16, Option);
779         PRINT_PENDING_STRING (Struct, Type17, FirwareVersion);
780         PRINT_STRUCT_VALUE_H (Struct, Type17, ModuleManufacturerID);
781         PRINT_STRUCT_VALUE_H (Struct, Type17, ModuleProductID);
782         PRINT_STRUCT_VALUE_H (Struct, Type17, MemorySubsystemControllerManufacturerID);
783         PRINT_STRUCT_VALUE_H (Struct, Type17, MemorySubsystemControllerProductID);
784       }
785       if (Struct->Hdr->Length > 0x34) {
786         PRINT_STRUCT_VALUE_H (Struct, Type17, NonVolatileSize);
787       }
788       if (Struct->Hdr->Length > 0x3C) {
789         PRINT_STRUCT_VALUE_H (Struct, Type17, VolatileSize);
790       }
791       if (Struct->Hdr->Length > 0x44) {
792         PRINT_STRUCT_VALUE_H (Struct, Type17, CacheSize);
793       }
794       if (Struct->Hdr->Length > 0x4C) {
795         PRINT_STRUCT_VALUE_H (Struct, Type17, LogicalSize);
796       }
797     }
798     break;
799 
800   //
801   // 32-bit Memory Error Information (Type 18)
802   //
803   case 18:
804     DisplayMemoryErrorType (Struct->Type18->ErrorType, Option);
805     DisplayMemoryErrorGranularity (
806       Struct->Type18->ErrorGranularity,
807       Option
808      );
809     DisplayMemoryErrorOperation (Struct->Type18->ErrorOperation, Option);
810     PRINT_STRUCT_VALUE_H (Struct, Type18, VendorSyndrome);
811     PRINT_STRUCT_VALUE_H (Struct, Type18, MemoryArrayErrorAddress);
812     PRINT_STRUCT_VALUE_H (Struct, Type18, DeviceErrorAddress);
813     PRINT_STRUCT_VALUE_H (Struct, Type18, ErrorResolution);
814     break;
815 
816   //
817   // Memory Array Mapped Address (Type 19)
818   //
819   case 19:
820     PRINT_STRUCT_VALUE_H (Struct, Type19, StartingAddress);
821     PRINT_STRUCT_VALUE_H (Struct, Type19, EndingAddress);
822     PRINT_STRUCT_VALUE_H (Struct, Type19, MemoryArrayHandle);
823     PRINT_STRUCT_VALUE_H (Struct, Type19, PartitionWidth);
824     if (AE_SMBIOS_VERSION (0x2, 0x7) && (Struct->Hdr->Length > 0xF)) {
825       PRINT_STRUCT_VALUE_LH (Struct, Type19, ExtendedStartingAddress);
826       PRINT_STRUCT_VALUE_LH (Struct, Type19, ExtendedEndingAddress);
827     }
828     break;
829 
830   //
831   // Memory Device Mapped Address (Type 20)
832   //
833   case 20:
834     PRINT_STRUCT_VALUE_H (Struct, Type20, StartingAddress);
835     PRINT_STRUCT_VALUE_H (Struct, Type20, EndingAddress);
836     PRINT_STRUCT_VALUE_H (Struct, Type20, MemoryDeviceHandle);
837     PRINT_STRUCT_VALUE_H (Struct, Type20, MemoryArrayMappedAddressHandle);
838     PRINT_STRUCT_VALUE_H (Struct, Type20, PartitionRowPosition);
839     PRINT_STRUCT_VALUE_H (Struct, Type20, InterleavePosition);
840     PRINT_STRUCT_VALUE_H (Struct, Type20, InterleavedDataDepth);
841     if (AE_SMBIOS_VERSION (0x2, 0x7) && (Struct->Hdr->Length > 0x13)) {
842       PRINT_STRUCT_VALUE_LH (Struct, Type19, ExtendedStartingAddress);
843       PRINT_STRUCT_VALUE_LH (Struct, Type19, ExtendedEndingAddress);
844     }
845     break;
846 
847   //
848   // Built-in Pointing Device (Type 21)
849   //
850   case 21:
851     DisplayPointingDeviceType (Struct->Type21->Type, Option);
852     DisplayPointingDeviceInterface (Struct->Type21->Interface, Option);
853     PRINT_STRUCT_VALUE (Struct, Type21, NumberOfButtons);
854     break;
855 
856   //
857   // Portable Battery (Type 22)
858   //
859   case 22:
860     PRINT_PENDING_STRING (Struct, Type22, Location);
861     PRINT_PENDING_STRING (Struct, Type22, Manufacturer);
862     PRINT_PENDING_STRING (Struct, Type22, ManufactureDate);
863     PRINT_PENDING_STRING (Struct, Type22, SerialNumber);
864     PRINT_PENDING_STRING (Struct, Type22, DeviceName);
865     DisplayPBDeviceChemistry (
866       Struct->Type22->DeviceChemistry,
867       Option
868      );
869     PRINT_STRUCT_VALUE_H (Struct, Type22, DeviceCapacity);
870     PRINT_STRUCT_VALUE_H (Struct, Type22, DesignVoltage);
871     PRINT_PENDING_STRING (Struct, Type22, SBDSVersionNumber);
872     PRINT_STRUCT_VALUE_H (Struct, Type22, MaximumErrorInBatteryData);
873     PRINT_STRUCT_VALUE_H (Struct, Type22, SBDSSerialNumber);
874     DisplaySBDSManufactureDate (
875       Struct->Type22->SBDSManufactureDate,
876       Option
877      );
878     PRINT_PENDING_STRING (Struct, Type22, SBDSDeviceChemistry);
879     PRINT_STRUCT_VALUE_H (Struct, Type22, DesignCapacityMultiplier);
880     PRINT_STRUCT_VALUE_H (Struct, Type22, OEMSpecific);
881     break;
882 
883   //
884   // System Reset (Type 23)
885   //
886   case 23:
887     DisplaySystemResetCapabilities (
888       Struct->Type23->Capabilities,
889       Option
890      );
891     PRINT_STRUCT_VALUE_H (Struct, Type23, ResetCount);
892     PRINT_STRUCT_VALUE_H (Struct, Type23, ResetLimit);
893     PRINT_STRUCT_VALUE_H (Struct, Type23, TimerInterval);
894     PRINT_STRUCT_VALUE_H (Struct, Type23, Timeout);
895     break;
896 
897   //
898   // Hardware Security (Type 24)
899   //
900   case 24:
901     DisplayHardwareSecuritySettings (
902       Struct->Type24->HardwareSecuritySettings,
903       Option
904      );
905     break;
906 
907   //
908   // System Power Controls (Type 25)
909   //
910   case 25:
911     PRINT_STRUCT_VALUE_H (Struct, Type25, NextScheduledPowerOnMonth);
912     PRINT_STRUCT_VALUE_H (Struct, Type25, NextScheduledPowerOnDayOfMonth);
913     PRINT_STRUCT_VALUE_H (Struct, Type25, NextScheduledPowerOnHour);
914     PRINT_STRUCT_VALUE_H (Struct, Type25, NextScheduledPowerOnMinute);
915     PRINT_STRUCT_VALUE_H (Struct, Type25, NextScheduledPowerOnSecond);
916     break;
917 
918   //
919   // Voltage Probe (Type 26)
920   //
921   case 26:
922     PRINT_PENDING_STRING (Struct, Type26, Description);
923     DisplayVPLocation (*(UINT8 *) &(Struct->Type26->LocationAndStatus), Option);
924     DisplayVPStatus (*(UINT8 *) &(Struct->Type26->LocationAndStatus), Option);
925     PRINT_STRUCT_VALUE_H (Struct, Type26, MaximumValue);
926     PRINT_STRUCT_VALUE_H (Struct, Type26, MinimumValue);
927     PRINT_STRUCT_VALUE_H (Struct, Type26, Resolution);
928     PRINT_STRUCT_VALUE_H (Struct, Type26, Tolerance);
929     PRINT_STRUCT_VALUE_H (Struct, Type26, Accuracy);
930     PRINT_STRUCT_VALUE_H (Struct, Type26, OEMDefined);
931     PRINT_STRUCT_VALUE_H (Struct, Type26, NominalValue);
932     break;
933 
934   //
935   // Cooling Device (Type 27)
936   //
937   case 27:
938     PRINT_STRUCT_VALUE_H (Struct, Type27, TemperatureProbeHandle);
939     DisplayCoolingDeviceStatus (*(UINT8 *) &(Struct->Type27->DeviceTypeAndStatus), Option);
940     DisplayCoolingDeviceType (*(UINT8 *) &(Struct->Type27->DeviceTypeAndStatus), Option);
941     PRINT_STRUCT_VALUE_H (Struct, Type27, CoolingUnitGroup);
942     PRINT_STRUCT_VALUE_H (Struct, Type27, OEMDefined);
943     PRINT_STRUCT_VALUE_H (Struct, Type27, NominalSpeed);
944     if (AE_SMBIOS_VERSION (0x2, 0x7) && (Struct->Hdr->Length > 0xE)) {
945       PRINT_PENDING_STRING (Struct, Type27, Description);
946     }
947     break;
948 
949   //
950   // Temperature Probe (Type 28)
951   //
952   case 28:
953     PRINT_PENDING_STRING (Struct, Type28, Description);
954     DisplayTemperatureProbeStatus (*(UINT8 *) &(Struct->Type28->LocationAndStatus), Option);
955     DisplayTemperatureProbeLoc (*(UINT8 *) &(Struct->Type28->LocationAndStatus), Option);
956     PRINT_STRUCT_VALUE_H (Struct, Type28, MaximumValue);
957     PRINT_STRUCT_VALUE_H (Struct, Type28, MinimumValue);
958     PRINT_STRUCT_VALUE_H (Struct, Type28, Resolution);
959     PRINT_STRUCT_VALUE_H (Struct, Type28, Tolerance);
960     PRINT_STRUCT_VALUE_H (Struct, Type28, Accuracy);
961     PRINT_STRUCT_VALUE_H (Struct, Type28, OEMDefined);
962     PRINT_STRUCT_VALUE_H (Struct, Type28, NominalValue);
963     break;
964 
965   //
966   // Electrical Current Probe (Type 29)
967   //
968   case 29:
969     PRINT_PENDING_STRING (Struct, Type29, Description);
970     DisplayECPStatus (*(UINT8 *) &(Struct->Type29->LocationAndStatus), Option);
971     DisplayECPLoc (*(UINT8 *) &(Struct->Type29->LocationAndStatus), Option);
972     PRINT_STRUCT_VALUE_H (Struct, Type29, MaximumValue);
973     PRINT_STRUCT_VALUE_H (Struct, Type29, MinimumValue);
974     PRINT_STRUCT_VALUE_H (Struct, Type29, Resolution);
975     PRINT_STRUCT_VALUE_H (Struct, Type29, Tolerance);
976     PRINT_STRUCT_VALUE_H (Struct, Type29, Accuracy);
977     PRINT_STRUCT_VALUE_H (Struct, Type29, OEMDefined);
978     PRINT_STRUCT_VALUE_H (Struct, Type29, NominalValue);
979     break;
980 
981   //
982   // Out-of-Band Remote Access (Type 30)
983   //
984   case 30:
985     PRINT_PENDING_STRING (Struct, Type30, ManufacturerName);
986     DisplayOBRAConnections (Struct->Type30->Connections, Option);
987     break;
988 
989   //
990   // Boot Integrity Services (BIS) Entry Point (Type 31)
991   //
992   case 31:
993     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_STRUCT_TYPE31), gShellDebug1HiiHandle);
994     break;
995 
996   //
997   // System Boot Information (Type 32)
998   //
999   case 32:
1000     PRINT_BIT_FIELD (Struct, Type32, Reserved, 6);
1001     DisplaySystemBootStatus (Struct->Type32->BootStatus, Option);
1002     break;
1003 
1004   //
1005   // 64-Bit Memory Error Information (Type 33)
1006   //
1007   case 33:
1008     DisplayMemoryErrorType (Struct->Type33->ErrorType, Option);
1009     DisplayMemoryErrorGranularity (
1010       Struct->Type33->ErrorGranularity,
1011       Option
1012      );
1013     DisplayMemoryErrorOperation (Struct->Type33->ErrorOperation, Option);
1014     PRINT_STRUCT_VALUE_H (Struct, Type33, VendorSyndrome);
1015     PRINT_STRUCT_VALUE_LH (Struct, Type33, MemoryArrayErrorAddress);
1016     PRINT_STRUCT_VALUE_LH (Struct, Type33, DeviceErrorAddress);
1017     PRINT_STRUCT_VALUE_H (Struct, Type33, ErrorResolution);
1018     break;
1019 
1020   //
1021   // Management Device (Type 34)
1022   //
1023   case 34:
1024     PRINT_PENDING_STRING (Struct, Type34, Description);
1025     DisplayMDType (Struct->Type34->Type, Option);
1026     PRINT_STRUCT_VALUE_H (Struct, Type34, Address);
1027     DisplayMDAddressType (Struct->Type34->AddressType, Option);
1028     break;
1029 
1030   //
1031   // Management Device Component (Type 35)
1032   //
1033   case 35:
1034     PRINT_PENDING_STRING (Struct, Type35, Description);
1035     PRINT_STRUCT_VALUE_H (Struct, Type35, ManagementDeviceHandle);
1036     PRINT_STRUCT_VALUE_H (Struct, Type35, ComponentHandle);
1037     PRINT_STRUCT_VALUE_H (Struct, Type35, ThresholdHandle);
1038     break;
1039 
1040   //
1041   // Management Device Threshold Data (Type 36)
1042   //
1043   case 36:
1044     PRINT_STRUCT_VALUE_H (Struct, Type36, LowerThresholdNonCritical);
1045     PRINT_STRUCT_VALUE_H (Struct, Type36, UpperThresholdNonCritical);
1046     PRINT_STRUCT_VALUE_H (Struct, Type36, LowerThresholdCritical);
1047     PRINT_STRUCT_VALUE_H (Struct, Type36, UpperThresholdCritical);
1048     PRINT_STRUCT_VALUE_H (Struct, Type36, LowerThresholdNonRecoverable);
1049     PRINT_STRUCT_VALUE_H (Struct, Type36, UpperThresholdNonRecoverable);
1050     break;
1051 
1052   //
1053   // Memory Channel (Type 37)
1054   //
1055   case 37:
1056     {
1057       UINT8          Count;
1058       MEMORY_DEVICE  *Ptr;
1059       DisplayMemoryChannelType (Struct->Type37->ChannelType, Option);
1060       PRINT_STRUCT_VALUE_H (Struct, Type37, MaximumChannelLoad);
1061       PRINT_STRUCT_VALUE_H (Struct, Type37, MemoryDeviceCount);
1062 
1063       Count = Struct->Type37->MemoryDeviceCount;
1064       Ptr   = Struct->Type37->MemoryDevice;
1065       for (Index = 0; Index < Count; Index++) {
1066         ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_MEM_DEVICE), gShellDebug1HiiHandle, Index + 1);
1067         ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_DEV_LOAD), gShellDebug1HiiHandle, Ptr[Index].DeviceLoad);
1068         ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_DEV_HANDLE), gShellDebug1HiiHandle, Ptr[Index].DeviceHandle);
1069       }
1070     }
1071     break;
1072 
1073   //
1074   // IPMI Device Information (Type 38)
1075   //
1076   case 38:
1077     DisplayIPMIDIBMCInterfaceType (Struct->Type38->InterfaceType, Option);
1078     PRINT_STRUCT_VALUE_H (Struct, Type38, IPMISpecificationRevision);
1079     PRINT_STRUCT_VALUE_H (Struct, Type38, I2CSlaveAddress);
1080     PRINT_STRUCT_VALUE_H (Struct, Type38, NVStorageDeviceAddress);
1081     PRINT_STRUCT_VALUE_LH (Struct, Type38, BaseAddress);
1082     break;
1083 
1084   //
1085   // System Power Supply (Type 39)
1086   //
1087   case 39:
1088     PRINT_STRUCT_VALUE_H (Struct, Type39, PowerUnitGroup);
1089     PRINT_PENDING_STRING (Struct, Type39, Location);
1090     PRINT_PENDING_STRING (Struct, Type39, DeviceName);
1091     PRINT_PENDING_STRING (Struct, Type39, Manufacturer);
1092     PRINT_PENDING_STRING (Struct, Type39, SerialNumber);
1093     PRINT_PENDING_STRING (Struct, Type39, AssetTagNumber);
1094     PRINT_PENDING_STRING (Struct, Type39, ModelPartNumber);
1095     PRINT_PENDING_STRING (Struct, Type39, RevisionLevel);
1096     PRINT_STRUCT_VALUE_H (Struct, Type39, MaxPowerCapacity);
1097     DisplaySPSCharacteristics (
1098       *(UINT16 *) &(Struct->Type39->PowerSupplyCharacteristics),
1099       Option
1100      );
1101     PRINT_STRUCT_VALUE_H (Struct, Type39, InputVoltageProbeHandle);
1102     PRINT_STRUCT_VALUE_H (Struct, Type39, CoolingDeviceHandle);
1103     PRINT_STRUCT_VALUE_H (Struct, Type39, InputCurrentProbeHandle);
1104     break;
1105 
1106   //
1107   // Additional Information (Type 40)
1108   //
1109   case 40:
1110     {
1111       UINT8                          NumberOfEntries;
1112       UINT8                          EntryLength;
1113       ADDITIONAL_INFORMATION_ENTRY   *Entries;
1114 
1115       EntryLength     = 0;
1116       Entries         = Struct->Type40->AdditionalInfoEntries;
1117       NumberOfEntries = Struct->Type40->NumberOfAdditionalInformationEntries;
1118 
1119       PRINT_STRUCT_VALUE_H (Struct, Type40, NumberOfAdditionalInformationEntries);
1120 
1121       for (Index = 0; Index < NumberOfEntries; Index++) {
1122         EntryLength = Entries->EntryLength;
1123         ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_ENTRYLEN), gShellDebug1HiiHandle, EntryLength);
1124         ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_REFERENCEDHANDLE), gShellDebug1HiiHandle, Entries->ReferencedHandle);
1125         ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_REFERENCEDOFFSET), gShellDebug1HiiHandle, Entries->ReferencedOffset);
1126         PRINT_SMBIOS_STRING (Struct, Entries->EntryString, String);
1127         PRINT_SMBIOS_BIT_FIELD (Struct, Entries->Value, Value, EntryLength - 5);
1128         Entries = (ADDITIONAL_INFORMATION_ENTRY *) ((UINT8 *)Entries + EntryLength);
1129       }
1130     }
1131     break;
1132 
1133   //
1134   // Onboard Devices Extended Information (Type 41)
1135   //
1136   case 41:
1137     PRINT_PENDING_STRING (Struct, Type41, ReferenceDesignation);
1138     ShellPrintEx(-1,-1,(((Struct->Type41->DeviceType) & 0x80) != 0) ? L"Device Enabled\n": L"Device Disabled\n");
1139     DisplayOnboardDeviceTypes ((Struct->Type41->DeviceType) & 0x7F, Option);
1140     PRINT_STRUCT_VALUE_H (Struct, Type41, DeviceTypeInstance);
1141     PRINT_STRUCT_VALUE_H (Struct, Type41, SegmentGroupNum);
1142     PRINT_STRUCT_VALUE_H (Struct, Type41, BusNum);
1143     PRINT_STRUCT_VALUE_H (Struct, Type41, DevFuncNum);
1144     break;
1145 
1146   //
1147   // Management Controller Host Interface (Type 42)
1148   //
1149   case 42:
1150     DisplayMCHostInterfaceType (Struct->Type42->InterfaceType, Option);
1151     if (AE_SMBIOS_VERSION (0x3, 0x2)) {
1152       PRINT_STRUCT_VALUE_H (Struct, Type42, InterfaceTypeSpecificDataLength);
1153       PRINT_BIT_FIELD (Struct, Type42, InterfaceTypeSpecificData, Struct->Type42->InterfaceTypeSpecificDataLength);
1154     }
1155     break;
1156 
1157   //
1158   // TPM Device (Type 43)
1159   //
1160   case 43:
1161     PRINT_BIT_FIELD (Struct, Type43, VendorID, 4);
1162     PRINT_STRUCT_VALUE_H (Struct, Type43, MajorSpecVersion);
1163     PRINT_STRUCT_VALUE_H (Struct, Type43, MinorSpecVersion);
1164     PRINT_STRUCT_VALUE_H (Struct, Type43, FirmwareVersion1);
1165     PRINT_STRUCT_VALUE_H (Struct, Type43, FirmwareVersion2);
1166     PRINT_PENDING_STRING (Struct, Type43, Description);
1167     DisplayTpmDeviceCharacteristics (ReadUnaligned64 ((UINT64 *) (UINTN) &(Struct->Type43->Characteristics)), Option);
1168     PRINT_STRUCT_VALUE_H (Struct, Type43, OemDefined);
1169     break;
1170 
1171   //
1172   // Inactive (Type 126)
1173   //
1174   case 126:
1175     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INACTIVE_STRUCT), gShellDebug1HiiHandle);
1176     break;
1177 
1178   //
1179   // End-of-Table (Type 127)
1180   //
1181   case 127:
1182     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_THIS_STRUCT_END_TABLE), gShellDebug1HiiHandle);
1183     break;
1184 
1185   default:
1186     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_STRUCT_TYPE_UNDEFINED), gShellDebug1HiiHandle);
1187     break;
1188   }
1189 
1190   return EFI_SUCCESS;
1191 }
1192 
1193 /**
1194   Display BIOS Information (Type 0) information.
1195 
1196   @param[in] Chara    The information bits.
1197   @param[in] Option   The optional information.
1198 **/
1199 VOID
DisplayBiosCharacteristics(IN UINT64 Chara,IN UINT8 Option)1200 DisplayBiosCharacteristics (
1201   IN UINT64  Chara,
1202   IN UINT8   Option
1203   )
1204 {
1205   //
1206   // Print header
1207   //
1208   ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIOS_CHAR), gShellDebug1HiiHandle);
1209   //
1210   // print option
1211   //
1212   PRINT_INFO_OPTION (Chara, Option);
1213 
1214   //
1215   // Check all the bits and print information
1216   // This function does not use Table because table of bits
1217   //   are designed not to deal with UINT64
1218   //
1219   if (BIT (Chara, 0) != 0) {
1220     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_RESERVED_BIT), gShellDebug1HiiHandle);
1221   }
1222 
1223   if (BIT (Chara, 1) != 0) {
1224     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_RESERVED_BIT), gShellDebug1HiiHandle);
1225   }
1226 
1227   if (BIT (Chara, 2) != 0) {
1228     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UNKNOWN_BIT), gShellDebug1HiiHandle);
1229   }
1230 
1231   if (BIT (Chara, 3) != 0) {
1232     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIOS_CHAR_NOT_SUPPORTED), gShellDebug1HiiHandle);
1233   }
1234 
1235   if (BIT (Chara, 4) != 0) {
1236     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ISA_SUPPORTED), gShellDebug1HiiHandle);
1237   }
1238 
1239   if (BIT (Chara, 5) != 0) {
1240     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_MSA_SUPPORTED), gShellDebug1HiiHandle);
1241   }
1242 
1243   if (BIT (Chara, 6) != 0) {
1244     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_EISA_SUPPORTED), gShellDebug1HiiHandle);
1245   }
1246 
1247   if (BIT (Chara, 7) != 0) {
1248     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PCI_SUPPORTED), gShellDebug1HiiHandle);
1249   }
1250 
1251   if (BIT (Chara, 8) != 0) {
1252     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PC_CARD_SUPPORTED), gShellDebug1HiiHandle);
1253   }
1254 
1255   if (BIT (Chara, 9) != 0) {
1256     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PLUG_PLAY_SUPPORTED), gShellDebug1HiiHandle);
1257   }
1258 
1259   if (BIT (Chara, 10) != 0) {
1260     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_APM_SUPPORTED), gShellDebug1HiiHandle);
1261   }
1262 
1263   if (BIT (Chara, 11) != 0) {
1264     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIOS_UPGRADEABLE), gShellDebug1HiiHandle);
1265   }
1266 
1267   if (BIT (Chara, 12) != 0) {
1268     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIOS_SHADOWING), gShellDebug1HiiHandle);
1269   }
1270 
1271   if (BIT (Chara, 13) != 0) {
1272     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_VESA_SUPPORTED), gShellDebug1HiiHandle);
1273   }
1274 
1275   if (BIT (Chara, 14) != 0) {
1276     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ECSD_SUPPORT), gShellDebug1HiiHandle);
1277   }
1278 
1279   if (BIT (Chara, 15) != 0) {
1280     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BOOT_FORM_CD_SUPPORTED), gShellDebug1HiiHandle);
1281   }
1282 
1283   if (BIT (Chara, 16) != 0) {
1284     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SELECTED_BOOT_SUPPORTED), gShellDebug1HiiHandle);
1285   }
1286 
1287   if (BIT (Chara, 17) != 0) {
1288     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIOS_ROM_SOCKETED), gShellDebug1HiiHandle);
1289   }
1290 
1291   if (BIT (Chara, 18) != 0) {
1292     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BOOT_FROM_PC_CARD), gShellDebug1HiiHandle);
1293   }
1294 
1295   if (BIT (Chara, 19) != 0) {
1296     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_EDD_ENHANCED_DRIVER), gShellDebug1HiiHandle);
1297   }
1298 
1299   if (BIT (Chara, 20) != 0) {
1300     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_JAPANESE_FLOPPY_NEC), gShellDebug1HiiHandle);
1301   }
1302 
1303   if (BIT (Chara, 21) != 0) {
1304     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_JAPANESE_FLOPPY_TOSHIBA), gShellDebug1HiiHandle);
1305   }
1306 
1307   if (BIT (Chara, 22) != 0) {
1308     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_FLOPPY_SERVICES_SUPPORTED), gShellDebug1HiiHandle);
1309   }
1310 
1311   if (BIT (Chara, 23) != 0) {
1312     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ONE_POINT_TWO_MB), gShellDebug1HiiHandle);
1313   }
1314 
1315   if (BIT (Chara, 24) != 0) {
1316     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_720_KB), gShellDebug1HiiHandle);
1317   }
1318 
1319   if (BIT (Chara, 25) != 0) {
1320     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_TWO_POINT_EIGHT_EIGHT_MB), gShellDebug1HiiHandle);
1321   }
1322 
1323   if (BIT (Chara, 26) != 0) {
1324     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PRINT_SCREEN_SUPPORT), gShellDebug1HiiHandle);
1325   }
1326 
1327   if (BIT (Chara, 27) != 0) {
1328     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_KEYBOARD_SERV_SUPPORT), gShellDebug1HiiHandle);
1329   }
1330 
1331   if (BIT (Chara, 28) != 0) {
1332     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SERIAL_SERVICES_SUPPORT), gShellDebug1HiiHandle);
1333   }
1334 
1335   if (BIT (Chara, 29) != 0) {
1336     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PRINTER_SERVICES_SUPPORT), gShellDebug1HiiHandle);
1337   }
1338 
1339   if (BIT (Chara, 30) != 0) {
1340     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_MONO_VIDEO_SUPPORT), gShellDebug1HiiHandle);
1341   }
1342 
1343   if (BIT (Chara, 31) != 0) {
1344     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_NEC_PC_98), gShellDebug1HiiHandle);
1345   }
1346   //
1347   // Just print the Reserved
1348   //
1349   ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BITS_32_47), gShellDebug1HiiHandle);
1350   ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BITS_48_64), gShellDebug1HiiHandle);
1351 }
1352 
1353 /**
1354   Display Bios Characteristice extensions1 information.
1355 
1356   @param[in] Byte1    The information.
1357   @param[in] Option   The optional information.
1358 **/
1359 VOID
DisplayBiosCharacteristicsExt1(IN UINT8 Byte1,IN UINT8 Option)1360 DisplayBiosCharacteristicsExt1 (
1361   IN UINT8 Byte1,
1362   IN UINT8 Option
1363   )
1364 {
1365   ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIOS_CHAR_EXTENSION), gShellDebug1HiiHandle);
1366   //
1367   // Print option
1368   //
1369   PRINT_INFO_OPTION (Byte1, Option);
1370 
1371   //
1372   // check bit and print
1373   //
1374   if (BIT (Byte1, 0) != 0) {
1375     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ACPI_SUPPORTED), gShellDebug1HiiHandle);
1376   }
1377 
1378   if (BIT (Byte1, 1) != 0) {
1379     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_USB_LEGACY_SUPPORTED), gShellDebug1HiiHandle);
1380   }
1381 
1382   if (BIT (Byte1, 2) != 0) {
1383     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AGP_SUPPORTED), gShellDebug1HiiHandle);
1384   }
1385 
1386   if (BIT (Byte1, 3) != 0) {
1387     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_I2O_BOOT_SUPPORTED), gShellDebug1HiiHandle);
1388   }
1389 
1390   if (BIT (Byte1, 4) != 0) {
1391     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_LS_120_BOOT_SUPPORTED), gShellDebug1HiiHandle);
1392   }
1393 
1394   if (BIT (Byte1, 5) != 0) {
1395     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ATAPI_ZIP_DRIVE), gShellDebug1HiiHandle);
1396   }
1397 
1398   if (BIT (Byte1, 6) != 0) {
1399     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_1394_BOOT_SUPPORTED), gShellDebug1HiiHandle);
1400   }
1401 
1402   if (BIT (Byte1, 7) != 0) {
1403     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SMART_BATTERY_SUPPORTED), gShellDebug1HiiHandle);
1404   }
1405 }
1406 
1407 /**
1408   Display Bios Characteristice extensions2 information.
1409 
1410   @param[in] byte2    The information.
1411   @param[in] Option   The optional information.
1412 **/
1413 VOID
DisplayBiosCharacteristicsExt2(IN UINT8 byte2,IN UINT8 Option)1414 DisplayBiosCharacteristicsExt2 (
1415   IN UINT8 byte2,
1416   IN UINT8 Option
1417   )
1418 {
1419   ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIOS_CHAR_EXTENSION_2), gShellDebug1HiiHandle);
1420   //
1421   // Print option
1422   //
1423   PRINT_INFO_OPTION (byte2, Option);
1424 
1425   if (BIT (byte2, 0) != 0) {
1426     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIOS_BOOT_SPEC_SUPP), gShellDebug1HiiHandle);
1427   }
1428 
1429   if (BIT (byte2, 1) != 0) {
1430     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_FUNCTION_KEY_INIT), gShellDebug1HiiHandle);
1431   }
1432 
1433   if (AE_SMBIOS_VERSION (0x2, 0x4)) {
1434     if (BIT (byte2, 2) != 0) {
1435       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ENABLE_TAR_CONT_DIST), gShellDebug1HiiHandle);
1436     }
1437     if (AE_SMBIOS_VERSION (0x2, 0x7)) {
1438       if (BIT (byte2, 3) != 0) {
1439         ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UEFI_SPEC_SUPPORT), gShellDebug1HiiHandle);
1440       }
1441       if (BIT (byte2, 4) != 0) {
1442         ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_VIRTUAL_MACHINE), gShellDebug1HiiHandle);
1443       }
1444       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BITS_RSVD_FOR_FUTURE), gShellDebug1HiiHandle, 5);
1445     } else {
1446       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BITS_RSVD_FOR_FUTURE), gShellDebug1HiiHandle, 3);
1447     }
1448   } else {
1449     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BITS_RSVD_FOR_FUTURE), gShellDebug1HiiHandle, 2);
1450   }
1451 }
1452 
1453 /**
1454   Display Processor Information (Type 4) information.
1455 
1456   @param[in] Family       The family value.
1457   @param[in] Option       The option value.
1458 **/
1459 VOID
DisplayProcessorFamily(UINT8 Family,UINT8 Option)1460 DisplayProcessorFamily (
1461   UINT8 Family,
1462   UINT8 Option
1463   )
1464 {
1465   //
1466   // Print prompt message
1467   //
1468   ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PROCESSOR_FAMILY), gShellDebug1HiiHandle);
1469   //
1470   // Print option
1471   //
1472   PRINT_INFO_OPTION (Family, Option);
1473 
1474   //
1475   // Use switch to check
1476   //
1477   switch (Family) {
1478   case 0x01:
1479     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_OTHER), gShellDebug1HiiHandle);
1480     break;
1481 
1482   case 0x02:
1483     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UNKNOWN), gShellDebug1HiiHandle);
1484     break;
1485 
1486   case 0x03:
1487     Print (L"8086\n");
1488     break;
1489 
1490   case 0x04:
1491     Print (L"80286\n");
1492     break;
1493 
1494   case 0x05:
1495     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL386_PROCESSOR), gShellDebug1HiiHandle);
1496     break;
1497 
1498   case 0x06:
1499     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL486_PROCESSOR), gShellDebug1HiiHandle);
1500     break;
1501 
1502   case 0x07:
1503     Print (L"8087\n");
1504     break;
1505 
1506   case 0x08:
1507     Print (L"80287\n");
1508     break;
1509 
1510   case 0x09:
1511     Print (L"80387\n");
1512     break;
1513 
1514   case 0x0A:
1515     Print (L"80487\n");
1516     break;
1517 
1518   case 0x0B:
1519     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PENTIUM_PROC_FAMILY), gShellDebug1HiiHandle);
1520     break;
1521 
1522   case 0x0C:
1523     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PENTIUM_PRO_PROC), gShellDebug1HiiHandle);
1524     break;
1525 
1526   case 0x0D:
1527     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PENTIUM_II_PROC), gShellDebug1HiiHandle);
1528     break;
1529 
1530   case 0x0E:
1531     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PENTIUM_PROC_MMX), gShellDebug1HiiHandle);
1532     break;
1533 
1534   case 0x0F:
1535     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CELERON_PROC), gShellDebug1HiiHandle);
1536     break;
1537 
1538   case 0x10:
1539     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PENTIUM_XEON_PROC), gShellDebug1HiiHandle);
1540     break;
1541 
1542   case 0x11:
1543     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PENTIUM_III_PROC), gShellDebug1HiiHandle);
1544     break;
1545 
1546   case 0x12:
1547     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_M1_FAMILY), gShellDebug1HiiHandle);
1548     break;
1549 
1550   case 0x13:
1551     Print (L"M2 Family\n");
1552     break;
1553 
1554   case 0x14:
1555     Print (L"Intel Celeron M\n");
1556     break;
1557 
1558   case 0x15:
1559     Print (L"Intel Pentium 4 HT\n");
1560     break;
1561 
1562   case 0x18:
1563     Print (L"AMD Duron\n");
1564     break;
1565 
1566   case 0x19:
1567     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_K5_FAMILY), gShellDebug1HiiHandle);
1568     break;
1569 
1570   case 0x1A:
1571     Print (L"K6 Family\n");
1572     break;
1573 
1574   case 0x1B:
1575     Print (L"K6-2\n");
1576     break;
1577 
1578   case 0x1C:
1579     Print (L"K6-3\n");
1580     break;
1581 
1582   case 0x1D:
1583     Print (L"AMD Althon Processor Family\n");
1584     break;
1585 
1586   case 0x1E:
1587     Print (L"AMD 29000 Family\n");
1588     break;
1589 
1590   case 0x1F:
1591     Print (L"K6-2+\n");
1592     break;
1593 
1594   case 0x20:
1595     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_POWER_PC_FAMILY), gShellDebug1HiiHandle);
1596     break;
1597 
1598   case 0x21:
1599     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_POWER_PC_601), gShellDebug1HiiHandle);
1600     break;
1601 
1602   case 0x22:
1603     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_POWER_PC_603), gShellDebug1HiiHandle);
1604     break;
1605 
1606   case 0x23:
1607     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_POWER_PC_603_PLUS), gShellDebug1HiiHandle);
1608     break;
1609 
1610   case 0x24:
1611     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_POWER_PC_604), gShellDebug1HiiHandle);
1612     break;
1613 
1614   case 0x25:
1615     Print (L"Power PC 620\n");
1616     break;
1617 
1618   case 0x26:
1619     Print (L"Power PC 704\n");
1620     break;
1621 
1622   case 0x27:
1623     Print (L"Power PC 750\n");
1624     break;
1625 
1626   case 0x28:
1627     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_CORE_DUO), gShellDebug1HiiHandle);
1628     break;
1629 
1630   case 0x29:
1631     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_CORE_DUO_MOBILE), gShellDebug1HiiHandle);
1632     break;
1633 
1634   case 0x2A:
1635     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_CORE_SOLO_MOBILE), gShellDebug1HiiHandle);
1636     break;
1637 
1638   case 0x2B:
1639     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_ATOM), gShellDebug1HiiHandle);
1640     break;
1641 
1642   case 0x2C:
1643     Print (L"Intel(R) Core(TM) M processor\n");
1644     break;
1645 
1646   case 0x2D:
1647     Print (L"Intel(R) Core(TM) m3 processor\n");
1648     break;
1649 
1650   case 0x2E:
1651     Print (L"Intel(R) Core(TM) m5 processor\n");
1652     break;
1653 
1654   case 0x2F:
1655     Print (L"Intel(R) Core(TM) m7 processor\n");
1656     break;
1657 
1658   case 0x30:
1659     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ALPHA_FAMILY_2), gShellDebug1HiiHandle);
1660     break;
1661 
1662   case 0x31:
1663     Print (L"Alpha 21064\n");
1664     break;
1665 
1666   case 0x32:
1667     Print (L"Alpha 21066\n");
1668     break;
1669 
1670   case 0x33:
1671     Print (L"Alpha 21164\n");
1672     break;
1673 
1674   case 0x34:
1675     Print (L"Alpha 21164PC\n");
1676     break;
1677 
1678   case 0x35:
1679     Print (L"Alpha 21164a\n");
1680     break;
1681 
1682   case 0x36:
1683     Print (L"Alpha 21264\n");
1684     break;
1685 
1686   case 0x37:
1687     Print (L"Alpha 21364\n");
1688     break;
1689 
1690   case 0x38:
1691     Print (L"AMD Turion II Ultra Dual-Core Mobile M Processor Family\n");
1692     break;
1693 
1694   case 0x39:
1695     Print (L"AMD Turion II Dual-Core Mobile M Processor Family\n");
1696     break;
1697 
1698   case 0x3A:
1699     Print (L"AMD Althon II Dual-Core M Processor Family\n");
1700     break;
1701 
1702   case 0x3B:
1703     Print (L"AMD Opteron 6100 Series Processor\n");
1704     break;
1705 
1706   case 0x3C:
1707     Print (L"AMD Opteron 4100 Series Processor\n");
1708     break;
1709 
1710   case 0x3D:
1711     Print (L"AMD Opteron 6200 Series Processor\n");
1712     break;
1713 
1714   case 0x3E:
1715     Print (L"AMD Opteron 4200 Series Processor\n");
1716     break;
1717 
1718   case 0x3F:
1719     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_FX_SERIES), gShellDebug1HiiHandle);
1720     break;
1721 
1722   case 0x40:
1723     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_MIPS_FAMILY), gShellDebug1HiiHandle);
1724     break;
1725 
1726   case 0x41:
1727     Print (L"MIPS R4000\n");
1728     break;
1729 
1730   case 0x42:
1731     Print (L"MIPS R4200\n");
1732     break;
1733 
1734   case 0x43:
1735     Print (L"MIPS R4400\n");
1736     break;
1737 
1738   case 0x44:
1739     Print (L"MIPS R4600\n");
1740     break;
1741 
1742   case 0x45:
1743     Print (L"MIPS R10000\n");
1744     break;
1745 
1746   case 0x46:
1747     Print (L"AMD C-Series Processor\n");
1748     break;
1749 
1750   case 0x47:
1751     Print (L"AMD E-Series Processor\n");
1752     break;
1753 
1754   case 0x48:
1755     Print (L"AMD A-Series Processor\n");
1756     break;
1757 
1758   case 0x49:
1759     Print (L"AMD G-Series Processor\n");
1760     break;
1761 
1762   case 0x4A:
1763     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_Z_SERIES), gShellDebug1HiiHandle);
1764     break;
1765 
1766   case 0x4B:
1767     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_R_SERIES), gShellDebug1HiiHandle);
1768     break;
1769 
1770   case 0x4C:
1771     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_OPTERON_4300_SERIES), gShellDebug1HiiHandle);
1772     break;
1773 
1774   case 0x4D:
1775     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_OPTERON_6300_SERIES), gShellDebug1HiiHandle);
1776     break;
1777 
1778   case 0x4E:
1779     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_OPTERON_3300_SERIES), gShellDebug1HiiHandle);
1780     break;
1781 
1782   case 0x4F:
1783     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_OPTERON_FIREPRO_SERIES), gShellDebug1HiiHandle);
1784     break;
1785 
1786   case 0x50:
1787     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SPARC_FAMILY), gShellDebug1HiiHandle);
1788     break;
1789 
1790   case 0x51:
1791     Print (L"SuperSparc\n");
1792     break;
1793 
1794   case 0x52:
1795     Print (L"microSparc II\n");
1796     break;
1797 
1798   case 0x53:
1799     Print (L"microSparc IIep\n");
1800     break;
1801 
1802   case 0x54:
1803     Print (L"UltraSparc\n");
1804     break;
1805 
1806   case 0x55:
1807     Print (L"UltraSparc II\n");
1808     break;
1809 
1810   case 0x56:
1811     Print (L"UltraSparcIIi\n");
1812     break;
1813 
1814   case 0x57:
1815     Print (L"UltraSparcIII\n");
1816     break;
1817 
1818   case 0x58:
1819     Print (L"UltraSparcIIIi\n");
1820     break;
1821 
1822   case 0x60:
1823     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_68040_FAMILY), gShellDebug1HiiHandle);
1824     break;
1825 
1826   case 0x61:
1827     Print (L"68xx\n");
1828     break;
1829 
1830   case 0x62:
1831     Print (L"68000\n");
1832     break;
1833 
1834   case 0x63:
1835     Print (L"68010\n");
1836     break;
1837 
1838   case 0x64:
1839     Print (L"68020\n");
1840     break;
1841 
1842   case 0x65:
1843     Print (L"68030\n");
1844     break;
1845 
1846   case 0x66:
1847     Print (L"AMD Athlon(TM) X4 Quad-Core Processor Family\n");
1848     break;
1849 
1850   case 0x67:
1851     Print (L"AMD Opteron(TM) X1000 Series Processor\n");
1852     break;
1853 
1854   case 0x68:
1855     Print (L"AMD Opteron(TM) X2000 Series APU\n");
1856     break;
1857 
1858   case 0x69:
1859     Print (L"AMD Opteron(TM) A-Series Processor\n");
1860     break;
1861 
1862   case 0x6A:
1863     Print (L"AMD Opteron(TM) X3000 Series APU\n");
1864     break;
1865 
1866   case 0x6B:
1867     Print (L"AMD Zen Processor Family\n");
1868     break;
1869 
1870   case 0x70:
1871     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_HOBBIT_FAMILY), gShellDebug1HiiHandle);
1872     break;
1873 
1874   case 0x78:
1875     Print (L"Crusoe TM5000\n");
1876     break;
1877 
1878   case 0x79:
1879     Print (L"Crusoe TM3000\n");
1880     break;
1881 
1882   case 0x7A:
1883     Print (L"Efficeon TM8000\n");
1884     break;
1885 
1886   case 0x80:
1887     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_WEITEK), gShellDebug1HiiHandle);
1888     break;
1889 
1890   case 0x82:
1891     Print (L"Itanium\n");
1892     break;
1893 
1894   case 0x83:
1895     Print (L"AMD Athlon64\n");
1896     break;
1897 
1898   case 0x84:
1899     Print (L"AMD Opteron\n");
1900     break;
1901 
1902   case 0x85:
1903     Print (L"AMD Sempron\n");
1904     break;
1905 
1906   case 0x86:
1907     Print (L"AMD Turion64 Mobile\n");
1908     break;
1909 
1910   case 0x87:
1911     Print (L"Dual-Core AMD Opteron\n");
1912     break;
1913 
1914   case 0x88:
1915     Print (L"AMD Athlon 64X2 DualCore\n");
1916     break;
1917 
1918   case 0x89:
1919     Print (L"AMD Turion 64X2 Mobile\n");
1920     break;
1921 
1922   case 0x8A:
1923     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_OPTERON_QUAD_CORE), gShellDebug1HiiHandle);
1924     break;
1925 
1926   case 0x8B:
1927     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_OPTERON_THIRD_GENERATION), gShellDebug1HiiHandle);
1928     break;
1929 
1930   case 0x8C:
1931     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_PHENOM_FX_QUAD_CORE), gShellDebug1HiiHandle);
1932     break;
1933 
1934   case 0x8D:
1935     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_PHENOM_X4_QUAD_CORE), gShellDebug1HiiHandle);
1936     break;
1937 
1938   case 0x8E:
1939     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_PHENOM_X2_DUAL_CORE), gShellDebug1HiiHandle);
1940     break;
1941 
1942   case 0x8F:
1943     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_ATHLON_X2_DUAL_CORE), gShellDebug1HiiHandle);
1944     break;
1945 
1946   case 0x90:
1947     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PA_RISC_FAMILY), gShellDebug1HiiHandle);
1948     break;
1949 
1950   case 0x91:
1951     Print (L"PA-RISC 8500\n");
1952     break;
1953 
1954   case 0x92:
1955     Print (L"PA-RISC 8000\n");
1956     break;
1957 
1958   case 0x93:
1959     Print (L"PA-RISC 7300LC\n");
1960     break;
1961 
1962   case 0x94:
1963     Print (L"PA-RISC 7200\n");
1964     break;
1965 
1966   case 0x95:
1967     Print (L"PA-RISC 7100LC\n");
1968     break;
1969 
1970   case 0x96:
1971     Print (L"PA-RISC 7100\n");
1972     break;
1973 
1974   case 0xA0:
1975     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_V30_FAMILY), gShellDebug1HiiHandle);
1976     break;
1977 
1978   case 0xA1:
1979     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_3200_SERIES_QUAD_CORE), gShellDebug1HiiHandle);
1980     break;
1981 
1982   case 0xA2:
1983     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_3000_SERIES_DUAL_CORE), gShellDebug1HiiHandle);
1984     break;
1985 
1986   case 0xA3:
1987     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_5300_SERIES_QUAD_CORE), gShellDebug1HiiHandle);
1988     break;
1989 
1990   case 0xA4:
1991     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_5100_SERIES_DUAL_CORE), gShellDebug1HiiHandle);
1992     break;
1993 
1994   case 0xA5:
1995     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_5000_SERIES_DUAL_CORE), gShellDebug1HiiHandle);
1996     break;
1997 
1998   case 0xA6:
1999     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_LV_DUAL_CORE), gShellDebug1HiiHandle);
2000     break;
2001 
2002   case 0xA7:
2003     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_ULV_DUAL_CORE), gShellDebug1HiiHandle);
2004     break;
2005 
2006   case 0xA8:
2007     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_7100_SERIES_DUAL_CORE), gShellDebug1HiiHandle);
2008     break;
2009 
2010   case 0xA9:
2011     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_5400_SERIES_QUAD_CORE), gShellDebug1HiiHandle);
2012     break;
2013 
2014   case 0xAA:
2015     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_QUAD_CORE), gShellDebug1HiiHandle);
2016     break;
2017 
2018   case 0xAB:
2019     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_5200_SERIES_DUAL_CORE), gShellDebug1HiiHandle);
2020     break;
2021 
2022   case 0xAC:
2023     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_7200_SERIES_DUAL_CORE), gShellDebug1HiiHandle);
2024     break;
2025 
2026   case 0xAD:
2027     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_7300_SERIES_QUAD_CORE), gShellDebug1HiiHandle);
2028     break;
2029 
2030   case 0xAE:
2031     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_7400_SERIES_QUAD_CORE), gShellDebug1HiiHandle);
2032     break;
2033 
2034   case 0xAF:
2035     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_7400_SERIES_MULTI_CORE), gShellDebug1HiiHandle);
2036     break;
2037 
2038   case 0xB0:
2039     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PENTIUM_III_XEON), gShellDebug1HiiHandle);
2040     break;
2041 
2042   case 0xB1:
2043     Print (L"Pentium III Processorwith Intel SpeedStep Technology\n");
2044     break;
2045 
2046   case 0xB2:
2047     Print (L"Pentium 4 processor\n");
2048     break;
2049 
2050   case 0xB3:
2051     Print (L"Intel Xeon Processor\n");
2052     break;
2053 
2054   case 0xB4:
2055     Print (L"AS400 Family\n");
2056     break;
2057 
2058   case 0xB5:
2059     Print (L"Intel Xeon processor MP\n");
2060     break;
2061 
2062   case 0xB6:
2063     Print (L"AMD Althon XP Processor Family\n");
2064     break;
2065 
2066   case 0xB7:
2067     Print (L"AMD Althon MP Promcessor Family\n");
2068     break;
2069 
2070   case 0xB8:
2071     Print (L"Intel Itanium 2 processor\n");
2072     break;
2073 
2074   case 0xB9:
2075     Print (L"Intel Penium M processor\n");
2076     break;
2077 
2078   case 0xBA:
2079     Print (L"Intel Celeron D processor\n");
2080     break;
2081 
2082   case 0xBB:
2083     Print (L"Intel Pentium D processor\n");
2084     break;
2085 
2086   case 0xBC:
2087     Print (L"Intel Pentium Processor Extreme Edition\n");
2088     break;
2089 
2090   case 0xBD:
2091     Print (L"Intel Core Solo Processor\n");
2092     break;
2093 
2094   case 0xBF:
2095     Print (L"Intel Core 2 Duo Processor\n");
2096     break;
2097 
2098   case 0xC0:
2099     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_CORE2_SOLO), gShellDebug1HiiHandle);
2100     break;
2101 
2102   case 0xC1:
2103     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_CORE2_EXTREME), gShellDebug1HiiHandle);
2104     break;
2105 
2106   case 0xC2:
2107     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_CORE2_QUAD), gShellDebug1HiiHandle);
2108     break;
2109 
2110   case 0xC3:
2111     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_CORE2_EXTREME), gShellDebug1HiiHandle);
2112     break;
2113 
2114   case 0xC4:
2115     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_CORE2_DUO_MOBILE), gShellDebug1HiiHandle);
2116     break;
2117 
2118   case 0xC5:
2119     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_CORE2_SOLO_MOBILE), gShellDebug1HiiHandle);
2120     break;
2121 
2122   case 0xC6:
2123     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_CORE_I7), gShellDebug1HiiHandle);
2124     break;
2125 
2126   case 0xC7:
2127     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_CELERON_DUAL_CORE), gShellDebug1HiiHandle);
2128     break;
2129 
2130   case 0xC8:
2131     Print (L"IBM 390\n");
2132     break;
2133 
2134   case 0xC9:
2135     Print (L"G4\n");
2136     break;
2137 
2138   case 0xCA:
2139     Print (L"G5\n");
2140     break;
2141 
2142   case 0xCB:
2143     Print (L"G6\n");
2144     break;
2145 
2146   case 0xCC:
2147     Print (L"zArchitecture\n");
2148     break;
2149 
2150   case 0xCD:
2151     Print (L"Intel Core i5 processor\n");
2152     break;
2153 
2154   case 0xCE:
2155     Print (L"Intel Core i3 processor\n");
2156     break;
2157 
2158   case 0xCF:
2159     Print (L"Intel Core i9 processor\n");
2160     break;
2161 
2162   case 0xD2:
2163     Print (L"ViaC7M\n");
2164     break;
2165 
2166   case 0xD3:
2167     Print (L"ViaC7D\n");
2168     break;
2169 
2170   case 0xD4:
2171     Print (L"ViaC7\n");
2172     break;
2173 
2174   case 0xD5:
2175     Print (L"Eden\n");
2176     break;
2177 
2178   case 0xD6:
2179     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_MULTI_CORE), gShellDebug1HiiHandle);
2180     break;
2181 
2182   case 0xD7:
2183     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_3_SERIES_DUAL_CORE), gShellDebug1HiiHandle);
2184     break;
2185 
2186   case 0xD8:
2187     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_3_SERIES_QUAD_CORE), gShellDebug1HiiHandle);
2188     break;
2189 
2190   case 0xDA:
2191     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_5_SERIES_DUAL_CORE), gShellDebug1HiiHandle);
2192     break;
2193 
2194   case 0xDB:
2195     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_5_SERIES_QUAD_CORE), gShellDebug1HiiHandle);
2196     break;
2197 
2198   case 0xDD:
2199     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_7_SERIES_DUAL_CORE), gShellDebug1HiiHandle);
2200     break;
2201 
2202   case 0xDE:
2203     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_7_SERIES_QUAD_CORE), gShellDebug1HiiHandle);
2204     break;
2205 
2206   case 0xDF:
2207     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_7_SERIES_MULTI_CORE), gShellDebug1HiiHandle);
2208     break;
2209 
2210   case 0xE0:
2211     Print (L"Multi-Core Intel Xeon processor 3400 Series\n");
2212     break;
2213 
2214   case 0xE4:
2215     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_OPTERON_3000_SERIES), gShellDebug1HiiHandle);
2216     break;
2217 
2218   case 0xE5:
2219     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_SEMPRON_II), gShellDebug1HiiHandle);
2220     break;
2221 
2222 
2223   case 0xE6:
2224     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_EMBEDDED_OPTERON_QUAD_CORE), gShellDebug1HiiHandle);
2225     break;
2226 
2227   case 0xE7:
2228     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_PHENOM_TRIPLE_CORE), gShellDebug1HiiHandle);
2229     break;
2230 
2231   case 0xE8:
2232     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_TURION_ULTRA_DUAL_CORE_MOBILE), gShellDebug1HiiHandle);
2233     break;
2234 
2235   case 0xE9:
2236     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_TURION_DUAL_CORE_MOBILE), gShellDebug1HiiHandle);
2237     break;
2238 
2239   case 0xEA:
2240     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_ATHLON_DUAL_CORE), gShellDebug1HiiHandle);
2241     break;
2242 
2243   case 0xEB:
2244     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_SEMPRON_SI), gShellDebug1HiiHandle);
2245     break;
2246 
2247   case 0xEC:
2248     Print (L"AMD Phenom II Processor Family\n");
2249     break;
2250 
2251   case 0xED:
2252     Print (L"AMD Althon II Processor Family\n");
2253     break;
2254 
2255   case 0xEE:
2256     Print (L"Six-Core AMD Opteron Processor Family\n");
2257     break;
2258 
2259   case 0xEF:
2260     Print (L"AMD Sempron M Processor Family\n");
2261     break;
2262 
2263   case 0xFA:
2264     Print (L"i860\n");
2265     break;
2266 
2267   case 0xFB:
2268     Print (L"i960\n");
2269     break;
2270 
2271   default:
2272     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UNDEFINED_PROC_FAMILY), gShellDebug1HiiHandle);
2273   }
2274   //
2275   // end switch
2276   //
2277 }
2278 
2279 /**
2280   Display processor family information.
2281 
2282   @param[in] Family2      The family value.
2283   @param[in] Option       The option value.
2284 **/
2285 VOID
DisplayProcessorFamily2(IN UINT16 Family2,IN UINT8 Option)2286 DisplayProcessorFamily2 (
2287   IN UINT16 Family2,
2288   IN UINT8  Option
2289   )
2290 {
2291   //
2292   // Print prompt message
2293   //
2294   ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PROCESSOR_FAMILY), gShellDebug1HiiHandle);
2295 
2296   //
2297   // Print option
2298   //
2299   PRINT_INFO_OPTION (Family2, Option);
2300 
2301   //
2302   // Use switch to check
2303   //
2304   switch (Family2) {
2305     case 0x100:
2306       Print (L"ARMv7\n");
2307       break;
2308 
2309     case 0x101:
2310       Print (L"ARMv8\n");
2311       break;
2312 
2313     case 0x104:
2314       Print (L"SH-3\n");
2315       break;
2316 
2317     case 0x105:
2318       Print (L"SH-4\n");
2319       break;
2320 
2321     case 0x118:
2322       Print (L"ARM\n");
2323       break;
2324 
2325     case 0x119:
2326       Print (L"StrongARM\n");
2327       break;
2328 
2329     case 0x12C:
2330       Print (L"6x86\n");
2331       break;
2332 
2333     case 0x12D:
2334       Print (L"MediaGX\n");
2335       break;
2336 
2337     case 0x12E:
2338       Print (L"MII\n");
2339       break;
2340 
2341     case 0x140:
2342       Print (L"WinChip\n");
2343       break;
2344 
2345     case 0x15E:
2346       Print (L"DSP\n");
2347       break;
2348 
2349     case 0x1F4:
2350       Print (L"Video Processor\n");
2351       break;
2352 
2353     default:
2354      ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UNDEFINED_PROC_FAMILY), gShellDebug1HiiHandle);
2355   }
2356 
2357 }
2358 
2359 /**
2360   Display processor voltage information.
2361 
2362   @param[in] Voltage      The Voltage.
2363   Bit 7 Set to 0, indicating 'legacy' mode for processor voltage
2364   Bits 6:4  Reserved, must be zero
2365   Bits 3:0  Voltage Capability.
2366             A Set bit indicates that the voltage is supported.
2367     Bit 0 - 5V
2368     Bit 1 - 3.3V
2369     Bit 2 - 2.9V
2370     Bit 3 - Reserved, must be zero.
2371 
2372   Note:
2373     Setting of multiple bits indicates the socket is configurable
2374     If bit 7 is set to 1, the remaining seven bits of the field are set to
2375     contain the processor's current voltage times 10.
2376     For example, the field value for a processor voltage of 1.8 volts would be
2377     92h = 80h + (1.8 * 10) = 80h + 18 = 80h +12h.
2378 
2379   @param[in] Option       The option.
2380 **/
2381 VOID
DisplayProcessorVoltage(IN UINT8 Voltage,IN UINT8 Option)2382 DisplayProcessorVoltage (
2383   IN UINT8 Voltage,
2384   IN UINT8 Option
2385   )
2386 {
2387   ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PROC_INFO), gShellDebug1HiiHandle);
2388   //
2389   // Print option
2390   //
2391   PRINT_INFO_OPTION (Voltage, Option);
2392 
2393   if (BIT (Voltage, 7) != 0) {
2394     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PROC_CURRENT_VOLTAGE), gShellDebug1HiiHandle, (Voltage - 0x80));
2395   } else {
2396     if (BIT (Voltage, 0) != 0) {
2397       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_5V_SUPOPRTED), gShellDebug1HiiHandle);
2398     }
2399 
2400     if (BIT (Voltage, 1) != 0) {
2401       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_33V_SUPPORTED), gShellDebug1HiiHandle);
2402     }
2403 
2404     if (BIT (Voltage, 2) != 0) {
2405       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_29V_SUPPORTED), gShellDebug1HiiHandle);
2406     }
2407     //
2408     // check the reserved zero bits:
2409     //
2410     if (BIT (Voltage, 3) != 0) {
2411       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIT3_NOT_ZERO), gShellDebug1HiiHandle);
2412     }
2413 
2414     if (BIT (Voltage, 4) != 0) {
2415       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIT4_NOT_ZERO), gShellDebug1HiiHandle);
2416     }
2417 
2418     if (BIT (Voltage, 5) != 0) {
2419       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIT5_NOT_ZERO), gShellDebug1HiiHandle);
2420     }
2421 
2422     if (BIT (Voltage, 6) != 0) {
2423       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIT6_NOT_ZERO), gShellDebug1HiiHandle);
2424     }
2425   }
2426 }
2427 
2428 /**
2429   Display processor information.
2430 
2431   @param[in] Status   The status.
2432 Bit 7 Reserved, must be 0
2433 Bit 6 CPU Socket Populated
2434   1 - CPU Socket Populated
2435   0 - CPU Socket Unpopulated
2436 Bits 5:3 Reserved, must be zero
2437 Bits 2:0 CPU Status
2438   0h - Unknown
2439   1h - CPU Enabled
2440   2h - CPU Disabled by User via BIOS Setup
2441   3h - CPU Disabled By BIOS (POST Error)
2442   4h - CPU is Idle, waiting to be enabled.
2443   5-6h - Reserved
2444   7h - Other
2445 
2446   @param[in] Option   The option
2447 **/
2448 VOID
DisplayProcessorStatus(IN UINT8 Status,IN UINT8 Option)2449 DisplayProcessorStatus (
2450   IN UINT8 Status,
2451   IN UINT8 Option
2452   )
2453 {
2454   ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PROC_STATUS), gShellDebug1HiiHandle);
2455   PRINT_INFO_OPTION (Status, Option);
2456 
2457   if (BIT (Status, 7) != 0) {
2458     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIT7_NOT_ZERO), gShellDebug1HiiHandle);
2459   } else if (BIT (Status, 5) != 0) {
2460     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIT5_NOT_ZERO), gShellDebug1HiiHandle);
2461   } else if (BIT (Status, 4) != 0) {
2462     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIT4_NOT_ZERO), gShellDebug1HiiHandle);
2463   } else if (BIT (Status, 3) != 0) {
2464     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIT3_NOT_ZERO), gShellDebug1HiiHandle);
2465   }
2466   //
2467   // Check BIT 6
2468   //
2469   if (BIT (Status, 6) != 0) {
2470     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CPU_SOCKET_POPULATED), gShellDebug1HiiHandle);
2471   } else {
2472     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CPU_SOCKET_UNPOPULATED), gShellDebug1HiiHandle);
2473   }
2474   //
2475   // Check BITs 2:0
2476   //
2477   switch (Status & 0x07) {
2478   case 0:
2479     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UNKNOWN), gShellDebug1HiiHandle);
2480     break;
2481 
2482   case 1:
2483     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CPU_ENABLED), gShellDebug1HiiHandle);
2484     break;
2485 
2486   case 2:
2487     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CPU_DISABLED_BY_USER), gShellDebug1HiiHandle);
2488     break;
2489 
2490   case 3:
2491     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CPU_DIABLED_BY_BIOS), gShellDebug1HiiHandle);
2492     break;
2493 
2494   case 4:
2495     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CPU_IDLE), gShellDebug1HiiHandle);
2496     break;
2497 
2498   case 7:
2499     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_OTHERS), gShellDebug1HiiHandle);
2500     break;
2501 
2502   default:
2503     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_RESERVED), gShellDebug1HiiHandle);
2504   }
2505 }
2506 
2507 /**
2508   Display information about Memory Controller Information (Type 5).
2509 
2510   @param[in] Size     Memory size.
2511   @param[in] SlotNum  Which slot is this about.
2512   @param[in] Option   Option for the level of detail output required.
2513 **/
2514 VOID
DisplayMaxMemoryModuleSize(IN UINT8 Size,IN UINT8 SlotNum,IN UINT8 Option)2515 DisplayMaxMemoryModuleSize (
2516   IN UINT8 Size,
2517   IN UINT8 SlotNum,
2518   IN UINT8 Option
2519   )
2520 {
2521   UINTN MaxSize;
2522   ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SIZE_LARGEST_MEM), gShellDebug1HiiHandle);
2523   //
2524   // MaxSize is determined by follow formula
2525   //
2526   MaxSize = (UINTN) 1 << Size;
2527   ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ONE_VAR_MB), gShellDebug1HiiHandle, MaxSize);
2528 
2529   if (Option >= SHOW_DETAIL) {
2530     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_MAX_AMOUNT_MEM), gShellDebug1HiiHandle);
2531     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ONE_VAR_MB), gShellDebug1HiiHandle, MaxSize, SlotNum, MaxSize * SlotNum);
2532   }
2533 }
2534 
2535 /**
2536   Display information about memory configuration handles.
2537 
2538   @param[in] Handles  The buffer of handles to output info on.
2539   @param[in] SlotNum  The number of handles in the above buffer.
2540   @param[in] Option   Option for the level of detail output required.
2541 **/
2542 VOID
DisplayMemoryModuleConfigHandles(IN UINT16 * Handles,IN UINT8 SlotNum,IN UINT8 Option)2543 DisplayMemoryModuleConfigHandles (
2544   IN UINT16 *Handles,
2545   IN UINT8  SlotNum,
2546   IN UINT8  Option
2547   )
2548 {
2549   UINT8 Index;
2550   ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_HANDLES_CONTROLLED), gShellDebug1HiiHandle, SlotNum);
2551 
2552   if (Option >= SHOW_DETAIL) {
2553     //
2554     // No handle, Handles is INVALID.
2555     //
2556     if (SlotNum == 0) {
2557       return ;
2558     }
2559 
2560     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_HANDLES_LIST_CONTROLLED), gShellDebug1HiiHandle);
2561     for (Index = 0; Index < SlotNum; Index++) {
2562       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_HANDLE), gShellDebug1HiiHandle, Index + 1, Handles[Index]);
2563     }
2564   }
2565 }
2566 
2567 /**
2568   Display Memory Module Information (Type 6).
2569 
2570   @param[in] BankConnections
2571   @param[in] Option
2572 **/
2573 VOID
DisplayMmBankConnections(IN UINT8 BankConnections,IN UINT8 Option)2574 DisplayMmBankConnections (
2575   IN UINT8 BankConnections,
2576   IN UINT8 Option
2577   )
2578 {
2579   UINT8 High;
2580   UINT8 Low;
2581 
2582   ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BANK_CONNECTIONS), gShellDebug1HiiHandle);
2583   //
2584   // Print option
2585   //
2586   PRINT_INFO_OPTION (BankConnections, Option);
2587 
2588   //
2589   // Divide it to high and low
2590   //
2591   High  = (UINT8) (BankConnections & 0xF0);
2592   Low   = (UINT8) (BankConnections & 0x0F);
2593   if (High != 0xF) {
2594     if (Low != 0xF) {
2595       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BANK_RAS), gShellDebug1HiiHandle, High, Low, High, Low);
2596     } else {
2597       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BANK_RAS_2), gShellDebug1HiiHandle, High, High);
2598     }
2599   } else {
2600     if (Low != 0xF) {
2601       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BANK_RAS_2), gShellDebug1HiiHandle, Low, Low);
2602     } else {
2603       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_NO_BANKS_CONNECTED), gShellDebug1HiiHandle);
2604     }
2605   }
2606 }
2607 
2608 /**
2609   Display memory informcation.
2610 
2611   Bits 0:6  Size (n),
2612       where 2**n is the size in MB with three special-case values:
2613       7Dh Not determinable (Installed Size only)
2614       7Eh Module is installed, but no memory has been enabled
2615       7Fh Not installed
2616   Bit  7  Defines whether the memory module has a single- (0)
2617           or double-bank (1) connection.
2618 
2619   @param[in] Size   - The size
2620   @param[in] Option - The option
2621 **/
2622 VOID
DisplayMmMemorySize(IN UINT8 Size,IN UINT8 Option)2623 DisplayMmMemorySize (
2624   IN UINT8 Size,
2625   IN UINT8 Option
2626   )
2627 {
2628   UINT8 Value;
2629   ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_MEMORY_SIZE), gShellDebug1HiiHandle);
2630   //
2631   // Print option
2632   //
2633   PRINT_INFO_OPTION (Size, Option);
2634 
2635   //
2636   // Get the low bits(0-6 bit)
2637   //
2638   Value = (UINT8) (Size & 0x7F);
2639   if (Value == 0x7D) {
2640     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_MEM_SIZE_NOT_DETERMINABLE), gShellDebug1HiiHandle);
2641   } else if (Value == 0x7E) {
2642     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_MODULE_INSTALLED), gShellDebug1HiiHandle);
2643   } else if (Value == 0x7F) {
2644     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_NOT_INSTALLED), gShellDebug1HiiHandle);
2645   } else {
2646     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_MEM_SIZE), gShellDebug1HiiHandle, 1 << Value);
2647   }
2648 
2649   if (BIT (Size, 7) != 0) {
2650     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_MEM_MODULE_DOUBLE_BANK), gShellDebug1HiiHandle);
2651   } else {
2652     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_MEM_MODULE_SINGLE_BANK), gShellDebug1HiiHandle);
2653   }
2654 }
2655 
2656 /**
2657   Display Cache Configuration.
2658 
2659   @param[in] CacheConfiguration   Cache Configuration.
2660 Bits 15:10 Reserved, must be 0
2661 Bits 9:8 Operational Mode
2662   0h - Write Through
2663   1h - Write Back
2664   2h - Varies with Memory Address
2665   3h - Unknown
2666 Bit 7 Enabled/Disabled
2667   1 - Enabled
2668   0 - Disabled
2669 Bits 6:5 Location
2670   0h - Internal
2671   1h - External
2672   2h - Reserved
2673   3h - Unknown
2674 Bit 4 Reserved, must be zero
2675 Bit 3 Cache Socketed
2676   1 - Socketed
2677   0 - Unsocketed
2678 Bits 2:0 Cache Level
2679   1 through 8 (For example, an L1 cache would
2680   use value 000b and an L3 cache would use 010b.)
2681 
2682   @param[in] Option   The option
2683 **/
2684 VOID
DisplayCacheConfiguration(IN UINT16 CacheConfiguration,IN UINT8 Option)2685 DisplayCacheConfiguration (
2686   IN UINT16 CacheConfiguration,
2687   IN UINT8 Option
2688   )
2689 {
2690   ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CACHE_CONFIGURATION), gShellDebug1HiiHandle);
2691   PRINT_INFO_OPTION (CacheConfiguration, Option);
2692 
2693   if (BIT (CacheConfiguration, 15) != 0) {
2694     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIT15_NOT_ZERO), gShellDebug1HiiHandle);
2695   } else if (BIT (CacheConfiguration, 14) != 0) {
2696     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIT14_NOT_ZERO), gShellDebug1HiiHandle);
2697   } else if (BIT (CacheConfiguration, 13) != 0) {
2698     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIT13_NOT_ZERO), gShellDebug1HiiHandle);
2699   } else if (BIT (CacheConfiguration, 12) != 0) {
2700     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIT12_NOT_ZERO), gShellDebug1HiiHandle);
2701   } else if (BIT (CacheConfiguration, 11) != 0) {
2702     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIT11_NOT_ZERO), gShellDebug1HiiHandle);
2703   } else if (BIT (CacheConfiguration, 10) != 0) {
2704     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIT10_NOT_ZERO), gShellDebug1HiiHandle);
2705   } else if (BIT (CacheConfiguration, 4) != 0) {
2706     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIT4_NOT_ZERO), gShellDebug1HiiHandle);
2707   }
2708 
2709   //
2710   // Check BITs 9:8
2711   //
2712   switch ((CacheConfiguration & 0x300) >> 8) {
2713   case 0:
2714     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CACHE_WRITE_THROUGH), gShellDebug1HiiHandle);
2715     break;
2716 
2717   case 1:
2718     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CACHE_WRITE_BACK), gShellDebug1HiiHandle);
2719     break;
2720 
2721   case 2:
2722     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CACHE_VARIES_WITH_MEM_ADDR), gShellDebug1HiiHandle);
2723     break;
2724 
2725   case 3:
2726     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UNKNOWN), gShellDebug1HiiHandle);
2727     break;
2728   }
2729 
2730   //
2731   // Check BIT 7
2732   //
2733   if (BIT (CacheConfiguration, 7) != 0) {
2734     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ENABLED), gShellDebug1HiiHandle);
2735   } else {
2736     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_DISABLED), gShellDebug1HiiHandle);
2737   }
2738 
2739   //
2740   // Check BITs 6:5
2741   //
2742   switch ((CacheConfiguration & 0x60) >> 5) {
2743   case 0:
2744     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CACHE_INTERNAL), gShellDebug1HiiHandle);
2745     break;
2746 
2747   case 1:
2748     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CACHE_EXTERNAL), gShellDebug1HiiHandle);
2749     break;
2750 
2751   case 2:
2752     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_RESERVED), gShellDebug1HiiHandle);
2753     break;
2754 
2755   case 3:
2756     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UNKNOWN), gShellDebug1HiiHandle);
2757     break;
2758   }
2759 
2760   //
2761   // Check BIT 3
2762   //
2763   if (BIT (CacheConfiguration, 3) != 0) {
2764     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CACHE_SOCKETED), gShellDebug1HiiHandle);
2765   } else {
2766     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CACHE_NOT_SOCKETED), gShellDebug1HiiHandle);
2767   }
2768 
2769 
2770   ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CACHE_LEVEL), gShellDebug1HiiHandle, (CacheConfiguration & 0x07) + 1);
2771 }
2772 
2773 /**
2774   The Slot ID field of the System Slot structure provides a mechanism to
2775   correlate the physical attributes of the slot to its logical access method
2776   (which varies based on the Slot Type field).
2777 
2778   @param[in] SlotId   - The slot ID
2779   @param[in] SlotType - The slot type
2780   @param[in] Option   - The Option
2781 **/
2782 VOID
DisplaySystemSlotId(IN UINT16 SlotId,IN UINT8 SlotType,IN UINT8 Option)2783 DisplaySystemSlotId (
2784   IN UINT16  SlotId,
2785   IN UINT8   SlotType,
2786   IN UINT8   Option
2787   )
2788 {
2789   //
2790   // Display slot type first
2791   //
2792   DisplaySystemSlotType (SlotType, Option);
2793 
2794   ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SLOT_ID), gShellDebug1HiiHandle);
2795   //
2796   // print option
2797   //
2798   PRINT_INFO_OPTION (SlotType, Option);
2799 
2800   switch (SlotType) {
2801   //
2802   // Slot Type: MCA
2803   //
2804   case 0x04:
2805     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_LOGICAL_MICRO_CHAN), gShellDebug1HiiHandle);
2806     if (SlotId > 0 && SlotId < 15) {
2807       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ONE_VAR_D), gShellDebug1HiiHandle, SlotId);
2808     } else {
2809       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ERROR_NOT_1_15), gShellDebug1HiiHandle);
2810     }
2811     break;
2812 
2813   //
2814   // EISA
2815   //
2816   case 0x05:
2817     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_LOGICAL_EISA_NUM), gShellDebug1HiiHandle);
2818     if (SlotId > 0 && SlotId < 15) {
2819       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ONE_VAR_D), gShellDebug1HiiHandle, SlotId);
2820     } else {
2821       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ERROR_NOT_1_15), gShellDebug1HiiHandle);
2822     }
2823     break;
2824 
2825   //
2826   // Slot Type: PCI
2827   //
2828   case 0x06:
2829     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_VALUE_PRESENT), gShellDebug1HiiHandle, SlotId);
2830     break;
2831 
2832   //
2833   // PCMCIA
2834   //
2835   case 0x07:
2836     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_IDENTIFIES_ADAPTER_NUM), gShellDebug1HiiHandle, SlotId);
2837     break;
2838 
2839   //
2840   // Slot Type: PCI-E
2841   //
2842   case 0xA5:
2843     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_VALUE_PRESENT), gShellDebug1HiiHandle, SlotId);
2844     break;
2845 
2846   default:
2847     if ((SlotType >= 0x0E && SlotType <= 0x12) || (SlotType >= 0xA6 && SlotType <= 0xB6)){
2848       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_VALUE_PRESENT), gShellDebug1HiiHandle, SlotId);
2849     } else {
2850       ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UNDEFINED_SLOT_ID), gShellDebug1HiiHandle);
2851     }
2852   }
2853 }
2854 
2855 /**
2856   Display System Boot Information (Type 32) information.
2857 
2858   @param[in] Parameter      The parameter.
2859   @param[in] Option         The options.
2860 **/
2861 VOID
DisplaySystemBootStatus(IN UINT8 Parameter,IN UINT8 Option)2862 DisplaySystemBootStatus (
2863   IN UINT8 Parameter,
2864   IN UINT8 Option
2865   )
2866 {
2867   ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SYSTEM_BOOT_STATUS), gShellDebug1HiiHandle);
2868   //
2869   // Print option
2870   //
2871   PRINT_INFO_OPTION (Parameter, Option);
2872 
2873   //
2874   // Check value and print
2875   //
2876   if (Parameter == 0) {
2877     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_NO_ERRORS_DETECTED), gShellDebug1HiiHandle);
2878   } else if (Parameter == 1) {
2879     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_NO_BOOTABLE_MEDIA), gShellDebug1HiiHandle);
2880   } else if (Parameter == 2) {
2881     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_NORMAL_OP_SYSTEM), gShellDebug1HiiHandle);
2882   } else if (Parameter == 3) {
2883     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_FIRMWARE_DETECTED), gShellDebug1HiiHandle);
2884   } else if (Parameter == 4) {
2885     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_OP_SYSTEM), gShellDebug1HiiHandle);
2886   } else if (Parameter == 5) {
2887     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_USER_REQUESTED_BOOT), gShellDebug1HiiHandle);
2888   } else if (Parameter == 6) {
2889     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SYSTEM_SECURITY_VIOLATION), gShellDebug1HiiHandle);
2890   } else if (Parameter == 7) {
2891     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PREV_REQ_IMAGE), gShellDebug1HiiHandle);
2892   } else if (Parameter == 8) {
2893     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_WATCHDOG_TIMER), gShellDebug1HiiHandle);
2894   } else if (Parameter >= 9 && Parameter <= 127) {
2895     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_RSVD_FUTURE_ASSIGNMENT), gShellDebug1HiiHandle);
2896   } else if (Parameter >= 128 && Parameter <= 191) {
2897     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_VENDOR_OEM_SPECIFIC), gShellDebug1HiiHandle);
2898   } else if (Parameter >= 192) {
2899     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PRODUCT_SPEC_IMPLMENTATION), gShellDebug1HiiHandle);
2900   } else {
2901     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ERROR_VALUE), gShellDebug1HiiHandle);
2902   }
2903 }
2904 
2905 /**
2906   Display Portable Battery (Type 22) information.
2907 
2908   The date the cell pack was manufactured, in packed format:
2909    Bits 15:9  Year, biased by 1980, in the range 0 to 127.
2910    Bits 8:5 Month, in the range 1 to 12.
2911    Bits 4:0 Date, in the range 1 to 31.
2912   For example, 01 February 2000 would be identified as
2913   0010 1000 0100 0001b (0x2841).
2914 
2915   @param[in] Date     The date
2916   @param[in] Option   The option
2917 **/
2918 VOID
DisplaySBDSManufactureDate(IN UINT16 Date,IN UINT8 Option)2919 DisplaySBDSManufactureDate (
2920   IN UINT16  Date,
2921   IN UINT8   Option
2922   )
2923 {
2924   UINTN Day;
2925   UINTN Month;
2926   UINTN Year;
2927 
2928   ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SBDS_MANUFACTURE_DATE), gShellDebug1HiiHandle);
2929   PRINT_INFO_OPTION (Date, Option);
2930   //
2931   // Print date
2932   //
2933   Day   = Date & 0x001F;
2934   Month = (Date & 0x01E0) >> 5;
2935   Year  = ((Date & 0xFE00) >> 9) + 1980;
2936   ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_MONTH_DAY_YEAR), gShellDebug1HiiHandle, Day, Month, Year);
2937 
2938 }
2939 
2940 /**
2941   Display System Reset (Type 23) information.
2942 
2943 
2944 Identifies the system-reset capabilities for the system.
2945  Bits 7:6 Reserved for future assignment via this specification, set to 00b.
2946  Bit 5  System contains a watchdog timer, either True (1) or False (0).
2947  Bits 4:3 Boot Option on Limit.
2948   Identifies the system action to be taken when the Reset Limit is reached, one of:
2949   00b Reserved, do not use.
2950   01b Operating system
2951   10b System utilities
2952   11b Do not rebootBits
2953  2:1  Boot Option.  Indicates the action to be taken following a watchdog reset, one of:
2954   00b Reserved, do not use.
2955   01b Operating system
2956   10b System utilities
2957   11b Do not reboot
2958  Bit 0  Status.
2959   1b The system reset is enabled by the user
2960   0b The system reset is not enabled by the user
2961 
2962   @param[in] Reset   Reset
2963   @param[in] Option  The option
2964 **/
2965 VOID
DisplaySystemResetCapabilities(IN UINT8 Reset,IN UINT8 Option)2966 DisplaySystemResetCapabilities (
2967   IN UINT8 Reset,
2968   IN UINT8 Option
2969   )
2970 {
2971   UINTN Temp;
2972 
2973   ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SYSTEM_RESET_CAPABILITIES), gShellDebug1HiiHandle);
2974   PRINT_INFO_OPTION (Reset, Option);
2975 
2976   //
2977   // Check reserved bits 7:6
2978   //
2979   if ((Reset & 0xC0) != 0) {
2980     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BITS_RESERVED_ZERO), gShellDebug1HiiHandle);
2981   }
2982   //
2983   // Watch dog
2984   //
2985   if (BIT (Reset, 5) != 0) {
2986     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_WATCHDOG_TIMER_2), gShellDebug1HiiHandle);
2987   } else {
2988     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SYSTEM_NOT_CONTAIN_TIMER), gShellDebug1HiiHandle);
2989   }
2990   //
2991   // Boot Option on Limit
2992   //
2993   Temp = (Reset & 0x18) >> 3;
2994   ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BOOT_OPTION_LIMIT), gShellDebug1HiiHandle);
2995   switch (Temp) {
2996   case 0:
2997     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_RESERVED), gShellDebug1HiiHandle);
2998     break;
2999 
3000   case 1:
3001     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_OP_SYSTEM_2), gShellDebug1HiiHandle);
3002     break;
3003 
3004   case 2:
3005     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SYSTEM_UTIL), gShellDebug1HiiHandle);
3006     break;
3007 
3008   case 3:
3009     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_DO_NOT_REBOOT_BITS), gShellDebug1HiiHandle);
3010     break;
3011   }
3012   //
3013   // Boot Option
3014   //
3015   Temp = (Reset & 0x06) >> 1;
3016   ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BOOT_OPTION), gShellDebug1HiiHandle);
3017   switch (Temp) {
3018   case 0:
3019     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_RESERVED), gShellDebug1HiiHandle);
3020     break;
3021 
3022   case 1:
3023     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_OP_SYSTEM_2), gShellDebug1HiiHandle);
3024     break;
3025 
3026   case 2:
3027     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SYSTEM_UTIL), gShellDebug1HiiHandle);
3028     break;
3029 
3030   case 3:
3031     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_DO_NOT_REBOOT), gShellDebug1HiiHandle);
3032     break;
3033   }
3034   //
3035   // Reset enable flag
3036   //
3037   if ((Reset & 0x01) != 0) {
3038     Print (L"The system reset is enabled by the user\n");
3039   } else {
3040     Print (L"The system reset is disabled by the user\n");
3041   }
3042 }
3043 
3044 /**
3045   Display Hardware Security (Type 24) information.
3046 
3047 
3048 Identifies the password and reset status for the system:
3049 
3050 Bits 7:6    Power-on Password Status, one of:
3051   00b Disabled
3052   01b Enabled
3053   10b Not Implemented
3054   11b Unknown
3055 Bits 5:4    Keyboard Password Status, one of:
3056   00b Disabled
3057   01b Enabled
3058   10b Not Implemented
3059   11b Unknown
3060 Bits 3:2    Administrator Password Status, one  of:
3061   00b Disabled
3062   01b Enabled
3063   10b Not Implemented
3064   11b Unknown
3065 Bits 1:0    Front Panel Reset Status, one of:
3066   00b Disabled
3067   01b Enabled
3068   10b Not Implemented
3069   11b Unknown
3070 
3071   @param[in] Settings The device settings.
3072   @param[in] Option   The device options.
3073 **/
3074 VOID
DisplayHardwareSecuritySettings(IN UINT8 Settings,IN UINT8 Option)3075 DisplayHardwareSecuritySettings (
3076   IN UINT8 Settings,
3077   IN UINT8 Option
3078   )
3079 {
3080   UINTN Temp;
3081 
3082   ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_HARDWARE_SECURITY_SET), gShellDebug1HiiHandle);
3083   PRINT_INFO_OPTION (Settings, Option);
3084 
3085   //
3086   // Power-on Password Status
3087   //
3088   Temp = (Settings & 0xC0) >> 6;
3089   ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_POWER_ON_PASSWORD), gShellDebug1HiiHandle);
3090   switch (Temp) {
3091   case 0:
3092     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_DISABLED), gShellDebug1HiiHandle);
3093     break;
3094 
3095   case 1:
3096     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ENABLED_NEWLINE), gShellDebug1HiiHandle);
3097     break;
3098 
3099   case 2:
3100     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_NOT_IMPLEMENTED), gShellDebug1HiiHandle);
3101     break;
3102 
3103   case 3:
3104     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UNKNOWN), gShellDebug1HiiHandle);
3105     break;
3106   }
3107   //
3108   // Keyboard Password Status
3109   //
3110   Temp = (Settings & 0x30) >> 4;
3111   ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_KEYBOARD_PASSWORD), gShellDebug1HiiHandle);
3112   switch (Temp) {
3113   case 0:
3114     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_DISABLED), gShellDebug1HiiHandle);
3115     break;
3116 
3117   case 1:
3118     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ENABLED_NEWLINE), gShellDebug1HiiHandle);
3119     break;
3120 
3121   case 2:
3122     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_NOT_IMPLEMENTED), gShellDebug1HiiHandle);
3123     break;
3124 
3125   case 3:
3126     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UNKNOWN), gShellDebug1HiiHandle);
3127     break;
3128   }
3129   //
3130   // Administrator Password Status
3131   //
3132   Temp = (Settings & 0x0C) >> 2;
3133   ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ADMIN_PASSWORD_STATUS), gShellDebug1HiiHandle);
3134   switch (Temp) {
3135   case 0:
3136     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_DISABLED), gShellDebug1HiiHandle);
3137     break;
3138 
3139   case 1:
3140     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ENABLED_NEWLINE), gShellDebug1HiiHandle);
3141     break;
3142 
3143   case 2:
3144     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_NOT_IMPLEMENTED), gShellDebug1HiiHandle);
3145     break;
3146 
3147   case 3:
3148     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UNKNOWN), gShellDebug1HiiHandle);
3149     break;
3150   }
3151   //
3152   // Front Panel Reset Status
3153   //
3154   Temp = Settings & 0x3;
3155   ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_FRONT_PANEL_RESET), gShellDebug1HiiHandle);
3156   switch (Temp) {
3157   case 0:
3158     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_DISABLED), gShellDebug1HiiHandle);
3159     break;
3160 
3161   case 1:
3162     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ENABLED_NEWLINE), gShellDebug1HiiHandle);
3163     break;
3164 
3165   case 2:
3166     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_NOT_IMPLEMENTED), gShellDebug1HiiHandle);
3167     break;
3168 
3169   case 3:
3170     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UNKNOWN), gShellDebug1HiiHandle);
3171     break;
3172   }
3173 }
3174 
3175 /**
3176   Display Out-of-Band Remote Access (Type 30) information.
3177 
3178   @param[in] Connections        The device characteristics.
3179   @param[in] Option             The device options.
3180 **/
3181 VOID
DisplayOBRAConnections(IN UINT8 Connections,IN UINT8 Option)3182 DisplayOBRAConnections (
3183   IN UINT8   Connections,
3184   IN UINT8   Option
3185   )
3186 {
3187   ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CONNECTIONS), gShellDebug1HiiHandle);
3188   PRINT_INFO_OPTION (Connections, Option);
3189 
3190   //
3191   // Check reserved bits 7:2
3192   //
3193   if ((Connections & 0xFC) != 0) {
3194     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BITS_RESERVED_ZERO_2), gShellDebug1HiiHandle);
3195   }
3196   //
3197   // Outbound Connection
3198   //
3199   if (BIT (Connections, 1) != 0) {
3200     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_OUTBOUND_CONN_ENABLED), gShellDebug1HiiHandle);
3201   } else {
3202     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_OTUBOUND_CONN_DISABLED), gShellDebug1HiiHandle);
3203   }
3204   //
3205   // Inbound Connection
3206   //
3207   if (BIT (Connections, 0) != 0) {
3208     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INBOIUND_CONN_ENABLED), gShellDebug1HiiHandle);
3209   } else {
3210     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INBOUND_CONN_DISABLED), gShellDebug1HiiHandle);
3211   }
3212 }
3213 
3214 /**
3215   Display System Power Supply (Type 39) information.
3216 
3217   @param[in] Characteristics    The device characteristics.
3218   @param[in] Option             The device options.
3219 **/
3220 VOID
DisplaySPSCharacteristics(IN UINT16 Characteristics,IN UINT8 Option)3221 DisplaySPSCharacteristics (
3222   IN UINT16  Characteristics,
3223   IN UINT8   Option
3224   )
3225 {
3226   UINTN Temp;
3227 
3228   ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_POWER_SUPPLY_CHAR), gShellDebug1HiiHandle);
3229   PRINT_INFO_OPTION (Characteristics, Option);
3230 
3231   //
3232   // Check reserved bits 15:14
3233   //
3234   if ((Characteristics & 0xC000) != 0) {
3235     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BITS_15_14_RSVD), gShellDebug1HiiHandle);
3236   }
3237   //
3238   // Bits 13:10 - DMTF Power Supply Type
3239   //
3240   ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_TYPE), gShellDebug1HiiHandle);
3241   Temp = (Characteristics & 0x1C00) >> 10;
3242   switch (Temp) {
3243   case 1:
3244     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_OTHER_SPACE), gShellDebug1HiiHandle);
3245     break;
3246 
3247   case 2:
3248     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UNKNOWN), gShellDebug1HiiHandle);
3249     break;
3250 
3251   case 3:
3252     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_LINEAR), gShellDebug1HiiHandle);
3253     break;
3254 
3255   case 4:
3256     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SWITCHING), gShellDebug1HiiHandle);
3257     break;
3258 
3259   case 5:
3260     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BATTERY), gShellDebug1HiiHandle);
3261     break;
3262 
3263   case 6:
3264     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UPS), gShellDebug1HiiHandle);
3265     break;
3266 
3267   case 7:
3268     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CONVERTER), gShellDebug1HiiHandle);
3269     break;
3270 
3271   case 8:
3272     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_REGULATOR), gShellDebug1HiiHandle);
3273     break;
3274 
3275   default:
3276     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_RESERVED_2), gShellDebug1HiiHandle);
3277   }
3278   //
3279   // Bits 9:7 - Status
3280   //
3281   ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_STATUS_DASH), gShellDebug1HiiHandle);
3282   Temp = (Characteristics & 0x380) >> 7;
3283   switch (Temp) {
3284   case 1:
3285     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_OTHER_SPACE), gShellDebug1HiiHandle);
3286     break;
3287 
3288   case 2:
3289     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UNKNOWN), gShellDebug1HiiHandle);
3290     break;
3291 
3292   case 3:
3293     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_OK), gShellDebug1HiiHandle);
3294     break;
3295 
3296   case 4:
3297     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_NON_CRITICAL), gShellDebug1HiiHandle);
3298     break;
3299 
3300   case 5:
3301     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CRITICAL_POWER_SUPPLY), gShellDebug1HiiHandle);
3302     break;
3303 
3304   default:
3305     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UNDEFINED), gShellDebug1HiiHandle);
3306   }
3307   //
3308   // Bits 6:3 - DMTF Input Voltage Range Switching
3309   //
3310   ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INPUT_VOLTAGE_RANGE), gShellDebug1HiiHandle);
3311   Temp = (Characteristics & 0x78) >> 3;
3312   switch (Temp) {
3313   case 1:
3314     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_OTHER_SPACE), gShellDebug1HiiHandle);
3315     break;
3316 
3317   case 2:
3318     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UNKNOWN), gShellDebug1HiiHandle);
3319     break;
3320 
3321   case 3:
3322     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_MANUAL), gShellDebug1HiiHandle);
3323     break;
3324 
3325   case 4:
3326     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AUTO_SWITCH), gShellDebug1HiiHandle);
3327     break;
3328 
3329   case 5:
3330     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_WIDE_RANGE), gShellDebug1HiiHandle);
3331     break;
3332 
3333   case 6:
3334     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_NOT_APPLICABLE), gShellDebug1HiiHandle);
3335     break;
3336 
3337   default:
3338     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_RESERVED_3), gShellDebug1HiiHandle);
3339     break;
3340   }
3341   //
3342   // Power supply is unplugged from the wall
3343   //
3344   if (BIT (Characteristics, 2) != 0) {
3345     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_POWER_SUPPLY_UNPLUGGED), gShellDebug1HiiHandle);
3346   } else {
3347     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_POWER_SUPPLY_PLUGGED), gShellDebug1HiiHandle);
3348   }
3349   //
3350   // Power supply is present
3351   //
3352   if (BIT (Characteristics, 1) != 0) {
3353     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_POWER_SUPPLY_PRESENT), gShellDebug1HiiHandle);
3354   } else {
3355     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_POWER_SUPPLY_NOT_PRESENT), gShellDebug1HiiHandle);
3356   }
3357   //
3358   // hot replaceable
3359   //
3360   if (BIT (Characteristics, 0) != 0) {
3361     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_POWER_SUPPLY_REPLACE), gShellDebug1HiiHandle);
3362   } else {
3363     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_POWER_SUPPLY_NOT_REPLACE), gShellDebug1HiiHandle);
3364   }
3365 }
3366 
3367 /**
3368   Display TPM Device (Type 43) Characteristics.
3369 
3370   @param[in] Chara    The information bits.
3371   @param[in] Option   The optional information.
3372 **/
3373 VOID
DisplayTpmDeviceCharacteristics(IN UINT64 Chara,IN UINT8 Option)3374 DisplayTpmDeviceCharacteristics (
3375   IN UINT64  Chara,
3376   IN UINT8   Option
3377   )
3378 {
3379   //
3380   // Print header
3381   //
3382   ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_TPM_DEVICE_CHAR), gShellDebug1HiiHandle);
3383   //
3384   // print option
3385   //
3386   PRINT_INFO_OPTION (Chara, Option);
3387 
3388   //
3389   // Check all the bits and print information
3390   // This function does not use Table because table of bits
3391   //   are designed not to deal with UINT64
3392   //
3393   if (BIT (Chara, 0) != 0) {
3394     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_RESERVED_BIT), gShellDebug1HiiHandle);
3395   }
3396 
3397   if (BIT (Chara, 1) != 0) {
3398     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_RESERVED_BIT), gShellDebug1HiiHandle);
3399   }
3400   if (BIT (Chara, 2) != 0) {
3401     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_TPM_DEVICE_CHAR_NOT_SUPPORTED), gShellDebug1HiiHandle);
3402   }
3403 
3404   if (BIT (Chara, 3) != 0) {
3405     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_TPM_DEVICE_CONFIG_FWU), gShellDebug1HiiHandle);
3406   }
3407 
3408   if (BIT (Chara, 4) != 0) {
3409     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_TPM_DEVICE_CONFIG_PLAT_SW), gShellDebug1HiiHandle);
3410   }
3411 
3412   if (BIT (Chara, 5) != 0) {
3413     ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_TPM_DEVICE_CONFIG_OEM), gShellDebug1HiiHandle);
3414   }
3415 
3416   //
3417   // Just print the Reserved
3418   //
3419   ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BITS_06_63), gShellDebug1HiiHandle);
3420 
3421 }
3422