diff options
author | Star Zeng <star.zeng@intel.com> | 2017-03-17 11:27:37 +0800 |
---|---|---|
committer | Star Zeng <star.zeng@intel.com> | 2017-03-21 14:48:10 +0800 |
commit | 7043a90eee1150db1d55cdde2a98700fa10838e5 (patch) | |
tree | 00c8154fa9e86081ef5df8d253b8967a2c6d9765 /MdeModulePkg | |
parent | f2333c707dd04f069c102bcae004561ec590a3a0 (diff) | |
download | edk2-platforms-7043a90eee1150db1d55cdde2a98700fa10838e5.tar.xz |
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>
Diffstat (limited to 'MdeModulePkg')
-rw-r--r-- | MdeModulePkg/Application/CapsuleApp/CapsuleApp.c | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/MdeModulePkg/Application/CapsuleApp/CapsuleApp.c b/MdeModulePkg/Application/CapsuleApp/CapsuleApp.c index 84ed4d738b..6febe846b1 100644 --- a/MdeModulePkg/Application/CapsuleApp/CapsuleApp.c +++ b/MdeModulePkg/Application/CapsuleApp/CapsuleApp.c @@ -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.
+ //
+ // For capsule with CAPSULE_FLAGS_PERSIST_ACROSS_RESET and without CAPSULE_FLAGS_INITIATE_RESET,
+ // check if -NR (no-reset) has been specified or not.
//
- gRT->ResetSystem (ResetType, EFI_SUCCESS, 0, NULL);
+ 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
|