MdeModulePkg: Apply uncrustify changes
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3737 Apply uncrustify changes to .c/.h files in the MdeModulePkg package Cc: Andrew Fish <afish@apple.com> Cc: Leif Lindholm <leif@nuviainc.com> Cc: Michael D Kinney <michael.d.kinney@intel.com> Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com> Reviewed-by: Liming Gao <gaoliming@byosoft.com.cn>
This commit is contained in:
committed by
mergify[bot]
parent
7c7184e201
commit
1436aea4d5
@@ -8,9 +8,9 @@
|
||||
|
||||
#include "CapsuleApp.h"
|
||||
|
||||
UINTN Argc;
|
||||
CHAR16 **Argv;
|
||||
EFI_SHELL_PROTOCOL *mShellProtocol = NULL;
|
||||
UINTN Argc;
|
||||
CHAR16 **Argv;
|
||||
EFI_SHELL_PROTOCOL *mShellProtocol = NULL;
|
||||
|
||||
/**
|
||||
|
||||
@@ -23,15 +23,15 @@ GetArg (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_SHELL_PARAMETERS_PROTOCOL *ShellParameters;
|
||||
EFI_STATUS Status;
|
||||
EFI_SHELL_PARAMETERS_PROTOCOL *ShellParameters;
|
||||
|
||||
Status = gBS->HandleProtocol (
|
||||
gImageHandle,
|
||||
&gEfiShellParametersProtocolGuid,
|
||||
(VOID**)&ShellParameters
|
||||
(VOID **)&ShellParameters
|
||||
);
|
||||
if (EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
@@ -50,13 +50,13 @@ GetShellProtocol (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_STATUS Status;
|
||||
|
||||
if (mShellProtocol == NULL) {
|
||||
Status = gBS->LocateProtocol (
|
||||
&gEfiShellProtocolGuid,
|
||||
NULL,
|
||||
(VOID **) &mShellProtocol
|
||||
(VOID **)&mShellProtocol
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
mShellProtocol = NULL;
|
||||
@@ -79,19 +79,19 @@ GetShellProtocol (
|
||||
**/
|
||||
EFI_STATUS
|
||||
ReadFileToBuffer (
|
||||
IN CHAR16 *FileName,
|
||||
OUT UINTN *BufferSize,
|
||||
OUT VOID **Buffer
|
||||
IN CHAR16 *FileName,
|
||||
OUT UINTN *BufferSize,
|
||||
OUT VOID **Buffer
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_SHELL_PROTOCOL *ShellProtocol;
|
||||
SHELL_FILE_HANDLE Handle;
|
||||
UINT64 FileSize;
|
||||
UINTN TempBufferSize;
|
||||
VOID *TempBuffer;
|
||||
EFI_STATUS Status;
|
||||
EFI_SHELL_PROTOCOL *ShellProtocol;
|
||||
SHELL_FILE_HANDLE Handle;
|
||||
UINT64 FileSize;
|
||||
UINTN TempBufferSize;
|
||||
VOID *TempBuffer;
|
||||
|
||||
ShellProtocol = GetShellProtocol();
|
||||
ShellProtocol = GetShellProtocol ();
|
||||
if (ShellProtocol == NULL) {
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
@@ -117,8 +117,8 @@ ReadFileToBuffer (
|
||||
return Status;
|
||||
}
|
||||
|
||||
TempBufferSize = (UINTN) FileSize;
|
||||
TempBuffer = AllocateZeroPool (TempBufferSize);
|
||||
TempBufferSize = (UINTN)FileSize;
|
||||
TempBuffer = AllocateZeroPool (TempBufferSize);
|
||||
if (TempBuffer == NULL) {
|
||||
ShellProtocol->CloseFile (Handle);
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
@@ -157,18 +157,18 @@ ReadFileToBuffer (
|
||||
**/
|
||||
EFI_STATUS
|
||||
WriteFileFromBuffer (
|
||||
IN CHAR16 *FileName,
|
||||
IN UINTN BufferSize,
|
||||
IN VOID *Buffer
|
||||
IN CHAR16 *FileName,
|
||||
IN UINTN BufferSize,
|
||||
IN VOID *Buffer
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_SHELL_PROTOCOL *ShellProtocol;
|
||||
SHELL_FILE_HANDLE Handle;
|
||||
EFI_FILE_INFO *FileInfo;
|
||||
UINTN TempBufferSize;
|
||||
EFI_STATUS Status;
|
||||
EFI_SHELL_PROTOCOL *ShellProtocol;
|
||||
SHELL_FILE_HANDLE Handle;
|
||||
EFI_FILE_INFO *FileInfo;
|
||||
UINTN TempBufferSize;
|
||||
|
||||
ShellProtocol = GetShellProtocol();
|
||||
ShellProtocol = GetShellProtocol ();
|
||||
if (ShellProtocol == NULL) {
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
@@ -202,24 +202,25 @@ WriteFileFromBuffer (
|
||||
// Set the file size to 0.
|
||||
//
|
||||
FileInfo->FileSize = 0;
|
||||
Status = ShellProtocol->SetFileInfo (Handle, FileInfo);
|
||||
Status = ShellProtocol->SetFileInfo (Handle, FileInfo);
|
||||
if (EFI_ERROR (Status)) {
|
||||
FreePool (FileInfo);
|
||||
ShellProtocol->CloseFile (Handle);
|
||||
return Status;
|
||||
}
|
||||
}
|
||||
|
||||
FreePool (FileInfo);
|
||||
|
||||
//
|
||||
// Write the file data from the buffer
|
||||
//
|
||||
TempBufferSize = BufferSize;
|
||||
Status = ShellProtocol->WriteFile (
|
||||
Handle,
|
||||
&TempBufferSize,
|
||||
Buffer
|
||||
);
|
||||
Status = ShellProtocol->WriteFile (
|
||||
Handle,
|
||||
&TempBufferSize,
|
||||
Buffer
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
ShellProtocol->CloseFile (Handle);
|
||||
return Status;
|
||||
@@ -229,4 +230,3 @@ WriteFileFromBuffer (
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
@@ -27,52 +27,54 @@ CreateBmpFmp (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
CHAR16 *OutputCapsuleName;
|
||||
VOID *BmpBuffer;
|
||||
UINTN FileSize;
|
||||
CHAR16 *BmpName;
|
||||
UINT8 *FullCapsuleBuffer;
|
||||
UINTN FullCapsuleBufferSize;
|
||||
EFI_DISPLAY_CAPSULE *DisplayCapsule;
|
||||
EFI_STATUS Status;
|
||||
EFI_GRAPHICS_OUTPUT_PROTOCOL *Gop;
|
||||
EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;
|
||||
EFI_GRAPHICS_OUTPUT_BLT_PIXEL *GopBlt;
|
||||
UINTN GopBltSize;
|
||||
UINTN Height;
|
||||
UINTN Width;
|
||||
CHAR16 *OutputCapsuleName;
|
||||
VOID *BmpBuffer;
|
||||
UINTN FileSize;
|
||||
CHAR16 *BmpName;
|
||||
UINT8 *FullCapsuleBuffer;
|
||||
UINTN FullCapsuleBufferSize;
|
||||
EFI_DISPLAY_CAPSULE *DisplayCapsule;
|
||||
EFI_STATUS Status;
|
||||
EFI_GRAPHICS_OUTPUT_PROTOCOL *Gop;
|
||||
EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;
|
||||
EFI_GRAPHICS_OUTPUT_BLT_PIXEL *GopBlt;
|
||||
UINTN GopBltSize;
|
||||
UINTN Height;
|
||||
UINTN Width;
|
||||
|
||||
Status = gBS->LocateProtocol(&gEfiGraphicsOutputProtocolGuid, NULL, (VOID **)&Gop);
|
||||
if (EFI_ERROR(Status)) {
|
||||
Print(L"CapsuleApp: NO GOP is found.\n");
|
||||
Status = gBS->LocateProtocol (&gEfiGraphicsOutputProtocolGuid, NULL, (VOID **)&Gop);
|
||||
if (EFI_ERROR (Status)) {
|
||||
Print (L"CapsuleApp: NO GOP is found.\n");
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
Info = Gop->Mode->Info;
|
||||
Print(L"Current GOP: Mode - %d, ", Gop->Mode->Mode);
|
||||
Print(L"HorizontalResolution - %d, ", Info->HorizontalResolution);
|
||||
Print(L"VerticalResolution - %d\n", Info->VerticalResolution);
|
||||
Print (L"Current GOP: Mode - %d, ", Gop->Mode->Mode);
|
||||
Print (L"HorizontalResolution - %d, ", Info->HorizontalResolution);
|
||||
Print (L"VerticalResolution - %d\n", Info->VerticalResolution);
|
||||
// HorizontalResolution >= BMP_IMAGE_HEADER.PixelWidth
|
||||
// VerticalResolution >= BMP_IMAGE_HEADER.PixelHeight
|
||||
|
||||
if (Argc != 5) {
|
||||
Print(L"CapsuleApp: Incorrect parameter count.\n");
|
||||
Print (L"CapsuleApp: Incorrect parameter count.\n");
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
if (StrCmp(Argv[3], L"-O") != 0) {
|
||||
Print(L"CapsuleApp: NO output capsule name.\n");
|
||||
if (StrCmp (Argv[3], L"-O") != 0) {
|
||||
Print (L"CapsuleApp: NO output capsule name.\n");
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
OutputCapsuleName = Argv[4];
|
||||
|
||||
BmpBuffer = NULL;
|
||||
FileSize = 0;
|
||||
BmpBuffer = NULL;
|
||||
FileSize = 0;
|
||||
FullCapsuleBuffer = NULL;
|
||||
|
||||
BmpName = Argv[2];
|
||||
Status = ReadFileToBuffer(BmpName, &FileSize, &BmpBuffer);
|
||||
if (EFI_ERROR(Status)) {
|
||||
Print(L"CapsuleApp: BMP image (%s) is not found.\n", BmpName);
|
||||
Status = ReadFileToBuffer (BmpName, &FileSize, &BmpBuffer);
|
||||
if (EFI_ERROR (Status)) {
|
||||
Print (L"CapsuleApp: BMP image (%s) is not found.\n", BmpName);
|
||||
goto Done;
|
||||
}
|
||||
|
||||
@@ -85,45 +87,48 @@ CreateBmpFmp (
|
||||
&Height,
|
||||
&Width
|
||||
);
|
||||
if (EFI_ERROR(Status)) {
|
||||
Print(L"CapsuleApp: BMP image (%s) is not valid.\n", BmpName);
|
||||
if (EFI_ERROR (Status)) {
|
||||
Print (L"CapsuleApp: BMP image (%s) is not valid.\n", BmpName);
|
||||
goto Done;
|
||||
}
|
||||
|
||||
if (GopBlt != NULL) {
|
||||
FreePool (GopBlt);
|
||||
}
|
||||
Print(L"BMP image (%s), Width - %d, Height - %d\n", BmpName, Width, Height);
|
||||
|
||||
Print (L"BMP image (%s), Width - %d, Height - %d\n", BmpName, Width, Height);
|
||||
|
||||
if (Height > Info->VerticalResolution) {
|
||||
Status = EFI_INVALID_PARAMETER;
|
||||
Print(L"CapsuleApp: BMP image (%s) height is larger than current resolution.\n", BmpName);
|
||||
goto Done;
|
||||
}
|
||||
if (Width > Info->HorizontalResolution) {
|
||||
Status = EFI_INVALID_PARAMETER;
|
||||
Print(L"CapsuleApp: BMP image (%s) width is larger than current resolution.\n", BmpName);
|
||||
Print (L"CapsuleApp: BMP image (%s) height is larger than current resolution.\n", BmpName);
|
||||
goto Done;
|
||||
}
|
||||
|
||||
FullCapsuleBufferSize = sizeof(EFI_DISPLAY_CAPSULE) + FileSize;
|
||||
FullCapsuleBuffer = AllocatePool(FullCapsuleBufferSize);
|
||||
if (Width > Info->HorizontalResolution) {
|
||||
Status = EFI_INVALID_PARAMETER;
|
||||
Print (L"CapsuleApp: BMP image (%s) width is larger than current resolution.\n", BmpName);
|
||||
goto Done;
|
||||
}
|
||||
|
||||
FullCapsuleBufferSize = sizeof (EFI_DISPLAY_CAPSULE) + FileSize;
|
||||
FullCapsuleBuffer = AllocatePool (FullCapsuleBufferSize);
|
||||
if (FullCapsuleBuffer == NULL) {
|
||||
Print(L"CapsuleApp: Capsule Buffer size (0x%x) too big.\n", FullCapsuleBufferSize);
|
||||
Print (L"CapsuleApp: Capsule Buffer size (0x%x) too big.\n", FullCapsuleBufferSize);
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
goto Done;
|
||||
}
|
||||
|
||||
DisplayCapsule = (EFI_DISPLAY_CAPSULE *)FullCapsuleBuffer;
|
||||
CopyGuid(&DisplayCapsule->CapsuleHeader.CapsuleGuid, &gWindowsUxCapsuleGuid);
|
||||
DisplayCapsule->CapsuleHeader.HeaderSize = sizeof(DisplayCapsule->CapsuleHeader);
|
||||
DisplayCapsule->CapsuleHeader.Flags = CAPSULE_FLAGS_PERSIST_ACROSS_RESET;
|
||||
CopyGuid (&DisplayCapsule->CapsuleHeader.CapsuleGuid, &gWindowsUxCapsuleGuid);
|
||||
DisplayCapsule->CapsuleHeader.HeaderSize = sizeof (DisplayCapsule->CapsuleHeader);
|
||||
DisplayCapsule->CapsuleHeader.Flags = CAPSULE_FLAGS_PERSIST_ACROSS_RESET;
|
||||
DisplayCapsule->CapsuleHeader.CapsuleImageSize = (UINT32)FullCapsuleBufferSize;
|
||||
|
||||
DisplayCapsule->ImagePayload.Version = 1;
|
||||
DisplayCapsule->ImagePayload.Checksum = 0;
|
||||
DisplayCapsule->ImagePayload.Version = 1;
|
||||
DisplayCapsule->ImagePayload.Checksum = 0;
|
||||
DisplayCapsule->ImagePayload.ImageType = 0; // BMP
|
||||
DisplayCapsule->ImagePayload.Reserved = 0;
|
||||
DisplayCapsule->ImagePayload.Mode = Gop->Mode->Mode;
|
||||
DisplayCapsule->ImagePayload.Reserved = 0;
|
||||
DisplayCapsule->ImagePayload.Mode = Gop->Mode->Mode;
|
||||
|
||||
//
|
||||
// Center the bitmap horizontally
|
||||
@@ -140,26 +145,27 @@ CreateBmpFmp (
|
||||
(UINT32)(((3 * Info->VerticalResolution) - (2 * Height)) / 4)
|
||||
);
|
||||
|
||||
Print(L"BMP image (%s), OffsetX - %d, OffsetY - %d\n",
|
||||
Print (
|
||||
L"BMP image (%s), OffsetX - %d, OffsetY - %d\n",
|
||||
BmpName,
|
||||
DisplayCapsule->ImagePayload.OffsetX,
|
||||
DisplayCapsule->ImagePayload.OffsetY
|
||||
);
|
||||
|
||||
CopyMem((DisplayCapsule + 1), BmpBuffer, FileSize);
|
||||
CopyMem ((DisplayCapsule + 1), BmpBuffer, FileSize);
|
||||
|
||||
DisplayCapsule->ImagePayload.Checksum = CalculateCheckSum8(FullCapsuleBuffer, FullCapsuleBufferSize);
|
||||
DisplayCapsule->ImagePayload.Checksum = CalculateCheckSum8 (FullCapsuleBuffer, FullCapsuleBufferSize);
|
||||
|
||||
Status = WriteFileFromBuffer(OutputCapsuleName, FullCapsuleBufferSize, FullCapsuleBuffer);
|
||||
Print(L"CapsuleApp: Write %s %r\n", OutputCapsuleName, Status);
|
||||
Status = WriteFileFromBuffer (OutputCapsuleName, FullCapsuleBufferSize, FullCapsuleBuffer);
|
||||
Print (L"CapsuleApp: Write %s %r\n", OutputCapsuleName, Status);
|
||||
|
||||
Done:
|
||||
if (BmpBuffer != NULL) {
|
||||
FreePool(BmpBuffer);
|
||||
FreePool (BmpBuffer);
|
||||
}
|
||||
|
||||
if (FullCapsuleBuffer != NULL) {
|
||||
FreePool(FullCapsuleBuffer);
|
||||
FreePool (FullCapsuleBuffer);
|
||||
}
|
||||
|
||||
return Status;
|
||||
@@ -174,18 +180,19 @@ Done:
|
||||
**/
|
||||
EFI_GUID *
|
||||
GetCapsuleImageTypeId (
|
||||
IN EFI_CAPSULE_HEADER *CapsuleHeader
|
||||
IN EFI_CAPSULE_HEADER *CapsuleHeader
|
||||
)
|
||||
{
|
||||
EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER *FmpCapsuleHeader;
|
||||
UINT64 *ItemOffsetList;
|
||||
EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER *ImageHeader;
|
||||
EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER *FmpCapsuleHeader;
|
||||
UINT64 *ItemOffsetList;
|
||||
EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER *ImageHeader;
|
||||
|
||||
FmpCapsuleHeader = (EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER *)((UINT8 *)CapsuleHeader + CapsuleHeader->HeaderSize);
|
||||
ItemOffsetList = (UINT64 *)(FmpCapsuleHeader + 1);
|
||||
ItemOffsetList = (UINT64 *)(FmpCapsuleHeader + 1);
|
||||
if (FmpCapsuleHeader->PayloadItemCount == 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ImageHeader = (EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER *)((UINT8 *)FmpCapsuleHeader + ItemOffsetList[FmpCapsuleHeader->EmbeddedDriverCount]);
|
||||
return &ImageHeader->UpdateImageTypeId;
|
||||
}
|
||||
@@ -199,7 +206,7 @@ GetCapsuleImageTypeId (
|
||||
**/
|
||||
UINT32
|
||||
GetEsrtFwType (
|
||||
IN EFI_GUID *ImageTypeId
|
||||
IN EFI_GUID *ImageTypeId
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
@@ -210,12 +217,12 @@ GetEsrtFwType (
|
||||
//
|
||||
// Check ESRT
|
||||
//
|
||||
Status = EfiGetSystemConfigurationTable(&gEfiSystemResourceTableGuid, (VOID **)&Esrt);
|
||||
if (!EFI_ERROR(Status)) {
|
||||
ASSERT(Esrt != NULL);
|
||||
Status = EfiGetSystemConfigurationTable (&gEfiSystemResourceTableGuid, (VOID **)&Esrt);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
ASSERT (Esrt != NULL);
|
||||
EsrtEntry = (VOID *)(Esrt + 1);
|
||||
for (Index = 0; Index < Esrt->FwResourceCount; Index++, EsrtEntry++) {
|
||||
if (CompareGuid(&EsrtEntry->FwClass, ImageTypeId)) {
|
||||
if (CompareGuid (&EsrtEntry->FwClass, ImageTypeId)) {
|
||||
return EsrtEntry->FwType;
|
||||
}
|
||||
}
|
||||
@@ -238,19 +245,22 @@ GetEsrtFwType (
|
||||
**/
|
||||
BOOLEAN
|
||||
IsValidCapsuleHeader (
|
||||
IN EFI_CAPSULE_HEADER *CapsuleHeader,
|
||||
IN UINT64 CapsuleSize
|
||||
IN EFI_CAPSULE_HEADER *CapsuleHeader,
|
||||
IN UINT64 CapsuleSize
|
||||
)
|
||||
{
|
||||
if (CapsuleSize < sizeof (EFI_CAPSULE_HEADER)) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (CapsuleHeader->CapsuleImageSize != CapsuleSize) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (CapsuleHeader->HeaderSize > CapsuleHeader->CapsuleImageSize) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (CapsuleHeader->HeaderSize < sizeof (EFI_CAPSULE_HEADER)) {
|
||||
return FALSE;
|
||||
}
|
||||
@@ -271,7 +281,7 @@ IsFmpCapsuleGuid (
|
||||
IN EFI_GUID *CapsuleGuid
|
||||
)
|
||||
{
|
||||
if (CompareGuid(&gEfiFmpCapsuleGuid, CapsuleGuid)) {
|
||||
if (CompareGuid (&gEfiFmpCapsuleGuid, CapsuleGuid)) {
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -291,96 +301,98 @@ CreateNestedFmp (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
CHAR16 *OutputCapsuleName;
|
||||
VOID *CapsuleBuffer;
|
||||
UINTN FileSize;
|
||||
CHAR16 *CapsuleName;
|
||||
UINT8 *FullCapsuleBuffer;
|
||||
UINTN FullCapsuleBufferSize;
|
||||
EFI_CAPSULE_HEADER *NestedCapsuleHeader;
|
||||
EFI_GUID *ImageTypeId;
|
||||
UINT32 FwType;
|
||||
EFI_STATUS Status;
|
||||
CHAR16 *OutputCapsuleName;
|
||||
VOID *CapsuleBuffer;
|
||||
UINTN FileSize;
|
||||
CHAR16 *CapsuleName;
|
||||
UINT8 *FullCapsuleBuffer;
|
||||
UINTN FullCapsuleBufferSize;
|
||||
EFI_CAPSULE_HEADER *NestedCapsuleHeader;
|
||||
EFI_GUID *ImageTypeId;
|
||||
UINT32 FwType;
|
||||
EFI_STATUS Status;
|
||||
|
||||
if (Argc != 5) {
|
||||
Print(L"CapsuleApp: Incorrect parameter count.\n");
|
||||
Print (L"CapsuleApp: Incorrect parameter count.\n");
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
if (StrCmp(Argv[3], L"-O") != 0) {
|
||||
Print(L"CapsuleApp: NO output capsule name.\n");
|
||||
if (StrCmp (Argv[3], L"-O") != 0) {
|
||||
Print (L"CapsuleApp: NO output capsule name.\n");
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
OutputCapsuleName = Argv[4];
|
||||
|
||||
CapsuleBuffer = NULL;
|
||||
FileSize = 0;
|
||||
CapsuleBuffer = NULL;
|
||||
FileSize = 0;
|
||||
FullCapsuleBuffer = NULL;
|
||||
|
||||
CapsuleName = Argv[2];
|
||||
Status = ReadFileToBuffer(CapsuleName, &FileSize, &CapsuleBuffer);
|
||||
if (EFI_ERROR(Status)) {
|
||||
Print(L"CapsuleApp: Capsule image (%s) is not found.\n", CapsuleName);
|
||||
Status = ReadFileToBuffer (CapsuleName, &FileSize, &CapsuleBuffer);
|
||||
if (EFI_ERROR (Status)) {
|
||||
Print (L"CapsuleApp: Capsule image (%s) is not found.\n", CapsuleName);
|
||||
goto Done;
|
||||
}
|
||||
|
||||
if (!IsValidCapsuleHeader (CapsuleBuffer, FileSize)) {
|
||||
Print(L"CapsuleApp: Capsule image (%s) is not a valid capsule.\n", CapsuleName);
|
||||
Print (L"CapsuleApp: Capsule image (%s) is not a valid capsule.\n", CapsuleName);
|
||||
Status = EFI_INVALID_PARAMETER;
|
||||
goto Done;
|
||||
}
|
||||
|
||||
if (!IsFmpCapsuleGuid (&((EFI_CAPSULE_HEADER *) CapsuleBuffer)->CapsuleGuid)) {
|
||||
Print(L"CapsuleApp: Capsule image (%s) is not a FMP capsule.\n", CapsuleName);
|
||||
if (!IsFmpCapsuleGuid (&((EFI_CAPSULE_HEADER *)CapsuleBuffer)->CapsuleGuid)) {
|
||||
Print (L"CapsuleApp: Capsule image (%s) is not a FMP capsule.\n", CapsuleName);
|
||||
Status = EFI_INVALID_PARAMETER;
|
||||
goto Done;
|
||||
}
|
||||
|
||||
ImageTypeId = GetCapsuleImageTypeId(CapsuleBuffer);
|
||||
ImageTypeId = GetCapsuleImageTypeId (CapsuleBuffer);
|
||||
if (ImageTypeId == NULL) {
|
||||
Print(L"CapsuleApp: Capsule ImageTypeId is not found.\n");
|
||||
Print (L"CapsuleApp: Capsule ImageTypeId is not found.\n");
|
||||
Status = EFI_INVALID_PARAMETER;
|
||||
goto Done;
|
||||
}
|
||||
FwType = GetEsrtFwType(ImageTypeId);
|
||||
|
||||
FwType = GetEsrtFwType (ImageTypeId);
|
||||
if ((FwType != ESRT_FW_TYPE_SYSTEMFIRMWARE) && (FwType != ESRT_FW_TYPE_DEVICEFIRMWARE)) {
|
||||
Print(L"CapsuleApp: Capsule FwType is invalid.\n");
|
||||
Print (L"CapsuleApp: Capsule FwType is invalid.\n");
|
||||
Status = EFI_INVALID_PARAMETER;
|
||||
goto Done;
|
||||
}
|
||||
|
||||
FullCapsuleBufferSize = NESTED_CAPSULE_HEADER_SIZE + FileSize;
|
||||
FullCapsuleBuffer = AllocatePool(FullCapsuleBufferSize);
|
||||
FullCapsuleBuffer = AllocatePool (FullCapsuleBufferSize);
|
||||
if (FullCapsuleBuffer == NULL) {
|
||||
Print(L"CapsuleApp: Capsule Buffer size (0x%x) too big.\n", FullCapsuleBufferSize);
|
||||
Print (L"CapsuleApp: Capsule Buffer size (0x%x) too big.\n", FullCapsuleBufferSize);
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
goto Done;
|
||||
}
|
||||
|
||||
NestedCapsuleHeader = (EFI_CAPSULE_HEADER *)FullCapsuleBuffer;
|
||||
ZeroMem(NestedCapsuleHeader, NESTED_CAPSULE_HEADER_SIZE);
|
||||
CopyGuid(&NestedCapsuleHeader->CapsuleGuid, ImageTypeId);
|
||||
NestedCapsuleHeader->HeaderSize = NESTED_CAPSULE_HEADER_SIZE;
|
||||
NestedCapsuleHeader->Flags = (FwType == ESRT_FW_TYPE_SYSTEMFIRMWARE) ? SYSTEM_FIRMWARE_FLAG : DEVICE_FIRMWARE_FLAG;
|
||||
ZeroMem (NestedCapsuleHeader, NESTED_CAPSULE_HEADER_SIZE);
|
||||
CopyGuid (&NestedCapsuleHeader->CapsuleGuid, ImageTypeId);
|
||||
NestedCapsuleHeader->HeaderSize = NESTED_CAPSULE_HEADER_SIZE;
|
||||
NestedCapsuleHeader->Flags = (FwType == ESRT_FW_TYPE_SYSTEMFIRMWARE) ? SYSTEM_FIRMWARE_FLAG : DEVICE_FIRMWARE_FLAG;
|
||||
NestedCapsuleHeader->CapsuleImageSize = (UINT32)FullCapsuleBufferSize;
|
||||
|
||||
CopyMem((UINT8 *)NestedCapsuleHeader + NestedCapsuleHeader->HeaderSize, CapsuleBuffer, FileSize);
|
||||
CopyMem ((UINT8 *)NestedCapsuleHeader + NestedCapsuleHeader->HeaderSize, CapsuleBuffer, FileSize);
|
||||
|
||||
Status = WriteFileFromBuffer(OutputCapsuleName, FullCapsuleBufferSize, FullCapsuleBuffer);
|
||||
Print(L"CapsuleApp: Write %s %r\n", OutputCapsuleName, Status);
|
||||
Status = WriteFileFromBuffer (OutputCapsuleName, FullCapsuleBufferSize, FullCapsuleBuffer);
|
||||
Print (L"CapsuleApp: Write %s %r\n", OutputCapsuleName, Status);
|
||||
|
||||
Done:
|
||||
if (CapsuleBuffer != NULL) {
|
||||
FreePool(CapsuleBuffer);
|
||||
FreePool (CapsuleBuffer);
|
||||
}
|
||||
|
||||
if (FullCapsuleBuffer != NULL) {
|
||||
FreePool(FullCapsuleBuffer);
|
||||
FreePool (FullCapsuleBuffer);
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Clear capsule status variable.
|
||||
|
||||
@@ -391,19 +403,19 @@ ClearCapsuleStatusVariable (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINT32 Index;
|
||||
CHAR16 CapsuleVarName[20];
|
||||
CHAR16 *TempVarName;
|
||||
BOOLEAN Found;
|
||||
EFI_STATUS Status;
|
||||
UINT32 Index;
|
||||
CHAR16 CapsuleVarName[20];
|
||||
CHAR16 *TempVarName;
|
||||
BOOLEAN Found;
|
||||
|
||||
StrCpyS (CapsuleVarName, sizeof(CapsuleVarName)/sizeof(CapsuleVarName[0]), L"Capsule");
|
||||
StrCpyS (CapsuleVarName, sizeof (CapsuleVarName)/sizeof (CapsuleVarName[0]), L"Capsule");
|
||||
TempVarName = CapsuleVarName + StrLen (CapsuleVarName);
|
||||
Index = 0;
|
||||
Index = 0;
|
||||
|
||||
Found = FALSE;
|
||||
while (TRUE) {
|
||||
UnicodeSPrint (TempVarName, 5 * sizeof(CHAR16), L"%04x", Index);
|
||||
UnicodeSPrint (TempVarName, 5 * sizeof (CHAR16), L"%04x", Index);
|
||||
|
||||
Status = gRT->SetVariable (
|
||||
CapsuleVarName,
|
||||
@@ -418,6 +430,7 @@ ClearCapsuleStatusVariable (
|
||||
//
|
||||
break;
|
||||
}
|
||||
|
||||
Found = TRUE;
|
||||
|
||||
Print (L"Clear %s %r\n", CapsuleVarName, Status);
|
||||
@@ -447,10 +460,10 @@ ClearCapsuleStatusVariable (
|
||||
**/
|
||||
EFI_STATUS
|
||||
BuildGatherList (
|
||||
IN VOID **CapsuleBuffer,
|
||||
IN UINTN *FileSize,
|
||||
IN UINTN CapsuleNum,
|
||||
OUT EFI_CAPSULE_BLOCK_DESCRIPTOR **BlockDescriptors
|
||||
IN VOID **CapsuleBuffer,
|
||||
IN UINTN *FileSize,
|
||||
IN UINTN CapsuleNum,
|
||||
OUT EFI_CAPSULE_BLOCK_DESCRIPTOR **BlockDescriptors
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
@@ -482,15 +495,15 @@ BuildGatherList (
|
||||
Count = (INT32)(NumberOfDescriptors + 2) / 2;
|
||||
}
|
||||
|
||||
Size = Count * sizeof (EFI_CAPSULE_BLOCK_DESCRIPTOR);
|
||||
BlockDescriptors1 = AllocateRuntimeZeroPool (Size);
|
||||
Size = Count * sizeof (EFI_CAPSULE_BLOCK_DESCRIPTOR);
|
||||
BlockDescriptors1 = AllocateRuntimeZeroPool (Size);
|
||||
if (BlockDescriptors1 == NULL) {
|
||||
Print (L"CapsuleApp: failed to allocate memory for descriptors\n");
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
goto ERREXIT;
|
||||
} else {
|
||||
Print (L"CapsuleApp: creating capsule descriptors at 0x%X\n", (UINTN) BlockDescriptors1);
|
||||
Print (L"CapsuleApp: capsule data starts at 0x%X with size 0x%X\n", (UINTN) CapsuleBuffer[Index], FileSize[Index]);
|
||||
Print (L"CapsuleApp: creating capsule descriptors at 0x%X\n", (UINTN)BlockDescriptors1);
|
||||
Print (L"CapsuleApp: capsule data starts at 0x%X with size 0x%X\n", (UINTN)CapsuleBuffer[Index], FileSize[Index]);
|
||||
}
|
||||
|
||||
//
|
||||
@@ -501,16 +514,16 @@ BuildGatherList (
|
||||
}
|
||||
|
||||
if (BlockDescriptorPre != NULL) {
|
||||
BlockDescriptorPre->Union.ContinuationPointer = (UINTN) BlockDescriptors1;
|
||||
BlockDescriptorPre->Length = 0;
|
||||
BlockDescriptorPre->Union.ContinuationPointer = (UINTN)BlockDescriptors1;
|
||||
BlockDescriptorPre->Length = 0;
|
||||
}
|
||||
|
||||
//
|
||||
// Fill them in
|
||||
//
|
||||
TempBlockPtr = BlockDescriptors1;
|
||||
TempDataPtr = CapsuleBuffer[Index];
|
||||
SizeLeft = FileSize[Index];
|
||||
TempBlockPtr = BlockDescriptors1;
|
||||
TempDataPtr = CapsuleBuffer[Index];
|
||||
SizeLeft = FileSize[Index];
|
||||
for (Number = 0; (Number < Count - 1) && (SizeLeft != 0); Number++) {
|
||||
//
|
||||
// Divide remaining data in half
|
||||
@@ -524,10 +537,11 @@ BuildGatherList (
|
||||
} else {
|
||||
Size = SizeLeft;
|
||||
}
|
||||
TempBlockPtr->Union.DataBlock = (UINTN)TempDataPtr;
|
||||
TempBlockPtr->Length = Size;
|
||||
Print (L"CapsuleApp: capsule block/size 0x%X/0x%X\n", (UINTN) TempDataPtr, Size);
|
||||
SizeLeft -= Size;
|
||||
|
||||
TempBlockPtr->Union.DataBlock = (UINTN)TempDataPtr;
|
||||
TempBlockPtr->Length = Size;
|
||||
Print (L"CapsuleApp: capsule block/size 0x%X/0x%X\n", (UINTN)TempDataPtr, Size);
|
||||
SizeLeft -= Size;
|
||||
TempDataPtr += Size;
|
||||
TempBlockPtr++;
|
||||
}
|
||||
@@ -555,10 +569,10 @@ BuildGatherList (
|
||||
//
|
||||
// Point the first list's last element to point to this second list.
|
||||
//
|
||||
TempBlockPtr->Union.ContinuationPointer = (UINTN) BlockDescriptors2;
|
||||
TempBlockPtr->Union.ContinuationPointer = (UINTN)BlockDescriptors2;
|
||||
|
||||
TempBlockPtr->Length = 0;
|
||||
TempBlockPtr = BlockDescriptors2;
|
||||
TempBlockPtr->Length = 0;
|
||||
TempBlockPtr = BlockDescriptors2;
|
||||
for (Number = 0; Number < Count - 1; Number++) {
|
||||
//
|
||||
// If second-to-last one, then dump rest to this element
|
||||
@@ -576,10 +590,10 @@ BuildGatherList (
|
||||
}
|
||||
}
|
||||
|
||||
TempBlockPtr->Union.DataBlock = (UINTN)TempDataPtr;
|
||||
TempBlockPtr->Length = Size;
|
||||
Print (L"CapsuleApp: capsule block/size 0x%X/0x%X\n", (UINTN) TempDataPtr, Size);
|
||||
SizeLeft -= Size;
|
||||
TempBlockPtr->Union.DataBlock = (UINTN)TempDataPtr;
|
||||
TempBlockPtr->Length = Size;
|
||||
Print (L"CapsuleApp: capsule block/size 0x%X/0x%X\n", (UINTN)TempDataPtr, Size);
|
||||
SizeLeft -= Size;
|
||||
TempDataPtr += Size;
|
||||
TempBlockPtr++;
|
||||
if (SizeLeft == 0) {
|
||||
@@ -596,20 +610,20 @@ BuildGatherList (
|
||||
// Null-terminate.
|
||||
//
|
||||
if (TempBlockPtr != NULL) {
|
||||
TempBlockPtr->Union.ContinuationPointer = (UINTN)NULL;
|
||||
TempBlockPtr->Length = 0;
|
||||
*BlockDescriptors = BlockDescriptorsHeader;
|
||||
TempBlockPtr->Union.ContinuationPointer = (UINTN)NULL;
|
||||
TempBlockPtr->Length = 0;
|
||||
*BlockDescriptors = BlockDescriptorsHeader;
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
|
||||
ERREXIT:
|
||||
if (BlockDescriptors1 != NULL) {
|
||||
FreePool(BlockDescriptors1);
|
||||
FreePool (BlockDescriptors1);
|
||||
}
|
||||
|
||||
if (BlockDescriptors2 != NULL) {
|
||||
FreePool(BlockDescriptors2);
|
||||
FreePool (BlockDescriptors2);
|
||||
}
|
||||
|
||||
return Status;
|
||||
@@ -623,18 +637,18 @@ ERREXIT:
|
||||
**/
|
||||
VOID
|
||||
CleanGatherList (
|
||||
IN EFI_CAPSULE_BLOCK_DESCRIPTOR *BlockDescriptors,
|
||||
IN UINTN CapsuleNum
|
||||
IN EFI_CAPSULE_BLOCK_DESCRIPTOR *BlockDescriptors,
|
||||
IN UINTN CapsuleNum
|
||||
)
|
||||
{
|
||||
EFI_CAPSULE_BLOCK_DESCRIPTOR *TempBlockPtr;
|
||||
EFI_CAPSULE_BLOCK_DESCRIPTOR *TempBlockPtr1;
|
||||
EFI_CAPSULE_BLOCK_DESCRIPTOR *TempBlockPtr2;
|
||||
UINTN Index;
|
||||
EFI_CAPSULE_BLOCK_DESCRIPTOR *TempBlockPtr;
|
||||
EFI_CAPSULE_BLOCK_DESCRIPTOR *TempBlockPtr1;
|
||||
EFI_CAPSULE_BLOCK_DESCRIPTOR *TempBlockPtr2;
|
||||
UINTN Index;
|
||||
|
||||
if (BlockDescriptors != NULL) {
|
||||
TempBlockPtr1 = BlockDescriptors;
|
||||
while (1){
|
||||
while (1) {
|
||||
TempBlockPtr = TempBlockPtr1;
|
||||
for (Index = 0; Index < CapsuleNum; Index++) {
|
||||
if (TempBlockPtr[Index].Length == 0) {
|
||||
@@ -646,8 +660,8 @@ CleanGatherList (
|
||||
break;
|
||||
}
|
||||
|
||||
TempBlockPtr2 = (VOID *) ((UINTN) TempBlockPtr[Index].Union.ContinuationPointer);
|
||||
FreePool(TempBlockPtr1);
|
||||
TempBlockPtr2 = (VOID *)((UINTN)TempBlockPtr[Index].Union.ContinuationPointer);
|
||||
FreePool (TempBlockPtr1);
|
||||
TempBlockPtr1 = TempBlockPtr2;
|
||||
}
|
||||
}
|
||||
@@ -661,42 +675,42 @@ PrintUsage (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
Print(L"CapsuleApp: usage\n");
|
||||
Print(L" CapsuleApp <Capsule...> [-NR] [-OD [FSx]]\n");
|
||||
Print(L" CapsuleApp -S\n");
|
||||
Print(L" CapsuleApp -C\n");
|
||||
Print(L" CapsuleApp -P\n");
|
||||
Print(L" CapsuleApp -E\n");
|
||||
Print(L" CapsuleApp -L\n");
|
||||
Print(L" CapsuleApp -L INFO\n");
|
||||
Print(L" CapsuleApp -F\n");
|
||||
Print(L" CapsuleApp -G <BMP> -O <Capsule>\n");
|
||||
Print(L" CapsuleApp -N <Capsule> -O <NestedCapsule>\n");
|
||||
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" -OD: Delivery of Capsules via file on Mass Storage device.\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_REPORT_GUID),\n");
|
||||
Print(L" which is defined in UEFI specification.\n");
|
||||
Print(L" -P: Dump UEFI FMP protocol info, or get image with specified\n");
|
||||
Print(L" ImageTypeId and Index (decimal format) to a file if 'GET'\n");
|
||||
Print(L" option is used.\n");
|
||||
Print(L" -E: Dump UEFI ESRT table info.\n");
|
||||
Print(L" -L: Dump provisioned capsule image information.\n");
|
||||
Print(L" -F: Dump all EFI System Partition.\n");
|
||||
Print(L" -G: Convert a BMP file to be an UX capsule,\n");
|
||||
Print(L" according to Windows Firmware Update document\n");
|
||||
Print(L" -N: Append a Capsule Header to an existing FMP capsule image\n");
|
||||
Print(L" with its ImageTypeId supported by the system,\n");
|
||||
Print(L" according to Windows Firmware Update document\n");
|
||||
Print(L" -O: Output new Capsule file name\n");
|
||||
Print(L" -D: Dump Capsule image header information, image payload\n");
|
||||
Print(L" information if it is an UX capsule and FMP header\n");
|
||||
Print(L" information if it is a FMP capsule.\n");
|
||||
Print (L"CapsuleApp: usage\n");
|
||||
Print (L" CapsuleApp <Capsule...> [-NR] [-OD [FSx]]\n");
|
||||
Print (L" CapsuleApp -S\n");
|
||||
Print (L" CapsuleApp -C\n");
|
||||
Print (L" CapsuleApp -P\n");
|
||||
Print (L" CapsuleApp -E\n");
|
||||
Print (L" CapsuleApp -L\n");
|
||||
Print (L" CapsuleApp -L INFO\n");
|
||||
Print (L" CapsuleApp -F\n");
|
||||
Print (L" CapsuleApp -G <BMP> -O <Capsule>\n");
|
||||
Print (L" CapsuleApp -N <Capsule> -O <NestedCapsule>\n");
|
||||
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" -OD: Delivery of Capsules via file on Mass Storage device.\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_REPORT_GUID),\n");
|
||||
Print (L" which is defined in UEFI specification.\n");
|
||||
Print (L" -P: Dump UEFI FMP protocol info, or get image with specified\n");
|
||||
Print (L" ImageTypeId and Index (decimal format) to a file if 'GET'\n");
|
||||
Print (L" option is used.\n");
|
||||
Print (L" -E: Dump UEFI ESRT table info.\n");
|
||||
Print (L" -L: Dump provisioned capsule image information.\n");
|
||||
Print (L" -F: Dump all EFI System Partition.\n");
|
||||
Print (L" -G: Convert a BMP file to be an UX capsule,\n");
|
||||
Print (L" according to Windows Firmware Update document\n");
|
||||
Print (L" -N: Append a Capsule Header to an existing FMP capsule image\n");
|
||||
Print (L" with its ImageTypeId supported by the system,\n");
|
||||
Print (L" according to Windows Firmware Update document\n");
|
||||
Print (L" -O: Output new Capsule file name\n");
|
||||
Print (L" -D: Dump Capsule image header information, image payload\n");
|
||||
Print (L" information if it is an UX capsule and FMP header\n");
|
||||
Print (L" information if it is a FMP capsule.\n");
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -738,54 +752,63 @@ UefiMain (
|
||||
EFI_GUID ImageTypeId;
|
||||
UINTN ImageIndex;
|
||||
|
||||
BlockDescriptors = NULL;
|
||||
MapFsStr = NULL;
|
||||
CapsuleNum = 0;
|
||||
BlockDescriptors = NULL;
|
||||
MapFsStr = NULL;
|
||||
CapsuleNum = 0;
|
||||
|
||||
Status = GetArg();
|
||||
if (EFI_ERROR(Status)) {
|
||||
Print(L"Please use UEFI SHELL to run this application!\n", Status);
|
||||
Status = GetArg ();
|
||||
if (EFI_ERROR (Status)) {
|
||||
Print (L"Please use UEFI SHELL to run this application!\n", Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
if (Argc < 2) {
|
||||
PrintUsage();
|
||||
PrintUsage ();
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
if (StrCmp(Argv[1], L"-D") == 0) {
|
||||
|
||||
if (StrCmp (Argv[1], L"-D") == 0) {
|
||||
if (Argc != 3) {
|
||||
Print(L"CapsuleApp: Incorrect parameter count.\n");
|
||||
Print (L"CapsuleApp: Incorrect parameter count.\n");
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
Status = DumpCapsule(Argv[2]);
|
||||
|
||||
Status = DumpCapsule (Argv[2]);
|
||||
return Status;
|
||||
}
|
||||
if (StrCmp(Argv[1], L"-G") == 0) {
|
||||
Status = CreateBmpFmp();
|
||||
|
||||
if (StrCmp (Argv[1], L"-G") == 0) {
|
||||
Status = CreateBmpFmp ();
|
||||
return Status;
|
||||
}
|
||||
if (StrCmp(Argv[1], L"-N") == 0) {
|
||||
Status = CreateNestedFmp();
|
||||
|
||||
if (StrCmp (Argv[1], L"-N") == 0) {
|
||||
Status = CreateNestedFmp ();
|
||||
return Status;
|
||||
}
|
||||
if (StrCmp(Argv[1], L"-S") == 0) {
|
||||
Status = DumpCapsuleStatusVariable();
|
||||
|
||||
if (StrCmp (Argv[1], L"-S") == 0) {
|
||||
Status = DumpCapsuleStatusVariable ();
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
if (StrCmp(Argv[1], L"-C") == 0) {
|
||||
Status = ClearCapsuleStatusVariable();
|
||||
|
||||
if (StrCmp (Argv[1], L"-C") == 0) {
|
||||
Status = ClearCapsuleStatusVariable ();
|
||||
return Status;
|
||||
}
|
||||
if (StrCmp(Argv[1], L"-P") == 0) {
|
||||
|
||||
if (StrCmp (Argv[1], L"-P") == 0) {
|
||||
if (Argc == 2) {
|
||||
DumpFmpData();
|
||||
DumpFmpData ();
|
||||
}
|
||||
|
||||
if (Argc >= 3) {
|
||||
if (StrCmp(Argv[2], L"GET") != 0) {
|
||||
Print(L"CapsuleApp: Unrecognized option(%s).\n", Argv[2]);
|
||||
if (StrCmp (Argv[2], L"GET") != 0) {
|
||||
Print (L"CapsuleApp: Unrecognized option(%s).\n", Argv[2]);
|
||||
return EFI_UNSUPPORTED;
|
||||
} else {
|
||||
if (Argc != 7) {
|
||||
Print(L"CapsuleApp: Incorrect parameter count.\n");
|
||||
Print (L"CapsuleApp: Incorrect parameter count.\n");
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
@@ -797,54 +820,58 @@ UefiMain (
|
||||
Print (L"Invalid ImageTypeId - %s\n", Argv[3]);
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
ImageIndex = StrDecimalToUintn(Argv[4]);
|
||||
if (StrCmp(Argv[5], L"-O") != 0) {
|
||||
Print(L"CapsuleApp: NO output file name.\n");
|
||||
|
||||
ImageIndex = StrDecimalToUintn (Argv[4]);
|
||||
if (StrCmp (Argv[5], L"-O") != 0) {
|
||||
Print (L"CapsuleApp: NO output file name.\n");
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
DumpFmpImage(&ImageTypeId, ImageIndex, Argv[6]);
|
||||
|
||||
DumpFmpImage (&ImageTypeId, ImageIndex, Argv[6]);
|
||||
}
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
if (StrCmp(Argv[1], L"-E") == 0) {
|
||||
DumpEsrtData();
|
||||
if (StrCmp (Argv[1], L"-E") == 0) {
|
||||
DumpEsrtData ();
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
if (StrCmp(Argv[1], L"-L") == 0) {
|
||||
if (Argc >= 3 && StrCmp(Argv[2], L"INFO") == 0) {
|
||||
DumpProvisionedCapsule(TRUE);
|
||||
if (StrCmp (Argv[1], L"-L") == 0) {
|
||||
if ((Argc >= 3) && (StrCmp (Argv[2], L"INFO") == 0)) {
|
||||
DumpProvisionedCapsule (TRUE);
|
||||
} else {
|
||||
DumpProvisionedCapsule(FALSE);
|
||||
DumpProvisionedCapsule (FALSE);
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
if (StrCmp(Argv[1], L"-F") == 0) {
|
||||
DumpAllEfiSysPartition();
|
||||
if (StrCmp (Argv[1], L"-F") == 0) {
|
||||
DumpAllEfiSysPartition ();
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
if (Argv[1][0] == L'-') {
|
||||
Print(L"CapsuleApp: Unrecognized option(%s).\n", Argv[1]);
|
||||
Print (L"CapsuleApp: Unrecognized option(%s).\n", Argv[1]);
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
CapsuleFirstIndex = 1;
|
||||
NoReset = FALSE;
|
||||
CapsuleOnDisk = FALSE;
|
||||
ParaOdIndex = 0;
|
||||
ParaNrIndex = 0;
|
||||
NoReset = FALSE;
|
||||
CapsuleOnDisk = FALSE;
|
||||
ParaOdIndex = 0;
|
||||
ParaNrIndex = 0;
|
||||
|
||||
for (Index = 1; Index < Argc; Index++) {
|
||||
if (StrCmp(Argv[Index], L"-OD") == 0) {
|
||||
ParaOdIndex = Index;
|
||||
if (StrCmp (Argv[Index], L"-OD") == 0) {
|
||||
ParaOdIndex = Index;
|
||||
CapsuleOnDisk = TRUE;
|
||||
} else if (StrCmp(Argv[Index], L"-NR") == 0) {
|
||||
} else if (StrCmp (Argv[Index], L"-NR") == 0) {
|
||||
ParaNrIndex = Index;
|
||||
NoReset = TRUE;
|
||||
NoReset = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -886,37 +913,40 @@ UefiMain (
|
||||
CapsuleNum = CapsuleLastIndex - CapsuleFirstIndex + 1;
|
||||
|
||||
if (CapsuleFirstIndex > CapsuleLastIndex) {
|
||||
Print(L"CapsuleApp: NO capsule image.\n");
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
if (CapsuleNum > MAX_CAPSULE_NUM) {
|
||||
Print(L"CapsuleApp: Too many capsule images.\n");
|
||||
Print (L"CapsuleApp: NO capsule image.\n");
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
ZeroMem(&CapsuleBuffer, sizeof(CapsuleBuffer));
|
||||
ZeroMem(&CapsuleBufferSize, sizeof(CapsuleBufferSize));
|
||||
if (CapsuleNum > MAX_CAPSULE_NUM) {
|
||||
Print (L"CapsuleApp: Too many capsule images.\n");
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
ZeroMem (&CapsuleBuffer, sizeof (CapsuleBuffer));
|
||||
ZeroMem (&CapsuleBufferSize, sizeof (CapsuleBufferSize));
|
||||
BlockDescriptors = NULL;
|
||||
|
||||
for (Index = 0; Index < CapsuleNum; Index++) {
|
||||
CapsuleName = Argv[CapsuleFirstIndex + Index];
|
||||
Status = ReadFileToBuffer(CapsuleName, &CapsuleBufferSize[Index], &CapsuleBuffer[Index]);
|
||||
if (EFI_ERROR(Status)) {
|
||||
Print(L"CapsuleApp: capsule image (%s) is not found.\n", CapsuleName);
|
||||
Status = ReadFileToBuffer (CapsuleName, &CapsuleBufferSize[Index], &CapsuleBuffer[Index]);
|
||||
if (EFI_ERROR (Status)) {
|
||||
Print (L"CapsuleApp: capsule image (%s) is not found.\n", CapsuleName);
|
||||
goto Done;
|
||||
}
|
||||
|
||||
if (!IsValidCapsuleHeader (CapsuleBuffer[Index], CapsuleBufferSize[Index])) {
|
||||
Print(L"CapsuleApp: Capsule image (%s) is not a valid capsule.\n", CapsuleName);
|
||||
Print (L"CapsuleApp: Capsule image (%s) is not a valid capsule.\n", CapsuleName);
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
CapsuleNames[Index] = CapsuleName;
|
||||
}
|
||||
|
||||
//
|
||||
// Every capsule use 2 descriptor 1 for data 1 for end
|
||||
//
|
||||
Status = BuildGatherList(CapsuleBuffer, CapsuleBufferSize, CapsuleNum, &BlockDescriptors);
|
||||
if (EFI_ERROR(Status)) {
|
||||
Status = BuildGatherList (CapsuleBuffer, CapsuleBufferSize, CapsuleNum, &BlockDescriptors);
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto Done;
|
||||
}
|
||||
|
||||
@@ -925,18 +955,19 @@ UefiMain (
|
||||
//
|
||||
NeedReset = FALSE;
|
||||
for (Index = 0; Index < CapsuleNum; Index++) {
|
||||
CapsuleHeaderArray[Index] = (EFI_CAPSULE_HEADER *) CapsuleBuffer[Index];
|
||||
CapsuleHeaderArray[Index] = (EFI_CAPSULE_HEADER *)CapsuleBuffer[Index];
|
||||
if ((CapsuleHeaderArray[Index]->Flags & CAPSULE_FLAGS_PERSIST_ACROSS_RESET) != 0) {
|
||||
NeedReset = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
CapsuleHeaderArray[CapsuleNum] = NULL;
|
||||
|
||||
//
|
||||
// Inquire platform capability of UpdateCapsule.
|
||||
//
|
||||
Status = gRT->QueryCapsuleCapabilities (CapsuleHeaderArray, CapsuleNum, &MaxCapsuleSize, &ResetType);
|
||||
if (EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
Print (L"CapsuleApp: failed to query capsule capability - %r\n", Status);
|
||||
goto Done;
|
||||
}
|
||||
@@ -970,11 +1001,12 @@ UefiMain (
|
||||
// Check whether the input capsule image has the flag of persist across system reset.
|
||||
//
|
||||
if (NeedReset) {
|
||||
Status = gRT->UpdateCapsule(CapsuleHeaderArray,CapsuleNum,(UINTN) BlockDescriptors);
|
||||
Status = gRT->UpdateCapsule (CapsuleHeaderArray, CapsuleNum, (UINTN)BlockDescriptors);
|
||||
if (Status != EFI_SUCCESS) {
|
||||
Print (L"CapsuleApp: failed to update capsule - %r\n", Status);
|
||||
goto Done;
|
||||
}
|
||||
|
||||
//
|
||||
// For capsule with CAPSULE_FLAGS_PERSIST_ACROSS_RESET + CAPSULE_FLAGS_INITIATE_RESET,
|
||||
// a system reset should have been triggered by gRT->UpdateCapsule() calling above.
|
||||
@@ -994,7 +1026,7 @@ UefiMain (
|
||||
// For capsule who has no reset flag, only call UpdateCapsule Service without a
|
||||
// system reset. The service will process the capsule immediately.
|
||||
//
|
||||
Status = gRT->UpdateCapsule (CapsuleHeaderArray,CapsuleNum,(UINTN) BlockDescriptors);
|
||||
Status = gRT->UpdateCapsule (CapsuleHeaderArray, CapsuleNum, (UINTN)BlockDescriptors);
|
||||
if (Status != EFI_SUCCESS) {
|
||||
Print (L"CapsuleApp: failed to update capsule - %r\n", Status);
|
||||
}
|
||||
@@ -1009,7 +1041,7 @@ Done:
|
||||
}
|
||||
}
|
||||
|
||||
CleanGatherList(BlockDescriptors, CapsuleNum);
|
||||
CleanGatherList (BlockDescriptors, CapsuleNum);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
@@ -6,7 +6,6 @@
|
||||
|
||||
**/
|
||||
|
||||
|
||||
#ifndef _CAPSULE_APP_H_
|
||||
#define _CAPSULE_APP_H_
|
||||
|
||||
@@ -42,22 +41,22 @@
|
||||
#define CAPSULE_HEADER_SIZE 0x20
|
||||
|
||||
#define NESTED_CAPSULE_HEADER_SIZE SIZE_4KB
|
||||
#define SYSTEM_FIRMWARE_FLAG 0x50000
|
||||
#define DEVICE_FIRMWARE_FLAG 0x78010
|
||||
#define SYSTEM_FIRMWARE_FLAG 0x50000
|
||||
#define DEVICE_FIRMWARE_FLAG 0x78010
|
||||
|
||||
#define MAJOR_VERSION 1
|
||||
#define MINOR_VERSION 0
|
||||
#define MAJOR_VERSION 1
|
||||
#define MINOR_VERSION 0
|
||||
|
||||
#define MAX_CAPSULE_NUM 10
|
||||
#define MAX_CAPSULE_NUM 10
|
||||
|
||||
//
|
||||
// (20 * (6+5+2))+1) unicode characters from EFI FAT spec (doubled for bytes)
|
||||
//
|
||||
#define MAX_FILE_NAME_SIZE 522
|
||||
#define MAX_FILE_NAME_LEN (MAX_FILE_NAME_SIZE / sizeof(CHAR16))
|
||||
#define MAX_FILE_NAME_SIZE 522
|
||||
#define MAX_FILE_NAME_LEN (MAX_FILE_NAME_SIZE / sizeof(CHAR16))
|
||||
|
||||
extern UINTN Argc;
|
||||
extern CHAR16 **Argv;
|
||||
extern UINTN Argc;
|
||||
extern CHAR16 **Argv;
|
||||
|
||||
/**
|
||||
|
||||
@@ -81,7 +80,6 @@ GetShellProtocol (
|
||||
VOID
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Read a file.
|
||||
|
||||
@@ -95,9 +93,9 @@ GetShellProtocol (
|
||||
**/
|
||||
EFI_STATUS
|
||||
ReadFileToBuffer (
|
||||
IN CHAR16 *FileName,
|
||||
OUT UINTN *BufferSize,
|
||||
OUT VOID **Buffer
|
||||
IN CHAR16 *FileName,
|
||||
OUT UINTN *BufferSize,
|
||||
OUT VOID **Buffer
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -113,12 +111,11 @@ ReadFileToBuffer (
|
||||
**/
|
||||
EFI_STATUS
|
||||
WriteFileFromBuffer (
|
||||
IN CHAR16 *FileName,
|
||||
IN UINTN BufferSize,
|
||||
IN VOID *Buffer
|
||||
IN CHAR16 *FileName,
|
||||
IN UINTN BufferSize,
|
||||
IN VOID *Buffer
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Dump capsule information
|
||||
|
||||
@@ -129,7 +126,7 @@ WriteFileFromBuffer (
|
||||
**/
|
||||
EFI_STATUS
|
||||
DumpCapsule (
|
||||
IN CHAR16 *CapsuleName
|
||||
IN CHAR16 *CapsuleName
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -182,7 +179,7 @@ DumpEsrtData (
|
||||
**/
|
||||
VOID
|
||||
DumpProvisionedCapsule (
|
||||
IN BOOLEAN DumpCapsuleInfo
|
||||
IN BOOLEAN DumpCapsuleInfo
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -193,7 +190,6 @@ DumpAllEfiSysPartition (
|
||||
VOID
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Get SimpleFileSystem from boot option file path.
|
||||
|
||||
@@ -213,7 +209,6 @@ GetEfiSysPartitionFromBootOptionFilePath (
|
||||
OUT EFI_SIMPLE_FILE_SYSTEM_PROTOCOL **Fs
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Process Capsule On Disk.
|
||||
|
||||
@@ -229,12 +224,11 @@ GetEfiSysPartitionFromBootOptionFilePath (
|
||||
**/
|
||||
EFI_STATUS
|
||||
ProcessCapsuleOnDisk (
|
||||
IN VOID **CapsuleBuffer,
|
||||
IN UINTN *CapsuleBufferSize,
|
||||
IN CHAR16 **FilePath,
|
||||
IN CHAR16 *Map,
|
||||
IN UINTN CapsuleNum
|
||||
IN VOID **CapsuleBuffer,
|
||||
IN UINTN *CapsuleBufferSize,
|
||||
IN CHAR16 **FilePath,
|
||||
IN CHAR16 *Map,
|
||||
IN UINTN CapsuleNum
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -8,7 +8,9 @@
|
||||
|
||||
#include "CapsuleApp.h"
|
||||
|
||||
EFI_GUID mCapsuleOnDiskBootOptionGuid = { 0x4CC29BB7, 0x2413, 0x40A2, { 0xB0, 0x6D, 0x25, 0x3E, 0x37, 0x10, 0xF5, 0x32 } };
|
||||
EFI_GUID mCapsuleOnDiskBootOptionGuid = {
|
||||
0x4CC29BB7, 0x2413, 0x40A2, { 0xB0, 0x6D, 0x25, 0x3E, 0x37, 0x10, 0xF5, 0x32 }
|
||||
};
|
||||
|
||||
/**
|
||||
Get file name from file path.
|
||||
@@ -20,13 +22,13 @@ EFI_GUID mCapsuleOnDiskBootOptionGuid = { 0x4CC29BB7, 0x2413, 0x40A2, { 0xB0, 0x
|
||||
**/
|
||||
CHAR16 *
|
||||
GetFileNameFromPath (
|
||||
CHAR16 *FilePath
|
||||
CHAR16 *FilePath
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_SHELL_PROTOCOL *ShellProtocol;
|
||||
SHELL_FILE_HANDLE Handle;
|
||||
EFI_FILE_INFO *FileInfo;
|
||||
EFI_STATUS Status;
|
||||
EFI_SHELL_PROTOCOL *ShellProtocol;
|
||||
SHELL_FILE_HANDLE Handle;
|
||||
EFI_FILE_INFO *FileInfo;
|
||||
|
||||
ShellProtocol = GetShellProtocol ();
|
||||
if (ShellProtocol == NULL) {
|
||||
@@ -68,13 +70,13 @@ GetFileNameFromPath (
|
||||
**/
|
||||
BOOLEAN
|
||||
IsEfiSysPartitionDevicePath (
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_DEVICE_PATH_PROTOCOL *TempDevicePath;
|
||||
HARDDRIVE_DEVICE_PATH *Hd;
|
||||
EFI_HANDLE Handle;
|
||||
EFI_STATUS Status;
|
||||
EFI_DEVICE_PATH_PROTOCOL *TempDevicePath;
|
||||
HARDDRIVE_DEVICE_PATH *Hd;
|
||||
EFI_HANDLE Handle;
|
||||
|
||||
//
|
||||
// Check if the device path contains GPT node
|
||||
@@ -83,12 +85,14 @@ IsEfiSysPartitionDevicePath (
|
||||
|
||||
while (!IsDevicePathEnd (TempDevicePath)) {
|
||||
if ((DevicePathType (TempDevicePath) == MEDIA_DEVICE_PATH) &&
|
||||
(DevicePathSubType (TempDevicePath) == MEDIA_HARDDRIVE_DP)) {
|
||||
(DevicePathSubType (TempDevicePath) == MEDIA_HARDDRIVE_DP))
|
||||
{
|
||||
Hd = (HARDDRIVE_DEVICE_PATH *)TempDevicePath;
|
||||
if (Hd->MBRType == MBR_TYPE_EFI_PARTITION_TABLE_HEADER) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
TempDevicePath = NextDevicePathNode (TempDevicePath);
|
||||
}
|
||||
|
||||
@@ -112,19 +116,19 @@ DumpAllEfiSysPartition (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
EFI_HANDLE *SimpleFileSystemHandles;
|
||||
UINTN NumberSimpleFileSystemHandles;
|
||||
UINTN Index;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
UINTN NumberEfiSystemPartitions;
|
||||
EFI_SHELL_PROTOCOL *ShellProtocol;
|
||||
EFI_HANDLE *SimpleFileSystemHandles;
|
||||
UINTN NumberSimpleFileSystemHandles;
|
||||
UINTN Index;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
UINTN NumberEfiSystemPartitions;
|
||||
EFI_SHELL_PROTOCOL *ShellProtocol;
|
||||
|
||||
NumberEfiSystemPartitions = 0;
|
||||
|
||||
ShellProtocol = GetShellProtocol ();
|
||||
if (ShellProtocol == NULL) {
|
||||
Print (L"Get Shell Protocol Fail\n");;
|
||||
return ;
|
||||
Print (L"Get Shell Protocol Fail\n");
|
||||
return;
|
||||
}
|
||||
|
||||
Print (L"EFI System Partition list:\n");
|
||||
@@ -141,12 +145,12 @@ DumpAllEfiSysPartition (
|
||||
DevicePath = DevicePathFromHandle (SimpleFileSystemHandles[Index]);
|
||||
if (IsEfiSysPartitionDevicePath (DevicePath)) {
|
||||
NumberEfiSystemPartitions++;
|
||||
Print(L" %s\n %s\n", ShellProtocol->GetMapFromDevicePath (&DevicePath), ConvertDevicePathToText (DevicePath, TRUE, TRUE));
|
||||
Print (L" %s\n %s\n", ShellProtocol->GetMapFromDevicePath (&DevicePath), ConvertDevicePathToText (DevicePath, TRUE, TRUE));
|
||||
}
|
||||
}
|
||||
|
||||
if (NumberEfiSystemPartitions == 0) {
|
||||
Print(L" No ESP found.\n");
|
||||
Print (L" No ESP found.\n");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -162,21 +166,22 @@ IsCapsuleProvisioned (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINT64 OsIndication;
|
||||
UINTN DataSize;
|
||||
EFI_STATUS Status;
|
||||
UINT64 OsIndication;
|
||||
UINTN DataSize;
|
||||
|
||||
OsIndication = 0;
|
||||
DataSize = sizeof(UINT64);
|
||||
Status = gRT->GetVariable (
|
||||
L"OsIndications",
|
||||
&gEfiGlobalVariableGuid,
|
||||
NULL,
|
||||
&DataSize,
|
||||
&OsIndication
|
||||
);
|
||||
DataSize = sizeof (UINT64);
|
||||
Status = gRT->GetVariable (
|
||||
L"OsIndications",
|
||||
&gEfiGlobalVariableGuid,
|
||||
NULL,
|
||||
&DataSize,
|
||||
&OsIndication
|
||||
);
|
||||
if (!EFI_ERROR (Status) &&
|
||||
(OsIndication & EFI_OS_INDICATIONS_FILE_CAPSULE_DELIVERY_SUPPORTED) != 0) {
|
||||
((OsIndication & EFI_OS_INDICATIONS_FILE_CAPSULE_DELIVERY_SUPPORTED) != 0))
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -199,11 +204,11 @@ GetEfiSysPartition (
|
||||
OUT EFI_SIMPLE_FILE_SYSTEM_PROTOCOL **Fs
|
||||
)
|
||||
{
|
||||
EFI_HANDLE *SimpleFileSystemHandles;
|
||||
UINTN NumberSimpleFileSystemHandles;
|
||||
UINTN Index;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
EFI_STATUS Status;
|
||||
EFI_HANDLE *SimpleFileSystemHandles;
|
||||
UINTN NumberSimpleFileSystemHandles;
|
||||
UINTN Index;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
EFI_STATUS Status;
|
||||
|
||||
Status = gBS->LocateHandleBuffer (
|
||||
ByProtocol,
|
||||
@@ -245,15 +250,15 @@ GetEfiSysPartition (
|
||||
**/
|
||||
EFI_STATUS
|
||||
GetEfiSysPartitionFromDevPath (
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
|
||||
OUT EFI_DEVICE_PATH_PROTOCOL **FsDevicePath,
|
||||
OUT EFI_SIMPLE_FILE_SYSTEM_PROTOCOL **Fs
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
|
||||
OUT EFI_DEVICE_PATH_PROTOCOL **FsDevicePath,
|
||||
OUT EFI_SIMPLE_FILE_SYSTEM_PROTOCOL **Fs
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_DEVICE_PATH_PROTOCOL *TempDevicePath;
|
||||
HARDDRIVE_DEVICE_PATH *Hd;
|
||||
EFI_HANDLE Handle;
|
||||
EFI_STATUS Status;
|
||||
EFI_DEVICE_PATH_PROTOCOL *TempDevicePath;
|
||||
HARDDRIVE_DEVICE_PATH *Hd;
|
||||
EFI_HANDLE Handle;
|
||||
|
||||
//
|
||||
// Check if the device path contains GPT node
|
||||
@@ -261,12 +266,14 @@ GetEfiSysPartitionFromDevPath (
|
||||
TempDevicePath = DevicePath;
|
||||
while (!IsDevicePathEnd (TempDevicePath)) {
|
||||
if ((DevicePathType (TempDevicePath) == MEDIA_DEVICE_PATH) &&
|
||||
(DevicePathSubType (TempDevicePath) == MEDIA_HARDDRIVE_DP)) {
|
||||
(DevicePathSubType (TempDevicePath) == MEDIA_HARDDRIVE_DP))
|
||||
{
|
||||
Hd = (HARDDRIVE_DEVICE_PATH *)TempDevicePath;
|
||||
if (Hd->MBRType == MBR_TYPE_EFI_PARTITION_TABLE_HEADER) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
TempDevicePath = NextDevicePathNode (TempDevicePath);
|
||||
}
|
||||
|
||||
@@ -310,13 +317,13 @@ GetEfiSysPartitionFromBootOptionFilePath (
|
||||
OUT EFI_SIMPLE_FILE_SYSTEM_PROTOCOL **Fs
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_DEVICE_PATH_PROTOCOL *CurFullPath;
|
||||
EFI_DEVICE_PATH_PROTOCOL *PreFullPath;
|
||||
EFI_DEVICE_PATH_PROTOCOL *FsFullPath;
|
||||
EFI_STATUS Status;
|
||||
EFI_DEVICE_PATH_PROTOCOL *CurFullPath;
|
||||
EFI_DEVICE_PATH_PROTOCOL *PreFullPath;
|
||||
EFI_DEVICE_PATH_PROTOCOL *FsFullPath;
|
||||
|
||||
CurFullPath = NULL;
|
||||
FsFullPath = NULL;
|
||||
FsFullPath = NULL;
|
||||
//
|
||||
// Try every full device Path generated from bootoption
|
||||
//
|
||||
@@ -337,13 +344,14 @@ GetEfiSysPartitionFromBootOptionFilePath (
|
||||
}
|
||||
|
||||
DEBUG_CODE_BEGIN ();
|
||||
CHAR16 *DevicePathStr;
|
||||
CHAR16 *DevicePathStr;
|
||||
|
||||
DevicePathStr = ConvertDevicePathToText (CurFullPath, TRUE, TRUE);
|
||||
if (DevicePathStr != NULL) {
|
||||
DEBUG ((DEBUG_INFO, "Full device path %s\n", DevicePathStr));
|
||||
FreePool (DevicePathStr);
|
||||
}
|
||||
|
||||
DevicePathStr = ConvertDevicePathToText (CurFullPath, TRUE, TRUE);
|
||||
if (DevicePathStr != NULL){
|
||||
DEBUG ((DEBUG_INFO, "Full device path %s\n", DevicePathStr));
|
||||
FreePool (DevicePathStr);
|
||||
}
|
||||
DEBUG_CODE_END ();
|
||||
|
||||
Status = GetEfiSysPartitionFromDevPath (CurFullPath, &FsFullPath, Fs);
|
||||
@@ -376,7 +384,7 @@ GetUpdateFileSystem (
|
||||
OUT UINT16 *BootNext,
|
||||
OUT EFI_SIMPLE_FILE_SYSTEM_PROTOCOL **Fs,
|
||||
OUT BOOLEAN *UpdateBootNext
|
||||
)
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
CHAR16 BootOptionName[20];
|
||||
@@ -396,7 +404,7 @@ GetUpdateFileSystem (
|
||||
|
||||
ShellProtocol = GetShellProtocol ();
|
||||
if (ShellProtocol == NULL) {
|
||||
Print (L"Get Shell Protocol Fail\n");;
|
||||
Print (L"Get Shell Protocol Fail\n");
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
@@ -404,14 +412,14 @@ GetUpdateFileSystem (
|
||||
// 1. If Fs is not assigned and there are capsule provisioned before,
|
||||
// Get EFI system partition from BootNext.
|
||||
//
|
||||
if (IsCapsuleProvisioned () && Map == NULL) {
|
||||
if (IsCapsuleProvisioned () && (Map == NULL)) {
|
||||
Status = GetVariable2 (
|
||||
L"BootNext",
|
||||
&gEfiGlobalVariableGuid,
|
||||
(VOID **)&BootNextData,
|
||||
NULL
|
||||
);
|
||||
if (EFI_ERROR (Status) || BootNextData == NULL) {
|
||||
if (EFI_ERROR (Status) || (BootNextData == NULL)) {
|
||||
Print (L"Get Boot Next Data Fail. Status = %r\n", Status);
|
||||
return EFI_NOT_FOUND;
|
||||
} else {
|
||||
@@ -419,11 +427,11 @@ GetUpdateFileSystem (
|
||||
Status = EfiBootManagerVariableToLoadOption (BootOptionName, &BootNextOption);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
DevicePath = BootNextOption.FilePath;
|
||||
Status = GetEfiSysPartitionFromBootOptionFilePath (DevicePath, &FullPath, Fs);
|
||||
Status = GetEfiSysPartitionFromBootOptionFilePath (DevicePath, &FullPath, Fs);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
*UpdateBootNext = FALSE;
|
||||
Print(L"Get EFI system partition from BootNext : %s\n", BootNextOption.Description);
|
||||
Print(L"%s %s\n", ShellProtocol->GetMapFromDevicePath (&FullPath), ConvertDevicePathToText (FullPath, TRUE, TRUE));
|
||||
Print (L"Get EFI system partition from BootNext : %s\n", BootNextOption.Description);
|
||||
Print (L"%s %s\n", ShellProtocol->GetMapFromDevicePath (&FullPath), ConvertDevicePathToText (FullPath, TRUE, TRUE));
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
}
|
||||
@@ -436,10 +444,10 @@ GetUpdateFileSystem (
|
||||
if (Map != NULL) {
|
||||
MappedDevicePath = ShellProtocol->GetDevicePathFromMap (Map);
|
||||
if (MappedDevicePath == NULL) {
|
||||
Print(L"'%s' is not a valid mapping.\n", Map);
|
||||
Print (L"'%s' is not a valid mapping.\n", Map);
|
||||
return EFI_INVALID_PARAMETER;
|
||||
} else if (!IsEfiSysPartitionDevicePath (DuplicateDevicePath (MappedDevicePath))) {
|
||||
Print(L"'%s' is not a EFI System Partition.\n", Map);
|
||||
Print (L"'%s' is not a EFI System Partition.\n", Map);
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
}
|
||||
@@ -448,9 +456,10 @@ GetUpdateFileSystem (
|
||||
// 2. Get EFI system partition form boot options.
|
||||
//
|
||||
BootOptionBuffer = EfiBootManagerGetLoadOptions (&BootOptionCount, LoadOptionTypeBoot);
|
||||
if ( (BootOptionBuffer == NULL) ||
|
||||
(BootOptionCount == 0 && Map == NULL)
|
||||
) {
|
||||
if ((BootOptionBuffer == NULL) ||
|
||||
((BootOptionCount == 0) && (Map == NULL))
|
||||
)
|
||||
{
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
@@ -458,32 +467,34 @@ GetUpdateFileSystem (
|
||||
//
|
||||
// Get the boot option from the link list
|
||||
//
|
||||
DevicePath = BootOptionBuffer[Index].FilePath;
|
||||
DevicePath = BootOptionBuffer[Index].FilePath;
|
||||
|
||||
//
|
||||
// Skip inactive or legacy boot options
|
||||
//
|
||||
if ((BootOptionBuffer[Index].Attributes & LOAD_OPTION_ACTIVE) == 0 ||
|
||||
DevicePathType (DevicePath) == BBS_DEVICE_PATH) {
|
||||
if (((BootOptionBuffer[Index].Attributes & LOAD_OPTION_ACTIVE) == 0) ||
|
||||
(DevicePathType (DevicePath) == BBS_DEVICE_PATH))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
DEBUG_CODE_BEGIN ();
|
||||
CHAR16 *DevicePathStr;
|
||||
CHAR16 *DevicePathStr;
|
||||
|
||||
DevicePathStr = ConvertDevicePathToText (DevicePath, TRUE, TRUE);
|
||||
if (DevicePathStr != NULL) {
|
||||
DEBUG ((DEBUG_INFO, "Try BootOption %s\n", DevicePathStr));
|
||||
FreePool (DevicePathStr);
|
||||
} else {
|
||||
DEBUG ((DEBUG_INFO, "DevicePathToStr failed\n"));
|
||||
}
|
||||
|
||||
DevicePathStr = ConvertDevicePathToText (DevicePath, TRUE, TRUE);
|
||||
if (DevicePathStr != NULL){
|
||||
DEBUG ((DEBUG_INFO, "Try BootOption %s\n", DevicePathStr));
|
||||
FreePool (DevicePathStr);
|
||||
} else {
|
||||
DEBUG ((DEBUG_INFO, "DevicePathToStr failed\n"));
|
||||
}
|
||||
DEBUG_CODE_END ();
|
||||
|
||||
Status = GetEfiSysPartitionFromBootOptionFilePath (DevicePath, &FullPath, Fs);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
if (Map == NULL) {
|
||||
*BootNext = (UINT16) BootOptionBuffer[Index].OptionNumber;
|
||||
*BootNext = (UINT16)BootOptionBuffer[Index].OptionNumber;
|
||||
*UpdateBootNext = TRUE;
|
||||
Print (L"Found EFI system partition on Boot%04x: %s\n", *BootNext, BootOptionBuffer[Index].Description);
|
||||
Print (L"%s %s\n", ShellProtocol->GetMapFromDevicePath (&FullPath), ConvertDevicePathToText (FullPath, TRUE, TRUE));
|
||||
@@ -491,7 +502,7 @@ GetUpdateFileSystem (
|
||||
}
|
||||
|
||||
if (StrnCmp (Map, ShellProtocol->GetMapFromDevicePath (&FullPath), StrLen (Map)) == 0) {
|
||||
*BootNext = (UINT16) BootOptionBuffer[Index].OptionNumber;
|
||||
*BootNext = (UINT16)BootOptionBuffer[Index].OptionNumber;
|
||||
*UpdateBootNext = TRUE;
|
||||
Print (L"Found Boot Option on %s : %s\n", Map, BootOptionBuffer[Index].Description);
|
||||
return EFI_SUCCESS;
|
||||
@@ -507,11 +518,12 @@ GetUpdateFileSystem (
|
||||
// If map is assigned, try to get ESP from mapped Fs.
|
||||
//
|
||||
DevicePath = DuplicateDevicePath (MappedDevicePath);
|
||||
Status = GetEfiSysPartitionFromDevPath (DevicePath, &FullPath, Fs);
|
||||
Status = GetEfiSysPartitionFromDevPath (DevicePath, &FullPath, Fs);
|
||||
if (EFI_ERROR (Status)) {
|
||||
Print (L"Error: Cannot get EFI system partition from '%s' - %r\n", Map, Status);
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
Print (L"Warning: Cannot find Boot Option on '%s'!\n", Map);
|
||||
} else {
|
||||
Status = GetEfiSysPartition (&DevicePath, Fs);
|
||||
@@ -529,15 +541,16 @@ GetUpdateFileSystem (
|
||||
LOAD_OPTION_ACTIVE,
|
||||
L"UEFI Capsule On Disk",
|
||||
DevicePath,
|
||||
(UINT8 *) &mCapsuleOnDiskBootOptionGuid,
|
||||
sizeof(EFI_GUID)
|
||||
(UINT8 *)&mCapsuleOnDiskBootOptionGuid,
|
||||
sizeof (EFI_GUID)
|
||||
);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
Status = EfiBootManagerAddLoadOptionVariable (&NewOption, (UINTN) -1); {
|
||||
Status = EfiBootManagerAddLoadOptionVariable (&NewOption, (UINTN)-1);
|
||||
{
|
||||
if (!EFI_ERROR (Status)) {
|
||||
*UpdateBootNext = TRUE;
|
||||
*BootNext = (UINT16) NewOption.OptionNumber;
|
||||
Print (L" Boot%04x: %s\n", *BootNext, ConvertDevicePathToText(DevicePath, TRUE, TRUE));
|
||||
*BootNext = (UINT16)NewOption.OptionNumber;
|
||||
Print (L" Boot%04x: %s\n", *BootNext, ConvertDevicePathToText (DevicePath, TRUE, TRUE));
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
}
|
||||
@@ -564,25 +577,25 @@ GetUpdateFileSystem (
|
||||
**/
|
||||
EFI_STATUS
|
||||
WriteUpdateFile (
|
||||
IN VOID **Buffer,
|
||||
IN UINTN *BufferSize,
|
||||
IN CHAR16 **FileName,
|
||||
IN UINTN BufferNum,
|
||||
IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Fs
|
||||
)
|
||||
IN VOID **Buffer,
|
||||
IN UINTN *BufferSize,
|
||||
IN CHAR16 **FileName,
|
||||
IN UINTN BufferNum,
|
||||
IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Fs
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_FILE *Root;
|
||||
EFI_FILE *FileHandle;
|
||||
EFI_FILE_PROTOCOL *DirHandle;
|
||||
UINT64 FileInfo;
|
||||
VOID *Filebuffer;
|
||||
UINTN FileSize;
|
||||
UINTN Index;
|
||||
EFI_STATUS Status;
|
||||
EFI_FILE *Root;
|
||||
EFI_FILE *FileHandle;
|
||||
EFI_FILE_PROTOCOL *DirHandle;
|
||||
UINT64 FileInfo;
|
||||
VOID *Filebuffer;
|
||||
UINTN FileSize;
|
||||
UINTN Index;
|
||||
|
||||
DirHandle = NULL;
|
||||
FileHandle = NULL;
|
||||
Index = 0;
|
||||
DirHandle = NULL;
|
||||
FileHandle = NULL;
|
||||
Index = 0;
|
||||
|
||||
//
|
||||
// Open Root from SFS
|
||||
@@ -600,15 +613,16 @@ WriteUpdateFile (
|
||||
if (EFI_ERROR (Status)) {
|
||||
Status = Root->Open (Root, &DirHandle, L"\\EFI", EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE, EFI_FILE_DIRECTORY);
|
||||
if (EFI_ERROR (Status)) {
|
||||
Print(L"Unable to create %s directory\n", L"\\EFI");
|
||||
Print (L"Unable to create %s directory\n", L"\\EFI");
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
}
|
||||
Status = Root->Open (Root, &DirHandle, EFI_CAPSULE_FILE_DIRECTORY, EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE , 0);
|
||||
|
||||
Status = Root->Open (Root, &DirHandle, EFI_CAPSULE_FILE_DIRECTORY, EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE, 0);
|
||||
if (EFI_ERROR (Status)) {
|
||||
Status = Root->Open (Root, &DirHandle, EFI_CAPSULE_FILE_DIRECTORY, EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE, EFI_FILE_DIRECTORY);
|
||||
if (EFI_ERROR (Status)) {
|
||||
Print(L"Unable to create %s directory\n", EFI_CAPSULE_FILE_DIRECTORY);
|
||||
Print (L"Unable to create %s directory\n", EFI_CAPSULE_FILE_DIRECTORY);
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
}
|
||||
@@ -643,7 +657,7 @@ WriteUpdateFile (
|
||||
// Set the file size to 0.
|
||||
//
|
||||
FileInfo = 0;
|
||||
Status = FileHandleSetSize (FileHandle, FileInfo);
|
||||
Status = FileHandleSetSize (FileHandle, FileInfo);
|
||||
if (EFI_ERROR (Status)) {
|
||||
Print (L"Error Deleting %s\n", FileName[Index]);
|
||||
FileHandleClose (FileHandle);
|
||||
@@ -655,8 +669,8 @@ WriteUpdateFile (
|
||||
// Write Filebuffer to file
|
||||
//
|
||||
Filebuffer = Buffer[Index];
|
||||
FileSize = BufferSize[Index];
|
||||
Status = FileHandleWrite (FileHandle, &FileSize, Filebuffer);
|
||||
FileSize = BufferSize[Index];
|
||||
Status = FileHandleWrite (FileHandle, &FileSize, Filebuffer);
|
||||
if (EFI_ERROR (Status)) {
|
||||
Print (L"Unable to write Capsule Update to %s, Status = %r\n", FileName[Index], Status);
|
||||
return EFI_NOT_FOUND;
|
||||
@@ -680,36 +694,37 @@ WriteUpdateFile (
|
||||
**/
|
||||
EFI_STATUS
|
||||
SetCapsuleStatusVariable (
|
||||
BOOLEAN SetCap
|
||||
BOOLEAN SetCap
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINT64 OsIndication;
|
||||
UINTN DataSize;
|
||||
EFI_STATUS Status;
|
||||
UINT64 OsIndication;
|
||||
UINTN DataSize;
|
||||
|
||||
OsIndication = 0;
|
||||
DataSize = sizeof(UINT64);
|
||||
Status = gRT->GetVariable (
|
||||
L"OsIndications",
|
||||
&gEfiGlobalVariableGuid,
|
||||
NULL,
|
||||
&DataSize,
|
||||
&OsIndication
|
||||
);
|
||||
DataSize = sizeof (UINT64);
|
||||
Status = gRT->GetVariable (
|
||||
L"OsIndications",
|
||||
&gEfiGlobalVariableGuid,
|
||||
NULL,
|
||||
&DataSize,
|
||||
&OsIndication
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
OsIndication = 0;
|
||||
}
|
||||
|
||||
if (SetCap) {
|
||||
OsIndication |= ((UINT64)EFI_OS_INDICATIONS_FILE_CAPSULE_DELIVERY_SUPPORTED);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
OsIndication &= ~((UINT64)EFI_OS_INDICATIONS_FILE_CAPSULE_DELIVERY_SUPPORTED);
|
||||
}
|
||||
|
||||
Status = gRT->SetVariable (
|
||||
L"OsIndications",
|
||||
&gEfiGlobalVariableGuid,
|
||||
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
|
||||
sizeof(UINT64),
|
||||
sizeof (UINT64),
|
||||
&OsIndication
|
||||
);
|
||||
|
||||
@@ -728,18 +743,18 @@ IsCapsuleOnDiskSupported (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINT64 OsIndicationsSupported;
|
||||
UINTN DataSize;
|
||||
EFI_STATUS Status;
|
||||
UINT64 OsIndicationsSupported;
|
||||
UINTN DataSize;
|
||||
|
||||
DataSize = sizeof(UINT64);
|
||||
Status = gRT->GetVariable (
|
||||
L"OsIndicationsSupported",
|
||||
&gEfiGlobalVariableGuid,
|
||||
NULL,
|
||||
&DataSize,
|
||||
&OsIndicationsSupported
|
||||
);
|
||||
DataSize = sizeof (UINT64);
|
||||
Status = gRT->GetVariable (
|
||||
L"OsIndicationsSupported",
|
||||
&gEfiGlobalVariableGuid,
|
||||
NULL,
|
||||
&DataSize,
|
||||
&OsIndicationsSupported
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return FALSE;
|
||||
}
|
||||
@@ -766,19 +781,19 @@ IsCapsuleOnDiskSupported (
|
||||
**/
|
||||
EFI_STATUS
|
||||
ProcessCapsuleOnDisk (
|
||||
IN VOID **CapsuleBuffer,
|
||||
IN UINTN *CapsuleBufferSize,
|
||||
IN CHAR16 **FilePath,
|
||||
IN CHAR16 *Map,
|
||||
IN UINTN CapsuleNum
|
||||
IN VOID **CapsuleBuffer,
|
||||
IN UINTN *CapsuleBufferSize,
|
||||
IN CHAR16 **FilePath,
|
||||
IN CHAR16 *Map,
|
||||
IN UINTN CapsuleNum
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINT16 BootNext;
|
||||
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Fs;
|
||||
BOOLEAN UpdateBootNext;
|
||||
CHAR16 *FileName[MAX_CAPSULE_NUM];
|
||||
UINTN Index;
|
||||
EFI_STATUS Status;
|
||||
UINT16 BootNext;
|
||||
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Fs;
|
||||
BOOLEAN UpdateBootNext;
|
||||
CHAR16 *FileName[MAX_CAPSULE_NUM];
|
||||
UINTN Index;
|
||||
|
||||
//
|
||||
// Check if Capsule On Disk is supported
|
||||
@@ -802,7 +817,7 @@ ProcessCapsuleOnDisk (
|
||||
//
|
||||
// Get file name from file path
|
||||
//
|
||||
for (Index = 0; Index < CapsuleNum; Index ++) {
|
||||
for (Index = 0; Index < CapsuleNum; Index++) {
|
||||
FileName[Index] = GetFileNameFromPath (FilePath[Index]);
|
||||
}
|
||||
|
||||
@@ -826,13 +841,13 @@ ProcessCapsuleOnDisk (
|
||||
|
||||
if (UpdateBootNext) {
|
||||
Status = gRT->SetVariable (
|
||||
L"BootNext",
|
||||
&gEfiGlobalVariableGuid,
|
||||
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
|
||||
sizeof(UINT16),
|
||||
&BootNext
|
||||
);
|
||||
if (EFI_ERROR (Status)){
|
||||
L"BootNext",
|
||||
&gEfiGlobalVariableGuid,
|
||||
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
|
||||
sizeof (UINT16),
|
||||
&BootNext
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
Print (L"CapsuleApp: unable to set BootNext variable.\n");
|
||||
return Status;
|
||||
}
|
||||
|
Reference in New Issue
Block a user