/** @file Module for clarifying the content of the smbios structure element info. Copyright (c) 2005 - 2019, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include "UefiShellDebug1CommandsLib.h" #include "PrintInfo.h" #include "QueryTable.h" #include "EventLogInfo.h" /** Function to display system event log access information. @param[in] Key Additional information to print. @param[in] Option Whether to print the additional information. **/ VOID DisplaySELAccessMethod ( IN CONST UINT8 Key, IN CONST UINT8 Option ) { // // Print prompt // ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_ACCESS_METHOD), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Key, Option); // // Print value info // switch (Key) { case 0: ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_ONE_EIGHT_BIT), gShellDebug1HiiHandle); break; case 1: ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_TWO_EIGHT_BITS), gShellDebug1HiiHandle); break; case 2: ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_ONE_SIXTEEN_BIT), gShellDebug1HiiHandle); break; case 3: ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_MEM_MAPPED_PHYS), gShellDebug1HiiHandle); break; case 4: ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_AVAIL_VIA_GENERAL), gShellDebug1HiiHandle); break; default: if (Key <= 0x7f) { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_AVAIL_FOR_FUTURE_ASSIGN), gShellDebug1HiiHandle); } else { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_BIOS_VENDOR_OEM), gShellDebug1HiiHandle); } } } /** Function to display system event log status information. @param[in] Key Additional information to print. @param[in] Option Whether to print the additional information. **/ VOID DisplaySELLogStatus ( UINT8 Key, UINT8 Option ) { // // Print prompt // ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_LOG_STATUS), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Key, Option); // // Print value info // if ((Key & 0x01) != 0) { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_LOG_AREA_VALID), gShellDebug1HiiHandle); } else { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_LOG_AREA_VALID), gShellDebug1HiiHandle); } if ((Key & 0x02) != 0) { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_LOG_AREA_FULL), gShellDebug1HiiHandle); } else { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_LOG_AREA_NOT_FULL), gShellDebug1HiiHandle); } if ((Key & 0xFC) != 0) { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_RES_BITS_NOT_ZERO), gShellDebug1HiiHandle, Key & 0xFC); } } /** Function to display system event log header format information. @param[in] Key Additional information to print. @param[in] Option Whether to print the additional information. **/ VOID DisplaySysEventLogHeaderFormat ( UINT8 Key, UINT8 Option ) { // // Print prompt // ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_LOG_HEADER_FORMAT), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Key, Option); // // Print value info // if (Key == 0x00) { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_NO_HEADER), gShellDebug1HiiHandle); } else if (Key == 0x01) { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_TYPE_LOG_HEADER), gShellDebug1HiiHandle); } else if (Key <= 0x7f) { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_AVAIL_FOR_FUTURE), gShellDebug1HiiHandle); } else { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_BIOS_VENDOR), gShellDebug1HiiHandle); } } /** Display the header information for SEL log items. @param[in] Key The information key. @param[in] Option The option index. **/ VOID DisplaySELLogHeaderLen ( UINT8 Key, UINT8 Option ) { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_LOG_HEADER_LEN), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Key, Option); ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_ONE_VAR_D), gShellDebug1HiiHandle, Key & 0x7F); // // The most-significant bit of the field specifies // whether (0) or not (1) the record has been read // if ((Key & 0x80) != 0) { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_THIS_RECORD_READ), gShellDebug1HiiHandle); } else { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_THIS_RECORD_NOT_READ), gShellDebug1HiiHandle); } } /** Display the header information for type 1 items. @param[in] LogHeader The buffer with the information. **/ VOID DisplaySysEventLogHeaderType1 ( IN UINT8 *LogHeader ) { LOG_HEADER_TYPE1_FORMAT *Header; ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_SYSTEM_EVENT_LOG), gShellDebug1HiiHandle); // // Print Log Header Type1 Format info // Header = (LOG_HEADER_TYPE1_FORMAT *)(LogHeader); ShellPrintHiiEx ( -1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_OEM_RESERVED), gShellDebug1HiiHandle, Header->OEMReserved[0], Header->OEMReserved[1], Header->OEMReserved[2], Header->OEMReserved[3], Header->OEMReserved[4] ); ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_MULTIPLE_EVENT_TIME), gShellDebug1HiiHandle, Header->Metw); ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_MULTIPLE_EVENT_COUNT), gShellDebug1HiiHandle, Header->Meci); ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_PREBOOT_ADDRESS), gShellDebug1HiiHandle, Header->CMOSAddress); ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_PREBOOT_INDEX), gShellDebug1HiiHandle, Header->CMOSBitIndex); ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_CHECKSUM_STARTING_OFF), gShellDebug1HiiHandle, Header->StartingOffset); ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_CHECKSUN_BYTE_COUNT), gShellDebug1HiiHandle, Header->ChecksumOffset); ShellPrintHiiEx ( -1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_RESERVED), gShellDebug1HiiHandle, Header->OEMReserved[0], Header->OEMReserved[1], Header->OEMReserved[2] ); ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_HEADER_REVISION), gShellDebug1HiiHandle, Header->HeaderRevision); } /** Function to display system event log header information. @param[in] LogHeaderFormat Format identifier. @param[in] LogHeader Format informcation. **/ VOID DisplaySysEventLogHeader ( UINT8 LogHeaderFormat, UINT8 *LogHeader ) { // // Print prompt // ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_LOG_HEADER), gShellDebug1HiiHandle); // // Print value info // if (LogHeaderFormat == 0x00) { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_NO_HEADER), gShellDebug1HiiHandle); } else if (LogHeaderFormat == 0x01) { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_TYPE_LOG_HEADER), gShellDebug1HiiHandle); DisplaySysEventLogHeaderType1 (LogHeader); } else if (LogHeaderFormat <= 0x7f) { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_AVAIL_FUTURE_ASSIGN), gShellDebug1HiiHandle); } else { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_BIOS_VENDOR), gShellDebug1HiiHandle); } } /** Display the El Vdf information. @param[in] ElVdfType The information type. @param[in] VarData The information buffer. **/ VOID DisplayElVdfInfo ( UINT8 ElVdfType, UINT8 *VarData ) { UINT16 *Word; UINT32 *Dword; // // Display Type Name // DisplaySELVarDataFormatType (ElVdfType, SHOW_DETAIL); // // Display Type description // switch (ElVdfType) { case 0: ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_NO_STD_FORMAT), gShellDebug1HiiHandle); break; case 1: Word = (UINT16 *)(VarData + 1); ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_SMBIOS_STRUCT_ASSOC), gShellDebug1HiiHandle); ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_STRUCT_HANDLE), gShellDebug1HiiHandle, *Word); break; case 2: Dword = (UINT32 *)(VarData + 1); ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_MULT_EVENT_COUNTER), gShellDebug1HiiHandle, *Dword); break; case 3: Word = (UINT16 *)(VarData + 1); ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_SMBIOS_STRUCT_ASSOC), gShellDebug1HiiHandle); ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_STRUCT_HANDLE), gShellDebug1HiiHandle, *Word); // // Followed by a multiple-event counter // Dword = (UINT32 *)(VarData + 1); ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_MULT_EVENT_COUNTER), gShellDebug1HiiHandle, *Dword); break; case 4: Dword = (UINT32 *)(VarData + 1); DisplayPostResultsBitmapDw1 (*Dword, SHOW_DETAIL); Dword++; DisplayPostResultsBitmapDw2 (*Dword, SHOW_DETAIL); break; case 5: Dword = (UINT32 *)(VarData + 1); DisplaySELSysManagementTypes (*Dword, SHOW_DETAIL); break; case 6: Dword = (UINT32 *)(VarData + 1); DisplaySELSysManagementTypes (*Dword, SHOW_DETAIL); // // Followed by a multiple-event counter // Dword = (UINT32 *)(VarData + 1); ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_MULT_EVENT_COUNTER), gShellDebug1HiiHandle, *Dword); break; default: if (ElVdfType <= 0x7F) { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_UNUSED_AVAIL_FOR_ASSIGN), gShellDebug1HiiHandle); } else { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_AVAIL_FOR_SYSTEM), gShellDebug1HiiHandle); } } } /** Function to display system event log data. @param[in] LogData The data information. @param[in] LogAreaLength Length of the data. **/ VOID DisplaySysEventLogData ( UINT8 *LogData, UINT16 LogAreaLength ) { LOG_RECORD_FORMAT *Log; UINT8 ElVdfType; // // Event Log Variable Data Format Types // UINTN Offset; // // Print prompt // ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_SYSTEM_EVENT_LOG_2), gShellDebug1HiiHandle); // // Print Log info // Offset = 0; Log = (LOG_RECORD_FORMAT *)LogData; while (Log != NULL && Log->Type != END_OF_LOG && Offset < LogAreaLength) { if (Log != NULL) { // // Display Event Log Record Information // DisplaySELTypes (Log->Type, SHOW_DETAIL); DisplaySELLogHeaderLen (Log->Length, SHOW_DETAIL); Offset += Log->Length; // // Display Log Header Date/Time Fields // These fields contain the BCD representation of the date and time // (as read from CMOS) of the occurrence of the event // So Print as hex and represent decimal // ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_DATE), gShellDebug1HiiHandle); if ((Log != NULL) && (Log->Year >= 80) && (Log->Year <= 99)) { Print (L"19"); } else if ((Log != NULL) && (Log->Year <= 79)) { Print (L"20"); } else { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_ERROR), gShellDebug1HiiHandle); // // Get a Event Log Record // Log = (LOG_RECORD_FORMAT *)(LogData + Offset); continue; } ShellPrintHiiEx ( -1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_TIME_SIX_VARS), gShellDebug1HiiHandle, Log->Year, Log->Month, Log->Day, Log->Hour, Log->Minute, Log->Second ); // // Display Variable Data Format // if (Log->Length <= (sizeof (LOG_RECORD_FORMAT) - 1)) { // // Get a Event Log Record // Log = (LOG_RECORD_FORMAT *)(LogData + Offset); continue; } ElVdfType = Log->LogVariableData[0]; DisplayElVdfInfo (ElVdfType, Log->LogVariableData); // // Get a Event Log Record // Log = (LOG_RECORD_FORMAT *)(LogData + Offset); } } }