ShellPkg: Eliminate loss of high bits in return value from exit command on 64 bit platform.
submitted-by: jcarsey reviewed-by: gookboy15a reviewed-by: niruiyu git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12356 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
@ -475,6 +475,9 @@ UefiMain (
|
|||||||
DEBUG_CODE(ShellInfoObject.ConsoleInfo = NULL;);
|
DEBUG_CODE(ShellInfoObject.ConsoleInfo = NULL;);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ShellCommandGetExit()) {
|
||||||
|
return ((EFI_STATUS)ShellCommandGetExitCode());
|
||||||
|
}
|
||||||
return (Status);
|
return (Status);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1622,6 +1625,7 @@ RunScriptFileHandle (
|
|||||||
BOOLEAN PreCommandEchoState;
|
BOOLEAN PreCommandEchoState;
|
||||||
CONST CHAR16 *CurDir;
|
CONST CHAR16 *CurDir;
|
||||||
UINTN LineCount;
|
UINTN LineCount;
|
||||||
|
CHAR16 LeString[50];
|
||||||
|
|
||||||
ASSERT(!ShellCommandGetScriptExit());
|
ASSERT(!ShellCommandGetScriptExit());
|
||||||
|
|
||||||
@ -1826,7 +1830,11 @@ RunScriptFileHandle (
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (ShellCommandGetScriptExit()) {
|
if (ShellCommandGetScriptExit()) {
|
||||||
ShellCommandRegisterExit(FALSE);
|
UnicodeSPrint(LeString, sizeof(LeString)*sizeof(LeString[0]), L"0x%Lx", ShellCommandGetExitCode());
|
||||||
|
DEBUG_CODE(InternalEfiShellSetEnv(L"DebugLasterror", LeString, TRUE););
|
||||||
|
InternalEfiShellSetEnv(L"Lasterror", LeString, TRUE);
|
||||||
|
|
||||||
|
ShellCommandRegisterExit(FALSE, 0);
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -340,11 +340,24 @@ ShellCommandSetEchoState (
|
|||||||
Indicate that the current shell or script should exit.
|
Indicate that the current shell or script should exit.
|
||||||
|
|
||||||
@param[in] ScriptOnly TRUE if exiting a script; FALSE otherwise.
|
@param[in] ScriptOnly TRUE if exiting a script; FALSE otherwise.
|
||||||
|
@param[in] ErrorCode The 64 bit error code to return.
|
||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
ShellCommandRegisterExit (
|
ShellCommandRegisterExit (
|
||||||
IN BOOLEAN ScriptOnly
|
IN BOOLEAN ScriptOnly,
|
||||||
|
IN CONST UINT64 ErrorCode
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Retrieve the Exit code.
|
||||||
|
|
||||||
|
@return the value passed into RegisterExit.
|
||||||
|
**/
|
||||||
|
UINT64
|
||||||
|
EFIAPI
|
||||||
|
ShellCommandGetExitCode (
|
||||||
|
VOID
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -26,6 +26,7 @@ STATIC SCRIPT_FILE_LIST mScriptList;
|
|||||||
STATIC ALIAS_LIST mAliasList;
|
STATIC ALIAS_LIST mAliasList;
|
||||||
STATIC BOOLEAN mEchoState;
|
STATIC BOOLEAN mEchoState;
|
||||||
STATIC BOOLEAN mExitRequested;
|
STATIC BOOLEAN mExitRequested;
|
||||||
|
STATIC UINT64 mExitCode;
|
||||||
STATIC BOOLEAN mExitScript;
|
STATIC BOOLEAN mExitScript;
|
||||||
STATIC CHAR16 *mProfileList;
|
STATIC CHAR16 *mProfileList;
|
||||||
STATIC UINTN mProfileListSize;
|
STATIC UINTN mProfileListSize;
|
||||||
@ -697,12 +698,14 @@ ShellCommandSetEchoState(
|
|||||||
/**
|
/**
|
||||||
Indicate that the current shell or script should exit.
|
Indicate that the current shell or script should exit.
|
||||||
|
|
||||||
@param[in] ScriptOnly TRUE if only exiting a script, FALSE othrwise.
|
@param[in] ScriptOnly TRUE if exiting a script; FALSE otherwise.
|
||||||
|
@param[in] ErrorCode The 64 bit error code to return.
|
||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
ShellCommandRegisterExit (
|
ShellCommandRegisterExit (
|
||||||
IN BOOLEAN ScriptOnly
|
IN BOOLEAN ScriptOnly,
|
||||||
|
IN CONST UINT64 ErrorCode
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
mExitRequested = (BOOLEAN)(!mExitRequested);
|
mExitRequested = (BOOLEAN)(!mExitRequested);
|
||||||
@ -711,6 +714,7 @@ ShellCommandRegisterExit (
|
|||||||
} else {
|
} else {
|
||||||
mExitScript = FALSE;
|
mExitScript = FALSE;
|
||||||
}
|
}
|
||||||
|
mExitCode = ErrorCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -728,6 +732,21 @@ ShellCommandGetExit (
|
|||||||
return (mExitRequested);
|
return (mExitRequested);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Retrieve the Exit code.
|
||||||
|
|
||||||
|
If ShellCommandGetExit returns FALSE than the return from this is undefined.
|
||||||
|
|
||||||
|
@return the value passed into RegisterExit.
|
||||||
|
**/
|
||||||
|
UINT64
|
||||||
|
EFIAPI
|
||||||
|
ShellCommandGetExitCode (
|
||||||
|
VOID
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return (mExitCode);
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
Retrieve the Exit script indicator.
|
Retrieve the Exit script indicator.
|
||||||
|
|
||||||
|
@ -77,16 +77,16 @@ ShellCommandRunExit (
|
|||||||
//
|
//
|
||||||
// If we are in a batch file and /b then pass TRUE otherwise false...
|
// If we are in a batch file and /b then pass TRUE otherwise false...
|
||||||
//
|
//
|
||||||
ShellCommandRegisterExit((BOOLEAN)(gEfiShellProtocol->BatchIsActive() && ShellCommandLineGetFlag(Package, L"/b")));
|
ShellCommandRegisterExit((BOOLEAN)(gEfiShellProtocol->BatchIsActive() && ShellCommandLineGetFlag(Package, L"/b")), RetVal);
|
||||||
|
|
||||||
ShellStatus = (SHELL_STATUS)(RetVal);
|
ShellStatus = SHELL_SUCCESS;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// If we are in a batch file and /b then pass TRUE otherwise false...
|
// If we are in a batch file and /b then pass TRUE otherwise false...
|
||||||
//
|
//
|
||||||
ShellCommandRegisterExit((BOOLEAN)(gEfiShellProtocol->BatchIsActive() && ShellCommandLineGetFlag(Package, L"/b")));
|
ShellCommandRegisterExit((BOOLEAN)(gEfiShellProtocol->BatchIsActive() && ShellCommandLineGetFlag(Package, L"/b")), 0);
|
||||||
|
|
||||||
ShellStatus = (SHELL_STATUS)0;
|
ShellStatus = SHELL_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
ShellCommandLineFreeVarList (Package);
|
ShellCommandLineFreeVarList (Package);
|
||||||
|
@ -84,7 +84,7 @@ ShellCommandRunPause (
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (EFI_ERROR(Status) || Resp == NULL || *Resp == ShellPromptResponseQuit) {
|
if (EFI_ERROR(Status) || Resp == NULL || *Resp == ShellPromptResponseQuit) {
|
||||||
ShellCommandRegisterExit(TRUE);
|
ShellCommandRegisterExit(TRUE, 0);
|
||||||
ShellStatus = SHELL_ABORTED;
|
ShellStatus = SHELL_ABORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user