summaryrefslogtreecommitdiff
path: root/Core
diff options
context:
space:
mode:
authorJeff Westfahl <jeff.westfahl@ni.com>2017-05-05 05:53:04 +0800
committerGuo Mang <mang.guo@intel.com>2017-07-12 11:24:43 +0800
commitdb5726dca80d669327d72a26089ac4ccd6d13479 (patch)
tree37f10e66cb907d65291937ecad5876df40bd294c /Core
parente6e5443901d90594f5b6000ad7d8181e0fd03f26 (diff)
downloadedk2-platforms-db5726dca80d669327d72a26089ac4ccd6d13479.tar.xz
ShellPkg/HandleParsingLib: Show LoadedImageProtocol file name
This patch adds support for showing the file name associated with a LoadedImageProtocol file path. This is a behavior that was present in the old shell but has been lost in the new shell. For example, using 'dh -v' in the old shell: Handle D3 (3A552218) Image (3A54C918) File:MicrocodeUpdate ParentHandle..: 3A666398 vs. the new shell: D3: 3A552218 LoadedImage Revision......: 0x00001000 ParentHandle..: 3A666398 Here's what the output of 'dh -v' looks like after this patch: D3: 3A552218 LoadedImage Name..........: MicrocodeUpdate Revision......: 0x00001000 ParentHandle..: 3A666398 This seems like useful information for the shell to display. Cc: Ruiyu Ni <ruiyu.ni@intel.com> Cc: Jaben Carsey <jaben.carsey@intel.com> Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Jeff Westfahl <jeff.westfahl@ni.com> Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com> Reviewed-by: Ruiyu Ni <ruiyu.ni@intel.com> Reviewed-by: Jaben Carsey <jaben.carsey@intel.com> (cherry picked from commit f4ac4354652b2bcf4f138b5ebd79b2f07710d4ef)
Diffstat (limited to 'Core')
-rw-r--r--Core/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c79
-rw-r--r--Core/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.uni2
2 files changed, 80 insertions, 1 deletions
diff --git a/Core/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c b/Core/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c
index c96f6dd157..d3ee068eba 100644
--- a/Core/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c
+++ b/Core/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c
@@ -16,11 +16,73 @@
#include "UefiHandleParsingLib.h"
#include "IndustryStandard/Acpi10.h"
+#include <PiDxe.h>
+#include <Protocol/FirmwareVolume2.h>
EFI_HANDLE mHandleParsingHiiHandle = NULL;
HANDLE_INDEX_LIST mHandleList = {{{NULL,NULL},0,0},0};
GUID_INFO_BLOCK *mGuidList;
UINTN mGuidListCount;
+
+/**
+ Function to find the file name associated with a LoadedImageProtocol.
+
+ @param[in] LoadedImage An instance of LoadedImageProtocol.
+
+ @retval A string representation of the file name associated
+ with LoadedImage, or NULL if no name can be found.
+**/
+CHAR16*
+FindLoadedImageFileName (
+ IN EFI_LOADED_IMAGE_PROTOCOL *LoadedImage
+ )
+{
+ EFI_GUID *NameGuid;
+ EFI_STATUS Status;
+ EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv;
+ VOID *Buffer;
+ UINTN BufferSize;
+ UINT32 AuthenticationStatus;
+
+ if ((LoadedImage == NULL) || (LoadedImage->FilePath == NULL)) {
+ return NULL;
+ }
+
+ NameGuid = EfiGetNameGuidFromFwVolDevicePathNode((MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *)LoadedImage->FilePath);
+
+ if (NameGuid == NULL) {
+ return NULL;
+ }
+
+ //
+ // Get the FirmwareVolume2Protocol of the device handle that this image was loaded from.
+ //
+ Status = gBS->HandleProtocol (LoadedImage->DeviceHandle, &gEfiFirmwareVolume2ProtocolGuid, (VOID**) &Fv);
+
+ //
+ // FirmwareVolume2Protocol is PI, and is not required to be available.
+ //
+ if (EFI_ERROR (Status)) {
+ return NULL;
+ }
+
+ //
+ // Read the user interface section of the image.
+ //
+ Buffer = NULL;
+ Status = Fv->ReadSection(Fv, NameGuid, EFI_SECTION_USER_INTERFACE, 0, &Buffer, &BufferSize, &AuthenticationStatus);
+
+ if (EFI_ERROR (Status)) {
+ return NULL;
+ }
+
+ //
+ // ReadSection returns just the section data, without any section header. For
+ // a user interface section, the only data is the file name.
+ //
+ return Buffer;
+}
+
/**
Function to translate the EFI_MEMORY_TYPE into a string.
@@ -169,6 +231,7 @@ LoadedImageProtocolDumpInformation(
EFI_STATUS Status;
CHAR16 *RetVal;
CHAR16 *Temp;
+ CHAR16 *FileName;
CHAR16 *FilePath;
CHAR16 *CodeType;
CHAR16 *DataType;
@@ -192,6 +255,20 @@ LoadedImageProtocolDumpInformation(
HandleParsingHiiInit();
+ FileName = FindLoadedImageFileName(LoadedImage);
+
+ RetVal = NULL;
+ if (FileName != NULL) {
+ Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_LI_DUMP_NAME), NULL);
+
+ if (Temp != NULL) {
+ RetVal = CatSPrint(NULL, Temp, FileName);
+ }
+
+ SHELL_FREE_NON_NULL(Temp);
+ SHELL_FREE_NON_NULL(FileName);
+ }
+
Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_LI_DUMP_MAIN), NULL);
if (Temp == NULL) {
return NULL;
@@ -203,7 +280,7 @@ LoadedImageProtocolDumpInformation(
CodeType = ConvertMemoryType(LoadedImage->ImageCodeType);
RetVal = CatSPrint(
- NULL,
+ RetVal,
Temp,
LoadedImage->Revision,
LoadedImage->ParentHandle,
diff --git a/Core/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.uni b/Core/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.uni
index 7b3711d741..e07c9a1670 100644
--- a/Core/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.uni
+++ b/Core/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.uni
@@ -348,6 +348,8 @@
+#string STR_LI_DUMP_NAME #language en-US " Name..........: %%H%s%%N\r\n"
+
#string STR_LI_DUMP_MAIN #language en-US " Revision......: %%H0x%08x%%N\r\n"
" ParentHandle..: %%H%x%%N\r\n"
" SystemTable...: %%H%x%%N\r\n"