1. Enhance GenFw tool to merge HII binary package into a txt resource file.
authorlgao4 <lgao4@7335b38e-4728-0410-8992-fb3ffe349368>
Mon, 19 Oct 2009 10:10:56 +0000 (10:10 +0000)
committerlgao4 <lgao4@7335b38e-4728-0410-8992-fb3ffe349368>
Mon, 19 Oct 2009 10:10:56 +0000 (10:10 +0000)
2. Enhance VfrCompiler tool to create the binary HII form package.
3. Enhance Build tool to create the binary HII string package when UEFI_HII_RESOURCE_SECTION is set, and insert HII resource section into the final EFI image.

git-svn-id: https://buildtools.tianocore.org/svn/buildtools/trunk/BaseTools@1721 7335b38e-4728-0410-8992-fb3ffe349368

Source/C/GenFw/GenFw.c
Source/C/Include/IndustryStandard/PeImage.h
Source/C/VfrCompile/VfrCompiler.cpp
Source/Python/AutoGen/AutoGen.py
Source/Python/AutoGen/GenC.py
Source/Python/AutoGen/StrGather.py
Source/Python/Common/Misc.py
Source/Python/Workspace/WorkspaceDatabase.py

index 25922a4..e72f052 100644 (file)
@@ -33,6 +33,7 @@ Abstract:
 \r
 #include <Common/UefiBaseTypes.h>\r
 #include <IndustryStandard/PeImage.h>\r
+#include <Common/UefiInternalFormRepresentation.h>\r
 \r
 //\r
 // Acpi Table definition\r
@@ -60,6 +61,8 @@ Abstract:
 #define UTILITY_MAJOR_VERSION 0\r
 #define UTILITY_MINOR_VERSION 2\r
 \r
+#define HII_RESOURCE_SECTION_INDEX  1\r
+#define HII_RESOURCE_SECTION_NAME   "HII"\r
 //\r
 // Action for this tool.\r
 //\r
@@ -73,6 +76,7 @@ Abstract:
 #define FW_MCI_IMAGE         7\r
 #define FW_MERGE_IMAGE       8\r
 #define FW_RELOC_STRIPEED_IMAGE 9\r
+#define FW_HII_PACKAGE_LIST_RCIMAGE 10\r
 \r
 #define DUMP_TE_HEADER       0x11\r
 \r
@@ -100,6 +104,15 @@ typedef struct {
   UINT32  Reserved[3];\r
 } MICROCODE_IMAGE_HEADER;\r
 \r
+static EFI_GUID mZeroGuid = {0x0, 0x0, 0x0, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}};\r
+\r
+static const char *gHiiPackageRCFileHeader[] = {\r
+  "//",\r
+  "//  DO NOT EDIT -- auto-generated file",\r
+  "//",\r
+  NULL\r
+};\r
+\r
 STATIC CHAR8 *mInImageName;\r
 \r
 STATIC\r
