/** @file Shell command `Cdata` to display configuration data. Copyright (c) 2018, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include #include #include #include #include #include /** display configuration data. @param[in] Shell shell instance @param[in] Argc number of command line arguments @param[in] Argv command line arguments @retval EFI_SUCCESS **/ STATIC EFI_STATUS EFIAPI ShellCommandCdataFunc ( IN SHELL *Shell, IN UINTN Argc, IN CHAR16 *Argv[] ); CONST SHELL_COMMAND ShellCommandCdata = { L"cdata", L"Display configuration data.", &ShellCommandCdataFunc }; /** Print the OS boot option list. @param[in] OsBootOptionList the OS boot option list **/ VOID PrintBlobheader ( CDATA_BLOB *CdataBlob ) { ShellPrint (L"Found config database:\n"); ShellPrint (L" Signature :%x\n", CdataBlob->Signature); ShellPrint (L" HeaderLength:%x\n", CdataBlob->HeaderLength); ShellPrint (L" Attribute :%x\n", CdataBlob->Attribute); ShellPrint (L" IntCfgOffset:%x\n", CdataBlob->ExtraInfo.InternalDataOffset * 4); ShellPrint (L" UsedLength :%x\n", CdataBlob->UsedLength); ShellPrint (L" TotalLength :%x\n", CdataBlob->TotalLength); } /** Print configuration data only for specified tag. @param[in] Address The buffer address to dump @param[in] Length The total length to dump **/ VOID ShellDumpBuffer ( IN CHAR8 *Address, IN UINT32 Length ) { UINT32 Index; if (Length > 0x20) { ShellPrint (L"Dump buffer from:0x%p, length %x\n", Address, Length); } for (Index = 0; Index < Length; Index++) { if ( (Index % 16) == 0) { ShellPrint (L"\n0x%08x:", Index); } ShellPrint (L" %02x ", Address[Index] & 0xFF); } ShellPrint (L"\n\n"); } /** Print all the configuration data. @param[in] CdataBlob The pointer to config database **/ VOID PrintCfgItem ( CDATA_BLOB *CdataBlob ) { CDATA_HEADER *CdataHeader; UINT32 Index; UINT32 Offset; Index = 0; Offset = CdataBlob->HeaderLength; ShellPrint (L"Idx | Tag | Version | Flags | Length | PID mask \n"); while (Offset < CdataBlob->UsedLength) { CdataHeader = (CDATA_HEADER *) ((UINT8 *)CdataBlob + Offset); ShellPrint (L"%3x |%4x | %6x | %4x | %4xh | %5x \n", \ Index, \ CdataHeader->Tag, \ CdataHeader->Version, \ CdataHeader->Flags, \ CdataHeader->Length * sizeof (UINT32), \ CdataHeader->Condition[0].Value \ ); Offset += CdataHeader->Length * sizeof (UINT32); Index++; } ShellPrint (L"\n"); } /** Print configuration data only for specified tag. @param[in] CdataBlob The pointer to config database @param[in] Tag The configuration tag **/ VOID PrintTag ( CDATA_BLOB *CdataBlob, UINT32 Tag ) { CDATA_HEADER *CdataHeader; UINT32 Index; UINT32 Offset; Index = 0; Offset = CdataBlob->HeaderLength; ShellPrint (L"Idx | Tag | Version | Flags | Length | PID mask \n"); while (Offset < CdataBlob->UsedLength) { CdataHeader = (CDATA_HEADER *) ((UINT8 *)CdataBlob + Offset); if (CdataHeader->Tag == Tag) { ShellPrint (L"%3x |%4x | %6x | %4x | %4xh | %5x \n", \ Index, \ CdataHeader->Tag, \ CdataHeader->Version, \ CdataHeader->Flags, \ CdataHeader->Length * sizeof (UINT32), \ CdataHeader->Condition[0].Value \ ); Index++; ShellDumpBuffer ((CHAR8 *) CdataHeader, CdataHeader->Length * sizeof (UINT32)); } Offset += CdataHeader->Length * sizeof (UINT32); } ShellPrint (L"\n"); } /** Print configuration data. @param[in] Shell shell instance @param[in] Argc number of command line arguments @param[in] Argv command line arguments @retval EFI_SUCCESS **/ EFI_STATUS EFIAPI ShellCommandCdataFunc ( IN SHELL *Shell, IN UINTN Argc, IN CHAR16 *Argv[] ) { CDATA_BLOB *CdataBlob; UINT32 Index; BOOLEAN BlobPrint; BOOLEAN CfgHeaderPrint; BOOLEAN DataBaseDump; BOOLEAN UsagePrint; UINT32 Tag; CdataBlob = (CDATA_BLOB *) GetConfigDataPtr (); if ((CdataBlob == NULL) || (CdataBlob->Signature != 0x44474643)) { ShellPrint (L"Not find Cdata blob!\n"); return EFI_NOT_FOUND; } UsagePrint = TRUE; BlobPrint = FALSE; CfgHeaderPrint = FALSE; DataBaseDump = FALSE; Tag = 0; // Check flags for (Index = 0; Index < Argc; Index++) { if (StrCmp (Argv[Index], L"-h") == 0) { UsagePrint = TRUE; } if (StrCmp (Argv[Index], L"-b") == 0) { BlobPrint = TRUE; UsagePrint = FALSE; } if (StrCmp (Argv[Index], L"-c") == 0) { CfgHeaderPrint = TRUE; UsagePrint = FALSE; } if (StrCmp (Argv[Index], L"-d") == 0) { DataBaseDump = TRUE; UsagePrint = FALSE; } if (StrCmp (Argv[Index], L"-t") == 0) { Index++; Tag = (UINT32)StrHexToUintn (Argv[Index]); UsagePrint = FALSE; } } if (BlobPrint) { PrintBlobheader (CdataBlob); } if (CfgHeaderPrint) { PrintCfgItem (CdataBlob); } if (DataBaseDump) { ShellDumpBuffer ((CHAR8 *)CdataBlob, CdataBlob->UsedLength); } if (Tag != 0) { PrintTag (CdataBlob, Tag); } if (UsagePrint) { ShellPrint (L"Usage: %s [-h] [-b] [-c] [-d] [-t tag]\n", Argv[0]); ShellPrint (L"\n" L"Flags:\n" L" -h help\n" L" -b Print config database header\n" L" -c Print all the configuratin header\n" L" -d Dump config database\n" L" -t tag Print configuration data with specified tag\n"); } return EFI_SUCCESS; }