REF: https://bugzilla.tianocore.org/show_bug.cgi?id=4352
Implemented dumping of the Image Execution Table using Dmem.c Cc: Ray Ni <ray...@intel.com> Cc: Zhichao Gao <zhichao....@intel.com> Signed-off-by: Sam Kaynor <sam.kay...@arm.com> --- Notes: v4: - changed Image Execution output to match spec v3: - fixed build erros - added setwidth formatting to output - properly using Address variable ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c | 134 ++++++++++++++++++++ ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.uni | 3 + 2 files changed, 137 insertions(+) diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c index 52a0630f1cdc..813759a9055d 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c @@ -139,6 +139,137 @@ DisplayRtProperties ( return (ShellStatus); } +/** + Retrieve the ImageExecutionTable Entry ImageName from Device Path + + @param[in] Address The pointer to the ImageExecutionTable. +**/ +EFI_STATUS +GetBaseName ( + IN CHAR16 *FileName, + OUT CHAR16 **BaseName + ) +{ + UINT32 StrLen; + CHAR16 *StrTail; + + StrLen = StrSize(FileName); + + for (StrTail = FileName + StrLen - 1; StrTail != FileName && *StrTail != L'\\'; StrTail--) { + } + + if (StrTail == FileName) { + return EFI_NOT_FOUND; + } + *BaseName = StrTail+1; + + return EFI_SUCCESS; +} + +/** + Retrieve the ImageExecutionTable entries + + @param[in] Address The pointer to the ImageExecutionTable. +**/ +EFI_STATUS +GetImageExecutionInfo ( + IN UINT64 Address + ) +{ + EFI_STATUS Status; + EFI_IMAGE_EXECUTION_INFO_TABLE *ExecInfoTablePtr; + EFI_IMAGE_EXECUTION_INFO *InfoPtr; + VOID *ptr; + CHAR16 *ImagePath; + CHAR16 *ImageName; + UINTN *NumberOfImages; + CHAR16 *ActionType; + + ExecInfoTablePtr = (EFI_IMAGE_EXECUTION_INFO_TABLE *)Address; + + NumberOfImages = &ExecInfoTablePtr->NumberOfImages; + + ptr = (VOID *)(ExecInfoTablePtr + 1); + + for (int Image = 0; Image < *NumberOfImages; Image++, ptr += InfoPtr->InfoSize) { + InfoPtr = ptr; + ImagePath = (CHAR16*)(InfoPtr + 1); + + GetBaseName(ImagePath,&ImageName); + + switch(InfoPtr->Action) { + case EFI_IMAGE_EXECUTION_AUTHENTICATION: + ActionType = L"AUTHENTICATION"; + break; + case EFI_IMAGE_EXECUTION_AUTH_UNTESTED: + ActionType = L"AUTH_UNTESTED"; + break; + case EFI_IMAGE_EXECUTION_AUTH_SIG_FAILED: + ActionType = L"AUTH_SIG_FAILED"; + break; + case EFI_IMAGE_EXECUTION_AUTH_SIG_PASSED: + ActionType = L"AUTH_SIG_PASSED"; + break; + case EFI_IMAGE_EXECUTION_AUTH_SIG_NOT_FOUND: + ActionType = L"AUTH_SIG_NOT_FOUND"; + break; + case EFI_IMAGE_EXECUTION_AUTH_SIG_FOUND: + ActionType = L"AUTH_SIG_FOUND"; + break; + case EFI_IMAGE_EXECUTION_POLICY_FAILED: + ActionType = L"POLICY_FAILED"; + break; + case EFI_IMAGE_EXECUTION_INITIALIZED: + ActionType = L"INITIALIZED"; + break; + default: + ActionType = L"invalid action"; + } + + Status = ShellPrintHiiEx( + -1, + -1, + NULL, + STRING_TOKEN (STR_DMEM_IMG_EXE_ENTRY), + gShellDebug1HiiHandle, + ImageName, + ActionType + ); + } + + return Status; +} + +/** + Display the ImageExecutionTable entries + + @param[in] Address The pointer to the ImageExecutionTable. +**/ +SHELL_STATUS +DisplayImageExecutionEntries ( + IN UINT64 Address + ) +{ + SHELL_STATUS ShellStatus; + EFI_STATUS Status; + + ShellStatus = SHELL_SUCCESS; + + if (Address != 0) { + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMEM_IMG_EXE_TABLE), gShellDebug1HiiHandle); + Status = GetImageExecutionInfo(Address); + if (EFI_ERROR (Status)) { + ShellStatus = SHELL_ABORTED; + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMEM_ERR_GET_FAIL), gShellDebug1HiiHandle, L"ImageExecutionTable"); + } + } else { + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMEM_ERR_NOT_FOUND), gShellDebug1HiiHandle, L"ImageExecutionTable"); + } + return (ShellStatus); +} + + + STATIC CONST SHELL_PARAM_ITEM ParamList[] = { { L"-mmio", TypeFlag }, { L"-verbose", TypeFlag }, @@ -369,6 +500,9 @@ ShellCommandRunDmem ( if (ShellStatus == SHELL_SUCCESS) { ShellStatus = DisplayRtProperties (RtPropertiesTableAddress); } + if (ShellStatus == SHELL_SUCCESS) { + ShellStatus = DisplayImageExecutionEntries (ImageExecutionTableAddress); + } } } else { diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.uni b/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.uni index a2241614f109..3b730164ddce 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.uni +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.uni @@ -144,6 +144,9 @@ " UPDATE_CAPSULE %d\r\n" " QUERY_CAPSULE_CAPABILITIES %d\r\n" " QUERY_VARIABLE_INFO %d\r\n" +#string STR_DMEM_IMG_EXE_TABLE #language en-US "\r\nImage Execution Table\r\n" + "----------------------------------------\r\n" +#string STR_DMEM_IMG_EXE_ENTRY #language en-US "%20s: %s\r\n" #string STR_DMEM_ERR_NOT_FOUND #language en-US "\r\n%H%s%N: Table address not found.\r\n" #string STR_DMEM_ERR_GET_FAIL #language en-US "\r\n%H%s%N: Unable to get table information.\r\n" -- 2.34.1