mirror of https://github.com/acidanthera/audk.git
Rollback the change to EFI_BOOT_KEY_DATA structure since UEFI Spec adds the clarification that bitfields are ordered such that bit 0 is the least significant bit.
Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15000 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
5fdd2a818b
commit
d4468cdf14
|
@ -2,7 +2,7 @@
|
|||
Provides a way for 3rd party applications to register themselves for launch by the
|
||||
Boot Manager based on hot key
|
||||
|
||||
Copyright (c) 2007 - 2012, Intel Corporation. All rights reserved.<BR>
|
||||
Copyright (c) 2007 - 2013, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
|
@ -315,6 +315,7 @@ HotkeyInsertList (
|
|||
BDS_HOTKEY_OPTION *HotkeyLeft;
|
||||
BDS_HOTKEY_OPTION *HotkeyRight;
|
||||
UINTN Index;
|
||||
EFI_BOOT_KEY_DATA KeyOptions;
|
||||
UINT32 KeyShiftStateLeft;
|
||||
UINT32 KeyShiftStateRight;
|
||||
EFI_INPUT_KEY *InputKey;
|
||||
|
@ -327,28 +328,31 @@ HotkeyInsertList (
|
|||
|
||||
HotkeyLeft->Signature = BDS_HOTKEY_OPTION_SIGNATURE;
|
||||
HotkeyLeft->BootOptionNumber = KeyOption->BootOption;
|
||||
HotkeyLeft->CodeCount = (UINT8) KEY_OPTION_INPUT_KEY_COUNT (KeyOption);
|
||||
|
||||
KeyOptions = KeyOption->KeyData;
|
||||
|
||||
HotkeyLeft->CodeCount = (UINT8) KeyOptions.Options.InputKeyCount;
|
||||
|
||||
//
|
||||
// Map key shift state from KeyOptions to EFI_KEY_DATA.KeyState
|
||||
//
|
||||
KeyShiftStateRight = EFI_SHIFT_STATE_VALID;
|
||||
if (KEY_OPTION_SHIFT_PRESSED (KeyOption)) {
|
||||
if (KeyOptions.Options.ShiftPressed) {
|
||||
KeyShiftStateRight |= EFI_RIGHT_SHIFT_PRESSED;
|
||||
}
|
||||
if (KEY_OPTION_CONTROL_PRESSED (KeyOption)) {
|
||||
if (KeyOptions.Options.ControlPressed) {
|
||||
KeyShiftStateRight |= EFI_RIGHT_CONTROL_PRESSED;
|
||||
}
|
||||
if (KEY_OPTION_ALT_PRESSED (KeyOption)) {
|
||||
if (KeyOptions.Options.AltPressed) {
|
||||
KeyShiftStateRight |= EFI_RIGHT_ALT_PRESSED;
|
||||
}
|
||||
if (KEY_OPTION_LOGO_PRESSED (KeyOption)) {
|
||||
if (KeyOptions.Options.LogoPressed) {
|
||||
KeyShiftStateRight |= EFI_RIGHT_LOGO_PRESSED;
|
||||
}
|
||||
if (KEY_OPTION_MENU_PRESSED (KeyOption)) {
|
||||
if (KeyOptions.Options.MenuPressed) {
|
||||
KeyShiftStateRight |= EFI_MENU_KEY_PRESSED;
|
||||
}
|
||||
if (KEY_OPTION_SYS_REQ_PRESSED (KeyOption)) {
|
||||
if (KeyOptions.Options.SysReqPressed) {
|
||||
KeyShiftStateRight |= EFI_SYS_REQ_PRESSED;
|
||||
}
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
Provides a way for 3rd party applications to register themselves for launch by the
|
||||
Boot Manager based on hot key
|
||||
|
||||
Copyright (c) 2007 - 2012, Intel Corporation. All rights reserved.<BR>
|
||||
Copyright (c) 2007 - 2013, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
|
@ -25,83 +25,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||
|
||||
#define BDS_HOTKEY_OPTION_SIGNATURE SIGNATURE_32 ('B', 'd', 'K', 'O')
|
||||
|
||||
/**
|
||||
Get the revision of the EFI_KEY_OPTION structure.
|
||||
|
||||
@param KeyOption Pointer to the EFI_KEY_OPTION structure.
|
||||
|
||||
@return Revision.
|
||||
**/
|
||||
#define KEY_OPTION_REVISION(KeyOption) ((KeyOption)->KeyData & EFI_KEY_OPTION_REVISION_MASK)
|
||||
|
||||
/**
|
||||
Get the actual number of entries in EFI_KEY_OPTION.Keys, from 0-3.
|
||||
|
||||
@param KeyOption Pointer to the EFI_KEY_OPTION structure.
|
||||
|
||||
@return Actual number of entries in EFI_KEY_OPTION.Keys.
|
||||
**/
|
||||
#define KEY_OPTION_INPUT_KEY_COUNT(KeyOption) (((KeyOption)->KeyData & EFI_KEY_OPTION_INPUT_KEY_COUNT_MASK) >> LowBitSet32 (EFI_KEY_OPTION_INPUT_KEY_COUNT_MASK))
|
||||
|
||||
/**
|
||||
Return whether the Shift key needs pressed.
|
||||
|
||||
@param KeyOption Pointer to the EFI_KEY_OPTION structure.
|
||||
|
||||
@retval TRUE Shift key needs pressed.
|
||||
@retval FALSE Shift key needn't pressed.
|
||||
**/
|
||||
#define KEY_OPTION_SHIFT_PRESSED(KeyOption) (BOOLEAN) (((KeyOption)->KeyData & EFI_KEY_OPTION_SHIFT_PRESSED_MASK) != 0)
|
||||
|
||||
/**
|
||||
Return whether the Control key needs pressed.
|
||||
|
||||
@param KeyOption Pointer to the EFI_KEY_OPTION structure.
|
||||
|
||||
@retval TRUE Control key needs pressed.
|
||||
@retval FALSE Control key needn't pressed.
|
||||
**/
|
||||
#define KEY_OPTION_CONTROL_PRESSED(KeyOption) (BOOLEAN) (((KeyOption)->KeyData & EFI_KEY_OPTION_CONTROL_PRESSED_MASK) != 0)
|
||||
|
||||
/**
|
||||
Return whether the Alt key needs pressed.
|
||||
|
||||
@param KeyOption Pointer to the EFI_KEY_OPTION structure.
|
||||
|
||||
@retval TRUE Alt key needs pressed.
|
||||
@retval FALSE Alt key needn't pressed.
|
||||
**/
|
||||
#define KEY_OPTION_ALT_PRESSED(KeyOption) (BOOLEAN) (((KeyOption)->KeyData & EFI_KEY_OPTION_ALT_PRESSED_MASK) != 0)
|
||||
|
||||
/**
|
||||
Return whether the Logo key needs pressed.
|
||||
|
||||
@param KeyOption Pointer to the EFI_KEY_OPTION structure.
|
||||
|
||||
@retval TRUE Logo key needs pressed.
|
||||
@retval FALSE Logo key needn't pressed.
|
||||
**/
|
||||
#define KEY_OPTION_LOGO_PRESSED(KeyOption) (BOOLEAN) (((KeyOption)->KeyData & EFI_KEY_OPTION_LOGO_PRESSED_MASK) != 0)
|
||||
|
||||
/**
|
||||
Return whether the Menu key needs pressed.
|
||||
|
||||
@param KeyOption Pointer to the EFI_KEY_OPTION structure.
|
||||
|
||||
@retval TRUE Menu key needs pressed.
|
||||
@retval FALSE Menu key needn't pressed.
|
||||
**/
|
||||
#define KEY_OPTION_MENU_PRESSED(KeyOption) (BOOLEAN) (((KeyOption)->KeyData & EFI_KEY_OPTION_MENU_PRESSED_MASK) != 0)
|
||||
|
||||
/**
|
||||
Return whether the SysReq key needs pressed.
|
||||
|
||||
@param KeyOption Pointer to the EFI_KEY_OPTION structure.
|
||||
|
||||
@retval TRUE SysReq key needs pressed.
|
||||
@retval FALSE SysReq key needn't pressed.
|
||||
**/
|
||||
#define KEY_OPTION_SYS_REQ_PRESSED(KeyOption) (BOOLEAN) (((KeyOption)->KeyData & EFI_KEY_OPTION_SYS_REQ_PRESSED_MASK) != 0)
|
||||
|
||||
typedef struct {
|
||||
UINTN Signature;
|
||||
|
|
|
@ -2043,41 +2043,46 @@ EFI_STATUS
|
|||
///
|
||||
/// EFI Boot Key Data
|
||||
///
|
||||
typedef UINT32 EFI_BOOT_KEY_DATA;
|
||||
///
|
||||
/// Indicates the revision of the EFI_KEY_OPTION structure. This revision level should be 0.
|
||||
///
|
||||
#define EFI_KEY_OPTION_REVISION_MASK 0x000000FF
|
||||
///
|
||||
/// Either the left or right Shift keys must be pressed (1) or must not be pressed (0).
|
||||
///
|
||||
#define EFI_KEY_OPTION_SHIFT_PRESSED_MASK BIT8
|
||||
///
|
||||
/// Either the left or right Control keys must be pressed (1) or must not be pressed (0).
|
||||
///
|
||||
#define EFI_KEY_OPTION_CONTROL_PRESSED_MASK BIT9
|
||||
///
|
||||
/// Either the left or right Alt keys must be pressed (1) or must not be pressed (0).
|
||||
///
|
||||
#define EFI_KEY_OPTION_ALT_PRESSED_MASK BIT10
|
||||
///
|
||||
/// Either the left or right Logo keys must be pressed (1) or must not be pressed (0).
|
||||
///
|
||||
#define EFI_KEY_OPTION_LOGO_PRESSED_MASK BIT11
|
||||
///
|
||||
/// The Menu key must be pressed (1) or must not be pressed (0).
|
||||
///
|
||||
#define EFI_KEY_OPTION_MENU_PRESSED_MASK BIT12
|
||||
///
|
||||
/// The SysReq key must be pressed (1) or must not be pressed (0).
|
||||
///
|
||||
#define EFI_KEY_OPTION_SYS_REQ_PRESSED_MASK BIT13
|
||||
///
|
||||
/// Specifies the actual number of entries in EFI_KEY_OPTION.Keys, from 0-3. If
|
||||
/// zero, then only the shift state is considered. If more than one, then the boot option will
|
||||
/// only be launched if all of the specified keys are pressed with the same shift state.
|
||||
///
|
||||
#define EFI_KEY_OPTION_INPUT_KEY_COUNT_MASK (BIT30 | BIT31)
|
||||
typedef union {
|
||||
struct {
|
||||
///
|
||||
/// Indicates the revision of the EFI_KEY_OPTION structure. This revision level should be 0.
|
||||
///
|
||||
UINT32 Revision : 8;
|
||||
///
|
||||
/// Either the left or right Shift keys must be pressed (1) or must not be pressed (0).
|
||||
///
|
||||
UINT32 ShiftPressed : 1;
|
||||
///
|
||||
/// Either the left or right Control keys must be pressed (1) or must not be pressed (0).
|
||||
///
|
||||
UINT32 ControlPressed : 1;
|
||||
///
|
||||
/// Either the left or right Alt keys must be pressed (1) or must not be pressed (0).
|
||||
///
|
||||
UINT32 AltPressed : 1;
|
||||
///
|
||||
/// Either the left or right Logo keys must be pressed (1) or must not be pressed (0).
|
||||
///
|
||||
UINT32 LogoPressed : 1;
|
||||
///
|
||||
/// The Menu key must be pressed (1) or must not be pressed (0).
|
||||
///
|
||||
UINT32 MenuPressed : 1;
|
||||
///
|
||||
/// The SysReq key must be pressed (1) or must not be pressed (0).
|
||||
///
|
||||
UINT32 SysReqPressed : 1;
|
||||
UINT32 Reserved : 16;
|
||||
///
|
||||
/// Specifies the actual number of entries in EFI_KEY_OPTION.Keys, from 0-3. If
|
||||
/// zero, then only the shift state is considered. If more than one, then the boot option will
|
||||
/// only be launched if all of the specified keys are pressed with the same shift state.
|
||||
///
|
||||
UINT32 InputKeyCount : 2;
|
||||
} Options;
|
||||
UINT32 PackedValue;
|
||||
} EFI_BOOT_KEY_DATA;
|
||||
|
||||
///
|
||||
/// EFI Key Option.
|
||||
|
|
|
@ -47,16 +47,6 @@ typedef struct {
|
|||
CONST CHAR16 *OptData;
|
||||
} BGFG_OPERATION;
|
||||
|
||||
/**
|
||||
Get the actual number of entries in EFI_KEY_OPTION.Keys, from 0-3.
|
||||
|
||||
@param KeyOption Pointer to the EFI_KEY_OPTION structure.
|
||||
|
||||
@return Actual number of entries in EFI_KEY_OPTION.Keys.
|
||||
**/
|
||||
#define KEY_OPTION_INPUT_KEY_COUNT(KeyOption) \
|
||||
(((KeyOption)->KeyData & EFI_KEY_OPTION_INPUT_KEY_COUNT_MASK) >> LowBitSet32 (EFI_KEY_OPTION_INPUT_KEY_COUNT_MASK))
|
||||
|
||||
/**
|
||||
Update the optional data for a boot or driver option.
|
||||
|
||||
|
@ -843,7 +833,7 @@ BcfgAddOptDebug1(
|
|||
ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, Walker);
|
||||
ShellStatus = SHELL_INVALID_PARAMETER;
|
||||
}
|
||||
NewKeyOption.KeyData = (UINT32)Intermediate;
|
||||
NewKeyOption.KeyData.PackedValue = (UINT32)Intermediate;
|
||||
Temp = StrStr(Walker, L" ");
|
||||
if (Temp != NULL) {
|
||||
Walker = Temp;
|
||||
|
@ -858,13 +848,13 @@ BcfgAddOptDebug1(
|
|||
// Now we know how many EFI_INPUT_KEY structs we need to attach to the end of the EFI_KEY_OPTION struct.
|
||||
// Re-allocate with the added information.
|
||||
//
|
||||
KeyOptionBuffer = AllocateCopyPool(sizeof(EFI_KEY_OPTION) + (sizeof(EFI_KEY_DATA) * KEY_OPTION_INPUT_KEY_COUNT (&NewKeyOption)), &NewKeyOption);
|
||||
KeyOptionBuffer = AllocateCopyPool(sizeof(EFI_KEY_OPTION) + (sizeof(EFI_KEY_DATA) * NewKeyOption.KeyData.Options.InputKeyCount), &NewKeyOption);
|
||||
if (KeyOptionBuffer == NULL) {
|
||||
ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_MEM), gShellDebug1HiiHandle);
|
||||
ShellStatus = SHELL_OUT_OF_RESOURCES;
|
||||
}
|
||||
}
|
||||
for (LoopCounter = 0 ; ShellStatus == SHELL_SUCCESS && LoopCounter < KEY_OPTION_INPUT_KEY_COUNT (&NewKeyOption); LoopCounter++) {
|
||||
for (LoopCounter = 0 ; ShellStatus == SHELL_SUCCESS && LoopCounter < NewKeyOption.KeyData.Options.InputKeyCount; LoopCounter++) {
|
||||
//
|
||||
// ScanCode
|
||||
//
|
||||
|
@ -930,7 +920,7 @@ BcfgAddOptDebug1(
|
|||
VariableName,
|
||||
(EFI_GUID*)&gEfiGlobalVariableGuid,
|
||||
EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS,
|
||||
sizeof(EFI_KEY_OPTION) + (sizeof(EFI_KEY_DATA) * KEY_OPTION_INPUT_KEY_COUNT (&NewKeyOption)),
|
||||
sizeof(EFI_KEY_OPTION) + (sizeof(EFI_KEY_DATA) * NewKeyOption.KeyData.Options.InputKeyCount),
|
||||
KeyOptionBuffer);
|
||||
if (EFI_ERROR(Status)) {
|
||||
ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_SET_VAR_FAIL), gShellDebug1HiiHandle, VariableName, Status);
|
||||
|
|
|
@ -47,16 +47,6 @@ typedef struct {
|
|||
CONST CHAR16 *OptData;
|
||||
} BGFG_OPERATION;
|
||||
|
||||
/**
|
||||
Get the actual number of entries in EFI_KEY_OPTION.Keys, from 0-3.
|
||||
|
||||
@param KeyOption Pointer to the EFI_KEY_OPTION structure.
|
||||
|
||||
@return Actual number of entries in EFI_KEY_OPTION.Keys.
|
||||
**/
|
||||
#define KEY_OPTION_INPUT_KEY_COUNT(KeyOption) \
|
||||
(((KeyOption)->KeyData & EFI_KEY_OPTION_INPUT_KEY_COUNT_MASK) >> LowBitSet32 (EFI_KEY_OPTION_INPUT_KEY_COUNT_MASK))
|
||||
|
||||
/**
|
||||
Update the optional data for a boot or driver option.
|
||||
|
||||
|
@ -841,7 +831,7 @@ BcfgAddOptInstall1(
|
|||
ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, Walker);
|
||||
ShellStatus = SHELL_INVALID_PARAMETER;
|
||||
}
|
||||
NewKeyOption.KeyData = (UINT32)Intermediate;
|
||||
NewKeyOption.KeyData.PackedValue = (UINT32)Intermediate;
|
||||
Temp = StrStr(Walker, L" ");
|
||||
if (Temp != NULL) {
|
||||
Walker = Temp;
|
||||
|
@ -856,13 +846,13 @@ BcfgAddOptInstall1(
|
|||
// Now we know how many EFI_INPUT_KEY structs we need to attach to the end of the EFI_KEY_OPTION struct.
|
||||
// Re-allocate with the added information.
|
||||
//
|
||||
KeyOptionBuffer = AllocateCopyPool(sizeof(EFI_KEY_OPTION) + (sizeof(EFI_INPUT_KEY) * KEY_OPTION_INPUT_KEY_COUNT (&NewKeyOption)), &NewKeyOption);
|
||||
KeyOptionBuffer = AllocateCopyPool(sizeof(EFI_KEY_OPTION) + (sizeof(EFI_INPUT_KEY) * NewKeyOption.KeyData.Options.InputKeyCount), &NewKeyOption);
|
||||
if (KeyOptionBuffer == NULL) {
|
||||
ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_MEM), gShellInstall1HiiHandle);
|
||||
ShellStatus = SHELL_OUT_OF_RESOURCES;
|
||||
}
|
||||
}
|
||||
for (LoopCounter = 0 ; ShellStatus == SHELL_SUCCESS && LoopCounter < KEY_OPTION_INPUT_KEY_COUNT (&NewKeyOption); LoopCounter++) {
|
||||
for (LoopCounter = 0 ; ShellStatus == SHELL_SUCCESS && LoopCounter < NewKeyOption.KeyData.Options.InputKeyCount; LoopCounter++) {
|
||||
//
|
||||
// ScanCode
|
||||
//
|
||||
|
@ -928,7 +918,7 @@ BcfgAddOptInstall1(
|
|||
VariableName,
|
||||
(EFI_GUID*)&gEfiGlobalVariableGuid,
|
||||
EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS,
|
||||
sizeof(EFI_KEY_OPTION) + (sizeof(EFI_INPUT_KEY) * KEY_OPTION_INPUT_KEY_COUNT (&NewKeyOption)),
|
||||
sizeof(EFI_KEY_OPTION) + (sizeof(EFI_INPUT_KEY) * NewKeyOption.KeyData.Options.InputKeyCount),
|
||||
KeyOptionBuffer);
|
||||
if (EFI_ERROR(Status)) {
|
||||
ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_SET_VAR_FAIL), gShellInstall1HiiHandle, VariableName, Status);
|
||||
|
|
Loading…
Reference in New Issue