MdeModulePkg CapsuleApp: Add -NR (no-reset) option support

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

Add -NR (no-reset) option support, once the option is specified,
no reset will be trigger for the capsule with flag
CAPSULE_FLAGS_PERSIST_ACROSS_RESET and no CAPSULE_FLAGS_INITIATE_RESET.

Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Xiaofeng Wang <winggundum82@163.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Star Zeng <star.zeng@intel.com>
Reviewed-by: Jiewen Yao <jiewen.yao@intel.com>
This commit is contained in:
Star Zeng 2017-03-17 11:27:37 +08:00
parent f2333c707d
commit 7043a90eee
1 changed files with 23 additions and 5 deletions

View File

@ -670,7 +670,7 @@ PrintUsage (
)
{
Print(L"CapsuleApp: usage\n");
Print(L" CapsuleApp <Capsule...>\n");
Print(L" CapsuleApp <Capsule...> [-NR]\n");
Print(L" CapsuleApp -S\n");
Print(L" CapsuleApp -C\n");
Print(L" CapsuleApp -P\n");
@ -680,6 +680,8 @@ PrintUsage (
Print(L" CapsuleApp -D <Capsule>\n");
Print(L" CapsuleApp -P GET <ImageTypeId> <Index> -O <FileName>\n");
Print(L"Parameter:\n");
Print(L" -NR: No reset will be triggered for the capsule\n");
Print(L" with CAPSULE_FLAGS_PERSIST_ACROSS_RESET and without CAPSULE_FLAGS_INITIATE_RESET.\n");
Print(L" -S: Dump capsule report variable (EFI_CAPSULE_REPORT_GUID),\n");
Print(L" which is defined in UEFI specification.\n");
Print(L" -C: Clear capsule report variable (EFI_CAPSULE_RPORT_GUID),\n");
@ -721,6 +723,7 @@ UefiMain (
UINT64 MaxCapsuleSize;
EFI_RESET_TYPE ResetType;
BOOLEAN NeedReset;
BOOLEAN NoReset;
CHAR16 *CapsuleName;
UINTN CapsuleNum;
UINTN Index;
@ -783,7 +786,13 @@ UefiMain (
return EFI_SUCCESS;
}
CapsuleFirstIndex = 1;
CapsuleLastIndex = Argc - 1;
NoReset = FALSE;
if ((Argc > 1) && (StrCmp(Argv[Argc - 1], L"-NR") == 0)) {
NoReset = TRUE;
CapsuleLastIndex = Argc - 2;
} else {
CapsuleLastIndex = Argc - 1;
}
CapsuleNum = CapsuleLastIndex - CapsuleFirstIndex + 1;
if (CapsuleFirstIndex > CapsuleLastIndex) {
@ -855,10 +864,19 @@ UefiMain (
goto Done;
}
//
// For capsule who has reset flag, after calling UpdateCapsule service,triger a
// system reset to process capsule persist across a system reset.
// For capsule with CAPSULE_FLAGS_PERSIST_ACROSS_RESET + CAPSULE_FLAGS_INITIATE_RESET,
// a system reset should have been triggered by gRT->UpdateCapsule() calling above.
//
gRT->ResetSystem (ResetType, EFI_SUCCESS, 0, NULL);
// For capsule with CAPSULE_FLAGS_PERSIST_ACROSS_RESET and without CAPSULE_FLAGS_INITIATE_RESET,
// check if -NR (no-reset) has been specified or not.
//
if (!NoReset) {
//
// For capsule who has reset flag and no -NR (no-reset) has been specified, after calling UpdateCapsule service,
// trigger a system reset to process capsule persist across a system reset.
//
gRT->ResetSystem (ResetType, EFI_SUCCESS, 0, NULL);
}
} else {
//
// For capsule who has no reset flag, only call UpdateCapsule Service without a