Revision: 18859
http://sourceforge.net/p/edk2/code/18859
Author: niruiyu
Date: 2015-11-17 10:11:44 +0000 (Tue, 17 Nov 2015)
Log Message:
-----------
MdeModulePkg: Add Platform recovery support
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ruiyu Ni <[email protected]>
Reviewed-by: Sunny Wang <[email protected]>
Modified Paths:
--------------
trunk/edk2/MdeModulePkg/Include/Library/UefiBootManagerLib.h
trunk/edk2/MdeModulePkg/Library/UefiBootManagerLib/BmLoadOption.c
trunk/edk2/MdeModulePkg/Library/UefiBootManagerLib/InternalBm.h
trunk/edk2/MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf
Modified: trunk/edk2/MdeModulePkg/Include/Library/UefiBootManagerLib.h
===================================================================
--- trunk/edk2/MdeModulePkg/Include/Library/UefiBootManagerLib.h
2015-11-17 10:10:54 UTC (rev 18858)
+++ trunk/edk2/MdeModulePkg/Include/Library/UefiBootManagerLib.h
2015-11-17 10:11:44 UTC (rev 18859)
@@ -31,6 +31,7 @@
LoadOptionTypeDriver,
LoadOptionTypeSysPrep,
LoadOptionTypeBoot,
+ LoadOptionTypePlatformRecovery,
LoadOptionTypeMax
} EFI_BOOT_MANAGER_LOAD_OPTION_TYPE;
Modified: trunk/edk2/MdeModulePkg/Library/UefiBootManagerLib/BmLoadOption.c
===================================================================
--- trunk/edk2/MdeModulePkg/Library/UefiBootManagerLib/BmLoadOption.c
2015-11-17 10:10:54 UTC (rev 18858)
+++ trunk/edk2/MdeModulePkg/Library/UefiBootManagerLib/BmLoadOption.c
2015-11-17 10:11:44 UTC (rev 18859)
@@ -19,14 +19,16 @@
CHAR16 *mBmLoadOptionName[] = {
L"Driver",
L"SysPrep",
- L"Boot"
+ L"Boot",
+ L"PlatformRecovery"
};
GLOBAL_REMOVE_IF_UNREFERENCED
CHAR16 *mBmLoadOptionOrderName[] = {
EFI_DRIVER_ORDER_VARIABLE_NAME,
EFI_SYS_PREP_ORDER_VARIABLE_NAME,
- EFI_BOOT_ORDER_VARIABLE_NAME
+ EFI_BOOT_ORDER_VARIABLE_NAME,
+ NULL // PlatformRecovery#### doesn't have associated *Order variable
};
/**
@@ -154,8 +156,9 @@
}
/**
- Create the Boot####, Driver####, SysPrep####, variable from the load option.
-
+ Create the Boot####, Driver####, SysPrep####, PlatformRecovery#### variable
+ from the load option.
+
@param LoadOption Pointer to the load option.
@retval EFI_SUCCESS The variable was created.
@@ -167,12 +170,14 @@
IN CONST EFI_BOOT_MANAGER_LOAD_OPTION *Option
)
{
+ EFI_STATUS Status;
UINTN VariableSize;
UINT8 *Variable;
UINT8 *Ptr;
CHAR16 OptionName[BM_OPTION_NAME_LEN];
CHAR16 *Description;
CHAR16 NullChar;
+ EDKII_VARIABLE_LOCK_PROTOCOL *VariableLock;
UINT32 VariableAttributes;
if ((Option->OptionNumber == LoadOptionNumberUnassigned) ||
@@ -233,6 +238,17 @@
UnicodeSPrint (OptionName, sizeof (OptionName), L"%s%04x",
mBmLoadOptionName[Option->OptionType], Option->OptionNumber);
VariableAttributes = EFI_VARIABLE_BOOTSERVICE_ACCESS |
EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE;
+ if (Option->OptionType == LoadOptionTypePlatformRecovery) {
+ //
+ // Lock the PlatformRecovery####
+ //
+ Status = gBS->LocateProtocol (&gEdkiiVariableLockProtocolGuid, NULL, (VOID
**) &VariableLock);
+ if (!EFI_ERROR (Status)) {
+ Status = VariableLock->RequestToLock (VariableLock, OptionName,
&gEfiGlobalVariableGuid);
+ ASSERT_EFI_ERROR (Status);
+ }
+ VariableAttributes = EFI_VARIABLE_BOOTSERVICE_ACCESS |
EFI_VARIABLE_RUNTIME_ACCESS;
+ }
return gRT->SetVariable (
OptionName,
@@ -550,6 +566,7 @@
UINTN OptionOrderSize;
EFI_STATUS Status;
UINTN Index;
+ CHAR16 OptionName[BM_OPTION_NAME_LEN];
if (((UINT32) OptionType >= LoadOptionTypeMax) || (OptionNumber >=
LoadOptionNumberMax)) {
return EFI_INVALID_PARAMETER;
@@ -581,6 +598,18 @@
if (OptionOrder != NULL) {
FreePool (OptionOrder);
}
+ } else if (OptionType == LoadOptionTypePlatformRecovery) {
+ //
+ // PlatformRecovery#### doesn't have assiciated PlatformRecoveryOrder,
remove the PlatformRecovery#### itself.
+ //
+ UnicodeSPrint (OptionName, sizeof (OptionName), L"%s%04x",
mBmLoadOptionName[OptionType], OptionNumber);
+ Status = gRT->SetVariable (
+ OptionName,
+ &gEfiGlobalVariableGuid,
+ 0,
+ 0,
+ NULL
+ );
}
return Status;
@@ -677,7 +706,8 @@
}
/**
- Validate the Boot####, Driver####, SysPrep#### variable (VendorGuid/Name)
+ Validate the Boot####, Driver####, SysPrep#### and PlatformRecovery####
+ variable (VendorGuid/Name)
@param Variable The variable data.
@param VariableSize The variable size.
@@ -920,7 +950,63 @@
return EfiBootManagerVariableToLoadOptionEx (VariableName,
&gEfiGlobalVariableGuid, Option);
}
+typedef struct {
+ EFI_BOOT_MANAGER_LOAD_OPTION_TYPE OptionType;
+ EFI_GUID *Guid;
+ EFI_BOOT_MANAGER_LOAD_OPTION *Options;
+ UINTN OptionCount;
+} BM_COLLECT_LOAD_OPTIONS_PARAM;
+
/**
+ Visitor function to collect the Platform Recovery load options or OS Recovery
+ load options from NV storage.
+
+ @param Name Variable name.
+ @param Guid Variable GUID.
+ @param Context The same context passed to BmForEachVariable.
+**/
+VOID
+BmCollectLoadOptions (
+ IN CHAR16 *Name,
+ IN EFI_GUID *Guid,
+ IN VOID *Context
+ )
+{
+ EFI_STATUS Status;
+ EFI_BOOT_MANAGER_LOAD_OPTION_TYPE OptionType;
+ UINT16 OptionNumber;
+ EFI_BOOT_MANAGER_LOAD_OPTION Option;
+ UINTN Index;
+ BM_COLLECT_LOAD_OPTIONS_PARAM *Param;
+
+ Param = (BM_COLLECT_LOAD_OPTIONS_PARAM *) Context;
+
+ if (CompareGuid (Guid, Param->Guid) && (
+ Param->OptionType == LoadOptionTypePlatformRecovery &&
+ BmIsValidLoadOptionVariableName (Name, &OptionType, &OptionNumber) &&
+ OptionType == LoadOptionTypePlatformRecovery
+ )) {
+ Status = EfiBootManagerVariableToLoadOptionEx (Name, Guid, &Option);
+ if (!EFI_ERROR (Status)) {
+ for (Index = 0; Index < Param->OptionCount; Index++) {
+ if (Param->Options[Index].OptionNumber > Option.OptionNumber) {
+ break;
+ }
+ }
+ Param->Options = ReallocatePool (
+ Param->OptionCount * sizeof
(EFI_BOOT_MANAGER_LOAD_OPTION),
+ (Param->OptionCount + 1) * sizeof
(EFI_BOOT_MANAGER_LOAD_OPTION),
+ Param->Options
+ );
+ ASSERT (Param->Options != NULL);
+ CopyMem (&Param->Options[Index + 1], &Param->Options[Index],
(Param->OptionCount - Index) * sizeof (EFI_BOOT_MANAGER_LOAD_OPTION));
+ CopyMem (&Param->Options[Index], &Option, sizeof
(EFI_BOOT_MANAGER_LOAD_OPTION));
+ Param->OptionCount++;
+ }
+ }
+}
+
+/**
Returns an array of load options based on the EFI variable
L"BootOrder"/L"DriverOrder" and the L"Boot####"/L"Driver####" variables
impled by it.
#### is the hex value of the UINT16 in each BootOrder/DriverOrder entry.
@@ -939,16 +1025,18 @@
IN EFI_BOOT_MANAGER_LOAD_OPTION_TYPE LoadOptionType
)
{
- EFI_STATUS Status;
- UINT16 *OptionOrder;
- UINTN OptionOrderSize;
- UINTN Index;
- UINTN OptionIndex;
- EFI_BOOT_MANAGER_LOAD_OPTION *Options;
- CHAR16 OptionName[BM_OPTION_NAME_LEN];
- UINT16 OptionNumber;
+ EFI_STATUS Status;
+ UINT16 *OptionOrder;
+ UINTN OptionOrderSize;
+ UINTN Index;
+ UINTN OptionIndex;
+ EFI_BOOT_MANAGER_LOAD_OPTION *Options;
+ CHAR16 OptionName[BM_OPTION_NAME_LEN];
+ UINT16 OptionNumber;
+ BM_COLLECT_LOAD_OPTIONS_PARAM Param;
*OptionCount = 0;
+ Options = NULL;
if (LoadOptionType == LoadOptionTypeDriver || LoadOptionType ==
LoadOptionTypeSysPrep || LoadOptionType == LoadOptionTypeBoot) {
//
@@ -989,8 +1077,16 @@
*OptionCount = OptionIndex;
}
- } else {
- return NULL;
+ } else if (LoadOptionType == LoadOptionTypePlatformRecovery) {
+ Param.OptionType = LoadOptionTypePlatformRecovery;
+ Param.Options = NULL;
+ Param.OptionCount = 0;
+ Param.Guid = &gEfiGlobalVariableGuid;
+
+ BmForEachVariable (BmCollectLoadOptions, (VOID *) &Param);
+
+ *OptionCount = Param.OptionCount;
+ Options = Param.Options;
}
return Options;
@@ -1118,7 +1214,8 @@
if ((Type == LoadOptionTypeDriver && Subsystem ==
EFI_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER) ||
(Type == LoadOptionTypeDriver && Subsystem ==
EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER) ||
(Type == LoadOptionTypeSysPrep && Subsystem ==
EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION) ||
- (Type == LoadOptionTypeBoot && Subsystem ==
EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION)
+ (Type == LoadOptionTypeBoot && Subsystem ==
EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION) ||
+ (Type == LoadOptionTypePlatformRecovery && Subsystem ==
EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION)
) {
return TRUE;
}
Modified: trunk/edk2/MdeModulePkg/Library/UefiBootManagerLib/InternalBm.h
===================================================================
--- trunk/edk2/MdeModulePkg/Library/UefiBootManagerLib/InternalBm.h
2015-11-17 10:10:54 UTC (rev 18858)
+++ trunk/edk2/MdeModulePkg/Library/UefiBootManagerLib/InternalBm.h
2015-11-17 10:11:44 UTC (rev 18859)
@@ -42,6 +42,7 @@
#include <Protocol/BootLogo.h>
#include <Protocol/DriverHealth.h>
#include <Protocol/FormBrowser2.h>
+#include <Protocol/VariableLock.h>
#include <Guid/ZeroGuid.h>
#include <Guid/MemoryTypeInformation.h>
@@ -102,7 +103,10 @@
IN EFI_HANDLE Handle
);
-#define BM_OPTION_NAME_LEN sizeof ("SysPrep####")
+//
+// PlatformRecovery#### is the load option with the longest name
+//
+#define BM_OPTION_NAME_LEN sizeof
("PlatformRecovery####")
extern CHAR16 *mBmLoadOptionName[];
/**
Modified:
trunk/edk2/MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf
===================================================================
--- trunk/edk2/MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf
2015-11-17 10:10:54 UTC (rev 18858)
+++ trunk/edk2/MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf
2015-11-17 10:11:44 UTC (rev 18859)
@@ -101,6 +101,7 @@
gEfiDevicePathProtocolGuid ## CONSUMES
gEfiBootLogoProtocolGuid ## CONSUMES
gEfiSimpleTextInputExProtocolGuid ## CONSUMES
+ gEdkiiVariableLockProtocolGuid ## CONSUMES
gEfiGraphicsOutputProtocolGuid ## SOMETIMES_CONSUMES
gEfiUsbIoProtocolGuid ## SOMETIMES_CONSUMES
gEfiDiskInfoProtocolGuid ## SOMETIMES_CONSUMES
------------------------------------------------------------------------------
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits