[edk2] [patch 6/6] MdeModulePkg/DriverSample: Add sample questions with bit/union VarStore

Dandan Bi posted 6 patches 7 years, 3 months ago
[edk2] [patch 6/6] MdeModulePkg/DriverSample: Add sample questions with bit/union VarStore
Posted by Dandan Bi 7 years, 3 months ago
https://bugzilla.tianocore.org/show_bug.cgi?id=545

Cc: Eric Dong <eric.dong@intel.com>
Cc: Liming Gao <liming.gao@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Dandan Bi <dandan.bi@intel.com>
---
 .../Universal/DriverSampleDxe/DriverSample.c       | 120 +++++++++++++
 .../Universal/DriverSampleDxe/DriverSample.h       |   2 +
 .../Universal/DriverSampleDxe/NVDataStruc.h        |  51 +++++-
 MdeModulePkg/Universal/DriverSampleDxe/Vfr.vfr     | 187 +++++++++++++++++++++
 .../Universal/DriverSampleDxe/VfrStrings.uni       |  61 +++++++
 5 files changed, 420 insertions(+), 1 deletion(-)

diff --git a/MdeModulePkg/Universal/DriverSampleDxe/DriverSample.c b/MdeModulePkg/Universal/DriverSampleDxe/DriverSample.c
index bbd9713..af31615 100644
--- a/MdeModulePkg/Universal/DriverSampleDxe/DriverSample.c
+++ b/MdeModulePkg/Universal/DriverSampleDxe/DriverSample.c
@@ -18,10 +18,13 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 
 #define DISPLAY_ONLY_MY_ITEM  0x0002
 
 CHAR16     VariableName[] = L"MyIfrNVData";
 CHAR16     MyEfiVar[] = L"MyEfiVar";
