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:
Ruiyu Ni
2013-12-18 05:51:22 +00:00
committed by niruiyu
parent 5fdd2a818b
commit d4468cdf14
5 changed files with 61 additions and 149 deletions

View File

@ -2,7 +2,7 @@
Provides a way for 3rd party applications to register themselves for launch by the Provides a way for 3rd party applications to register themselves for launch by the
Boot Manager based on hot key 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 This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License 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 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 *HotkeyLeft;
BDS_HOTKEY_OPTION *HotkeyRight; BDS_HOTKEY_OPTION *HotkeyRight;
UINTN Index; UINTN Index;
EFI_BOOT_KEY_DATA KeyOptions;
UINT32 KeyShiftStateLeft; UINT32 KeyShiftStateLeft;
UINT32 KeyShiftStateRight; UINT32 KeyShiftStateRight;
EFI_INPUT_KEY *InputKey; EFI_INPUT_KEY *InputKey;
@ -327,28 +328,31 @@ HotkeyInsertList (
HotkeyLeft->Signature = BDS_HOTKEY_OPTION_SIGNATURE; HotkeyLeft->Signature = BDS_HOTKEY_OPTION_SIGNATURE;
HotkeyLeft->BootOptionNumber = KeyOption->BootOption; 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 // Map key shift state from KeyOptions to EFI_KEY_DATA.KeyState
// //
KeyShiftStateRight = EFI_SHIFT_STATE_VALID; KeyShiftStateRight = EFI_SHIFT_STATE_VALID;
if (KEY_OPTION_SHIFT_PRESSED (KeyOption)) { if (KeyOptions.Options.ShiftPressed) {
KeyShiftStateRight |= EFI_RIGHT_SHIFT_PRESSED; KeyShiftStateRight |= EFI_RIGHT_SHIFT_PRESSED;
} }
if (KEY_OPTION_CONTROL_PRESSED (KeyOption)) { if (KeyOptions.Options.ControlPressed) {
KeyShiftStateRight |= EFI_RIGHT_CONTROL_PRESSED; KeyShiftStateRight |= EFI_RIGHT_CONTROL_PRESSED;
} }
if (KEY_OPTION_ALT_PRESSED (KeyOption)) { if (KeyOptions.Options.AltPressed) {
KeyShiftStateRight |= EFI_RIGHT_ALT_PRESSED; KeyShiftStateRight |= EFI_RIGHT_ALT_PRESSED;
} }
if (KEY_OPTION_LOGO_PRESSED (KeyOption)) { if (KeyOptions.Options.LogoPressed) {
KeyShiftStateRight |= EFI_RIGHT_LOGO_PRESSED; KeyShiftStateRight |= EFI_RIGHT_LOGO_PRESSED;
} }
if (KEY_OPTION_MENU_PRESSED (KeyOption)) { if (KeyOptions.Options.MenuPressed) {
KeyShiftStateRight |= EFI_MENU_KEY_PRESSED; KeyShiftStateRight |= EFI_MENU_KEY_PRESSED;
} }
if (KEY_OPTION_SYS_REQ_PRESSED (KeyOption)) { if (KeyOptions.Options.SysReqPressed) {
KeyShiftStateRight |= EFI_SYS_REQ_PRESSED; KeyShiftStateRight |= EFI_SYS_REQ_PRESSED;
} }

View File

@ -2,7 +2,7 @@
Provides a way for 3rd party applications to register themselves for launch by the Provides a way for 3rd party applications to register themselves for launch by the
Boot Manager based on hot key 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 This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License 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 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') #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 { typedef struct {
UINTN Signature; UINTN Signature;

View File

@ -2043,41 +2043,46 @@ EFI_STATUS
/// ///
/// EFI Boot Key Data /// EFI Boot Key Data
/// ///
typedef UINT32 EFI_BOOT_KEY_DATA; typedef union {
/// struct {
/// Indicates the revision of the EFI_KEY_OPTION structure. This revision level should be 0. ///
/// /// Indicates the revision of the EFI_KEY_OPTION structure. This revision level should be 0.
#define EFI_KEY_OPTION_REVISION_MASK 0x000000FF ///
/// UINT32 Revision : 8;
/// Either the left or right Shift keys must be pressed (1) or must not be pressed (0). ///
/// /// 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 ///
/// UINT32 ShiftPressed : 1;
/// Either the left or right Control keys must be pressed (1) or must not be pressed (0). ///
/// /// 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 ///
/// UINT32 ControlPressed : 1;
/// Either the left or right Alt keys must be pressed (1) or must not be pressed (0). ///
/// /// 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 ///
/// UINT32 AltPressed : 1;
/// Either the left or right Logo keys must be pressed (1) or must not be pressed (0). ///
/// /// 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 ///
/// UINT32 LogoPressed : 1;
/// The Menu key must be pressed (1) or must not be pressed (0). ///
/// /// The Menu key must be pressed (1) or must not be pressed (0).
#define EFI_KEY_OPTION_MENU_PRESSED_MASK BIT12 ///
/// UINT32 MenuPressed : 1;
/// The SysReq key must be pressed (1) or must not be pressed (0). ///
/// /// The SysReq key must be pressed (1) or must not be pressed (0).
#define EFI_KEY_OPTION_SYS_REQ_PRESSED_MASK BIT13 ///
/// UINT32 SysReqPressed : 1;
/// Specifies the actual number of entries in EFI_KEY_OPTION.Keys, from 0-3. If UINT32 Reserved : 16;
/// 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. /// 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
#define EFI_KEY_OPTION_INPUT_KEY_COUNT_MASK (BIT30 | BIT31) /// 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. /// EFI Key Option.

View File

@ -47,16 +47,6 @@ typedef struct {
CONST CHAR16 *OptData; CONST CHAR16 *OptData;
} BGFG_OPERATION; } 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. 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); ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, Walker);
ShellStatus = SHELL_INVALID_PARAMETER; ShellStatus = SHELL_INVALID_PARAMETER;
} }
NewKeyOption.KeyData = (UINT32)Intermediate; NewKeyOption.KeyData.PackedValue = (UINT32)Intermediate;
Temp = StrStr(Walker, L" "); Temp = StrStr(Walker, L" ");
if (Temp != NULL) { if (Temp != NULL) {
Walker = Temp; 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. // 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. // 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) { if (KeyOptionBuffer == NULL) {
ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_MEM), gShellDebug1HiiHandle); ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_MEM), gShellDebug1HiiHandle);
ShellStatus = SHELL_OUT_OF_RESOURCES; 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 // ScanCode
// //
@ -930,7 +920,7 @@ BcfgAddOptDebug1(
VariableName, VariableName,
(EFI_GUID*)&gEfiGlobalVariableGuid, (EFI_GUID*)&gEfiGlobalVariableGuid,
EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS, 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); KeyOptionBuffer);
if (EFI_ERROR(Status)) { if (EFI_ERROR(Status)) {
ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_SET_VAR_FAIL), gShellDebug1HiiHandle, VariableName, Status); ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_SET_VAR_FAIL), gShellDebug1HiiHandle, VariableName, Status);

View File

@ -47,16 +47,6 @@ typedef struct {
CONST CHAR16 *OptData; CONST CHAR16 *OptData;
} BGFG_OPERATION; } 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. 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); ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, Walker);
ShellStatus = SHELL_INVALID_PARAMETER; ShellStatus = SHELL_INVALID_PARAMETER;
} }
NewKeyOption.KeyData = (UINT32)Intermediate; NewKeyOption.KeyData.PackedValue = (UINT32)Intermediate;
Temp = StrStr(Walker, L" "); Temp = StrStr(Walker, L" ");
if (Temp != NULL) { if (Temp != NULL) {
Walker = Temp; 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. // 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. // 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) { if (KeyOptionBuffer == NULL) {
ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_MEM), gShellInstall1HiiHandle); ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_MEM), gShellInstall1HiiHandle);
ShellStatus = SHELL_OUT_OF_RESOURCES; 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 // ScanCode
// //
@ -928,7 +918,7 @@ BcfgAddOptInstall1(
VariableName, VariableName,
(EFI_GUID*)&gEfiGlobalVariableGuid, (EFI_GUID*)&gEfiGlobalVariableGuid,
EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS, 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); KeyOptionBuffer);
if (EFI_ERROR(Status)) { if (EFI_ERROR(Status)) {
ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_SET_VAR_FAIL), gShellInstall1HiiHandle, VariableName, Status); ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_SET_VAR_FAIL), gShellInstall1HiiHandle, VariableName, Status);