#include <Library/PrintLib.h>\r
#include <Library/BmpSupportLib.h>\r
#include <Protocol/GraphicsOutput.h>\r
-#include <Guid/GlobalVariable.h>\r
#include <Guid/CapsuleReport.h>\r
#include <Guid/SystemResourceTable.h>\r
#include <Guid/FmpCapsule.h>\r
@retval EFI_UNSUPPORTED Input parameter is not valid.\r
**/\r
EFI_STATUS\r
-DmpCapsuleStatusVariable (\r
+DumpCapsuleStatusVariable (\r
VOID\r
);\r
\r
return ESRT_FW_TYPE_UNKNOWN;\r
}\r
\r
+/**\r
+ Validate if it is valid capsule header\r
+\r
+ This function assumes the caller provided correct CapsuleHeader pointer\r
+ and CapsuleSize.\r
+\r
+ This function validates the fields in EFI_CAPSULE_HEADER.\r
+\r
+ @param[in] CapsuleHeader Points to a capsule header.\r
+ @param[in] CapsuleSize Size of the whole capsule image.\r
+\r
+**/\r
+BOOLEAN\r
+IsValidCapsuleHeader (\r
+ IN EFI_CAPSULE_HEADER *CapsuleHeader,\r
+ IN UINT64 CapsuleSize\r
+ )\r
+{\r
+ if (CapsuleSize < sizeof (EFI_CAPSULE_HEADER)) {\r
+ return FALSE;\r
+ }\r
+ if (CapsuleHeader->CapsuleImageSize != CapsuleSize) {\r
+ return FALSE;\r
+ }\r
+ if (CapsuleHeader->HeaderSize > CapsuleHeader->CapsuleImageSize) {\r
+ return FALSE;\r
+ }\r
+ if (CapsuleHeader->HeaderSize < sizeof (EFI_CAPSULE_HEADER)) {\r
+ return FALSE;\r
+ }\r
+\r
+ return TRUE;\r
+}\r
+\r
+/**\r
+ Return if this CapsuleGuid is a FMP capsule GUID or not.\r
+\r
+ @param[in] CapsuleGuid A pointer to EFI_GUID\r
+\r
+ @retval TRUE It is a FMP capsule GUID.\r
+ @retval FALSE It is not a FMP capsule GUID.\r
+**/\r
+BOOLEAN\r
+IsFmpCapsuleGuid (\r
+ IN EFI_GUID *CapsuleGuid\r
+ )\r
+{\r
+ if (CompareGuid(&gEfiFmpCapsuleGuid, CapsuleGuid)) {\r
+ return TRUE;\r
+ }\r
+\r
+ return FALSE;\r
+}\r
+\r
/**\r
Append a capsule header on top of current image.\r
This function follows Windows UEFI Firmware Update Platform document.\r
Print(L"CapsuleApp: Capsule image (%s) is not found.\n", CapsuleName);\r
goto Done;\r
}\r
+ if (!IsValidCapsuleHeader (CapsuleBuffer, FileSize)) {\r
+ Print(L"CapsuleApp: Capsule image (%s) is not a valid capsule.\n", CapsuleName);\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Done;\r
+ }\r
+\r
+ if (!IsFmpCapsuleGuid (&((EFI_CAPSULE_HEADER *) CapsuleBuffer)->CapsuleGuid)) {\r
+ Print(L"CapsuleApp: Capsule image (%s) is not a FMP capsule.\n", CapsuleName);\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Done;\r
+ }\r
\r
ImageTypeId = GetCapsuleImageTypeId(CapsuleBuffer);\r
if (ImageTypeId == NULL) {\r
Print(L"CapsuleApp: Capsule ImageTypeId is not found.\n");\r
+ Status = EFI_INVALID_PARAMETER;\r
goto Done;\r
}\r
FwType = GetEsrtFwType(ImageTypeId);\r
if ((FwType != ESRT_FW_TYPE_SYSTEMFIRMWARE) && (FwType != ESRT_FW_TYPE_DEVICEFIRMWARE)) {\r
Print(L"CapsuleApp: Capsule FwType is invalid.\n");\r
+ Status = EFI_INVALID_PARAMETER;\r
goto Done;\r
}\r
\r
UINT32 Index;\r
CHAR16 CapsuleVarName[20];\r
CHAR16 *TempVarName;\r
+ BOOLEAN Found;\r
\r
StrCpyS (CapsuleVarName, sizeof(CapsuleVarName)/sizeof(CapsuleVarName[0]), L"Capsule");\r
TempVarName = CapsuleVarName + StrLen (CapsuleVarName);\r
Index = 0;\r
\r
+ Found = FALSE;\r
while (TRUE) {\r
UnicodeSPrint (TempVarName, 5 * sizeof(CHAR16), L"%04x", Index);\r
\r
0,\r
(VOID *)NULL\r
);\r
- if (EFI_ERROR(Status)) {\r
+ if (Status == EFI_NOT_FOUND) {\r
//\r
- // There is no capsule variables, quit\r
+ // There is no more capsule variables, quit\r
//\r
break;\r
}\r
+ Found = TRUE;\r
+\r
+ Print (L"Clear %s %r\n", CapsuleVarName, Status);\r
\r
Index++;\r
if (Index > 0xFFFF) {\r
}\r
}\r
\r
+ if (!Found) {\r
+ Print (L"No any Capsule#### variable found\n");\r
+ }\r
+\r
return EFI_SUCCESS;\r
}\r
\r
}\r
}\r
\r
-/**\r
- Validate if it is valid capsule header\r
-\r
- This function assumes the caller provided correct CapsuleHeader pointer\r
- and CapsuleSize.\r
-\r
- This function validates the fields in EFI_CAPSULE_HEADER.\r
-\r
- @param[in] CapsuleHeader Points to a capsule header.\r
- @param[in] CapsuleSize Size of the whole capsule image.\r
-\r
-**/\r
-BOOLEAN\r
-IsValidCapsuleHeader (\r
- IN EFI_CAPSULE_HEADER *CapsuleHeader,\r
- IN UINT64 CapsuleSize\r
- )\r
-{\r
- if (CapsuleSize < sizeof (EFI_CAPSULE_HEADER)) {\r
- return FALSE;\r
- }\r
- if (CapsuleHeader->CapsuleImageSize != CapsuleSize) {\r
- return FALSE;\r
- }\r
- if (CapsuleHeader->HeaderSize > CapsuleHeader->CapsuleImageSize) {\r
- return FALSE;\r
- }\r
- if (CapsuleHeader->HeaderSize < sizeof (EFI_CAPSULE_HEADER)) {\r
- return FALSE;\r
- }\r
-\r
- return TRUE;\r
-}\r
-\r
/**\r
Print APP usage.\r
**/\r
return Status;\r
}\r
if (StrCmp(Argv[1], L"-S") == 0) {\r
- Status = DmpCapsuleStatusVariable();\r
+ Status = DumpCapsuleStatusVariable();\r
return EFI_SUCCESS;\r
}\r
if (StrCmp(Argv[1], L"-C") == 0) {\r