@@ -258,6 +271,16 @@ Returns:
   fprintf (stdout, "  -r, --replace         Overwrite the input file with the output content.\n\\r
                         If more input files are specified,\n\\r
                         the last input file will be as the output file.\n");\r
+  fprintf (stdout, "  -g HiiPackageListGuid, --hiiguid HiiPackageListGuid\n\\r
+                        HiiListPackageGuidGuid is from the module guid.\n\\r
+                        Its format is xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\n\\r
+                        If not specified, the first Form FormSet guid is used.\n");\r
+  fprintf (stdout, "  --hiipackage          Combine all input binary hii pacakges into \n\\r
+                        a single package list as the text resource data(RC).\n\\r
+                        It can't be combined with other action options\n\\r
+                        except for -o option. It is a action option.\n\\r
+                        If it is combined with other action options, the later\n\\r
+                        input action option will override the previous one.\n");\r
   fprintf (stdout, "  -v, --verbose         Turn on verbose output with informational messages.\n");\r
   fprintf (stdout, "  -q, --quiet           Disable all messages except key message and fatal error\n");\r
   fprintf (stdout, "  -d, --debug level     Enable debug messages, at input debug level.\n");\r
@@ -440,7 +463,7 @@ typedef Elf32_Dyn Elf_Dyn;
 #define ELFCLASS ELFCLASS32\r
 #define ELF_R_TYPE(r) ELF32_R_TYPE(r)\r
 #define ELF_R_SYM(r) ELF32_R_SYM(r)\r
-\r
+#define ELF_HII_SECTION_NAME ".hii"\r
 //\r
 // Well known ELF structures.\r
 //\r
@@ -452,7 +475,7 @@ Elf_Phdr *gPhdrBase;
 // PE section alignment.\r
 //\r
 const UINT32 CoffAlignment = 0x20;\r
-const UINT16 CoffNbrSections = 4;\r
+const UINT16 CoffNbrSections = 5;\r
 \r
 //\r
 // Current offset in coff file.\r
@@ -475,8 +498,15 @@ UINT32 NtHdrOffset;
 UINT32 TableOffset;\r
 UINT32 TextOffset;\r
 UINT32 DataOffset;\r
+UINT32 HiiRsrcOffset;\r
 UINT32 RelocOffset;\r
 \r
+//\r
+// HiiBinData\r
+//\r
+UINT8* HiiBinData = NULL;\r
+UINT32 HiiBinSize = 0;\r
+\r
 EFI_IMAGE_BASE_RELOCATION *CoffBaseRel;\r
 UINT16 *CoffEntryRel;\r
 \r
@@ -547,11 +577,28 @@ IsTextShdr(
   return (Shdr->sh_flags & (SHF_WRITE | SHF_ALLOC)) == SHF_ALLOC;\r
 }\r
 \r
+int\r
+IsHiiRsrcShdr(\r
+  Elf_Shdr *Shdr\r
+  )\r
+{\r
+  Elf_Shdr *Namedr = GetShdrByIndex(Ehdr->e_shstrndx);\r
+\r
+  if (strcmp((CHAR8*)Ehdr + Namedr->sh_offset + Shdr->sh_name, ELF_HII_SECTION_NAME) == 0) {\r
+    return 1;\r
+  }\r
+\r
+  return 0;\r
+}\r
+\r
 int\r
 IsDataShdr(\r
   Elf_Shdr *Shdr\r
   )\r
 {\r
+  if (IsHiiRsrcShdr(Shdr)) {\r
+    return 0;\r
+  }\r
   return (Shdr->sh_flags & (SHF_WRITE | SHF_ALLOC)) == (SHF_ALLOC | SHF_WRITE);\r
 }\r
 \r
@@ -580,6 +627,128 @@ CreateSectionHeader(
   TableOffset += sizeof (EFI_IMAGE_SECTION_HEADER);\r
 }\r
 \r
+VOID\r
+GetBinaryHiiData (\r
+  CHAR8   *RcString,\r
+  UINT32  Size,\r
+  UINT32  OffsetToFile\r
+  )\r
+{\r
+  unsigned  Data16;\r
+  UINT32  HiiBinOffset;\r
+  UINT32  Index;\r
+  EFI_IMAGE_RESOURCE_DIRECTORY        *ResourceDirectory;\r
+  EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY  *ResourceDirectoryEntry;\r
+  EFI_IMAGE_RESOURCE_DIRECTORY_STRING *ResourceDirectoryString;\r
+  EFI_IMAGE_RESOURCE_DATA_ENTRY       *ResourceDataEntry;\r
+\r
+  Index = 0;\r
+  while (Index < Size && *RcString != '\0' && *RcString != '{') {\r
+    RcString ++;\r
+    Index ++;\r
+  }\r
+  \r
+  if (*RcString == '\0' || Index == Size) {\r
+    return;\r
+  }\r
+  \r
+  //\r
+  // Skip '{' character\r
+  // Skip space and ',' character\r
+  //\r
+  RcString ++;\r
+  Index ++;\r
+  while (Index < Size && *RcString != '\0' && (isspace (*RcString) || *RcString == ',')){\r
+    RcString ++;\r
+    Index ++;\r
+  }\r
+\r
+  //\r
+  // '}' end character\r
+  //\r
+  if (*RcString == '}' || Index == Size) {\r
+    return;\r
+  }\r
+\r
+  HiiBinOffset = 0;\r
+  HiiBinSize   = 0x1000;\r
+  HiiBinData   = (UINT8 *) malloc (HiiBinSize);\r
+  if (HiiBinData == NULL) {\r
+    return;\r
+  }\r
+  memset (HiiBinData, 0, HiiBinSize);\r
+  //\r
+  // Fill Resource section entry\r
+  //\r
+  ResourceDirectory = (EFI_IMAGE_RESOURCE_DIRECTORY *) (HiiBinData + HiiBinOffset);\r
+  HiiBinOffset += sizeof (EFI_IMAGE_RESOURCE_DIRECTORY);\r
+  ResourceDirectory->NumberOfNamedEntries = 1;\r
+\r
+  ResourceDirectoryEntry = (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY *) (HiiBinData + HiiBinOffset);\r
+  HiiBinOffset += sizeof (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY);\r
+  ResourceDirectoryEntry->u1.s.NameIsString = 1;\r
+  ResourceDirectoryEntry->u1.s.NameOffset   = HiiBinOffset;\r
+\r
+  ResourceDirectoryString = (EFI_IMAGE_RESOURCE_DIRECTORY_STRING *) (HiiBinData + HiiBinOffset);\r
+  ResourceDirectoryString->Length = 3;\r
+  ResourceDirectoryString->String[0] =L'H';\r
+  ResourceDirectoryString->String[1] =L'I';\r
+  ResourceDirectoryString->String[2] =L'I';\r
+  HiiBinOffset = HiiBinOffset + sizeof (ResourceDirectoryString->Length) + ResourceDirectoryString->Length * sizeof (ResourceDirectoryString->String[0]);\r
+\r
+  ResourceDirectoryEntry->u2.OffsetToData = HiiBinOffset;\r
+  ResourceDataEntry = (EFI_IMAGE_RESOURCE_DATA_ENTRY *) (HiiBinData + HiiBinOffset);\r
+  HiiBinOffset += sizeof (EFI_IMAGE_RESOURCE_DATA_ENTRY);\r
+  ResourceDataEntry->OffsetToData = OffsetToFile + HiiBinOffset;\r
+\r
+  while (sscanf (RcString, "0x%X", &Data16) != EOF) {\r
+    //\r
+    // Convert the string data to the binary data.\r
+    //\r
+    *(UINT16 *)(HiiBinData + HiiBinOffset) = (UINT16) Data16;\r
+    HiiBinOffset += 2;\r
+    //\r
+    // Jump to the next data.\r
+    //\r
+    RcString = RcString + 2 + 4;\r
+    Index    = Index + 2 + 4;\r
+    //\r
+    // Skip space and ',' character\r
+    //\r
+    while (Index < Size && *RcString != '\0' && (isspace (*RcString) || *RcString == ',')){\r
+      RcString ++;\r
+      Index ++;\r
+    }\r
+    //\r
+    // '}' end character\r
+    //\r
+    if (*RcString == '}'|| Index == Size) {\r
+      break;\r
+    }\r
+    //\r
+    // Check BinBuffer size\r
+    //\r
+    if (HiiBinOffset >= HiiBinSize) {\r
+      HiiBinSize += 0x1000;\r
+      HiiBinData = (UINT8 *) realloc (HiiBinData, HiiBinSize);\r
+      //\r
+      // Memory allocation is failure.\r
+      //\r
+      if (HiiBinData == NULL) {\r
+        HiiBinSize = 0;\r
+        break;\r
+      }\r
+    }\r
+  }\r
+\r
+  if (HiiBinData != NULL) {\r
+    HiiBinSize = HiiBinOffset;\r
+    ResourceDataEntry->Size = HiiBinSize + OffsetToFile - ResourceDataEntry->OffsetToData;\r
+  }\r
+  \r
+  return;\r
+}\r
+\r
 VOID\r
 ScanSections(\r
   VOID\r
@@ -605,11 +774,11 @@ ScanSections(
        break;\r
   case EM_X86_64:\r
   case EM_IA_64:\r
-       CoffOffset += sizeof (EFI_IMAGE_NT_HEADERS64);\r
+    CoffOffset += sizeof (EFI_IMAGE_NT_HEADERS64);\r
        break;\r
   default:\r
     VerboseMsg ("%s unknown e_machine type. Assume IA-32", (UINTN)Ehdr->e_machine);\r
-       CoffOffset += sizeof (EFI_IMAGE_NT_HEADERS32);\r
+    CoffOffset += sizeof (EFI_IMAGE_NT_HEADERS32);\r
        break;\r
   }\r
 \r
@@ -672,13 +841,41 @@ ScanSections(
           Error (NULL, 0, 3000, "Invalid", "Unsupported section alignment.");\r
         }\r
       }\r
-\r
       CoffSectionsOffset[i] = CoffOffset;\r
       CoffOffset += shdr->sh_size;\r
     }\r
   }\r
   CoffOffset = CoffAlign(CoffOffset);\r
 \r
+  //\r
+  //  The HII resource sections.\r
+  //\r
+  HiiRsrcOffset = CoffOffset;\r
+  for (i = 0; i < Ehdr->e_shnum; i++) {\r
+    Elf_Shdr *shdr = GetShdrByIndex(i);\r
+    if (IsHiiRsrcShdr(shdr)) {\r
+      if ((shdr->sh_addralign != 0) && (shdr->sh_addralign != 1)) {\r
+        // the alignment field is valid\r
+        if ((shdr->sh_addr & (shdr->sh_addralign - 1)) == 0) {\r
+          // if the section address is aligned we must align PE/COFF \r
+          CoffOffset = (CoffOffset + shdr->sh_addralign - 1) & ~(shdr->sh_addralign - 1);\r
+        } else if ((shdr->sh_addr % shdr->sh_addralign) != (CoffOffset % shdr->sh_addralign)) {\r
+          // ARM RVCT tools have behavior outside of the ELF specification to try \r
+          // and make images smaller.  If sh_addr is not aligned to sh_addralign \r
+          // then the section needs to preserve sh_addr MOD sh_addralign. \r
+          // Normally doing nothing here works great.\r
+          Error (NULL, 0, 3000, "Invalid", "Unsupported section alignment.");\r
+        }\r
+      }\r
+      GetBinaryHiiData ((CHAR8*)Ehdr + shdr->sh_offset, shdr->sh_size, HiiRsrcOffset);\r
+      if (HiiBinSize != 0) {\r
+        CoffOffset += HiiBinSize;\r
+        CoffOffset = CoffAlign(CoffOffset);\r
+      }\r
+      break;\r
+    }\r
+  }\r
+\r
   RelocOffset = CoffOffset;\r
 \r
   //\r
@@ -760,8 +957,8 @@ ScanSections(
     NtHdr->Pe32.FileHeader.NumberOfSections--;\r
   }\r
 \r
-  if ((RelocOffset - TextOffset) > 0) {\r
-    CreateSectionHeader (".data", DataOffset, RelocOffset - DataOffset,\r
+  if ((HiiRsrcOffset - DataOffset) > 0) {\r
+    CreateSectionHeader (".data", DataOffset, HiiRsrcOffset - DataOffset,\r
             EFI_IMAGE_SCN_CNT_INITIALIZED_DATA\r
             | EFI_IMAGE_SCN_MEM_WRITE\r
             | EFI_IMAGE_SCN_MEM_READ);\r
@@ -769,6 +966,24 @@ ScanSections(
     // Don't make a section of size 0. \r
     NtHdr->Pe32.FileHeader.NumberOfSections--;\r
   }\r
+\r
+  if ((RelocOffset - HiiRsrcOffset) > 0) {\r
+    CreateSectionHeader (".rsrc", HiiRsrcOffset, RelocOffset - HiiRsrcOffset,\r
+            EFI_IMAGE_SCN_CNT_INITIALIZED_DATA\r
+            | EFI_IMAGE_SCN_MEM_READ);\r
+\r
+    NtHdr->Pe32.OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_RESOURCE].Size = HiiBinSize;\r
+    NtHdr->Pe32.OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_RESOURCE].VirtualAddress = HiiRsrcOffset;\r
+\r
+    memcpy(CoffFile + HiiRsrcOffset, HiiBinData, HiiBinSize);\r
+    free (HiiBinData);\r
+    HiiBinData = NULL;\r
+    HiiBinSize = 0;\r
+  } else {\r
+    // Don't make a section of size 0. \r
+    NtHdr->Pe32.FileHeader.NumberOfSections--;\r
+  }\r
+\r
 }\r
 \r
 VOID\r
@@ -1278,6 +1493,14 @@ Returns:
   EFI_IMAGE_OPTIONAL_HEADER64      *Optional64;\r
   EFI_IMAGE_DOS_HEADER             BackupDosHdr;\r
   MICROCODE_IMAGE_HEADER           *MciHeader;\r
+  UINT8                            *HiiPackageListBuffer;\r
+  UINT8                            *HiiPackageDataPointer;\r
+  EFI_GUID                         HiiPackageListGuid;\r
+  EFI_HII_PACKAGE_LIST_HEADER      HiiPackageListHeader;\r
+  EFI_HII_PACKAGE_HEADER           HiiPackageHeader;\r
+  EFI_IFR_FORM_SET                 IfrFormSet;\r
+  UINT8                            NumberOfFormPacakge;\r
+  EFI_HII_PACKAGE_HEADER           EndPackage;\r
 \r
   SetUtilityName (UTILITY_NAME);\r
 \r
@@ -1310,6 +1533,12 @@ Returns:
   Optional64        = NULL;\r
   KeepExceptionTableFlag = FALSE;\r
   KeepZeroPendingFlag    = FALSE;\r
+  NumberOfFormPacakge    = 0;\r
+  HiiPackageListBuffer   = NULL;\r
+  HiiPackageDataPointer  = NULL;\r
+  EndPackage.Length      = sizeof (EFI_HII_PACKAGE_HEADER);\r
+  EndPackage.Type        = EFI_HII_PACKAGE_END;\r
+  memset (&HiiPackageListGuid, 0, sizeof (HiiPackageListGuid));\r
 \r
   if (argc == 1) {\r
     Error (NULL, 0, 1001, "Missing options", "No input options.");\r
@@ -1501,6 +1730,24 @@ Returns:
       continue;\r
     }\r
     \r
+    if ((stricmp (argv[0], "-g") == 0) || (stricmp (argv[0], "--hiiguid") == 0)) {\r
+      Status = StringToGuid (argv[1], &HiiPackageListGuid);\r
+      if (EFI_ERROR (Status)) {\r
+        Error (NULL, 0, 1003, "Invalid option value", "%s = %s", argv[0], argv[1]);\r
+        goto Finish;\r
+      }\r
+      argc -= 2;\r
+      argv += 2;\r
+      continue;\r
+    }\r
+\r
+    if (stricmp (argv[0], "--hiipackage") == 0) {\r
+      OutImageType = FW_HII_PACKAGE_LIST_RCIMAGE;\r
+      argc --;\r
+      argv ++;\r
+      continue;\r
+    }\r
+\r
     if (argv[0][0] == '-') {\r
       Error (NULL, 0, 1000, "Unknown option", argv[0]);\r
       goto Finish;\r
@@ -1564,6 +1811,14 @@ Returns:
     goto Finish;\r
   }\r
 \r
+  //\r
+  // Combine HiiBinary packages to a single package list\r
+  //\r
+  if ((OutImageType == FW_HII_PACKAGE_LIST_RCIMAGE) && ReplaceFlag) {\r
+    Error (NULL, 0, 1002, "Conflicting option", "-r replace option cannot be used with --hiipackage merge files option.");\r
+    goto Finish;\r
+  }\r
+\r
   //\r
   // Input image file\r
   //\r
@@ -1604,6 +1859,9 @@ Returns:
   case FW_MERGE_IMAGE:\r
     VerboseMsg ("Combine the input multi microcode bin files to one bin file.");\r
     break;\r
+  case FW_HII_PACKAGE_LIST_RCIMAGE:\r
+    VerboseMsg ("Combine the input multi hii bin packages to one text pacakge list RC file.");\r
+    break;\r
   default:\r
     break;\r
   }\r
@@ -1644,6 +1902,107 @@ Returns:
     }\r
   }\r
 \r
+  //\r
+  // Combine multi binary HII package files to a single text package list RC file.\r
+  //\r
+  if (OutImageType == FW_HII_PACKAGE_LIST_RCIMAGE) {\r
+    //\r
+    // Get hii package list lenght\r
+    //\r
+    HiiPackageListHeader.PackageLength = sizeof (EFI_HII_PACKAGE_LIST_HEADER);\r
+    for (Index = 0; Index < InputFileNum; Index ++) {\r
+      fpIn = fopen (InputFileName [Index], "rb");\r
+      if (!fpIn) {\r
+        Error (NULL, 0, 0001, "Error opening file", InputFileName [Index]);\r
+        goto Finish;\r
+      }\r
+      FileLength = _filelength (fileno (fpIn));\r
+      fread (&HiiPackageHeader, 1, sizeof (HiiPackageHeader), fpIn);\r
+      if (HiiPackageHeader.Type == EFI_HII_PACKAGE_FORM) {\r
+        if (HiiPackageHeader.Length != FileLength) {\r
+          Error (NULL, 0, 3000, "Invalid", "The wrong package size is in HII package file %s", InputFileName [Index]);\r
+          fclose (fpIn);\r
+          goto Finish;\r
+        }\r
+        if (memcmp (&HiiPackageListGuid, &mZeroGuid, sizeof (EFI_GUID)) == 0) {\r
+          fread (&IfrFormSet, 1, sizeof (IfrFormSet), fpIn);\r
+          memcpy (&HiiPackageListGuid, &IfrFormSet.Guid, sizeof (EFI_GUID));\r
+        }\r
+        NumberOfFormPacakge ++;\r
+      }\r
+      HiiPackageListHeader.PackageLength += FileLength;\r
+      fclose (fpIn);\r
+    }\r
+    HiiPackageListHeader.PackageLength += sizeof (EndPackage);\r
+    //\r
+    // Check whether hii packages are valid\r
+    //\r
+    if (NumberOfFormPacakge > 1) {\r
+      Error (NULL, 0, 3000, "Invalid", "The input hii packages contains more than one hii form package");\r
+      goto Finish;\r
+    }\r
+    if (memcmp (&HiiPackageListGuid, &mZeroGuid, sizeof (EFI_GUID)) == 0) {\r
+      Error (NULL, 0, 3000, "Invalid", "HII pacakge list guid is not specified!");\r
+      goto Finish;\r
+    }\r
+    memcpy (&HiiPackageListHeader.PackageListGuid, &HiiPackageListGuid, sizeof (EFI_GUID));\r
+    //\r
+    // read hii packages\r
+    //\r
+    HiiPackageListBuffer = malloc (HiiPackageListHeader.PackageLength);\r
+    if (HiiPackageListBuffer == NULL) {\r
+      Error (NULL, 0, 4001, "Resource", "memory cannot be allocated!");\r
+      goto Finish;\r
+    }\r
+    memcpy (HiiPackageListBuffer, &HiiPackageListHeader, sizeof (HiiPackageListHeader));\r
+    HiiPackageDataPointer = HiiPackageListBuffer + sizeof (HiiPackageListHeader);\r
+    for (Index = 0; Index < InputFileNum; Index ++) {\r
+      fpIn = fopen (InputFileName [Index], "rb");\r
+      if (!fpIn) {\r
+        Error (NULL, 0, 0001, "Error opening file", InputFileName [Index]);\r
+        free (HiiPackageListBuffer);\r
+        goto Finish;\r
+      }\r
+\r
+      FileLength = _filelength (fileno (fpIn));\r
+      fread (HiiPackageDataPointer, 1, FileLength, fpIn);\r
+      fclose (fpIn);\r
+      HiiPackageDataPointer = HiiPackageDataPointer + FileLength;\r
+    }\r
+    memcpy (HiiPackageDataPointer, &EndPackage, sizeof (EndPackage));\r
+    //\r
+    // write the hii package into the text package list rc file.\r
+    //\r
+    for (Index = 0; gHiiPackageRCFileHeader[Index] != NULL; Index++) {\r
+      fprintf (fpOut, "%s\n", gHiiPackageRCFileHeader[Index]);\r
+    }\r
+    fprintf (fpOut, "\n%d %s\n{", HII_RESOURCE_SECTION_INDEX, HII_RESOURCE_SECTION_NAME);\r
+\r
+    HiiPackageDataPointer = HiiPackageListBuffer;\r
+    for (Index = 0; Index + 2 < HiiPackageListHeader.PackageLength; Index += 2) {\r
+      if (Index % 16 == 0) {\r
+        fprintf (fpOut, "\n ");\r
+      }\r
+      fprintf (fpOut, " 0x%04X,", *(UINT16 *) HiiPackageDataPointer);\r
+      HiiPackageDataPointer += 2;\r
+    }\r
+    \r
+    if (Index % 16 == 0) {\r
+      fprintf (fpOut, "\n ");\r
+    }\r
+    if ((Index + 2) == HiiPackageListHeader.PackageLength) {\r
+      fprintf (fpOut, " 0x%04X\n}\n", *(UINT16 *) HiiPackageDataPointer);\r
+    }\r
+    if ((Index + 1) == HiiPackageListHeader.PackageLength) {\r
+      fprintf (fpOut, " 0x%04X\n}\n", *(UINT8 *) HiiPackageDataPointer);\r
+    }\r
+    free (HiiPackageListBuffer);\r
+    //\r
+    // Done successfully\r
+    //\r
+    goto Finish;\r
+  }\r
+\r
   //\r
   // Combine MciBinary files to one file\r
   //\r
