/** @file Shell command `Cdata` to display configuration data. Copyright (c) 2018, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at http://opensource.org/licenses/bsd-license.php. THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. **/ #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->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 = 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; }