public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Sam Kaynor" <sam.kaynor@arm.com>
To: devel@edk2.groups.io
Cc: Ray Ni <ray.ni@intel.com>, Zhichao Gao <zhichao.gao@intel.com>
Subject: [edk2-devel] [PATCH v8 2/5] ShellPkg: UefiShellDebug1CommandsLib: Image Execution Table in Dmem.c
Date: Tue, 18 Jun 2024 13:34:56 -0500	[thread overview]
Message-ID: <20240618183459.299381-3-Sam.Kaynor@arm.com> (raw)
In-Reply-To: <20240618183459.299381-1-Sam.Kaynor@arm.com>

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=4352

Implemented dumping of the Image Execution Table using Dmem.c

Cc: Ray Ni <ray.ni@intel.com>
Cc: Zhichao Gao <zhichao.gao@intel.com>
Signed-off-by: Sam Kaynor <Sam.Kaynor@arm.com>
Tested-by: Stuart Yoder <stuart.yoder@arm.com>
Reviewed-by: Stuart Yoder <stuart.yoder@arm.com>
Reviewed-by: Zhichao Gao <zhichao.gao@intel.com>
---

Notes:
    v8:
    - corrected CI failure on bad type cast
    - various CI changes
    v5:
    - corrected comment for GetBaseName
    - corrected style error (spaces before '(')
    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                         | 136 ++++++++++++++++++++
 ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.uni |   3 +
 2 files changed, 139 insertions(+)

diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c
index d4030798f3cb..80c779a0b369 100644
--- a/ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c
+++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c
@@ -139,6 +139,138 @@ DisplayRtProperties (
   return (ShellStatus);
 }
 
+/**
+  Retrieve the ImageExecutionTable Entry ImageName from ImagePath
+
+  @param[in]  FileName    The full path of the image.
+  @param[out] BaseName    The name of the image.
+**/
+EFI_STATUS
+GetBaseName (
+  IN  CHAR16  *FileName,
+  OUT CHAR16  **BaseName
+  )
+{
+  UINTN   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.
+**/
+EFI_STATUS
+GetImageExecutionInfo (
+  )
+{
+  EFI_STATUS                      Status;
+  EFI_IMAGE_EXECUTION_INFO_TABLE  *ExecInfoTablePtr;
+  EFI_IMAGE_EXECUTION_INFO        *InfoPtr;
+  CHAR8                           *ptr;
+  CHAR16                          *ImagePath;
+  CHAR16                          *ImageName;
+  UINTN                           Image;
+  UINTN                           *NumberOfImages;
+  CHAR16                          *ActionType;
+
+  EfiGetSystemConfigurationTable (&gEfiImageSecurityDatabaseGuid, (VOID **)&ExecInfoTablePtr);
+
+  NumberOfImages = &ExecInfoTablePtr->NumberOfImages;
+
+  ptr = (CHAR8 *)ExecInfoTablePtr + 1;
+
+  for (Image = 0; Image < *NumberOfImages; Image++, ptr += InfoPtr->InfoSize) {
+    InfoPtr   = (EFI_IMAGE_EXECUTION_INFO *)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 ();
+    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 +501,10 @@ ShellCommandRunDmem (
           if (ShellStatus == SHELL_SUCCESS) {
             ShellStatus = DisplayRtProperties (RtPropertiesTableAddress);
           }
+
+          if (ShellStatus == SHELL_SUCCESS) {
+            ShellStatus = DisplayImageExecutionEntries (ImageExecutionTableAddress);
+          }
         }
       } else {
         ShellStatus = DisplayMmioMemory (Address, (UINTN)Size);
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


  parent reply	other threads:[~2024-06-18 18:35 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-06-18 18:34 [edk2-devel] [PATCH v8 0/5] Adding support for verbose UEFI Table dumping to Dmem.c Sam Kaynor
2024-06-18 18:34 ` [edk2-devel] [PATCH v8 1/5] ShellPkg: UefiShellDebug1CommandsLib: Dumping RT Properties in Dmem.c Sam Kaynor
2024-06-18 18:34 ` Sam Kaynor [this message]
2024-06-18 18:34 ` [edk2-devel] [PATCH v8 3/5] MdePkg: Adding support for EFI_CONFORMANCE_PROFILE_TABLE Sam Kaynor
2024-06-18 18:34 ` [edk2-devel] [PATCH v8 4/5] MdePkg: Adding EBBR EFI_CONFORMANCE_PROFILE_TABLE GUIDs Sam Kaynor
2024-06-18 18:34 ` [edk2-devel] [PATCH v8 5/5] ShellPkg: UefiShellDebug1CommandsLib: Conformance Profiles in Dmem.c Sam Kaynor

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240618183459.299381-3-Sam.Kaynor@arm.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox