/** @file Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.
* (C) Copyright 2020 Hewlett Packard Enterprise Development LP
SPDX-License-Identifier: BSD-2-Clause-Patent Module Name: NVDataStruc.h Abstract: NVData structure used by the sample driver Revision History: **/ #ifndef _NVDATASTRUC_H_ #define _NVDATASTRUC_H_ #include #include #include #include #define CONFIGURATION_VARSTORE_ID 0x1234 #define BITS_VARSTORE_ID 0x2345 #pragma pack(1) // // !!! For a structure with a series of bit fields and used as a storage in vfr file, and if the bit fields do not add up to the size of the defined type. // In the C code use sizeof() to get the size the strucure, the results may vary form the compiler(VS,GCC...). // But the size of the storage calculated by VfrCompiler is fixed (calculate with alignment). // To avoid above case, we need to make the total bit width in the structure aligned with the size of the defined type for these bit fields. We can: // 1. Add bit field (with/without name) with remianing with for padding. // 2. Add unnamed bit field with 0 for padding, the amount of padding is determined by the alignment characteristics of the members of the structure. // typedef struct { UINT16 NestByteField; UINT8 : 1; // unamed field can be used for padding UINT8 NestBitCheckbox : 1; UINT8 NestBitOneof : 2; UINT8 : 0; // Special width 0 can be used to force alignment at the next word boundary UINT8 NestBitNumeric : 4; } MY_BITS_DATA; typedef union { UINT8 UnionNumeric; UINT8 UnionNumericAlias; } MY_EFI_UNION_DATA; typedef struct { UINT16 MyStringData[40]; UINT16 SomethingHiddenForHtml; UINT8 HowOldAreYouInYearsManual; UINT16 HowTallAreYouManual; UINT8 HowOldAreYouInYears; UINT16 HowTallAreYou; UINT8 MyFavoriteNumber; UINT8 TestLateCheck; UINT8 TestLateCheck2; UINT8 QuestionAboutTreeHugging; UINT8 ChooseToActivateNuclearWeaponry; UINT8 SuppressGrayOutSomething; UINT8 OrderedList[8]; UINT16 BootOrder[8]; UINT8 BootOrderLarge; UINT8 DynamicRefresh; UINT8 DynamicOneof; UINT8 DynamicOrderedList[5]; UINT8 Reserved; EFI_HII_REF RefData; UINT8 NameValueVar0; UINT16 NameValueVar1; UINT16 NameValueVar2[20]; UINT8 SerialPortNo; UINT8 SerialPortStatus; UINT16 SerialPortIo; UINT8 SerialPortIrq; UINT8 GetDefaultValueFromCallBack; UINT8 GetDefaultValueFromAccess; EFI_HII_TIME Time; UINT8 RefreshGuidCount; UINT8 Match2; UINT8 GetDefaultValueFromCallBackForOrderedList[3]; UINT8 BitCheckbox : 1; UINT8 ReservedBits : 7; // Reserved bit fields for padding. UINT16 BitOneof : 6; UINT16 : 0; // Width 0 used to force alignment. UINT16 BitNumeric : 12; MY_BITS_DATA MyBitData; MY_EFI_UNION_DATA MyUnionData; UINT8 QuestionXUefiKeywordRestStyle; UINT8 QuestionNonXUefiKeywordRestStyle; UINT8 QuestionApply; } DRIVER_SAMPLE_CONFIGURATION; // // 2nd NV data structure definition // typedef struct { UINT8 Field8; UINT16 Field16; UINT8 OrderedList[3]; UINT16 SubmittedCallback; } MY_EFI_VARSTORE_DATA; // // 3rd NV data structure definition // typedef struct { MY_BITS_DATA BitsData; UINT32 EfiBitGrayoutTest : 5; UINT32 EfiBitNumeric : 4; UINT32 EfiBitOneof : 10; UINT32 EfiBitCheckbox : 1; UINT32 : 0; // Width 0 used to force alignment. } MY_EFI_BITS_VARSTORE_DATA; // // Labels definition // #define LABEL_UPDATE1 0x1234 #define LABEL_UPDATE2 0x2234 #define LABEL_UPDATE3 0x3234 #define LABEL_END 0x2223 #pragma pack() #endif