BaseTools: Update Trim to generate VfrBinOffset Binary
authorYonghong Zhu <yonghong.zhu@intel.com>
Thu, 28 Sep 2017 23:54:12 +0000 (07:54 +0800)
committerYonghong Zhu <yonghong.zhu@intel.com>
Tue, 5 Dec 2017 01:24:34 +0000 (09:24 +0800)
Its usage is
"Trim --Vfr-Uni-Offset -o $(OUTPUT_DIR)(+)$(MODULE_NAME)VfrOffset.sec
--ModuleName=$(MODULE_NAME) --DebugDir=$(DEBUG_DIR)"

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Liming Gao <liming.gao@intel.com>
Reviewed-by: Yonghong Zhu <yonghong.zhu@intel.com>
BaseTools/Source/Python/Trim/Trim.py

index 9ccc0273c254c63bb4c2da9b96bd8ea7978a861f..d1e40b025caa0f3f0b86068caea5e626e2f10734 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # Trim files preprocessed by compiler\r
 #\r
-# Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>\r
 # This program and the accompanying materials\r
 # are licensed and made available under the terms and conditions of the BSD License\r
 # which accompanies this distribution.  The full text of the license may be found at\r
@@ -17,6 +17,7 @@
 import Common.LongFilePathOs as os\r
 import sys\r
 import re\r
+import StringIO\r
 \r
 from optparse import OptionParser\r
 from optparse import make_option\r
@@ -29,7 +30,7 @@ from Common.LongFilePathSupport import OpenLongFilePath as open
 # Version and Copyright\r
 __version_number__ = ("0.10" + " " + gBUILD_VERSION)\r
 __version__ = "%prog Version " + __version_number__\r
-__copyright__ = "Copyright (c) 2007-2016, Intel Corporation. All rights reserved."\r
+__copyright__ = "Copyright (c) 2007-2017, Intel Corporation. All rights reserved."\r
 \r
 ## Regular expression for matching Line Control directive like "#line xxx"\r
 gLineControlDirective = re.compile('^\s*#(?:line)?\s+([0-9]+)\s+"*([^"]*)"')\r
@@ -430,6 +431,68 @@ def TrimAslFile(Source, Target, IncludePathFile):
     f.writelines(Lines)\r
     f.close()\r
 \r
+def GenerateVfrBinSec(ModuleName, DebugDir, OutputFile):\r
+    VfrNameList = []\r
+    if os.path.isdir(DebugDir):\r
+        for CurrentDir, Dirs, Files in os.walk(DebugDir):\r
+            for FileName in Files:\r
+                Name, Ext = os.path.splitext(FileName)\r
+                if Ext == '.lst':\r
+                    VfrNameList.append (Name + 'Bin')\r
+\r
+    VfrNameList.append (ModuleName + 'Strings')\r
+\r
+    EfiFileName = os.path.join(DebugDir, ModuleName + '.efi')\r
+    MapFileName = os.path.join(DebugDir, ModuleName + '.map')\r
+    VfrUniOffsetList = GetVariableOffset(MapFileName, EfiFileName, VfrNameList)\r
+\r
+    if not VfrUniOffsetList:\r
+        return\r
+\r
+    try:\r
+        fInputfile = open(OutputFile, "wb+", 0)\r
+    except:\r
+        EdkLogger.error("Trim", FILE_OPEN_FAILURE, "File open failed for %s" %OutputFile, None)\r
+\r
+    # Use a instance of StringIO to cache data\r
+    fStringIO = StringIO.StringIO('')\r
+\r
+    for Item in VfrUniOffsetList:\r
+        if (Item[0].find("Strings") != -1):\r
+            #\r
+            # UNI offset in image.\r
+            # GUID + Offset\r
+            # { 0x8913c5e0, 0x33f6, 0x4d86, { 0x9b, 0xf1, 0x43, 0xef, 0x89, 0xfc, 0x6, 0x66 } }\r
+            #\r
+            UniGuid = [0xe0, 0xc5, 0x13, 0x89, 0xf6, 0x33, 0x86, 0x4d, 0x9b, 0xf1, 0x43, 0xef, 0x89, 0xfc, 0x6, 0x66]\r
+            UniGuid = [chr(ItemGuid) for ItemGuid in UniGuid]\r
+            fStringIO.write(''.join(UniGuid))\r
+            UniValue = pack ('Q', int (Item[1], 16))\r
+            fStringIO.write (UniValue)\r
+        else:\r
+            #\r
+            # VFR binary offset in image.\r
+            # GUID + Offset\r
+            # { 0xd0bc7cb4, 0x6a47, 0x495f, { 0xaa, 0x11, 0x71, 0x7, 0x46, 0xda, 0x6, 0xa2 } };\r
+            #\r
+            VfrGuid = [0xb4, 0x7c, 0xbc, 0xd0, 0x47, 0x6a, 0x5f, 0x49, 0xaa, 0x11, 0x71, 0x7, 0x46, 0xda, 0x6, 0xa2]\r
+            VfrGuid = [chr(ItemGuid) for ItemGuid in VfrGuid]\r
+            fStringIO.write(''.join(VfrGuid))\r
+            type (Item[1])\r
+            VfrValue = pack ('Q', int (Item[1], 16))\r
+            fStringIO.write (VfrValue)\r
+\r
+    #\r
+    # write data into file.\r
+    #\r
+    try :\r
+        fInputfile.write (fStringIO.getvalue())\r
+    except:\r
+        EdkLogger.error("Trim", FILE_WRITE_FAILURE, "Write data to file %s failed, please check whether the file been locked or using by other applications." %OutputFile, None)\r
+\r
+    fStringIO.close ()\r
+    fInputfile.close ()\r
+\r
 ## Trim EDK source code file(s)\r
 #\r
 #\r
@@ -535,6 +598,8 @@ def Options():
                           help="The input file is preprocessed source code, including C or assembly code"),\r
         make_option("-r", "--vfr-file", dest="FileType", const="Vfr", action="store_const",\r
                           help="The input file is preprocessed VFR file"),\r
+        make_option("--Vfr-Uni-Offset", dest="FileType", const="VfrOffsetBin", action="store_const",\r
+                          help="The input file is EFI image"),\r
         make_option("-a", "--asl-file", dest="FileType", const="Asl", action="store_const",\r
                           help="The input file is ASL file"),\r
         make_option("-8", "--Edk-source-code", dest="FileType", const="EdkSourceCode", action="store_const",\r
@@ -549,6 +614,9 @@ def Options():
                           help="The input file is include path list to search for ASL include file"),\r
         make_option("-o", "--output", dest="OutputFile",\r
                           help="File to store the trimmed content"),\r
+        make_option("--ModuleName", dest="ModuleName", help="The module's BASE_NAME"),\r
+        make_option("--DebugDir", dest="DebugDir",\r
+                          help="Debug Output directory to store the output files"),\r
         make_option("-v", "--verbose", dest="LogLevel", action="store_const", const=EdkLogger.VERBOSE,\r
                           help="Run verbosely"),\r
         make_option("-d", "--debug", dest="LogLevel", type="int",\r
@@ -559,7 +627,7 @@ def Options():
     ]\r
 \r
     # use clearer usage to override default usage message\r
-    UsageString = "%prog [-s|-r|-a] [-c] [-v|-d <debug_level>|-q] [-i <include_path_file>] [-o <output_file>] <input_file>"\r
+    UsageString = "%prog [-s|-r|-a|--Vfr-Uni-Offset] [-c] [-v|-d <debug_level>|-q] [-i <include_path_file>] [-o <output_file>] [--ModuleName <ModuleName>] [--DebugDir <DebugDir>] [<input_file>]"\r
 \r
     Parser = OptionParser(description=__copyright__, version=__version__, option_list=OptionList, usage=UsageString)\r
     Parser.set_defaults(FileType="Vfr")\r
@@ -569,6 +637,11 @@ def Options():
     Options, Args = Parser.parse_args()\r
 \r
     # error check\r
+    if Options.FileType == 'VfrOffsetBin':\r
+        if len(Args) == 0:\r
+            return Options, ''\r
+        elif len(Args) > 1:\r
+            EdkLogger.error("Trim", OPTION_NOT_SUPPORTED, ExtraData=Parser.get_usage())\r
     if len(Args) == 0:\r
         EdkLogger.error("Trim", OPTION_MISSING, ExtraData=Parser.get_usage())\r
     if len(Args) > 1:\r
@@ -608,6 +681,8 @@ def Main():
             TrimAslFile(InputFile, CommandOptions.OutputFile, CommandOptions.IncludePathFile)\r
         elif CommandOptions.FileType == "EdkSourceCode":\r
             TrimEdkSources(InputFile, CommandOptions.OutputFile)\r
+        elif CommandOptions.FileType == "VfrOffsetBin":\r
+            GenerateVfrBinSec(CommandOptions.ModuleName, CommandOptions.DebugDir, CommandOptions.OutputFile)\r
         else :\r
             if CommandOptions.OutputFile == None:\r
                 CommandOptions.OutputFile = os.path.splitext(InputFile)[0] + '.iii'\r