index 1595a98..57cbc23 100644 (file)
@@ -656,6 +656,59 @@ typedef struct {
   UINT8  FrameRegisterOffset:4;\r
 } UNWIND_INFO;\r
 \r
+///\r
+/// Resource format.\r
+///\r
+typedef struct {\r
+  UINT32  Characteristics;\r
+  UINT32  TimeDateStamp;\r
+  UINT16  MajorVersion;\r
+  UINT16  MinorVersion;\r
+  UINT16  NumberOfNamedEntries;\r
+  UINT16  NumberOfIdEntries;\r
+  //\r
+  // Array of EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY entries goes here.\r
+  //\r
+} EFI_IMAGE_RESOURCE_DIRECTORY;\r
+\r
+///\r
+/// Resource directory entry format.\r
+///\r
+typedef struct {\r
+  union {\r
+    struct {\r
+      UINT32  NameOffset:31;\r
+      UINT32  NameIsString:1;\r
+    } s;\r
+    UINT32  Id;\r
+  } u1;\r
+  union {\r
+    UINT32  OffsetToData;\r
+    struct {\r
+      UINT32  OffsetToDirectory:31;\r
+      UINT32  DataIsDirectory:1;\r
+    } s;\r
+  } u2;\r
+} EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY;\r
+\r
+///\r
+/// Resource directory entry for string.\r
+///\r
+typedef struct {\r
+  UINT16  Length;\r
+  CHAR16  String[1];\r
+} EFI_IMAGE_RESOURCE_DIRECTORY_STRING;\r
+\r
+///\r
+/// Resource directory entry for data array.\r
+///\r
+typedef struct {\r
+  UINT32  OffsetToData;\r
+  UINT32  Size;\r
+  UINT32  CodePage;\r
+  UINT32  Reserved;\r
+} EFI_IMAGE_RESOURCE_DATA_ENTRY;\r
+\r
 ///\r
 /// Header format for TE images\r
 ///\r
