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:
jcarsey
2011-09-15 20:10:39 +00:00
parent a0248b0936
commit b6b22b132a
5 changed files with 49 additions and 9 deletions

View File

@ -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;
} }

View File

@ -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
); );
/** /**

View File

@ -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.

View File

@ -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);

View File

@ -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;
} }