]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/DriverSampleDxe/NVDataStruc.h
MdeModulePkg/DriverSampleDxe: Make bit fields aligned in C structure
[mirror_edk2.git] / MdeModulePkg / Universal / DriverSampleDxe / NVDataStruc.h
index 40fb3d0964787c56ddca25479749edeeaa80d97b..6f092de8b637dae71e2860dc096e08333886cf8c 100644 (file)
@@ -35,6 +35,14 @@ Revision History:
 \r
 #pragma pack(1)\r
 \r
+//\r
+// !!! 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.\r
+// In the C code use sizeof() to get the size the strucure, the results may vary form the compiler(VS,GCC...).\r
+// But the size of the storage calculated by VfrCompiler is fixed (calculate with alignment).\r
+// 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:\r
+// 1. Add bit field (with/without name) with remianing with for padding.\r
+// 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.\r
+//\r
 typedef struct {\r
   UINT16   NestByteField;\r
   UINT8                    : 1;  // unamed field can be used for padding\r
@@ -84,7 +92,9 @@ typedef struct {
   UINT8   Match2;\r
   UINT8   GetDefaultValueFromCallBackForOrderedList[3];\r
   UINT8   BitCheckbox : 1;\r
+  UINT8   ReservedBits: 7;  // Reserved bit fields for padding.\r
   UINT16  BitOneof    : 6;\r
+  UINT16              : 0;  // Width 0 used to force alignment.\r
   UINT16  BitNumeric  : 12;\r
   MY_BITS_DATA  MyBitData;\r
   MY_EFI_UNION_DATA MyUnionData;\r
@@ -109,6 +119,7 @@ typedef struct {
   UINT32   EfiBitNumeric     : 4;\r
   UINT32   EfiBitOneof       : 10;\r
   UINT32   EfiBitCheckbox    : 1;\r
+  UINT32                     : 0;  // Width 0 used to force alignment.\r
 } MY_EFI_BITS_VARSTORE_DATA;\r
 \r
 //\r