index 195727c..e3c150c 100644 (file)
@@ -628,23 +628,27 @@ CVfrCompiler::GenCFile (
   if (!IS_RUN_STATUS(STATUS_GENBINARY)) {\r
     goto Fail;\r
   }\r
+  \r
+  if (!mOptions.CreateIfrPkgFile || mOptions.CompatibleMode) {\r
+    if ((pFile = fopen (mOptions.COutputFileName, "w")) == NULL) {\r
+      Error (NULL, 0, 0001, "Error opening output C file", mOptions.COutputFileName);\r
+      goto Fail;\r
+    }\r
 \r
-  if ((pFile = fopen (mOptions.COutputFileName, "w")) == NULL) {\r
-    Error (NULL, 0, 0001, "Error opening output C file", mOptions.COutputFileName);\r
-    goto Fail;\r
-  }\r
-\r
-  for (Index = 0; gSourceFileHeader[Index] != NULL; Index++) {\r
-    fprintf (pFile, "%s\n", gSourceFileHeader[Index]);\r
-  }\r
+    for (Index = 0; gSourceFileHeader[Index] != NULL; Index++) {\r
+      fprintf (pFile, "%s\n", gSourceFileHeader[Index]);\r
+    }\r
 \r
-  gCVfrBufferConfig.OutputCFile (pFile, mOptions.VfrBaseFileName);\r
+    if (mOptions.CompatibleMode) { \r
+      gCVfrBufferConfig.OutputCFile (pFile, mOptions.VfrBaseFileName);\r
+    }\r
 \r
-  if (gCFormPkg.GenCFile (mOptions.VfrBaseFileName, pFile, &gRBuffer) != VFR_RETURN_SUCCESS) {\r
+    if (gCFormPkg.GenCFile (mOptions.VfrBaseFileName, pFile, &gRBuffer) != VFR_RETURN_SUCCESS) {\r
+      fclose (pFile);\r
+      goto Fail;\r
+    }\r
     fclose (pFile);\r
-    goto Fail;\r
   }\r
-  fclose (pFile);\r
 \r
   SET_RUN_STATUS (STATUS_FINISHED);\r
   return;\r
index 6e973c0..ba459af 100755 (executable)
@@ -21,6 +21,7 @@ import copy
 import GenC
 import GenMake
 import GenDepex
+from StringIO import StringIO
 
 from StrGather import *
 from BuildEngine import BuildRule
@@ -48,6 +49,7 @@ gBuildRuleFile = 'Conf/build_rule.txt'
 gAutoGenCodeFileName = "AutoGen.c"
 gAutoGenHeaderFileName = "AutoGen.h"
 gAutoGenStringFileName = "%(module_name)sStrDefs.h"
+gAutoGenStringFormFileName = "%(module_name)sStrDefs.hpk"
 gAutoGenDepexFileName = "%(module_name)s.depex"
 gAutoGenSmmDepexFileName = "%(module_name)s.smm"
 
@@ -2030,12 +2032,17 @@ class ModuleAutoGen(AutoGen):
     #   @retval     list        The list of auto-generated file
     #
     def _GetAutoGenFileList(self):
+        UniStringAutoGenC = True
+        UniStringBinBuffer = None
+        if self.BuildType == 'UEFI_HII':
+            UniStringBinBuffer = StringIO()
+            UniStringAutoGenC = False
         if self._AutoGenFileList == None:
             self._AutoGenFileList = {}
             AutoGenC = TemplateString()
             AutoGenH = TemplateString()
             StringH = TemplateString()
-            GenC.CreateCode(self, AutoGenC, AutoGenH, StringH)
+            GenC.CreateCode(self, AutoGenC, AutoGenH, StringH, UniStringAutoGenC, UniStringBinBuffer)
             if str(AutoGenC) != "" and TAB_C_CODE_FILE in self.FileTypes:
                 AutoFile = PathClass(gAutoGenCodeFileName, self.DebugDir)
                 self._AutoGenFileList[AutoFile] = str(AutoGenC)
@@ -2048,6 +2055,13 @@ class ModuleAutoGen(AutoGen):
                 AutoFile = PathClass(gAutoGenStringFileName % {"module_name":self.Name}, self.DebugDir)
                 self._AutoGenFileList[AutoFile] = str(StringH)
                 self._ApplyBuildRule(AutoFile, TAB_UNKNOWN_FILE)
+            if UniStringBinBuffer != None and UniStringBinBuffer.getvalue() != "":
+                AutoFile = PathClass(gAutoGenStringFormFileName % {"module_name":self.Name}, self.OutputDir)
+                self._AutoGenFileList[AutoFile] = UniStringBinBuffer.getvalue()\r
+                AutoFile.IsBinary = True
+                self._ApplyBuildRule(AutoFile, TAB_UNKNOWN_FILE)
+            if UniStringBinBuffer != None:\r
+                UniStringBinBuffer.close()\r
         return self._AutoGenFileList
 
     ## Return the list of library modules explicitly or implicityly used by this module
@@ -2200,7 +2214,7 @@ class ModuleAutoGen(AutoGen):
         IgoredAutoGenList = []
 
         for File in self.AutoGenFileList:
-            if GenC.Generate(File.Path, self.AutoGenFileList[File]):
+            if GenC.Generate(File.Path, self.AutoGenFileList[File], File.IsBinary):
                 #Ignore R8 AutoGen.c
                 if self.AutoGenVersion < 0x00010005 and File.Name == 'AutoGen.c':
                         continue
index b62a127..3cdb0df 100644 (file)
@@ -1782,8 +1782,10 @@ def CreatePcdCode(Info, AutoGenC, AutoGenH):
 #   @param      Info        The ModuleAutoGen object
 #   @param      AutoGenC    The TemplateString object for C code
 #   @param      AutoGenH    The TemplateString object for header file
+#   @param      UniGenCFlag     UniString is generated into AutoGen C file when it is set to True
+#   @param      UniGenBinBuffer Buffer to store uni string package data
 #
-def CreateUnicodeStringCode(Info, AutoGenC, AutoGenH):
+def CreateUnicodeStringCode(Info, AutoGenC, AutoGenH, UniGenCFlag, UniGenBinBuffer):
     WorkingDir = os.getcwd()
     os.chdir(Info.WorkspaceDir)
 
@@ -1823,13 +1825,15 @@ def CreateUnicodeStringCode(Info, AutoGenC, AutoGenH):
     else:
         ShellMode = False
 
-    Header, Code = GetStringFiles(Info.UnicodeFileList, SrcList, IncList, ['.uni', '.inf'], Info.Name, CompatibleMode, ShellMode)
-    AutoGenC.Append("\n//\n//Unicode String Pack Definition\n//\n")
-    AutoGenC.Append(Code)
-    AutoGenC.Append("\n")
+    Header, Code = GetStringFiles(Info.UnicodeFileList, SrcList, IncList, ['.uni', '.inf'], Info.Name, CompatibleMode, ShellMode, UniGenCFlag, UniGenBinBuffer)
+    if CompatibleMode or UniGenCFlag:
+        AutoGenC.Append("\n//\n//Unicode String Pack Definition\n//\n")
+        AutoGenC.Append(Code)
+        AutoGenC.Append("\n")
     AutoGenH.Append("\n//\n//Unicode String ID\n//\n")
     AutoGenH.Append(Header)
-    AutoGenH.Append("\n#define STRING_ARRAY_NAME %sStrings\n" % Info.Name)
+    if CompatibleMode or UniGenCFlag:
+        AutoGenH.Append("\n#define STRING_ARRAY_NAME %sStrings\n" % Info.Name)
     os.chdir(WorkingDir)
 
 ## Create common code
@@ -1890,8 +1894,10 @@ def CreateFooterCode(Info, AutoGenC, AutoGenH):
 #   @param      Info        The ModuleAutoGen object
 #   @param      AutoGenC    The TemplateString object for C code
 #   @param      AutoGenH    The TemplateString object for header file
+#   @param      UniGenCFlag     UniString is generated into AutoGen C file when it is set to True
+#   @param      UniGenBinBuffer Buffer to store uni string package data
 #
-def CreateCode(Info, AutoGenC, AutoGenH, StringH):
+def CreateCode(Info, AutoGenC, AutoGenH, StringH, UniGenCFlag, UniGenBinBuffer):
     CreateHeaderCode(Info, AutoGenC, AutoGenH)
 
     if Info.AutoGenVersion >= 0x00010005:
@@ -1908,7 +1914,7 @@ def CreateCode(Info, AutoGenC, AutoGenH, StringH):
         FileName = "%sStrDefs.h" % Info.Name
         StringH.Append(gAutoGenHeaderString.Replace({'FileName':FileName}))
         StringH.Append(gAutoGenHPrologueString.Replace({'File':'STRDEFS', 'Guid':Info.Guid.replace('-','_')}))
-        CreateUnicodeStringCode(Info, AutoGenC, StringH)
+        CreateUnicodeStringCode(Info, AutoGenC, StringH, UniGenCFlag, UniGenBinBuffer)
         StringH.Append("\n#endif\n")
         AutoGenH.Append('#include "%s"\n' % FileName)
 
@@ -1920,12 +1926,13 @@ def CreateCode(Info, AutoGenC, AutoGenH, StringH):
 
 ## Create the code file
 #
-#   @param      FilePath    The path of code file
-#   @param      Content     The content of code file
+#   @param      FilePath     The path of code file
+#   @param      Content      The content of code file
+#   @param      IsBinaryFile The flag indicating if the file is binary file or not
 #
 #   @retval     True        If file content is changed or file doesn't exist
 #   @retval     False       If the file exists and the content is not changed
 #
-def Generate(FilePath, Content):
-    return SaveFileOnChange(FilePath, Content, False)
+def Generate(FilePath, Content, IsBinaryFile):
+    return SaveFileOnChange(FilePath, Content, IsBinaryFile)
 
index 0f64444..a7f38b8 100644 (file)
@@ -18,6 +18,8 @@ import re
 import Common.EdkLogger as EdkLogger\r
 from Common.BuildToolError import *\r
 from UniClassObject import *\r
+from StringIO import StringIO\r
+from struct import pack\r
 \r
 ##\r
 # Static definitions\r
@@ -151,12 +153,14 @@ def CreateHFileHeader(BaseName):
 #\r
 # Create content of .h file\r
 #\r
-# @param BaseName:       The basename of strings\r
-# @param UniObjectClass: A UniObjectClass instance\r
+# @param BaseName:        The basename of strings\r
+# @param UniObjectClass   A UniObjectClass instance\r
+# @param IsCompatibleMode Compatible mode\r
+# @param UniGenCFlag      UniString is generated into AutoGen C file when it is set to True\r
 #\r
 # @retval Str:           A string of .h file content\r
 #\r
-def CreateHFileContent(BaseName, UniObjectClass):\r
+def CreateHFileContent(BaseName, UniObjectClass, IsCompatibleMode, UniGenCFlag):\r
     Str = ''\r
     ValueStartPtr = 60\r
     Line = COMMENT_DEFINE_STR + ' ' + LANGUAGE_NAME_STRING_NAME + ' ' * (ValueStartPtr - len(DEFINE_STR + LANGUAGE_NAME_STRING_NAME)) + DecToHexStr(0, 4) + COMMENT_NOT_REFERENCED\r
@@ -182,21 +186,24 @@ def CreateHFileContent(BaseName, UniObjectClass):
                     Line = COMMENT_DEFINE_STR + ' ' + Name + ' ' * (ValueStartPtr - len(DEFINE_STR + Name)) + DecToHexStr(Token, 4) + COMMENT_NOT_REFERENCED\r
             Str = WriteLine(Str, Line)\r
 \r
-    Str =  WriteLine(Str, '')\r
-    Str = WriteLine(Str, 'extern unsigned char ' + BaseName + 'Strings[];')\r
+    Str = WriteLine(Str, '')\r
+    if IsCompatibleMode or UniGenCFlag:\r
+        Str = WriteLine(Str, 'extern unsigned char ' + BaseName + 'Strings[];')\r
     return Str\r
 \r
 ## Create a complete .h file\r
 #\r
 # Create a complet .h file with file header and file content\r
 #\r
-# @param BaseName:       The basename of strings\r
-# @param UniObjectClass: A UniObjectClass instance\r
+# @param BaseName:        The basename of strings\r
+# @param UniObjectClass   A UniObjectClass instance\r
+# @param IsCompatibleMode Compatible mode\r
+# @param UniGenCFlag      UniString is generated into AutoGen C file when it is set to True\r
 #\r
 # @retval Str:           A string of complete .h file\r
 #\r
-def CreateHFile(BaseName, UniObjectClass):\r
-    HFile = WriteLine('', CreateHFileContent(BaseName, UniObjectClass))\r
+def CreateHFile(BaseName, UniObjectClass, IsCompatibleMode, UniGenCFlag):\r
+    HFile = WriteLine('', CreateHFileContent(BaseName, UniObjectClass, IsCompatibleMode, UniGenCFlag))\r
 \r
     return HFile\r
 \r
@@ -213,6 +220,15 @@ def CreateCFileHeader():
 \r
     return Str\r
 \r
+## Create a buffer to store all items in an array\r
+#\r
+# @param BinBuffer   Buffer to contain Binary data.\r
+# @param Array:      The array need to be formatted\r
+#\r
+def CreateBinBuffer(BinBuffer, Array):\r
+    for Item in Array:\r
+        BinBuffer.write(pack("B", int(Item,16)))\r
+\r
 ## Create a formatted string all items in an array\r
 #\r
 # Use ',' to join each item in an array, and break an new line when reaching the width (default is 16)\r
@@ -260,12 +276,14 @@ def CreateCFileStringValue(Value):
 #\r
 # Create content of .c file\r
 #\r
-# @param BaseName:       The basename of strings\r
-# @param UniObjectClass: A UniObjectClass instance\r
+# @param BaseName:        The basename of strings\r
+# @param UniObjectClass   A UniObjectClass instance\r
+# @param IsCompatibleMode Compatible mode\r
+# @param UniBinBuffer     UniBinBuffer to contain UniBinary data.\r
 #\r
 # @retval Str:           A string of .c file content\r
 #\r
-def CreateCFileContent(BaseName, UniObjectClass, IsCompatibleMode):\r
+def CreateCFileContent(BaseName, UniObjectClass, IsCompatibleMode, UniBinBuffer=None):\r
     #\r
     # Init array length\r
     #\r
@@ -280,9 +298,10 @@ def CreateCFileContent(BaseName, UniObjectClass, IsCompatibleMode):
         Language = UniObjectClass.LanguageDef[IndexI][0]\r
         LangPrintName = UniObjectClass.LanguageDef[IndexI][1]\r
 \r
+        StringBuffer = StringIO()\r
         StrStringValue = ''\r
         ArrayLength = 0\r
-        NumberOfUseOhterLangDef = 0\r
+        NumberOfUseOtherLangDef = 0\r
         Index = 0\r
         for IndexJ in range(1, len(UniObjectClass.OrderedStringList[UniObjectClass.LanguageDef[IndexI][0]])):\r
             Item = UniObjectClass.FindByToken(IndexJ, Language)\r
@@ -294,18 +313,19 @@ def CreateCFileContent(BaseName, UniObjectClass, IsCompatibleMode):
             UseOtherLangDef = Item.UseOtherLangDef\r
 \r
             if UseOtherLangDef != '' and Referenced:\r
-                NumberOfUseOhterLangDef = NumberOfUseOhterLangDef + 1\r
+                NumberOfUseOtherLangDef = NumberOfUseOtherLangDef + 1\r
                 Index = Index + 1\r
             else:\r
-                if NumberOfUseOhterLangDef > 0:\r
-                    StrStringValue = WriteLine(StrStringValue, CreateArrayItem([StringSkipType] + DecToHexList(NumberOfUseOhterLangDef, 4)))\r
-                    NumberOfUseOhterLangDef = 0\r
+                if NumberOfUseOtherLangDef > 0:\r
+                    StrStringValue = WriteLine(StrStringValue, CreateArrayItem([StringSkipType] + DecToHexList(NumberOfUseOtherLangDef, 4)))\r
+                    CreateBinBuffer (StringBuffer, ([StringSkipType] + DecToHexList(NumberOfUseOtherLangDef, 4)))\r
+                    NumberOfUseOtherLangDef = 0\r
                     ArrayLength = ArrayLength + 3\r
                 if Referenced and Item.Token > 0:\r
                     Index = Index + 1\r
                     StrStringValue = WriteLine(StrStringValue, "// %s: %s:%s" % (DecToHexStr(Index, 4), Name, DecToHexStr(Token, 4)))\r
                     StrStringValue = Write(StrStringValue, CreateCFileStringValue(Value))\r
-                    Offset = Offset + Length\r
+                    CreateBinBuffer (StringBuffer, [StringBlockType] + Value)\r
                     ArrayLength = ArrayLength + Item.Length + 1 # 1 is for the length of string type\r
 \r
         #\r
@@ -340,6 +360,15 @@ def CreateCFileContent(BaseName, UniObjectClass, IsCompatibleMode):
         # Add an EFI_HII_SIBT_END at last\r
         #\r
         Str = WriteLine(Str, '  ' + EFI_HII_SIBT_END + ",")\r
+        \r
+        #\r
+        # Create binary UNI string\r
+        #\r
+        if UniBinBuffer:\r
+            CreateBinBuffer (UniBinBuffer, List)\r
+            UniBinBuffer.write (StringBuffer.getvalue())\r
+            UniBinBuffer.write (pack("B", int(EFI_HII_SIBT_END,16)))\r
+        StringBuffer.close()\r
 \r
     #\r
     # Create line for string variable name\r
@@ -347,19 +376,18 @@ def CreateCFileContent(BaseName, UniObjectClass, IsCompatibleMode):
     #\r
     AllStr = WriteLine('', CHAR_ARRAY_DEFIN + ' ' + BaseName + COMMON_FILE_NAME + '[] = {\n' )\r
 \r
-    #\r
-    # Create FRAMEWORK_EFI_HII_PACK_HEADER in compatible mode\r
-    #\r
     if IsCompatibleMode:\r
+        #\r
+        # Create FRAMEWORK_EFI_HII_PACK_HEADER in compatible mode\r
+        #\r
         AllStr = WriteLine(AllStr, '// FRAMEWORK PACKAGE HEADER Length')\r
         AllStr = WriteLine(AllStr, CreateArrayItem(DecToHexList(TotalLength + 2)) + '\n')\r
         AllStr = WriteLine(AllStr, '// FRAMEWORK PACKAGE HEADER Type')\r
         AllStr = WriteLine(AllStr, CreateArrayItem(DecToHexList(2, 4)) + '\n')\r
-\r
-    #\r
-    # Create whole array length in UEFI mode\r
-    #\r
-    if not IsCompatibleMode:\r
+    else:\r
+        #\r
+        # Create whole array length in UEFI mode\r
+        #\r
         AllStr = WriteLine(AllStr, '// STRGATHER_OUTPUT_HEADER')\r
         AllStr = WriteLine(AllStr, CreateArrayItem(DecToHexList(TotalLength)) + '\n')\r
 \r
@@ -384,8 +412,9 @@ def CreateCFileEnd():
 #\r
 # Create a complete .c file\r
 #\r
-# @param BaseName:       The basename of strings\r
-# @param UniObjectClass: A UniObjectClass instance\r
+# @param BaseName:        The basename of strings\r
+# @param UniObjectClass   A UniObjectClass instance\r
+# @param IsCompatibleMode Compatible Mode\r
 #\r
 # @retval CFile:         A string of complete .c file\r
 #\r
@@ -472,7 +501,7 @@ def SearchString(UniObjectClass, FileList):
 # This function is used for UEFI2.1 spec\r
 #\r
 #\r
-def GetStringFiles(UniFilList, SourceFileList, IncludeList, SkipList, BaseName, IsCompatibleMode = False, ShellMode = False):\r
+def GetStringFiles(UniFilList, SourceFileList, IncludeList, SkipList, BaseName, IsCompatibleMode = False, ShellMode = False, UniGenCFlag = True, UniGenBinBuffer = None):\r
     Status = True\r
     ErrorMessage = ''\r
 \r
@@ -491,8 +520,12 @@ def GetStringFiles(UniFilList, SourceFileList, IncludeList, SkipList, BaseName,
 \r
     Uni = SearchString(Uni, FileList)\r
 \r
-    HFile = CreateHFile(BaseName, Uni)\r
-    CFile = CreateCFile(BaseName, Uni, IsCompatibleMode)\r
+    HFile = CreateHFile(BaseName, Uni, IsCompatibleMode, UniGenCFlag)\r
+    CFile = None\r
+    if IsCompatibleMode or UniGenCFlag:\r
+        CFile = CreateCFile(BaseName, Uni, IsCompatibleMode)\r
+    if UniGenBinBuffer:\r
+        CreateCFileContent(BaseName, Uni, IsCompatibleMode, UniGenBinBuffer)\r
 \r
     return HFile, CFile\r
 \r
index 94063ff..76dfbb6 100755 (executable)
@@ -694,6 +694,7 @@ class TemplateString(object):
     ## Constructor
     def __init__(self, Template=None):
         self.String = ''
+        self.IsBinary = False
         self._Template = Template
         self._TemplateSectionList = self._Parse(Template)
 
index 2f6ff0b..73e827a 100644 (file)
@@ -1321,6 +1321,9 @@ class InfBuildData(ModuleBuildClassObject):
             if self._Defs and 'PCI_DEVICE_ID' in self._Defs and 'PCI_VENDOR_ID' in self._Defs \
                and 'PCI_CLASS_CODE' in self._Defs:
                 self._BuildType = 'UEFI_OPTIONROM'
+            elif self._Defs and 'UEFI_HII_RESOURCE_SECTION' in self._Defs \
+               and self._Defs['UEFI_HII_RESOURCE_SECTION'] == 'TRUE':
+                self._BuildType = 'UEFI_HII'
             else:
                 self._BuildType = self._ModuleType.upper()
         else: