summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ShellPkg/Application/Shell/Shell.c4
-rw-r--r--ShellPkg/Application/Shell/ShellProtocol.c10
-rw-r--r--ShellPkg/Application/Shell/ShellProtocol.h7
3 files changed, 14 insertions, 7 deletions
diff --git a/ShellPkg/Application/Shell/Shell.c b/ShellPkg/Application/Shell/Shell.c
index 056d66d09e..951d31e82b 100644
--- a/ShellPkg/Application/Shell/Shell.c
+++ b/ShellPkg/Application/Shell/Shell.c
@@ -2231,6 +2231,7 @@ RunCommandOrFile(
)
{
EFI_STATUS Status;
+ EFI_STATUS StartStatus;
CHAR16 *CommandWithPath;
EFI_DEVICE_PATH_PROTOCOL *DevPath;
SHELL_STATUS CalleeExitStatus;
@@ -2308,6 +2309,7 @@ RunCommandOrFile(
DevPath,
CmdLine,
NULL,
+ &StartStatus,
NULL,
NULL
);
@@ -2317,7 +2319,7 @@ RunCommandOrFile(
if(EFI_ERROR (Status)) {
CalleeExitStatus = (SHELL_STATUS) (Status & (~MAX_BIT));
} else {
- CalleeExitStatus = SHELL_SUCCESS;
+ CalleeExitStatus = (SHELL_STATUS) StartStatus;
}
//
diff --git a/ShellPkg/Application/Shell/ShellProtocol.c b/ShellPkg/Application/Shell/ShellProtocol.c
index ec4559480d..cfe2f409e4 100644
--- a/ShellPkg/Application/Shell/ShellProtocol.c
+++ b/ShellPkg/Application/Shell/ShellProtocol.c
@@ -1386,11 +1386,13 @@ InternalShellExecuteDevicePath(
IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath,
IN CONST CHAR16 *CommandLine OPTIONAL,
IN CONST CHAR16 **Environment OPTIONAL,
+ OUT EFI_STATUS *StartImageStatus OPTIONAL,
OUT UINTN *ExitDataSize OPTIONAL,
OUT CHAR16 **ExitData OPTIONAL
)
{
EFI_STATUS Status;
+ EFI_STATUS StartStatus;
EFI_STATUS CleanupStatus;
EFI_HANDLE NewHandle;
EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
@@ -1504,11 +1506,14 @@ InternalShellExecuteDevicePath(
// now start the image, passing up exit data if the caller requested it
//
if (!EFI_ERROR(Status)) {
- Status = gBS->StartImage(
+ StartStatus = gBS->StartImage(
NewHandle,
ExitDataSizePtr,
ExitData
);
+ if (StartImageStatus != NULL) {
+ *StartImageStatus = StartStatus;
+ }
CleanupStatus = gBS->UninstallProtocolInterface(
NewHandle,
@@ -1620,6 +1625,7 @@ EfiShellExecute(
DevPath,
Temp,
(CONST CHAR16**)Environment,
+ StatusCode,
&ExitDataSize,
&ExitData);
@@ -1644,8 +1650,6 @@ EfiShellExecute(
}
FreePool (ExitData);
Status = EFI_SUCCESS;
- } else if ((StatusCode != NULL) && !EFI_ERROR(Status)) {
- *StatusCode = EFI_SUCCESS;
}
//
diff --git a/ShellPkg/Application/Shell/ShellProtocol.h b/ShellPkg/Application/Shell/ShellProtocol.h
index ff123277c2..7cc1b01947 100644
--- a/ShellPkg/Application/Shell/ShellProtocol.h
+++ b/ShellPkg/Application/Shell/ShellProtocol.h
@@ -455,10 +455,11 @@ EfiShellEnablePageBreak (
EFI_STATUS
EFIAPI
InternalShellExecuteDevicePath(
- IN CONST EFI_HANDLE *ParentImageHandle,
+ IN CONST EFI_HANDLE *ParentImageHandle,
IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath,
- IN CONST CHAR16 *CommandLine OPTIONAL,
- IN CONST CHAR16 **Environment OPTIONAL,
+ IN CONST CHAR16 *CommandLine OPTIONAL,
+ IN CONST CHAR16 **Environment OPTIONAL,
+ OUT EFI_STATUS *StartImageStatus OPTIONAL,
OUT UINTN *ExitDataSize OPTIONAL,
OUT CHAR16 **ExitData OPTIONAL
);