+CHAR16     MyEfiBitVar[] = L"MyEfiBitVar";
+CHAR16     MyEfiUnionVar[] = L"MyEfiUnionVar";
+
 EFI_HANDLE                      DriverHandle[2] = {NULL, NULL};
 DRIVER_SAMPLE_PRIVATE_DATA      *mPrivateData = NULL;
 EFI_EVENT                       mEvent;
 
 HII_VENDOR_DEVICE_PATH  mHiiVendorDevicePath0 = {
@@ -662,10 +665,17 @@ ExtractConfig (
     // through hii database, not support in this path.
     //
     if (HiiIsConfigHdrMatch(Request, &gDriverSampleFormSetGuid, MyEfiVar)) {
       return EFI_UNSUPPORTED;
     }
+    if (HiiIsConfigHdrMatch(Request, &gDriverSampleFormSetGuid, MyEfiBitVar)) {
+      return EFI_UNSUPPORTED;
+    }
+    if (HiiIsConfigHdrMatch(Request, &gDriverSampleFormSetGuid, MyEfiUnionVar)) {
+      return EFI_UNSUPPORTED;
+    }
+
     //
     // Set Request to the unified request string.
     //
     ConfigRequest = Request;
     //
@@ -883,10 +893,16 @@ RouteConfig (
   // through hii database, not support in this path.
   //
   if (HiiIsConfigHdrMatch(Configuration, &gDriverSampleFormSetGuid, MyEfiVar)) {
     return EFI_UNSUPPORTED;
   }
+  if (HiiIsConfigHdrMatch(Configuration, &gDriverSampleFormSetGuid, MyEfiBitVar)) {
+    return EFI_UNSUPPORTED;
+  }
+  if (HiiIsConfigHdrMatch(Configuration, &gDriverSampleFormSetGuid, MyEfiUnionVar)) {
+    return EFI_UNSUPPORTED;
+  }
 
   //
   // Get Buffer Storage data from EFI variable
   //
   BufferSize = sizeof (DRIVER_SAMPLE_CONFIGURATION);
@@ -1295,10 +1311,14 @@ DriverCallback (
         for (Index = 0; Index < 3; Index ++) {
           SetArrayData (Value, EFI_IFR_TYPE_NUM_SIZE_8, Index, BufferValue--);
         }
       break;
 
+      case 0x6666:
+        Value->u8 = 12;
+        break;
+
       default:
         Status = EFI_UNSUPPORTED;
       break;
       }
     }
@@ -1309,10 +1329,14 @@ DriverCallback (
       switch (QuestionId) {
       case 0x1240:
         Value->u8 = DEFAULT_CLASS_MANUFACTURING_VALUE;
       break;
 
+     case 0x6666:
+        Value->u8 = 13;
+        break;
+
       default:
         Status = EFI_UNSUPPORTED;      
       break;
       }
     }
@@ -1703,10 +1727,12 @@ DriverSampleInit (
   DRIVER_SAMPLE_CONFIGURATION     *Configuration;
   BOOLEAN                         ActionFlag;
   EFI_STRING                      ConfigRequestHdr;
   EFI_STRING                      NameRequestHdr;
   MY_EFI_VARSTORE_DATA            *VarStoreConfig;
+  MY_EFI_BITS_VARSTORE_DATA       *BitsVarStoreConfig;
+  MY_EFI_UNION_DATA               *UnionConfig;
   EFI_INPUT_KEY                   HotKey;
   EDKII_FORM_BROWSER_EXTENSION_PROTOCOL *FormBrowserEx;
 
   //
   // Initialize the local variables.
@@ -1991,10 +2017,104 @@ DriverSampleInit (
       return EFI_INVALID_PARAMETER;
     }
   }
   FreePool (ConfigRequestHdr);
 
+  //
+  // Initialize Bits efi varstore configuration data
+  //
+  BitsVarStoreConfig = &mPrivateData->BitsVarStoreConfig;
+  ZeroMem (BitsVarStoreConfig, sizeof (MY_EFI_BITS_VARSTORE_DATA));
+
+  ConfigRequestHdr = HiiConstructConfigHdr (&gDriverSampleFormSetGuid, MyEfiBitVar, DriverHandle[0]);
+  ASSERT (ConfigRequestHdr != NULL);
+
+  BufferSize = sizeof (MY_EFI_BITS_VARSTORE_DATA);
+  Status = gRT->GetVariable (MyEfiBitVar, &gDriverSampleFormSetGuid, NULL, &BufferSize, BitsVarStoreConfig);
+  if (EFI_ERROR (Status)) {
+    //
+    // Store zero data to EFI variable Storage.
+    //
+    Status = gRT->SetVariable(
+                    MyEfiBitVar,
+                    &gDriverSampleFormSetGuid,
+                    EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,
+                    sizeof (MY_EFI_BITS_VARSTORE_DATA),
+                    BitsVarStoreConfig
+                    );
+    if (EFI_ERROR (Status)) {
+      DriverSampleUnload (ImageHandle);
+      return Status;
+    }
+    //
+    // EFI variable for NV config doesn't exit, we should build this variable
+    // based on default values stored in IFR
+    //
+    ActionFlag = HiiSetToDefaults (ConfigRequestHdr, EFI_HII_DEFAULT_CLASS_STANDARD);
+    if (!ActionFlag) {
+      DriverSampleUnload (ImageHandle);
+      return EFI_INVALID_PARAMETER;
+    }
+  } else {
+    //
+    // EFI variable does exist and Validate Current Setting
+    //
+    ActionFlag = HiiValidateSettings (ConfigRequestHdr);
+    if (!ActionFlag) {
+      DriverSampleUnload (ImageHandle);
+      return EFI_INVALID_PARAMETER;
+    }
+  }
+  FreePool (ConfigRequestHdr);
+
+   //
+  // Initialize Union efi varstore configuration data
+  //
+  UnionConfig = &mPrivateData->UnionConfig;
+  ZeroMem (UnionConfig, sizeof (MY_EFI_UNION_DATA));
+
+  ConfigRequestHdr = HiiConstructConfigHdr (&gDriverSampleFormSetGuid, MyEfiUnionVar, DriverHandle[0]);
+  ASSERT (ConfigRequestHdr != NULL);
+
+  BufferSize = sizeof (MY_EFI_UNION_DATA);
+  Status = gRT->GetVariable (MyEfiUnionVar, &gDriverSampleFormSetGuid, NULL, &BufferSize, UnionConfig);
+  if (EFI_ERROR (Status)) {
+    //
+    // Store zero data to EFI variable Storage.
+    //
+    Status = gRT->SetVariable(
+                    MyEfiUnionVar,
+                    &gDriverSampleFormSetGuid,
+                    EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,
+                    sizeof (MY_EFI_UNION_DATA),
+                    UnionConfig
+                    );
+    if (EFI_ERROR (Status)) {
+      DriverSampleUnload (ImageHandle);
+      return Status;
+    }
+    //
+    // EFI variable for NV config doesn't exit, we should build this variable
+    // based on default values stored in IFR
+    //
+    ActionFlag = HiiSetToDefaults (ConfigRequestHdr, EFI_HII_DEFAULT_CLASS_STANDARD);
+    if (!ActionFlag) {
+      DriverSampleUnload (ImageHandle);
+      return EFI_INVALID_PARAMETER;
+    }
+  } else {
+    //
+    // EFI variable does exist and Validate Current Setting
+    //
+    ActionFlag = HiiValidateSettings (ConfigRequestHdr);
+    if (!ActionFlag) {
+      DriverSampleUnload (ImageHandle);
+      return EFI_INVALID_PARAMETER;
+    }
+  }
+  FreePool (ConfigRequestHdr);
+
   Status = gBS->CreateEventEx (
         EVT_NOTIFY_SIGNAL, 
         TPL_NOTIFY,
         EfiEventEmptyFunction,
         NULL,
diff --git a/MdeModulePkg/Universal/DriverSampleDxe/DriverSample.h b/MdeModulePkg/Universal/DriverSampleDxe/DriverSample.h
index 507cff6..00752bf 100644
--- a/MdeModulePkg/Universal/DriverSampleDxe/DriverSample.h
+++ b/MdeModulePkg/Universal/DriverSampleDxe/DriverSample.h
@@ -83,10 +83,12 @@ typedef struct {
 
   EFI_HANDLE                       DriverHandle[2];
   EFI_HII_HANDLE                   HiiHandle[2];
   DRIVER_SAMPLE_CONFIGURATION      Configuration;
   MY_EFI_VARSTORE_DATA             VarStoreConfig;
+  MY_EFI_BITS_VARSTORE_DATA        BitsVarStoreConfig;
+  MY_EFI_UNION_DATA                UnionConfig;
 
   //
   // Name/Value storage Name list
   //
   EFI_STRING_ID                    NameStringId[NAME_VALUE_NAME_NUMBER];
diff --git a/MdeModulePkg/Universal/DriverSampleDxe/NVDataStruc.h b/MdeModulePkg/Universal/DriverSampleDxe/NVDataStruc.h
index 195cc8a..d018ba5 100644
--- a/MdeModulePkg/Universal/DriverSampleDxe/NVDataStruc.h
+++ b/MdeModulePkg/Universal/DriverSampleDxe/NVDataStruc.h
@@ -1,8 +1,8 @@
 /** @file
 
-Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2007 - 2017, 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
 http://opensource.org/licenses/bsd-license.php
 
@@ -29,13 +29,43 @@ Revision History:
 #include <Guid/HiiFormMapMethodGuid.h>
 #include <Guid/DriverSampleHii.h>
 #include <Guid/ZeroGuid.h>
 
 #define CONFIGURATION_VARSTORE_ID    0x1234
+#define BITS_VARSTORE_ID             0x2345
 
 #pragma pack(1)
+
+typedef struct {
+  UINT16   Field16;
+  UINT8    MyBits4 : 1;
+  UINT16           : 1;  // unnamed field can be used for padding
+  UINT8    MyBits3 : 3;
+  UINT8            : 0;  // Special width 0 can be used to force alignment at the next word boundary
+  UINT8    MyBits5 : 3;
+  UINT16   MyBits6 : 4;
+  UINT8    Field8;
+} MY_BITS_DATA;
+
+typedef union {
+  UINT16   MyBits7 : 10;
+  UINT16   MyBits9 : 12;
+} MY_UNION_DATA1;
+
+typedef union {
+  UINT16   Field16;
+  UINT8    Field8;
+} MY_UNION_DATA2;
+
+typedef union {
+  MY_UNION_DATA1  Data1;
+  MY_UNION_DATA2  Data2;
+  MY_BITS_DATA    Data3;
+} MY_EFI_UNION_DATA;
+
 typedef struct {
+  UINT16   Test;
   UINT16  MyStringData[40];
   UINT16  SomethingHiddenForHtml;
   UINT8   HowOldAreYouInYearsManual;
   UINT16  HowTallAreYouManual;
   UINT8   HowOldAreYouInYears;
@@ -65,10 +95,17 @@ typedef struct {
   UINT8   GetDefaultValueFromAccess;
   EFI_HII_TIME  Time;
   UINT8   RefreshGuidCount;
   UINT8   Match2;
   UINT8   GetDefaultValueFromCallBackForOrderedList[3];
+  UINT8   Bits1 : 5;
+  UINT8   Bits2 : 6;
+  UINT8   Bits3 : 1;
+  UINT16  Bits4 : 6;
+  UINT16  Bits5 : 12;
+  MY_BITS_DATA  MyBitData;
+  MY_EFI_UNION_DATA MyUnionData;
 } DRIVER_SAMPLE_CONFIGURATION;
 
 //
 // 2nd NV data structure definition
 //
@@ -78,10 +115,22 @@ typedef struct {
   UINT8         OrderedList[3];
   UINT16        SubmittedCallback;
 } MY_EFI_VARSTORE_DATA;
 
 //
+// 3rd NV data structure definition
+//
+typedef struct {
+  UINT16   Field16;
+  MY_BITS_DATA  BitsData;
+  UINT8    Field8;
+  UINT16   MyBits7 : 3;
+  UINT16   MyBits8 : 3;
+  UINT16   MyBits9 : 1;
+} MY_EFI_BITS_VARSTORE_DATA;
+
+//
 // Labels definition
 //
 #define LABEL_UPDATE1               0x1234
 #define LABEL_UPDATE2               0x2234
 #define LABEL_UPDATE3               0x3234
diff --git a/MdeModulePkg/Universal/DriverSampleDxe/Vfr.vfr b/MdeModulePkg/Universal/DriverSampleDxe/Vfr.vfr
index d547ec8..bc6f645 100644
--- a/MdeModulePkg/Universal/DriverSampleDxe/Vfr.vfr
+++ b/MdeModulePkg/Universal/DriverSampleDxe/Vfr.vfr
@@ -86,10 +86,23 @@ formset
     attribute = EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,  // EFI variable attribures  
     name  = MyEfiVar,
     guid  = DRIVER_SAMPLE_FORMSET_GUID;
 
   //
+  // Define a Buffer Storage (EFI_IFR_VARSTORE)
+  //
+  efivarstore MY_EFI_BITS_VARSTORE_DATA,       // This is the data structure type
+    attribute = EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,  // EFI variable attribures
+    name  = MyEfiBitVar,                       // Define referenced name in vfr
+    guid  = DRIVER_SAMPLE_FORMSET_GUID;     // GUID of this buffer storage
+
+  efivarstore MY_EFI_UNION_DATA,
+    attribute = EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,  // EFI variable attribures
+    name  = MyEfiUnionVar,
+    guid  = DRIVER_SAMPLE_FORMSET_GUID;
+
+  //
   // Define a Name/Value Storage (EFI_IFR_VARSTORE_NAME_VALUE)
   //
   namevaluevarstore MyNameValueVar,                // Define storage reference name in vfr
     name = STRING_TOKEN(STR_NAME_VALUE_VAR_NAME0), // Define Name list of this storage, refer it by MyNameValueVar[0]
     name = STRING_TOKEN(STR_NAME_VALUE_VAR_NAME1), // Define Name list of this storage, refer it by MyNameValueVar[1]
@@ -516,10 +529,13 @@ formset
         data.Field8  = 0x21, 
         data.Field16 = 0x2121,
         data.OrderedList[0] = 0x21,        
     endguidop;
 
+     goto 7,
+      prompt = STRING_TOKEN(STR_GOTO_FORM7),
+      help   = STRING_TOKEN(STR_GOTO_FORM7_HELP);
 
   endform;
 
   suppressif ideqval MyIfrNVData.BootOrderLarge == 0;
     form formid = 2,               // SecondSetupPage,
@@ -778,6 +794,177 @@ formset
     //
     label LABEL_END;
 
   endform;
 
+
+  form formid = 7,            // Form to show the question refer to union and bit Varstore
+    title = STRING_TOKEN(STR_FORM7_TITLE);
+
+    subtitle text = STRING_TOKEN(STR_NEST_BIT_EFI_VARSTORE);
+
+    checkbox varid   = MyEfiBitVar.BitsData.MyBits4,
+             prompt   = STRING_TOKEN(STR_BIT_NEST_CHECK_BOX_PROMPT),
+             help     = STRING_TOKEN(STR_BIT_NEST_CHECK_BOX_HELP),
+             flags    = CHECKBOX_DEFAULT,
+    endcheckbox;
+
+    oneof varid  = MyEfiBitVar.BitsData.MyBits3,
+      prompt      = STRING_TOKEN(STR_ONE_OF_BIT_NEST_PROMPT),
+      help        = STRING_TOKEN(STR_ONE_OF_BIT_NEST_HELP),
+      option text = STRING_TOKEN(STR_BOOT_ORDER1), value = 0, flags = MANUFACTURING;
+      option text = STRING_TOKEN(STR_BOOT_ORDER2), value = 1, flags = DEFAULT;
+    endoneof;
+
+    numeric varid   = MyEfiBitVar.BitsData.MyBits5,
+            prompt  = STRING_TOKEN(STR_BIT_NEST_NUMERIC_PROMPT),
+            help    = STRING_TOKEN(STR_BIT_NEST_NUMERIC_HELP),
+            minimum = 0,
+            maximum = 7,
+            step    = 1,
+            default = 2, defaultstore = MyStandardDefault,     // This is standard default value
+            default = 3, defaultstore = MyManufactureDefault,  // This is manufacture default value
+    endnumeric;
+
+   numeric varid   = MyEfiBitVar.BitsData.MyBits6,
+            questionid = 0x6666,
+            prompt  = STRING_TOKEN(STR_BIT_NEST_NUMERIC_PROMPT),
+            help    = STRING_TOKEN(STR_BIT_NEST_NUMERIC_DEFAULT_HELP),
+            flags   = DISPLAY_UINT_HEX | INTERACTIVE,
+            minimum = 0,
+            maximum = 15,
+    endnumeric;
+
+    oneof varid  = MyEfiBitVar.BitsData.Field16,
+      prompt      = STRING_TOKEN(BYTE_QUESTION_NEST_BIT_PROMPT),
+      help        = STRING_TOKEN(BYTE_QUESTION_NEST_BIT_HELP),
+      option text = STRING_TOKEN(STR_BOOT_ORDER1), value = 0, flags = MANUFACTURING;
+      option text = STRING_TOKEN(STR_BOOT_ORDER2), value = 1, flags = DEFAULT;
+    endoneof;
+
+    subtitle text = STRING_TOKEN(STR_SUBTITLE_TEXT2);
+    subtitle text = STRING_TOKEN(STR_BIT_EFI_VARSTORE);
+
+    checkbox varid   = MyEfiBitVar.MyBits9,
+             prompt   = STRING_TOKEN(STR_BIT_CHECK_BOX_PROMPT),
+             help     = STRING_TOKEN(STR_BIT_CHECK_BOX_HELP),
+             flags    = CHECKBOX_DEFAULT,
+    endcheckbox;
+
+    oneof varid  = MyEfiBitVar.MyBits8,
+      prompt      = STRING_TOKEN(STR_ONE_OF_BIT_PROMPT),
+      help        = STRING_TOKEN(STR_ONE_OF_BIT_HELP),
+      option text = STRING_TOKEN(STR_BOOT_ORDER1), value = 0, flags = MANUFACTURING;
+      option text = STRING_TOKEN(STR_BOOT_ORDER2), value = 1, flags = DEFAULT;
+    endoneof;
+
+    numeric varid   = MyEfiBitVar.MyBits7,
+            prompt  = STRING_TOKEN(STR_BIT_NUMERIC_PROMPT),
+            help    = STRING_TOKEN(STR_BIT_NUMERIC_HELP),
+            minimum = 0,
+            maximum = 7,
+            step    = 0,
+            default = 4, defaultstore = MyStandardDefault,     // This is standard default value
+            default = 5, defaultstore = MyManufactureDefault,  // This is manufacture default value
+    endnumeric;
+
+    oneof varid  = MyEfiBitVar.Field16,
+      prompt      = STRING_TOKEN(BYTE_QUESTION_BIT_PROMPT),
+      help        = STRING_TOKEN(BYTE_QUESTION_BIT_HELP),
+      option text = STRING_TOKEN(STR_BOOT_ORDER1), value = 0, flags = MANUFACTURING;
+      option text = STRING_TOKEN(STR_BOOT_ORDER2), value = 1, flags = DEFAULT;
+    endoneof;
+
+    subtitle text = STRING_TOKEN(STR_SUBTITLE_TEXT2);
+    subtitle text = STRING_TOKEN(STR_NEST_BIT_VARSTORE);
+    checkbox varid   = MyIfrNVData.MyBitData.MyBits4,
+             prompt   = STRING_TOKEN(STR_BIT_NEST_CHECK_BOX_PROMPT),
+             help     = STRING_TOKEN(STR_BIT_NEST_CHECK_BOX_HELP),
+             flags    = CHECKBOX_DEFAULT,
+    endcheckbox;
+
+    oneof varid  = MyIfrNVData.MyBitData.MyBits3,
+      prompt      = STRING_TOKEN(STR_ONE_OF_BIT_NEST_PROMPT),
+      help        = STRING_TOKEN(STR_ONE_OF_BIT_NEST_HELP),
+      option text = STRING_TOKEN(STR_BOOT_ORDER1), value = 0, flags = MANUFACTURING;
+      option text = STRING_TOKEN(STR_BOOT_ORDER2), value = 1, flags = DEFAULT;
+    endoneof;
+
+    numeric varid   = MyIfrNVData.MyBitData.MyBits5,
+            prompt  = STRING_TOKEN(STR_BIT_NEST_NUMERIC_PROMPT),
+            help    = STRING_TOKEN(STR_BIT_NEST_NUMERIC_HELP),
+            minimum = 0,
+            maximum = 7,
+            step    = 0,
+            default = 6, defaultstore = MyStandardDefault,     // This is standard default value
+            default = 7, defaultstore = MyManufactureDefault,  // This is manufacture default value
+    endnumeric;
+
+   numeric varid   = MyIfrNVData.MyBitData.MyBits6,
+            prompt  = STRING_TOKEN(STR_BIT_NEST_NUMERIC_PROMPT),
+            help    = STRING_TOKEN(STR_BIT_NEST_NUMERIC_HELP),
+            minimum = 0,
+            maximum = 15,
+            step    = 0,
+            default = 10, defaultstore = MyStandardDefault,     // This is standard default value
+            default = 11, defaultstore = MyManufactureDefault,  // This is manufacture default value
+    endnumeric;
+
+    oneof varid  = MyIfrNVData.MyBitData.Field16,
+      prompt      = STRING_TOKEN(BYTE_QUESTION_NEST_BIT_PROMPT),
+      help        = STRING_TOKEN(BYTE_QUESTION_NEST_BIT_HELP),
+      option text = STRING_TOKEN(STR_BOOT_ORDER1), value = 0, flags = MANUFACTURING;
+      option text = STRING_TOKEN(STR_BOOT_ORDER2), value = 1, flags = DEFAULT;
+    endoneof;
+
+    subtitle text = STRING_TOKEN(STR_SUBTITLE_TEXT2);
+    subtitle text = STRING_TOKEN(STR_BIT_VARSTORE);
+
+    checkbox varid   = MyIfrNVData.Bits3,
+             prompt   = STRING_TOKEN(STR_BIT_CHECK_BOX_PROMPT),
+             help     = STRING_TOKEN(STR_BIT_CHECK_BOX_HELP),
+             flags    = CHECKBOX_DEFAULT,
+    endcheckbox;
+
+    oneof varid  = MyIfrNVData.Bits2,
+      prompt      = STRING_TOKEN(STR_ONE_OF_BIT_PROMPT),
+      help        = STRING_TOKEN(STR_ONE_OF_BIT_HELP),
+      option text = STRING_TOKEN(STR_BOOT_ORDER1), value = 0, flags = MANUFACTURING;
+      option text = STRING_TOKEN(STR_BOOT_ORDER2), value = 1, flags = DEFAULT;
+    endoneof;
+
+    numeric varid   = MyIfrNVData.Bits5,
+            prompt  = STRING_TOKEN(STR_BIT_NUMERIC_PROMPT),
+            help    = STRING_TOKEN(STR_BIT_NUMERIC_HELP),
+            minimum = 0,
+            maximum = 20,
+            step    = 0,
+            default = 16, defaultstore = MyStandardDefault,     // This is standard default value
+            default = 17, defaultstore = MyManufactureDefault,  // This is manufacture default value
+    endnumeric;
+
+    subtitle text = STRING_TOKEN(STR_SUBTITLE_TEXT2);
+    subtitle text = STRING_TOKEN(STR_UNION_EFI_VARSTORE);
+
+    numeric varid   = MyEfiUnionVar.Data2.Field8,
+            prompt  = STRING_TOKEN(STR_EFI_UNION_NUMERIC_PROMPT),
+            help    = STRING_TOKEN(STR_EFI_UNION_NUMERIC_HELP),
+            minimum = 0,
+            maximum = 20,
+            step    = 0,
+            default = 7, defaultstore = MyStandardDefault,     // This is standard default value
+            default = 8, defaultstore = MyManufactureDefault,  // This is manufacture default value
+    endnumeric;
+
+    numeric varid   = MyIfrNVData.MyUnionData.Data1.MyBits7,
+            prompt  = STRING_TOKEN(STR_BUF_UNION_NUMERIC_PROMPT),
+            help    = STRING_TOKEN(STR_BUF_UNION_NUMERIC_HELP),
+            minimum = 0,
+            maximum = 20,
+            step    = 0,
+            default = 7, defaultstore = MyStandardDefault,     // This is standard default value
+            default = 8, defaultstore = MyManufactureDefault,  // This is manufacture default value
+    endnumeric;
+
+  endform;
+
 endformset;
diff --git a/MdeModulePkg/Universal/DriverSampleDxe/VfrStrings.uni b/MdeModulePkg/Universal/DriverSampleDxe/VfrStrings.uni
index 6a268d1..67134f6 100644
--- a/MdeModulePkg/Universal/DriverSampleDxe/VfrStrings.uni
+++ b/MdeModulePkg/Universal/DriverSampleDxe/VfrStrings.uni
@@ -271,10 +271,71 @@
                                                      #language fr-FR "Select it to invoke Hii Popup Protocol"
 #string STR_POPUP_TEST_HELP                          #language en-US "Select this question will pop up a message box, then user can decide whether exit curret form or not"
                                                      #language fr-FR "Select this question will pop up a message box, then user can decide whether exit curret form or not"
 #string STR_POPUP_STRING                             #language en-US "Are you sure to exit current form?"
                                                      #language fr-FR "Are you sure to exit current form?"
+//
+// Form 7 to show Questions which refer to Union Bit varstore
+//
+#string STR_FORM7_TITLE                #language en-US "Form to Show Questions with union/bit VarStore"
+                                       #language fr-FR "Form to Show Questions with union/bit VarStore"
+#string STR_GOTO_FORM7                 #language en-US "Go to Form 7"
+                                       #language fr-FR "Go to Form 7"
+#string STR_GOTO_FORM7_HELP            #language en-US "This Form is to Show Questions with union/bit VarStore"
+                                       #language fr-FR "This Form is to Show Questions with union/bit VarStore"
+#string STR_BIT_NEST_CHECK_BOX_PROMPT  #language en-US "NEST_BIT check box"
+                                       #language fr-FR "NEST_BIT check box"
+#string STR_BIT_NEST_CHECK_BOX_HELP    #language en-US "The check box refer to nested bit field"
+                                       #language fr-FR "The check box refer to nested bit field"
+#string STR_ONE_OF_BIT_NEST_PROMPT     #language en-US "NEST_BIT one-of"
+                                       #language fr-FR "NEST_BIT one-of"
+#string STR_ONE_OF_BIT_NEST_HELP       #language en-US "The oneof refer to nested bit field"
+                                       #language fr-FR "The oneof refer to nested bit field"
+#string STR_BIT_NEST_NUMERIC_PROMPT    #language en-US "NEST_BIT numeric"
+                                       #language fr-FR "NEST_BIT numeric"
+#string STR_BIT_NEST_NUMERIC_HELP      #language en-US "The numeric refer to nested bit field"
+                                       #language fr-FR "The numeric refer to nested bit field"
+#string BYTE_QUESTION_NEST_BIT_PROMPT  #language en-US "Use byte field in NEST_BIT structure"
+                                       #language fr-FR "Use byte field in NEST_BIT structure"
+#string BYTE_QUESTION_NEST_BIT_HELP    #language en-US "The Question refer to byte field in NEST_BIT structure"
+                                       #language fr-FR "The Question refer to byte field in NEST_BIT structure"
+#string STR_BIT_NEST_NUMERIC_DEFAULT_HELP   #language en-US "NEST_BIT numeric, default value form callback function"
+                                            #language fr-FR "NEST_BIT numeric, default value form callback function"
+#string STR_NEST_BIT_EFI_VARSTORE      #language en-US "Nested BIT fields in efivarstore"
+                                       #language fr-FR "Nested BIT fields in efivarstore"
+#string STR_BIT_EFI_VARSTORE           #language en-US "BIT fields in efivarstore"
+                                       #language fr-FR "BIT fields in efivarstore"
+#string STR_NEST_BIT_VARSTORE          #language en-US "Nested BIT fields in bufferstore"
+                                       #language fr-FR "Nested BIT fields in bufferstore"
+#string STR_BIT_VARSTORE               #language en-US "BIT fields in varstore"
+                                       #language fr-FR "BIT fields in varstore"
+#string STR_UNION_EFI_VARSTORE         #language en-US "Union efivarstore"
+                                       #language fr-FR "Union efivarstore"
+#string STR_BIT_CHECK_BOX_PROMPT       #language en-US "BIT check box"
+                                       #language fr-FR "BIT check box"
+#string STR_BIT_CHECK_BOX_HELP         #language en-US "The check box refer to bit field"
+                                       #language fr-FR "The check box refer to bit field"
+#string STR_ONE_OF_BIT_PROMPT          #language en-US "BIT one-of"
+                                       #language fr-FR "BIT one-of"
+#string STR_ONE_OF_BIT_HELP            #language en-US "The one-of refer to bit field"
+                                       #language fr-FR "The one-of refer to bit field"
+#string STR_BIT_NUMERIC_PROMPT         #language en-US "BIT numeric"
+                                       #language fr-FR "BIT numeric"
+#string STR_BIT_NUMERIC_HELP           #language en-US "The numeric refer to bit field"
+                                       #language fr-FR "The numeric refer to bit field"
+#string BYTE_QUESTION_BIT_PROMPT       #language en-US "Use byte field in BIT structure"
+                                       #language fr-FR "Use byte field in BIT structure"
+#string BYTE_QUESTION_BIT_HELP         #language en-US "The question refer to byte field in BIT structure"
+                                       #language fr-FR "The question refer to byte field in BIT structure"
+#string STR_EFI_UNION_NUMERIC_PROMPT   #language en-US "UNION EfiVarStore numeric"
+                                       #language fr-FR "UNION EfiVarStore numeric"
+#string STR_EFI_UNION_NUMERIC_HELP     #language en-US "Question refer to UNION type efivastore"
+                                       #language fr-FR "Question refer to UNION type efivastore"
+#string STR_BUF_UNION_NUMERIC_PROMPT   #language en-US "UNION field numeric"
+                                       #language fr-FR "UNION field numeric"
+#string STR_BUF_UNION_NUMERIC_HELP     #language en-US "Question refer to UNION field in buffervastore"
+                                       #language fr-FR "Question refer to UNION field in buffervastore"
 // Boot Order
 #string STR_BOOT_TITLE                 #language en-US "Boot"
 #string STR_BOOT_OPTIONS               #language en-US "Boot Order"
 #string STR_BOOT_OPTION1               #language en-US "IDE HDD"
 #string STR_BOOT_OPTION2               #language en-US "ATAPI CD"
-- 
1.9.5.msysgit.1

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel