mirror of https://github.com/acidanthera/audk.git
Remove the KeyOrder variable dependency from BDS
Signed-off-by: Ruiyu Ni<ruiyu.ni@intel.com> Reviewed-by: Eric Dong<eric.dong@intel.com> git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13861 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
f269f2afa1
commit
ad481b0b99
|
@ -116,7 +116,6 @@
|
|||
## SOMETIMES_PRODUCES ## Variable:L"BootXX" (Boot option variable)
|
||||
## SOMETIMES_PRODUCES ## Variable:L"PlatformLang" (Platform supported languange in Rfc4646 format)
|
||||
## SOMETIMES_PRODUCES ## Variable:L"Lang" (Platform supported languange in Iso639 format)
|
||||
## SOMETIMES_PRODUCES ## Variable:L"KeyOrder" (Number of hotkey)
|
||||
## SOMETIMES_PRODUCES ## Variable:L"KeyXX" (Hotkey option variable)
|
||||
## PRODUCES ## Variable:L"HwErrRecSupport" (The level of platform supported hardware Error Record Persistence)
|
||||
## SOMETIMES_PRODUCES ## Variable:L"BootOptionSupport" (The feature supported in boot option menu, value could be: EFI_BOOT_OPTION_SUPPORT_KEY, EFI_BOOT_OPTION_SUPPORT_APP
|
||||
|
|
|
@ -64,241 +64,6 @@ IsKeyOptionValid (
|
|||
return (BOOLEAN) ((KeyOption->BootOptionCrc == Crc) ? TRUE : FALSE);
|
||||
}
|
||||
|
||||
/**
|
||||
Create Key#### for the given hotkey.
|
||||
|
||||
@param KeyOption The Hot Key Option to be added.
|
||||
@param KeyOptionNumber The key option number for Key#### (optional).
|
||||
|
||||
@retval EFI_SUCCESS Register hotkey successfully.
|
||||
@retval EFI_INVALID_PARAMETER The hotkey option is invalid.
|
||||
@retval EFI_OUT_OF_RESOURCES Fail to allocate memory resource.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
RegisterHotkey (
|
||||
IN EFI_KEY_OPTION *KeyOption,
|
||||
OUT UINT16 *KeyOptionNumber
|
||||
)
|
||||
{
|
||||
UINT16 KeyOptionName[10];
|
||||
UINT16 *KeyOrder;
|
||||
UINTN KeyOrderSize;
|
||||
UINT16 *NewKeyOrder;
|
||||
UINTN Index;
|
||||
UINT16 MaxOptionNumber;
|
||||
UINT16 RegisterOptionNumber;
|
||||
EFI_KEY_OPTION *TempOption;
|
||||
UINTN TempOptionSize;
|
||||
EFI_STATUS Status;
|
||||
UINTN KeyOptionSize;
|
||||
BOOLEAN UpdateBootOption;
|
||||
|
||||
//
|
||||
// Validate the given key option
|
||||
//
|
||||
if (!IsKeyOptionValid (KeyOption)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
KeyOptionSize = sizeof (EFI_KEY_OPTION) + KEY_OPTION_INPUT_KEY_COUNT (KeyOption) * sizeof (EFI_INPUT_KEY);
|
||||
UpdateBootOption = FALSE;
|
||||
|
||||
//
|
||||
// Check whether HotKey conflict with keys used by Setup Browser
|
||||
//
|
||||
KeyOrder = BdsLibGetVariableAndSize (
|
||||
VAR_KEY_ORDER,
|
||||
&gEfiGlobalVariableGuid,
|
||||
&KeyOrderSize
|
||||
);
|
||||
if (KeyOrder == NULL) {
|
||||
KeyOrderSize = 0;
|
||||
}
|
||||
|
||||
//
|
||||
// Find free key option number
|
||||
//
|
||||
MaxOptionNumber = 0;
|
||||
TempOption = NULL;
|
||||
for (Index = 0; Index < KeyOrderSize / sizeof (UINT16); Index++) {
|
||||
if (MaxOptionNumber < KeyOrder[Index]) {
|
||||
MaxOptionNumber = KeyOrder[Index];
|
||||
}
|
||||
|
||||
UnicodeSPrint (KeyOptionName, sizeof (KeyOptionName), L"Key%04x", KeyOrder[Index]);
|
||||
TempOption = BdsLibGetVariableAndSize (
|
||||
KeyOptionName,
|
||||
&gEfiGlobalVariableGuid,
|
||||
&TempOptionSize
|
||||
);
|
||||
ASSERT (TempOption != NULL);
|
||||
|
||||
if (CompareMem (TempOption, KeyOption, TempOptionSize) == 0) {
|
||||
//
|
||||
// Got the option, so just return
|
||||
//
|
||||
FreePool (TempOption);
|
||||
FreePool (KeyOrder);
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
if (KeyOption->KeyData == TempOption->KeyData) {
|
||||
if (CompareMem (
|
||||
((UINT8 *) TempOption) + sizeof (EFI_KEY_OPTION),
|
||||
((UINT8 *) KeyOption) + sizeof (EFI_KEY_OPTION),
|
||||
KeyOptionSize - sizeof (EFI_KEY_OPTION)
|
||||
) == 0) {
|
||||
//
|
||||
// Hotkey is the same but BootOption changed, need update
|
||||
//
|
||||
UpdateBootOption = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
FreePool (TempOption);
|
||||
}
|
||||
|
||||
if (UpdateBootOption) {
|
||||
RegisterOptionNumber = KeyOrder[Index];
|
||||
FreePool (TempOption);
|
||||
} else {
|
||||
RegisterOptionNumber = (UINT16) (MaxOptionNumber + 1);
|
||||
}
|
||||
|
||||
if (KeyOptionNumber != NULL) {
|
||||
*KeyOptionNumber = RegisterOptionNumber;
|
||||
}
|
||||
|
||||
//
|
||||
// Create variable Key####
|
||||
//
|
||||
UnicodeSPrint (KeyOptionName, sizeof (KeyOptionName), L"Key%04x", RegisterOptionNumber);
|
||||
Status = gRT->SetVariable (
|
||||
KeyOptionName,
|
||||
&gEfiGlobalVariableGuid,
|
||||
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
|
||||
KeyOptionSize,
|
||||
KeyOption
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
FreePool (KeyOrder);
|
||||
return Status;
|
||||
}
|
||||
|
||||
//
|
||||
// Update the key order variable - "KeyOrder"
|
||||
//
|
||||
if (!UpdateBootOption) {
|
||||
Index = KeyOrderSize / sizeof (UINT16);
|
||||
KeyOrderSize += sizeof (UINT16);
|
||||
}
|
||||
|
||||
NewKeyOrder = AllocatePool (KeyOrderSize);
|
||||
if (NewKeyOrder == NULL) {
|
||||
FreePool (KeyOrder);
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
if (KeyOrder != NULL) {
|
||||
CopyMem (NewKeyOrder, KeyOrder, KeyOrderSize);
|
||||
}
|
||||
|
||||
NewKeyOrder[Index] = RegisterOptionNumber;
|
||||
|
||||
Status = gRT->SetVariable (
|
||||
VAR_KEY_ORDER,
|
||||
&gEfiGlobalVariableGuid,
|
||||
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
|
||||
KeyOrderSize,
|
||||
NewKeyOrder
|
||||
);
|
||||
|
||||
FreePool (KeyOrder);
|
||||
FreePool (NewKeyOrder);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Delete Key#### for the given Key Option number.
|
||||
|
||||
@param KeyOptionNumber Key option number for Key####
|
||||
|
||||
@retval EFI_SUCCESS Unregister hotkey successfully.
|
||||
@retval EFI_NOT_FOUND No Key#### is found for the given Key Option number.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
UnregisterHotkey (
|
||||
IN UINT16 KeyOptionNumber
|
||||
)
|
||||
{
|
||||
UINT16 KeyOption[10];
|
||||
UINTN Index;
|
||||
EFI_STATUS Status;
|
||||
UINTN Index2Del;
|
||||
UINT16 *KeyOrder;
|
||||
UINTN KeyOrderSize;
|
||||
|
||||
//
|
||||
// Delete variable Key####
|
||||
//
|
||||
UnicodeSPrint (KeyOption, sizeof (KeyOption), L"Key%04x", KeyOptionNumber);
|
||||
gRT->SetVariable (
|
||||
KeyOption,
|
||||
&gEfiGlobalVariableGuid,
|
||||
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
|
||||
0,
|
||||
NULL
|
||||
);
|
||||
|
||||
//
|
||||
// Adjust key order array
|
||||
//
|
||||
KeyOrder = BdsLibGetVariableAndSize (
|
||||
VAR_KEY_ORDER,
|
||||
&gEfiGlobalVariableGuid,
|
||||
&KeyOrderSize
|
||||
);
|
||||
if (KeyOrder == NULL) {
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
Index2Del = 0;
|
||||
for (Index = 0; Index < KeyOrderSize / sizeof (UINT16); Index++) {
|
||||
if (KeyOrder[Index] == KeyOptionNumber) {
|
||||
Index2Del = Index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (Index != KeyOrderSize / sizeof (UINT16)) {
|
||||
//
|
||||
// KeyOptionNumber found in "KeyOrder", delete it
|
||||
//
|
||||
for (Index = Index2Del; Index < KeyOrderSize / sizeof (UINT16) - 1; Index++) {
|
||||
KeyOrder[Index] = KeyOrder[Index + 1];
|
||||
}
|
||||
|
||||
KeyOrderSize -= sizeof (UINT16);
|
||||
}
|
||||
|
||||
Status = gRT->SetVariable (
|
||||
VAR_KEY_ORDER,
|
||||
&gEfiGlobalVariableGuid,
|
||||
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
|
||||
KeyOrderSize,
|
||||
KeyOrder
|
||||
);
|
||||
|
||||
FreePool (KeyOrder);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
/**
|
||||
Try to boot the boot option triggered by hotkey.
|
||||
@retval EFI_SUCCESS There is HotkeyBootOption & it is processed
|
||||
|
@ -634,12 +399,118 @@ HotkeyInsertList (
|
|||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
Return TRUE when the variable pointed by Name and Guid is a Key#### variable.
|
||||
|
||||
@param Name The name of the variable.
|
||||
@param Guid The GUID of the variable.
|
||||
@param OptionNumber Return the option number parsed from the Name.
|
||||
|
||||
@retval TRUE The variable pointed by Name and Guid is a Key#### variable.
|
||||
@retval FALSE The variable pointed by Name and Guid isn't a Key#### variable.
|
||||
**/
|
||||
BOOLEAN
|
||||
IsKeyOptionVariable (
|
||||
CHAR16 *Name,
|
||||
EFI_GUID *Guid,
|
||||
UINT16 *OptionNumber
|
||||
)
|
||||
{
|
||||
UINTN Index;
|
||||
|
||||
if (!CompareGuid (Guid, &gEfiGlobalVariableGuid) ||
|
||||
(StrSize (Name) != sizeof (L"Key####")) &&
|
||||
(StrnCmp (Name, L"Key", 3) != 0)
|
||||
) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
*OptionNumber = 0;
|
||||
for (Index = 3; Index < 7; Index++) {
|
||||
if ((Name[Index] >= L'0') && (Name[Index] <= L'9')) {
|
||||
*OptionNumber = *OptionNumber * 10 + Name[Index] - L'0';
|
||||
} else if ((Name[Index] >= L'A') && (Name[Index] <= L'F')) {
|
||||
*OptionNumber = *OptionNumber * 10 + Name[Index] - L'A';
|
||||
} else {
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
Return an array of key option numbers.
|
||||
|
||||
@param Count Return the count of key option numbers.
|
||||
|
||||
@return UINT16* Pointer to an array of key option numbers;
|
||||
**/
|
||||
UINT16 *
|
||||
EFIAPI
|
||||
HotkeyGetOptionNumbers (
|
||||
OUT UINTN *Count
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINTN Index;
|
||||
CHAR16 *Name;
|
||||
EFI_GUID Guid;
|
||||
UINTN NameSize;
|
||||
UINTN NewNameSize;
|
||||
UINT16 *OptionNumbers;
|
||||
UINT16 OptionNumber;
|
||||
|
||||
if (Count == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
*Count = 0;
|
||||
OptionNumbers = NULL;
|
||||
|
||||
NameSize = sizeof (CHAR16);
|
||||
Name = AllocateZeroPool (NameSize);
|
||||
while (TRUE) {
|
||||
NewNameSize = NameSize;
|
||||
Status = gRT->GetNextVariableName (&NewNameSize, Name, &Guid);
|
||||
if (Status == EFI_BUFFER_TOO_SMALL) {
|
||||
Name = ReallocatePool (NameSize, NewNameSize, Name);
|
||||
Status = gRT->GetNextVariableName (&NewNameSize, Name, &Guid);
|
||||
NameSize = NewNameSize;
|
||||
}
|
||||
|
||||
if (Status == EFI_NOT_FOUND) {
|
||||
break;
|
||||
}
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
if (IsKeyOptionVariable (Name ,&Guid, &OptionNumber)) {
|
||||
OptionNumbers = ReallocatePool (
|
||||
*Count * sizeof (UINT16),
|
||||
(*Count + 1) * sizeof (UINT16),
|
||||
OptionNumbers
|
||||
);
|
||||
for (Index = 0; Index < *Count; Index++) {
|
||||
if (OptionNumber < OptionNumbers[Index]) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
CopyMem (&OptionNumbers[Index + 1], &OptionNumbers[Index], (*Count - Index) * sizeof (UINT16));
|
||||
OptionNumbers[Index] = OptionNumber;
|
||||
(*Count)++;
|
||||
}
|
||||
}
|
||||
|
||||
FreePool (Name);
|
||||
|
||||
return OptionNumbers;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Process all the "Key####" variables, associate Hotkeys with corresponding Boot Options.
|
||||
|
||||
@retval EFI_SUCCESS Hotkey services successfully initialized.
|
||||
@retval EFI_NOT_FOUND Can not find the "KeyOrder" variable
|
||||
**/
|
||||
EFI_STATUS
|
||||
InitializeHotkeyService (
|
||||
|
@ -648,11 +519,10 @@ InitializeHotkeyService (
|
|||
{
|
||||
EFI_STATUS Status;
|
||||
UINT32 BootOptionSupport;
|
||||
UINT16 *KeyOrder;
|
||||
UINTN KeyOrderSize;
|
||||
UINT16 *KeyOptionNumbers;
|
||||
UINTN KeyOptionCount;
|
||||
UINTN Index;
|
||||
UINT16 KeyOptionName[8];
|
||||
UINTN KeyOptionSize;
|
||||
CHAR16 KeyOptionName[8];
|
||||
EFI_KEY_OPTION *KeyOption;
|
||||
|
||||
//
|
||||
|
@ -673,33 +543,21 @@ InitializeHotkeyService (
|
|||
sizeof (UINT32),
|
||||
&BootOptionSupport
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
//
|
||||
// Get valid Key Option List from private EFI variable "KeyOrder"
|
||||
//
|
||||
KeyOrder = BdsLibGetVariableAndSize (
|
||||
VAR_KEY_ORDER,
|
||||
&gEfiGlobalVariableGuid,
|
||||
&KeyOrderSize
|
||||
);
|
||||
|
||||
if (KeyOrder == NULL) {
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
for (Index = 0; Index < KeyOrderSize / sizeof (UINT16); Index ++) {
|
||||
UnicodeSPrint (KeyOptionName, sizeof (KeyOptionName), L"Key%04x", KeyOrder[Index]);
|
||||
KeyOption = BdsLibGetVariableAndSize (
|
||||
KeyOptionName,
|
||||
&gEfiGlobalVariableGuid,
|
||||
&KeyOptionSize
|
||||
);
|
||||
|
||||
if (KeyOption == NULL || !IsKeyOptionValid (KeyOption)) {
|
||||
UnregisterHotkey (KeyOrder[Index]);
|
||||
} else {
|
||||
KeyOptionNumbers = HotkeyGetOptionNumbers (&KeyOptionCount);
|
||||
for (Index = 0; Index < KeyOptionCount; Index ++) {
|
||||
UnicodeSPrint (KeyOptionName, sizeof (KeyOptionName), L"Key%04x", KeyOptionNumbers[Index]);
|
||||
GetEfiGlobalVariable2 (KeyOptionName, &KeyOption, NULL);
|
||||
ASSERT (KeyOption != NULL);
|
||||
if (IsKeyOptionValid (KeyOption)) {
|
||||
HotkeyInsertList (KeyOption);
|
||||
}
|
||||
FreePool (KeyOption);
|
||||
}
|
||||
|
||||
if (KeyOptionNumbers != NULL) {
|
||||
FreePool (KeyOptionNumbers);
|
||||
}
|
||||
|
||||
//
|
||||
|
|
|
@ -116,43 +116,6 @@ typedef struct {
|
|||
|
||||
#define BDS_HOTKEY_OPTION_FROM_LINK(a) CR (a, BDS_HOTKEY_OPTION, Link, BDS_HOTKEY_OPTION_SIGNATURE)
|
||||
|
||||
#define VAR_KEY_ORDER L"KeyOrder"
|
||||
|
||||
/**
|
||||
|
||||
Create Key#### for the given hotkey.
|
||||
|
||||
|
||||
@param KeyOption - The Hot Key Option to be added.
|
||||
@param KeyOptionNumber - The key option number for Key#### (optional).
|
||||
|
||||
@retval EFI_SUCCESS Register hotkey successfully.
|
||||
@retval EFI_INVALID_PARAMETER The hotkey option is invalid.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
RegisterHotkey (
|
||||
IN EFI_KEY_OPTION *KeyOption,
|
||||
OUT UINT16 *KeyOptionNumber
|
||||
);
|
||||
|
||||
/**
|
||||
|
||||
Delete Key#### for the given Key Option number.
|
||||
|
||||
|
||||
@param KeyOptionNumber - Key option number for Key####
|
||||
|
||||
@retval EFI_SUCCESS Unregister hotkey successfully.
|
||||
@retval EFI_NOT_FOUND No Key#### is found for the given Key Option number.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
UnregisterHotkey (
|
||||
IN UINT16 KeyOptionNumber
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
|
||||
Process all the "Key####" variables, associate Hotkeys with corresponding Boot Options.
|
||||
|
|
Loading…
Reference in New Issue