+ \r
+ ## __GetBuildOutputMapFileVfrUniInfo() method\r
+ #\r
+ # Find the offset of UNI/INF object offset in the EFI image file.\r
+ #\r
+ # @param self The object pointer\r
+ # @param VfrUniBaseName A name list contain the UNI/INF object name.\r
+ # @retval RetValue A list contain offset of UNI/INF object.\r
+ # \r
+ def __GetBuildOutputMapFileVfrUniInfo(self, VfrUniBaseName):\r
+ \r
+ RetValue = []\r
+ \r
+ MapFileName = os.path.join(self.EfiOutputPath, self.BaseName + ".map")\r
+ try:\r
+ fInputfile = open(MapFileName, "r", 0)\r
+ try:\r
+ FileLinesList = fInputfile.readlines()\r
+ except:\r
+ EdkLogger.error("GenFds", FILE_READ_FAILURE, "File read failed for %s" %MapFileName,None)\r
+ finally:\r
+ fInputfile.close()\r
+ except:\r
+ EdkLogger.error("GenFds", FILE_OPEN_FAILURE, "File open failed for %s" %MapFileName,None)\r
+ \r
+ IsHex = False\r
+ for eachLine in FileLinesList:\r
+ for eachName in VfrUniBaseName.values():\r
+ if eachLine.find(eachName) != -1:\r
+ eachLine = eachLine.strip()\r
+ Element = eachLine.split()\r
+ #\r
+ # MSFT/ICC/EBC map file\r
+ #\r
+ if (len(Element) == 4):\r
+ try:\r
+ int (Element[2], 16)\r
+ IsHex = True\r
+ except:\r
+ IsHex = False\r
+ \r
+ if IsHex:\r
+ RetValue.append((eachName, Element[2]))\r
+ IsHex = False\r
+ #\r
+ # GCC map file\r
+ #\r
+ elif (len(Element) == 2) and Element[0].startswith("0x"):\r
+ RetValue.append((eachName, Element[0]))\r
+ \r
+ return RetValue\r
+ \r
+ ## __GenUniVfrOffsetFile() method\r
+ #\r
+ # Generate the offset file for the module which contain VFR or UNI file.\r
+ #\r
+ # @param self The object pointer\r
+ # @param VfrUniOffsetList A list contain the VFR/UNI offsets in the EFI image file.\r
+ # @param UniVfrOffsetFileName The output offset file name.\r
+ #\r
+ def __GenUniVfrOffsetFile(self, VfrUniOffsetList, UniVfrOffsetFileName):\r
+ \r
+ try:\r
+ fInputfile = open(UniVfrOffsetFileName, "wb+", 0)\r
+ except:\r
+ EdkLogger.error("GenFds", FILE_OPEN_FAILURE, "File open failed for %s" %UniVfrOffsetFileName,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("GenFds", FILE_WRITE_FAILURE, "Write data to file %s failed, please check whether the file been locked or using by other applications." %UniVfrOffsetFileName,None)\r
+ \r
+ fStringIO.close ()\r
+ fInputfile.close ()\r
+ \r
+ \r
+ \r
+ \r
+ \r
+ \r
+ \r
+ \r