Sync EDKII BaseTools to BaseTools project r1903.
authorlgao4 <lgao4@6f19259b-4bc3-4df7-8a09-765794883524>
Sun, 28 Feb 2010 23:39:39 +0000 (23:39 +0000)
committerlgao4 <lgao4@6f19259b-4bc3-4df7-8a09-765794883524>
Sun, 28 Feb 2010 23:39:39 +0000 (23:39 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk@10123 6f19259b-4bc3-4df7-8a09-765794883524

169 files changed:
edk2/BaseTools/Bin/Win32/BootSectImage.exe
edk2/BaseTools/Bin/Win32/EfiLdrImage.exe
edk2/BaseTools/Bin/Win32/EfiRom.exe
edk2/BaseTools/Bin/Win32/Fpd2Dsc.exe
edk2/BaseTools/Bin/Win32/GenBootSector.exe
edk2/BaseTools/Bin/Win32/GenCrc32.exe
edk2/BaseTools/Bin/Win32/GenDepex.exe
edk2/BaseTools/Bin/Win32/GenFds.exe
edk2/BaseTools/Bin/Win32/GenFfs.exe
edk2/BaseTools/Bin/Win32/GenFv.exe
edk2/BaseTools/Bin/Win32/GenFw.exe
edk2/BaseTools/Bin/Win32/GenPage.exe
edk2/BaseTools/Bin/Win32/GenPatchPcdTable.exe [new file with mode: 0644]
edk2/BaseTools/Bin/Win32/GenSec.exe
edk2/BaseTools/Bin/Win32/GenVtf.exe
edk2/BaseTools/Bin/Win32/LzmaCompress.exe
edk2/BaseTools/Bin/Win32/MigrationMsa2Inf.exe
edk2/BaseTools/Bin/Win32/PatchPcdValue.exe [new file with mode: 0644]
edk2/BaseTools/Bin/Win32/Spd2Dec.exe
edk2/BaseTools/Bin/Win32/Split.exe
edk2/BaseTools/Bin/Win32/TargetTool.exe
edk2/BaseTools/Bin/Win32/TianoCompress.exe
edk2/BaseTools/Bin/Win32/Trim.exe
edk2/BaseTools/Bin/Win32/VfrCompile.exe
edk2/BaseTools/Bin/Win32/VolInfo.exe
edk2/BaseTools/Bin/Win32/build.exe
edk2/BaseTools/Conf/build_rule.template
edk2/BaseTools/Conf/tools_def.template
edk2/BaseTools/Source/C/BootSectImage/bootsectimage.c
edk2/BaseTools/Source/C/Common/EfiUtilityMsgs.c
edk2/BaseTools/Source/C/Common/EfiUtilityMsgs.h
edk2/BaseTools/Source/C/Common/ParseInf.c
edk2/BaseTools/Source/C/EfiLdrImage/EfiLdrImage.c
edk2/BaseTools/Source/C/EfiRom/EfiRom.c
edk2/BaseTools/Source/C/GenBootSector/GenBootSector.c
edk2/BaseTools/Source/C/GenCrc32/GenCrc32.c
edk2/BaseTools/Source/C/GenFfs/GenFfs.c
edk2/BaseTools/Source/C/GenFv/GenFv.c
edk2/BaseTools/Source/C/GenFv/GenFvInternalLib.c
edk2/BaseTools/Source/C/GenFv/GenFvInternalLib.h
edk2/BaseTools/Source/C/GenFw/GenFw.c
edk2/BaseTools/Source/C/GenFw/elf32.h
edk2/BaseTools/Source/C/GenFw/elf64.h
edk2/BaseTools/Source/C/GenFw/elf_common.h
edk2/BaseTools/Source/C/GenPage/GenPage.c
edk2/BaseTools/Source/C/GenSec/GenSec.c
edk2/BaseTools/Source/C/GenVtf/GenVtf.c
edk2/BaseTools/Source/C/GnuGenBootSector/GnuGenBootSector.c
edk2/BaseTools/Source/C/Include/Common/PiFirmwareFile.h
edk2/BaseTools/Source/C/Include/Common/UefiInternalFormRepresentation.h
edk2/BaseTools/Source/C/Makefiles/NmakeSubdirs.bat
edk2/BaseTools/Source/C/Makefiles/app.makefile
edk2/BaseTools/Source/C/Makefiles/footer.makefile
edk2/BaseTools/Source/C/Makefiles/header.makefile
edk2/BaseTools/Source/C/Makefiles/lib.makefile
edk2/BaseTools/Source/C/Makefiles/ms.app
edk2/BaseTools/Source/C/Makefiles/ms.common
edk2/BaseTools/Source/C/Makefiles/ms.lib
edk2/BaseTools/Source/C/Makefiles/ms.rule
edk2/BaseTools/Source/C/PyEfiCompressor/EfiCompressor.c
edk2/BaseTools/Source/C/PyEfiCompressor/Makefile
edk2/BaseTools/Source/C/PyUtility/Makefile
edk2/BaseTools/Source/C/PyUtility/PyUtility.c
edk2/BaseTools/Source/C/Split/Split.c
edk2/BaseTools/Source/C/TianoCompress/TianoCompress.c
edk2/BaseTools/Source/C/VfrCompile/EfiVfr.h
edk2/BaseTools/Source/C/VfrCompile/VfrCompiler.cpp
edk2/BaseTools/Source/C/VfrCompile/VfrCompiler.h
edk2/BaseTools/Source/C/VfrCompile/VfrError.cpp
edk2/BaseTools/Source/C/VfrCompile/VfrError.h
edk2/BaseTools/Source/C/VfrCompile/VfrFormPkg.cpp
edk2/BaseTools/Source/C/VfrCompile/VfrFormPkg.h
edk2/BaseTools/Source/C/VfrCompile/VfrSyntax.g
edk2/BaseTools/Source/C/VfrCompile/VfrUtilityLib.cpp
edk2/BaseTools/Source/C/VfrCompile/VfrUtilityLib.h
edk2/BaseTools/Source/C/VolInfo/VolInfo.c
edk2/BaseTools/Source/Python/AutoGen/AutoGen.py
edk2/BaseTools/Source/Python/AutoGen/GenC.py
edk2/BaseTools/Source/Python/AutoGen/GenDepex.py
edk2/BaseTools/Source/Python/AutoGen/UniClassObject.py
edk2/BaseTools/Source/Python/AutoGen/__init__.py
edk2/BaseTools/Source/Python/Common/BuildToolError.py
edk2/BaseTools/Source/Python/Common/DataType.py
edk2/BaseTools/Source/Python/Common/EdkIIWorkspaceBuild.py
edk2/BaseTools/Source/Python/Common/FdfParserLite.py
edk2/BaseTools/Source/Python/Common/InfClassObject.py
edk2/BaseTools/Source/Python/Common/InfClassObjectLight.py
edk2/BaseTools/Source/Python/Common/Misc.py
edk2/BaseTools/Source/Python/Common/Parsing.py
edk2/BaseTools/Source/Python/Common/__init__.py
edk2/BaseTools/Source/Python/CommonDataClass/FdfClass.py
edk2/BaseTools/Source/Python/CommonDataClass/ModuleClass.py
edk2/BaseTools/Source/Python/CommonDataClass/__init__.py
edk2/BaseTools/Source/Python/Ecc/C.g
edk2/BaseTools/Source/Python/Ecc/CLexer.py
edk2/BaseTools/Source/Python/Ecc/CParser.py
edk2/BaseTools/Source/Python/Ecc/Check.py
edk2/BaseTools/Source/Python/Ecc/Ecc.py
edk2/BaseTools/Source/Python/Ecc/EccToolError.py
edk2/BaseTools/Source/Python/Ecc/ParserWarning.py
edk2/BaseTools/Source/Python/Ecc/__init__.py
edk2/BaseTools/Source/Python/Ecc/c.py
edk2/BaseTools/Source/Python/Ecc/exception.xml
edk2/BaseTools/Source/Python/Eot/CLexer.py [new file with mode: 0644]
edk2/BaseTools/Source/Python/Eot/CParser.py [new file with mode: 0644]
edk2/BaseTools/Source/Python/Eot/CodeFragment.py [new file with mode: 0644]
edk2/BaseTools/Source/Python/Eot/CodeFragmentCollector.py [new file with mode: 0644]
edk2/BaseTools/Source/Python/Eot/Database.py [new file with mode: 0644]
edk2/BaseTools/Source/Python/Eot/EfiCompressor.pyd [new file with mode: 0644]
edk2/BaseTools/Source/Python/Eot/Eot.py [new file with mode: 0644]
edk2/BaseTools/Source/Python/Eot/EotGlobalData.py [new file with mode: 0644]
edk2/BaseTools/Source/Python/Eot/EotToolError.py [new file with mode: 0644]
edk2/BaseTools/Source/Python/Eot/FileProfile.py [new file with mode: 0644]
edk2/BaseTools/Source/Python/Eot/FvImage.py [new file with mode: 0644]
edk2/BaseTools/Source/Python/Eot/InfParserLite.py [new file with mode: 0644]
edk2/BaseTools/Source/Python/Eot/LzmaCompressor.pyd [new file with mode: 0644]
edk2/BaseTools/Source/Python/Eot/Parser.py [new file with mode: 0644]
edk2/BaseTools/Source/Python/Eot/ParserWarning.py [new file with mode: 0644]
edk2/BaseTools/Source/Python/Eot/Report.py [new file with mode: 0644]
edk2/BaseTools/Source/Python/Eot/__init__.py [new file with mode: 0644]
edk2/BaseTools/Source/Python/Eot/c.py [new file with mode: 0644]
edk2/BaseTools/Source/Python/Fdb/__init__.py
edk2/BaseTools/Source/Python/FixFlash/__init__.py
edk2/BaseTools/Source/Python/GenFds/CompressSection.py
edk2/BaseTools/Source/Python/GenFds/DepexSection.py
edk2/BaseTools/Source/Python/GenFds/EfiSection.py
edk2/BaseTools/Source/Python/GenFds/FdfParser.py
edk2/BaseTools/Source/Python/GenFds/FfsFileStatement.py
edk2/BaseTools/Source/Python/GenFds/FfsInfStatement.py
edk2/BaseTools/Source/Python/GenFds/Fv.py
edk2/BaseTools/Source/Python/GenFds/FvImageSection.py
edk2/BaseTools/Source/Python/GenFds/GenFds.py
edk2/BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py
edk2/BaseTools/Source/Python/GenFds/GuidSection.py
edk2/BaseTools/Source/Python/GenFds/Section.py
edk2/BaseTools/Source/Python/GenFds/__init__.py
edk2/BaseTools/Source/Python/GenPatchPcdTable/GenPatchPcdTable.py [new file with mode: 0644]
edk2/BaseTools/Source/Python/GenPatchPcdTable/__init__.py [new file with mode: 0644]
edk2/BaseTools/Source/Python/Makefile
edk2/BaseTools/Source/Python/MigrationMsa2Inf/MigrationMsa2Inf.py
edk2/BaseTools/Source/Python/MigrationMsa2Inf/__init__.py
edk2/BaseTools/Source/Python/MkBOM/__init__.py
edk2/BaseTools/Source/Python/PackagingTool/InstallPkg.py
edk2/BaseTools/Source/Python/PackagingTool/MkPkg.py
edk2/BaseTools/Source/Python/PackagingTool/RmPkg.py
edk2/BaseTools/Source/Python/PatchPcdValue/PatchPcdValue.py [new file with mode: 0644]
edk2/BaseTools/Source/Python/PatchPcdValue/__init__.py [new file with mode: 0644]
edk2/BaseTools/Source/Python/Table/TableEotReport.py
edk2/BaseTools/Source/Python/Table/TableQuery.py
edk2/BaseTools/Source/Python/Table/TableReport.py
edk2/BaseTools/Source/Python/Table/__init__.py
edk2/BaseTools/Source/Python/TargetTool/TargetTool.py
edk2/BaseTools/Source/Python/TargetTool/__init__.py
edk2/BaseTools/Source/Python/Trim/Trim.py
edk2/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py
edk2/BaseTools/Source/Python/Workspace/__init__.py
edk2/BaseTools/Source/Python/build/BuildReport.py [new file with mode: 0644]
edk2/BaseTools/Source/Python/build/__init__.py
edk2/BaseTools/Source/Python/build/build.py
edk2/BaseTools/Source/Python/fpd2dsc/__init__.py
edk2/BaseTools/Source/Python/fpd2dsc/fpd2dsc.py
edk2/BaseTools/Source/Python/msa2inf/ConvertModule.py
edk2/BaseTools/Source/Python/msa2inf/StoreInf.py
edk2/BaseTools/Source/Python/msa2inf/__init__.py
edk2/BaseTools/Source/Python/sitecustomize.py
edk2/BaseTools/Source/Python/spd2dec/__init__.py
edk2/BaseTools/UserManuals/Build_Utility_Man_Page.rtf
edk2/BaseTools/UserManuals/GenVtf_Utility_Man_Page.rtf
edk2/BaseTools/gcc/mingw-gcc-build.py

index 454aa34..06cdd4e 100755 (executable)
Binary files a/edk2/BaseTools/Bin/Win32/BootSectImage.exe and b/edk2/BaseTools/Bin/Win32/BootSectImage.exe differ
index cfa5475..6c80b40 100755 (executable)
Binary files a/edk2/BaseTools/Bin/Win32/EfiLdrImage.exe and b/edk2/BaseTools/Bin/Win32/EfiLdrImage.exe differ
index 399b2d8..a36b64a 100755 (executable)
Binary files a/edk2/BaseTools/Bin/Win32/EfiRom.exe and b/edk2/BaseTools/Bin/Win32/EfiRom.exe differ
index 59212c5..55f1a69 100755 (executable)
Binary files a/edk2/BaseTools/Bin/Win32/Fpd2Dsc.exe and b/edk2/BaseTools/Bin/Win32/Fpd2Dsc.exe differ
index e618ad1..7d3b398 100755 (executable)
Binary files a/edk2/BaseTools/Bin/Win32/GenBootSector.exe and b/edk2/BaseTools/Bin/Win32/GenBootSector.exe differ
index 3e4b5e5..a77006e 100755 (executable)
Binary files a/edk2/BaseTools/Bin/Win32/GenCrc32.exe and b/edk2/BaseTools/Bin/Win32/GenCrc32.exe differ
index 3959a80..04c6e71 100755 (executable)
Binary files a/edk2/BaseTools/Bin/Win32/GenDepex.exe and b/edk2/BaseTools/Bin/Win32/GenDepex.exe differ
index 65322ef..d9b5169 100755 (executable)
Binary files a/edk2/BaseTools/Bin/Win32/GenFds.exe and b/edk2/BaseTools/Bin/Win32/GenFds.exe differ
index bc3e447..32c8139 100755 (executable)
Binary files a/edk2/BaseTools/Bin/Win32/GenFfs.exe and b/edk2/BaseTools/Bin/Win32/GenFfs.exe differ
index 485fa10..df202d3 100755 (executable)
Binary files a/edk2/BaseTools/Bin/Win32/GenFv.exe and b/edk2/BaseTools/Bin/Win32/GenFv.exe differ
index 724b501..7a816a2 100755 (executable)
Binary files a/edk2/BaseTools/Bin/Win32/GenFw.exe and b/edk2/BaseTools/Bin/Win32/GenFw.exe differ
index 0c47f3f..0dd72b8 100755 (executable)
Binary files a/edk2/BaseTools/Bin/Win32/GenPage.exe and b/edk2/BaseTools/Bin/Win32/GenPage.exe differ
diff --git a/edk2/BaseTools/Bin/Win32/GenPatchPcdTable.exe b/edk2/BaseTools/Bin/Win32/GenPatchPcdTable.exe
new file mode 100644 (file)
index 0000000..437ee12
Binary files /dev/null and b/edk2/BaseTools/Bin/Win32/GenPatchPcdTable.exe differ
index 62adbfa..62b04ee 100755 (executable)
Binary files a/edk2/BaseTools/Bin/Win32/GenSec.exe and b/edk2/BaseTools/Bin/Win32/GenSec.exe differ
index a222d5e..ee60e62 100755 (executable)
Binary files a/edk2/BaseTools/Bin/Win32/GenVtf.exe and b/edk2/BaseTools/Bin/Win32/GenVtf.exe differ
index b280fb2..5397a5c 100644 (file)
Binary files a/edk2/BaseTools/Bin/Win32/LzmaCompress.exe and b/edk2/BaseTools/Bin/Win32/LzmaCompress.exe differ
index 089252d..bb3be94 100755 (executable)
Binary files a/edk2/BaseTools/Bin/Win32/MigrationMsa2Inf.exe and b/edk2/BaseTools/Bin/Win32/MigrationMsa2Inf.exe differ
diff --git a/edk2/BaseTools/Bin/Win32/PatchPcdValue.exe b/edk2/BaseTools/Bin/Win32/PatchPcdValue.exe
new file mode 100644 (file)
index 0000000..27a4f1f
Binary files /dev/null and b/edk2/BaseTools/Bin/Win32/PatchPcdValue.exe differ
index e1474b6..7c16177 100755 (executable)
Binary files a/edk2/BaseTools/Bin/Win32/Spd2Dec.exe and b/edk2/BaseTools/Bin/Win32/Spd2Dec.exe differ
index 3e02697..ce172e9 100755 (executable)
Binary files a/edk2/BaseTools/Bin/Win32/Split.exe and b/edk2/BaseTools/Bin/Win32/Split.exe differ
index b0c6cde..ba06532 100755 (executable)
Binary files a/edk2/BaseTools/Bin/Win32/TargetTool.exe and b/edk2/BaseTools/Bin/Win32/TargetTool.exe differ
index f9894b0..58afbab 100755 (executable)
Binary files a/edk2/BaseTools/Bin/Win32/TianoCompress.exe and b/edk2/BaseTools/Bin/Win32/TianoCompress.exe differ
index 9777b80..8bfdbb3 100755 (executable)
Binary files a/edk2/BaseTools/Bin/Win32/Trim.exe and b/edk2/BaseTools/Bin/Win32/Trim.exe differ
index a193e5b..dfbff8c 100755 (executable)
Binary files a/edk2/BaseTools/Bin/Win32/VfrCompile.exe and b/edk2/BaseTools/Bin/Win32/VfrCompile.exe differ
index 32e5218..915ec65 100755 (executable)
Binary files a/edk2/BaseTools/Bin/Win32/VolInfo.exe and b/edk2/BaseTools/Bin/Win32/VolInfo.exe differ
index 02827fe..5bf7135 100755 (executable)
Binary files a/edk2/BaseTools/Bin/Win32/build.exe and b/edk2/BaseTools/Bin/Win32/build.exe differ
index 7e5d4aa..0f2921c 100644 (file)
@@ -1,5 +1,5 @@
 #\r
-#  Copyright (c) 2007-2009, Intel Corporation\r
+#  Copyright (c) 2007-2010, Intel Corporation\r
 #  Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.\r
 #  All rights reserved. This program and the accompanying materials\r
 #  are licensed and made available under the terms and conditions of the BSD License\r
 \r
     <Command.GCC>\r
         "$(DLINK)" -o ${dst} $(DLINK_FLAGS) -\( $(DLINK_SPATH) @$(STATIC_LIBRARY_FILES_LIST) -\) $(DLINK2_FLAGS)\r
-        "$(OBJCOPY)" --only-keep-debug ${dst} $(DEBUG_DIR)(+)$(MODULE_NAME).pdb\r
-        "$(OBJCOPY)" -S ${dst}\r
         "$(OBJCOPY)" $(OBJCOPY_FLAGS) ${dst}\r
 \r
     <Command.RVCT>\r
     <OutputFile>\r
         $(DEBUG_DIR)(+)$(MODULE_NAME).efi\r
 \r
-    <Command.MSFT, Command.INTEL, Command.GCC, Command.RVCT>      \r
+    <Command.MSFT, Command.INTEL, Command.RVCT>  \r
+        GenFw -e $(MODULE_TYPE) -o ${dst} ${src}\r
+        $(CP) ${dst} $(OUTPUT_DIR)\r
+        $(CP) ${dst} $(BIN_DIR)\r
+        -$(CP) $(DEBUG_DIR)(+)*.map $(OUTPUT_DIR)\r
+\r
+    <Command.GCC>\r
+        $(OBJCOPY) --only-keep-debug ${src} $(BIN_DIR)(+)$(MODULE_NAME).debug\r
+        $(OBJCOPY) --strip-unneeded ${src}\r
+        $(OBJCOPY) --add-gnu-debuglink=$(BIN_DIR)(+)$(MODULE_NAME).debug ${src}\r
         GenFw -e $(MODULE_TYPE) -o ${dst} ${src}\r
         $(CP) ${dst} $(OUTPUT_DIR)\r
         $(CP) ${dst} $(BIN_DIR)\r
     <InputFile>\r
         *.mcb\r
 \r
+    <ExtraDependency>\r
+        $(MAKE_FILE)\r
+\r
     <OutputFile>\r
         $(OUTPUT_DIR)(+)$(MODULE_NAME).bin\r
 \r
index bb0cead..e797f15 100644 (file)
@@ -1,5 +1,5 @@
 #\r
-#  Copyright (c) 2006-2009, Intel Corporation\r
+#  Copyright (c) 2006-2010, Intel Corporation\r
 #  Portions copyright (c) 2008-2009 Apple Inc. All rights reserved.\r
 #\r
 #  All rights reserved. This program and the accompanying materials\r
@@ -27,6 +27,19 @@ DEFINE VS2005x86_DLL    = C:\Program Files (x86)\Microsoft Visual Studio 8\Commo
 DEFINE VS2005x86_BINX64 = DEF(VS2005x86_BIN)\x86_amd64\r
 DEFINE VS2005x86_BIN64  = DEF(VS2005x86_BIN)\x86_ia64\r
 \r
+DEFINE VS2008_BIN      = C:\Program Files\Microsoft Visual Studio 9.0\Vc\bin\r
+DEFINE VS2008_DLL      = C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\r
+DEFINE VS2008_BINX64   = DEF(VS2008_BIN)\x86_amd64\r
+DEFINE VS2008_BIN64    = DEF(VS2008_BIN)\x86_ia64\r
+\r
+DEFINE VS2008x86_BIN    = C:\Program Files (x86)\Microsoft Visual Studio 9.0\Vc\bin\r
+DEFINE VS2008x86_DLL    = C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE\r
+DEFINE VS2008x86_BINX64 = DEF(VS2008x86_BIN)\x86_amd64\r
+DEFINE VS2008x86_BIN64  = DEF(VS2008x86_BIN)\x86_ia64\r
+\r
+DEFINE WINSDK_VERSION   = v6.0A\r
+DEFINE WINSDK_BIN       = c:\Program Files\Microsoft SDKs\Windows\DEF(WINSDK_VERSION)\bin\r
+DEFINE WINSDKx86_BIN    = c:\Program Files (x86)\Microsoft SDKs\Windows\DEF(WINSDK_VERSION)\bin\r
 \r
 # These defines are needed for certain Microsoft Visual Studio tools that\r
 # are used by other toolchains.  An example is that ICC on Windows normally\r
@@ -158,6 +171,7 @@ DEFINE ARMGCC_BIN              = /
 # =====================\r
 #   VS2003                 - win32 - Microsoft Visual Studio .NET 2003, Intel EBC, Intel ASL\r
 #   VS2005                 - win32 - Microsoft Visual Studio 2005 Team Suite Edition, Intel EBC, Intel ASL (also compatible with VS 2005 Express, Standard, and Pro)\r
+#   VS2008                 - win32 - Microsoft Visual Studio 2008 Team Suite with Intel ASL\r
 #   DDK3790                - win32 - Microsoft Windows DDK 3790.1830, Intel EBC, Intel ASL\r
 #   UNIXGCC                - UNIX GCC, No EBC, Intel ASL\r
 #   ELFGCC                 - Linux ELF GCC, No EBC, Intel ASL\r
@@ -166,12 +180,15 @@ DEFINE ARMGCC_BIN              = /
 #   MYTOOLS                - win32 - VS2005 for IA32/X64, WINDDK 3790.1830 for IPF, Intel EBC, Intel ASL\r
 #   VS2003xASL             - win32 - Microsoft Visual Studio .NET 2003, Intel EBC, Microsoft ASL\r
 #   VS2005xASL             - win32 - Microsoft Visual Studio 2005 Team Suite Edition, Intel EBC, Microsoft ASL\r
+#   VS2008xASL             - win32 - Microsoft Visual Studio 2008 Team Suite with Microsoft ASL\r
 #   DDK3790xASL            - win32 - Microsoft Windows DDK 3790.1830, Intel EBC, Microsoft ASL\r
 #   CYGGCCxASL             - win32 - CygWin GCC, Intel EBC, Microsoft ASL\r
 #   ICCxASL                - win32 - Intel C Compiler V9.1, Intel EBC, Microsoft ASL\r
 #   VS2005x86              - win64 - Microsoft Visual Studio 2005 Team Suite Edition (x86), Intel EBC, Intel ASL (also compatible with VS 2005 Express, Standard, and Pro)\r
+#   VS2008x86              - Microsoft Visual Studio 2008 (x86) w/ Intel ASL\r
 #   ICCx86                 - win64 - Intel C Compiler V9.1 (x86), Intel EBC, Intel ASL\r
 #   VS2005x86xASL          - win64 - Microsoft Visual Studio 2005 Team Suite Edition (x86), Intel EBC, Microsoft ASL (also compatible with VS 2005 Express, Standard, and Pro)\r
+#   VS2008x86xASL          - Microsoft Visual Studio 2008 (x86) w/ Microsoft ASL\r
 #   ICCx86xASL             - win64 - Intel C Compiler V9.1 (x86), Intel EBC, Microsoft ASL\r
 #   CYGGCCx86              - win64 - CygWin GCC (x86), Intel EBC (x86), Intel ASL\r
 #   CYGGCCx86xASL          - win64 - CygWin GCC (x86), Intel EBC (x86), Microsoft ASL\r
@@ -853,6 +870,454 @@ RELEASE_VS2005x86xASL_IPF_DLINK_FLAGS  = /NOLOGO /NODEFAULTLIB /LTCG /DLL /OPT:R
 *_VS2005x86xASL_EBC_SLINK_FLAGS         = /lib /NOLOGO /MACHINE:EBC\r
 *_VS2005x86xASL_EBC_DLINK_FLAGS         = "C:\Program Files (x86)\Intel\EBC\Lib\EbcLib.lib" /NOLOGO /NODEFAULTLIB /MACHINE:EBC /OPT:REF /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /MAP\r
 \r
+\r
+\r
+####################################################################################\r
+#\r
+# Microsoft Visual Studio 2008\r
+#\r
+#   VS2008  - Microsoft Visual Studio 2005 All Edition, including Standard, Professional, Express, TeamSuite\r
+#   ASL     - Intel ACPI Source Language Compiler\r
+####################################################################################\r
+#   VS2008           - Microsoft Visual Studio 2008 ALL Edition, including Standard, Professional, Express, TeamSuite\r
+*_VS2008_*_*_FAMILY               = MSFT\r
+\r
+*_VS2008_*_MAKE_PATH              = DEF(VS2008_BIN)\nmake.exe\r
+*_VS2008_*_MAKE_FLAGS             = /nologo\r
+*_VS2008_*_RC_PATH                = DEF(WINSDK_BIN)\rc.exe\r
+\r
+*_VS2008_*_SLINK_FLAGS            = /NOLOGO /LTCG\r
+*_VS2008_*_APP_FLAGS              = /nologo /E /TC\r
+*_VS2008_*_PP_FLAGS               = /nologo /E /TC /FIAutoGen.h\r
+*_VS2008_*_VFRPP_FLAGS            = /nologo /E /TC /DVFRCOMPILE /FI$(MODULE_NAME)StrDefs.h\r
+\r
+##################\r
+# ASL definitions\r
+##################\r
+*_VS2008_*_ASL_PATH               = DEF(DEFAULT_WIN_ASL_BIN)\r
+*_VS2008_*_ASL_FLAGS              = DEF(DEFAULT_WIN_ASL_FLAGS)\r
+*_VS2008_*_ASL_OUTFLAGS           = DEF(DEFAULT_WIN_ASL_OUTFLAGS)\r
+*_VS2008_*_ASLCC_FLAGS            = DEF(MSFT_ASLCC_FLAGS)\r
+*_VS2008_*_ASLPP_FLAGS            = DEF(MSFT_ASLPP_FLAGS)\r
+*_VS2008_*_ASLDLINK_FLAGS         = DEF(MSFT_ASLDLINK_FLAGS)\r
+\r
+##################\r
+# IA32 definitions\r
+##################\r
+*_VS2008_IA32_*_DLL               = DEF(VS2008_DLL)\r
+\r
+*_VS2008_IA32_MAKE_PATH           = DEF(VS2008_BIN)\nmake.exe\r
+*_VS2008_IA32_CC_PATH             = DEF(VS2008_BIN)\cl.exe\r
+*_VS2008_IA32_VFRPP_PATH          = DEF(VS2008_BIN)\cl.exe\r
+*_VS2008_IA32_SLINK_PATH          = DEF(VS2008_BIN)\lib.exe\r
+*_VS2008_IA32_DLINK_PATH          = DEF(VS2008_BIN)\link.exe\r
+*_VS2008_IA32_ASMLINK_PATH        = DEF(WINDDK_BIN16)\link16.exe\r
+*_VS2008_IA32_APP_PATH            = DEF(VS2008_BIN)\cl.exe\r
+*_VS2008_IA32_PP_PATH             = DEF(VS2008_BIN)\cl.exe\r
+*_VS2008_IA32_ASM_PATH            = DEF(VS2008_BIN)\ml.exe\r
+*_VS2008_IA32_ASLCC_PATH          = DEF(VS2008_BIN)\cl.exe\r
+*_VS2008_IA32_ASLPP_PATH          = DEF(VS2008_BIN)\cl.exe\r
+*_VS2008_IA32_ASLDLINK_PATH       = DEF(VS2008_BIN)\link.exe\r
+\r
+      *_VS2008_IA32_MAKE_FLAGS    = /nologo\r
+  DEBUG_VS2008_IA32_CC_FLAGS      = /nologo /c /WX /GS- /W4 /Gs8192 /D UNICODE /O1ib2 /GL /FIAutoGen.h /EHs-c- /GR- /GF /Gy /Zi /Gm\r
+RELEASE_VS2008_IA32_CC_FLAGS      = /nologo /c /WX /GS- /W4 /Gs8192 /D UNICODE /O1ib2 /GL /FIAutoGen.h /EHs-c- /GR- /GF\r
+  DEBUG_VS2008_IA32_ASM_FLAGS     = /nologo /c /WX /W3 /Cx /coff /Zd /Zi\r
+RELEASE_VS2008_IA32_ASM_FLAGS     = /nologo /c /WX /W3 /Cx /coff /Zd\r
+  DEBUG_VS2008_IA32_DLINK_FLAGS   = /NOLOGO /NODEFAULTLIB /IGNORE:4086 /OPT:REF /OPT:ICF=10 /MAP /ALIGN:32 /SECTION:.xdata,D /SECTION:.pdata,D /MACHINE:I386 /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:CONSOLE /SAFESEH:NO /BASE:0 /DRIVER /DEBUG\r
+RELEASE_VS2008_IA32_DLINK_FLAGS   = /NOLOGO /NODEFAULTLIB /IGNORE:4086 /OPT:REF /OPT:ICF=10 /MAP /ALIGN:32 /SECTION:.xdata,D /SECTION:.pdata,D /MACHINE:I386 /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:CONSOLE /SAFESEH:NO /BASE:0 /DRIVER /MERGE:.data=.text /MERGE:.rdata=.text\r
+      *_VS2008_IA32_ASMLINK_FLAGS = /nologo /tiny\r
+\r
+##################\r
+# X64 definitions\r
+##################\r
+*_VS2008_X64_*_DLL         = DEF(VS2008_DLL)\r
+\r
+*_VS2008_X64_CC_PATH       = DEF(VS2008_BINX64)\cl.exe\r
+*_VS2008_X64_PP_PATH       = DEF(VS2008_BINX64)\cl.exe\r
+*_VS2008_X64_APP_PATH      = DEF(VS2008_BINX64)\cl.exe\r
+*_VS2008_X64_VFRPP_PATH    = DEF(VS2008_BINX64)\cl.exe\r
+*_VS2008_X64_ASM_PATH      = DEF(VS2008_BINX64)\ml64.exe\r
+*_VS2008_X64_SLINK_PATH    = DEF(VS2008_BINX64)\lib.exe\r
+*_VS2008_X64_DLINK_PATH    = DEF(VS2008_BINX64)\link.exe\r
+*_VS2008_X64_ASLCC_PATH    = DEF(VS2008_BINX64)\cl.exe\r
+*_VS2008_X64_ASLPP_PATH    = DEF(VS2008_BINX64)\cl.exe\r
+*_VS2008_X64_ASLDLINK_PATH = DEF(VS2008_BINX64)\link.exe\r
+\r
+\r
+  DEBUG_VS2008_X64_CC_FLAGS     = /nologo /c /WX /GS- /X /W4 /Gs8192 /D UNICODE /O1ib2s /GL /Gy /FIAutoGen.h /EHs-c- /GR- /GF /Zi /Gm\r
+RELEASE_VS2008_X64_CC_FLAGS     = /nologo /c /WX /GS- /X /W4 /Gs8192 /D UNICODE /O1ib2s /GL /Gy /FIAutoGen.h /EHs-c- /GR- /GF\r
+  DEBUG_VS2008_X64_ASM_FLAGS    = /nologo /c /WX /W3 /Cx /Zd /Zi\r
+RELEASE_VS2008_X64_ASM_FLAGS    = /nologo /c /WX /W3 /Cx /Zd\r
+  DEBUG_VS2008_X64_DLINK_FLAGS  = /NOLOGO /NODEFAULTLIB /IGNORE:4086 /OPT:REF /OPT:ICF=10 /MAP /ALIGN:32 /SECTION:.xdata,D /SECTION:.pdata,D /Machine:AMD64 /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:CONSOLE /SAFESEH:NO /BASE:0 /DRIVER /DEBUG\r
+RELEASE_VS2008_X64_DLINK_FLAGS  = /NOLOGO /NODEFAULTLIB /IGNORE:4086 /OPT:REF /OPT:ICF=10 /MAP /ALIGN:32 /SECTION:.xdata,D /SECTION:.pdata,D /Machine:AMD64 /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:CONSOLE /SAFESEH:NO /BASE:0 /DRIVER /MERGE:.data=.text /MERGE:.rdata=.text\r
+\r
+##################\r
+# IPF definitions\r
+##################\r
+*_VS2008_IPF_*_DLL         = DEF(VS2008_DLL)\r
+\r
+*_VS2008_IPF_PP_PATH       = DEF(VS2008_BIN64)\cl.exe\r
+*_VS2008_IPF_APP_PATH      = DEF(VS2008_BIN64)\cl.exe\r
+*_VS2008_IPF_VFRPP_PATH    = DEF(VS2008_BIN64)\cl.exe\r
+*_VS2008_IPF_CC_PATH       = DEF(VS2008_BIN64)\cl.exe\r
+*_VS2008_IPF_ASM_PATH      = DEF(VS2008_BIN64)\ias.exe\r
+*_VS2008_IPF_SLINK_PATH    = DEF(VS2008_BIN64)\lib.exe\r
+*_VS2008_IPF_DLINK_PATH    = DEF(VS2008_BIN64)\link.exe\r
+*_VS2008_IPF_ASLCC_PATH    = DEF(VS2008_BIN64)\cl.exe\r
+*_VS2008_IPF_ASLPP_PATH    = DEF(VS2008_BIN64)\cl.exe\r
+*_VS2008_IPF_ASLDLINK_PATH = DEF(VS2008_BIN64)\link.exe\r
+\r
+  DEBUG_VS2008_IPF_CC_FLAGS     = /nologo /c /WX /GS- /X /W4 /EHs-c- /GR- /Gy /Os /GL /FIAutoGen.h /QIPF_fr32 /Zi\r
+RELEASE_VS2008_IPF_CC_FLAGS     = /nologo /c /WX /GS- /X /W4 /EHs-c- /GR- /Gy /Os /GL /FIAutoGen.h /QIPF_fr32\r
+  DEBUG_VS2008_IPF_ASM_FLAGS    = -N us -X explicit -M ilp64 -N so -W4 -d debug\r
+RELEASE_VS2008_IPF_ASM_FLAGS    = -N us -X explicit -M ilp64 -N so -W4\r
+  DEBUG_VS2008_IPF_DLINK_FLAGS  = /NOLOGO /NODEFAULTLIB /LTCG /DLL /OPT:REF,ICF /IGNORE:4086 /MAP /ALIGN:32 /SECTION:.xdata,D /SECTION:.pdata,D /MACHINE:IA64 /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /BASE:0 /DRIVER /MAP:$(DEBUG_DIR)/$(BASE_NAME).map /PDB:$(DEBUG_DIR)/$(BASE_NAME).pdb /DEBUG\r
+RELEASE_VS2008_IPF_DLINK_FLAGS  = /NOLOGO /NODEFAULTLIB /LTCG /DLL /OPT:REF.ICF /IGNORE:4086 /MAP /ALIGN:32 /SECTION:.xdata,D /SECTION:.pdata,D /MACHINE:IA64 /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /BASE:0 /DRIVER /MAP:$(DEBUG_DIR)/$(BASE_NAME).map /PDB:$(DEBUG_DIR)/$(BASE_NAME).pdb\r
+\r
+##################\r
+# EBC definitions\r
+##################\r
+*_VS2008_EBC_*_FAMILY            = INTEL\r
+\r
+*_VS2008_EBC_MAKE_PATH           = DEF(VS2008_BIN)\nmake.exe\r
+*_VS2008_EBC_PP_PATH             = DEF(EBC_BIN)\iec.exe\r
+*_VS2008_EBC_VFRPP_PATH          = DEF(EBC_BIN)\iec.exe\r
+*_VS2008_EBC_CC_PATH             = DEF(EBC_BIN)\iec.exe\r
+*_VS2008_EBC_SLINK_PATH          = DEF(EBC_BIN)\link.exe\r
+*_VS2008_EBC_DLINK_PATH          = DEF(EBC_BIN)\link.exe\r
+\r
+*_VS2008_EBC_MAKE_FLAGS          = /nologo\r
+*_VS2008_EBC_PP_FLAGS            = /nologo /E /TC /FIAutoGen.h\r
+*_VS2008_EBC_CC_FLAGS            = /nologo /c /WX /W3 /FIAutoGen.h /D$(MODULE_ENTRY_POINT)=$(ARCH_ENTRY_POINT)\r
+*_VS2008_EBC_VFRPP_FLAGS         = /nologo /E /TC /DVFRCOMPILE /FI$(MODULE_NAME)StrDefs.h\r
+*_VS2008_EBC_SLINK_FLAGS         = /lib /NOLOGO /MACHINE:EBC\r
+*_VS2008_EBC_DLINK_FLAGS         = "C:\Program Files\Intel\EBC\Lib\EbcLib.lib" /NOLOGO /NODEFAULTLIB /MACHINE:EBC /OPT:REF /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /MAP\r
+\r
+####################################################################################\r
+#\r
+# Microsoft Visual Studio 2008\r
+#\r
+#   VS2008  - Microsoft Visual Studio 2008 All Edition, including Standard, Professional, Express, TeamSuite\r
+#   ASL     - Microsoft ACPI Source Language Compiler (asl.exe)\r
+####################################################################################\r
+#   VS2008xASL           - Microsoft Visual Studio 2008 ALL Edition, including Standard, Professional, Express, TeamSuite\r
+*_VS2008xASL_*_*_FAMILY        = MSFT\r
+\r
+*_VS2008xASL_*_MAKE_PATH       = DEF(VS2008_BIN)\nmake.exe\r
+*_VS2008xASL_*_MAKE_FLAG       = /nologo\r
+*_VS2008xASL_*_RC_PATH         = DEF(WINSDK_BIN)\rc.exe\r
+\r
+*_VS2008xASL_*_SLINK_FLAGS     = /NOLOGO /LTCG\r
+*_VS2008xASL_*_APP_FLAGS       = /nologo /E /TC\r
+*_VS2008xASL_*_PP_FLAGS        = /nologo /E /TC /FIAutoGen.h\r
+*_VS2008xASL_*_VFRPP_FLAGS     = /nologo /E /TC /DVFRCOMPILE /FI$(MODULE_NAME)StrDefs.h\r
+\r
+##################\r
+# ASL definitions\r
+##################\r
+*_VS2008xASL_*_ASL_PATH        = DEF(WIN_ASL_BIN)\r
+*_VS2008xASL_*_ASL_FLAGS       = \r
+*_VS2008xASL_*_ASL_OUTFLAGS    = DEF(MS_ASL_OUTFLAGS)\r
+*_VS2008xASL_*_ASLCC_FLAGS     = DEF(MSFT_ASLCC_FLAGS)\r
+*_VS2008xASL_*_ASLPP_FLAGS     = DEF(MSFT_ASLPP_FLAGS)\r
+*_VS2008xASL_*_ASLDLINK_FLAGS  = DEF(MSFT_ASLDLINK_FLAGS)\r
+\r
+##################\r
+# IA32 definitions\r
+##################\r
+*_VS2008xASL_IA32_*_DLL        = DEF(VS2008_DLL)\r
+\r
+*_VS2008xASL_IA32_MAKE_PATH    = DEF(VS2008_BIN)\nmake.exe\r
+*_VS2008xASL_IA32_CC_PATH      = DEF(VS2008_BIN)\cl.exe\r
+*_VS2008xASL_IA32_VFRPP_PATH   = DEF(VS2008_BIN)\cl.exe\r
+*_VS2008xASL_IA32_SLINK_PATH   = DEF(VS2008_BIN)\lib.exe\r
+*_VS2008xASL_IA32_DLINK_PATH   = DEF(VS2008_BIN)\link.exe\r
+*_VS2008xASL_IA32_ASMLINK_PATH = DEF(WINDDK_BIN16)\link16.exe\r
+*_VS2008xASL_IA32_APP_PATH     = DEF(VS2008_BIN)\cl.exe\r
+*_VS2008xASL_IA32_PP_PATH      = DEF(VS2008_BIN)\cl.exe\r
+*_VS2008xASL_IA32_ASM_PATH     = DEF(VS2008_BIN)\ml.exe\r
+*_VS2008xASL_IA32_ASLCC_PATH    = DEF(VS2008_BIN)\cl.exe\r
+*_VS2008xASL_IA32_ASLPP_PATH    = DEF(VS2008_BIN)\cl.exe\r
+*_VS2008xASL_IA32_ASLDLINK_PATH = DEF(VS2008_BIN)\link.exe\r
+\r
+      *_VS2008xASL_IA32_MAKE_FLAGS  = /nologo\r
+  DEBUG_VS2008xASL_IA32_CC_FLAGS    = /nologo /c /WX /GS- /W4 /Gs8192 /D UNICODE /O1ib2 /GL /FIAutoGen.h /EHs-c- /GR- /GF /Gy /Zi /Gm\r
+RELEASE_VS2008xASL_IA32_CC_FLAGS    = /nologo /c /WX /GS- /W4 /Gs8192 /D UNICODE /O1ib2 /GL /FIAutoGen.h /EHs-c- /GR- /GF\r
+  DEBUG_VS2008xASL_IA32_ASM_FLAGS   = /nologo /c /WX /W3 /Cx /coff /Zd /Zi\r
+RELEASE_VS2008xASL_IA32_ASM_FLAGS   = /nologo /c /WX /W3 /Cx /coff /Zd\r
+  DEBUG_VS2008xASL_IA32_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4086 /OPT:REF /OPT:ICF=10 /MAP /ALIGN:32 /SECTION:.xdata,D /SECTION:.pdata,D /MACHINE:I386 /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:CONSOLE /SAFESEH:NO /BASE:0 /DRIVER /DEBUG\r
+RELEASE_VS2008xASL_IA32_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4086 /OPT:REF /OPT:ICF=10 /MAP /ALIGN:32 /SECTION:.xdata,D /SECTION:.pdata,D /MACHINE:I386 /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:CONSOLE /SAFESEH:NO /BASE:0 /DRIVER /MERGE:.data=.text /MERGE:.rdata=.text\r
+      *_VS2008xASL_IA32_ASMLINK_FLAGS= /nologo /tiny\r
+\r
+##################\r
+# X64 definitions\r
+##################\r
+*_VS2008xASL_X64_*_DLL         = DEF(VS2008_DLL)\r
+\r
+*_VS2008xASL_X64_CC_PATH       = DEF(VS2008_BINX64)\cl.exe\r
+*_VS2008xASL_X64_PP_PATH       = DEF(VS2008_BINX64)\cl.exe\r
+*_VS2008xASL_X64_APP_PATH      = DEF(VS2008_BINX64)\cl.exe\r
+*_VS2008xASL_X64_VFRPP_PATH    = DEF(VS2008_BINX64)\cl.exe\r
+*_VS2008xASL_X64_ASM_PATH      = DEF(VS2008_BINX64)\ml64.exe\r
+*_VS2008xASL_X64_SLINK_PATH    = DEF(VS2008_BINX64)\lib.exe\r
+*_VS2008xASL_X64_DLINK_PATH    = DEF(VS2008_BINX64)\link.exe\r
+*_VS2008xASL_X64_ASLCC_PATH    = DEF(VS2008_BINX64)\cl.exe\r
+*_VS2008xASL_X64_ASLPP_PATH    = DEF(VS2008_BINX64)\cl.exe\r
+*_VS2008xASL_X64_ASLDLINK_PATH = DEF(VS2008_BINX64)\link.exe\r
+\r
+\r
+  DEBUG_VS2008xASL_X64_CC_FLAGS     = /nologo /c /WX /GS- /X /W4 /Gs8192 /D UNICODE /O1ib2s /GL /Gy /FIAutoGen.h /EHs-c- /GR- /GF /Zi /Gm\r
+RELEASE_VS2008xASL_X64_CC_FLAGS     = /nologo /c /WX /GS- /X /W4 /Gs8192 /D UNICODE /O1ib2s /GL /Gy /FIAutoGen.h /EHs-c- /GR- /GF\r
+  DEBUG_VS2008xASL_X64_ASM_FLAGS    = /nologo /c /WX /W3 /Cx /Zd /Zi\r
+RELEASE_VS2008xASL_X64_ASM_FLAGS    = /nologo /c /WX /W3 /Cx /Zd\r
+  DEBUG_VS2008xASL_X64_DLINK_FLAGS  = /NOLOGO /NODEFAULTLIB /IGNORE:4086 /OPT:REF /OPT:ICF=10 /MAP /ALIGN:32 /SECTION:.xdata,D /SECTION:.pdata,D /Machine:AMD64 /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:CONSOLE /SAFESEH:NO /BASE:0 /DRIVER /DEBUG\r
+RELEASE_VS2008xASL_X64_DLINK_FLAGS  = /NOLOGO /NODEFAULTLIB /IGNORE:4086 /OPT:REF /OPT:ICF=10 /MAP /ALIGN:32 /SECTION:.xdata,D /SECTION:.pdata,D /Machine:AMD64 /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:CONSOLE /SAFESEH:NO /BASE:0 /DRIVER /MERGE:.data=.text /MERGE:.rdata=.text\r
+\r
+##################\r
+# IPF definitions\r
+##################\r
+*_VS2008xASL_IPF_*_DLL         = DEF(VS2008_DLL)\r
+\r
+*_VS2008xASL_IPF_PP_PATH       = DEF(VS2008_BIN64)\cl.exe\r
+*_VS2008xASL_IPF_APP_PATH      = DEF(VS2008_BIN64)\cl.exe\r
+*_VS2008xASL_IPF_VFRPP_PATH    = DEF(VS2008_BIN64)\cl.exe\r
+*_VS2008xASL_IPF_CC_PATH       = DEF(VS2008_BIN64)\cl.exe\r
+*_VS2008xASL_IPF_ASM_PATH      = DEF(VS2008_BIN64)\ias.exe\r
+*_VS2008xASL_IPF_SLINK_PATH    = DEF(VS2008_BIN64)\lib.exe\r
+*_VS2008xASL_IPF_DLINK_PATH    = DEF(VS2008_BIN64)\link.exe\r
+*_VS2008xASL_IPF_ASLCC_PATH    = DEF(VS2008_BIN64)\cl.exe\r
+*_VS2008xASL_IPF_ASLPP_PATH    = DEF(VS2008_BIN64)\cl.exe\r
+*_VS2008xASL_IPF_ASLDLINK_PATH = DEF(VS2008_BIN64)\link.exe\r
+\r
+  DEBUG_VS2008xASL_IPF_CC_FLAGS     = /nologo /c /WX /GS- /X /W4 /EHs-c- /GR- /Gy /Os /GL /FIAutoGen.h /QIPF_fr32 /Zi\r
+RELEASE_VS2008xASL_IPF_CC_FLAGS     = /nologo /c /WX /GS- /X /W4 /EHs-c- /GR- /Gy /Os /GL /FIAutoGen.h /QIPF_fr32\r
+  DEBUG_VS2008xASL_IPF_ASM_FLAGS    = -N us -X explicit -M ilp64 -N so -W4 -d debug\r
+RELEASE_VS2008xASL_IPF_ASM_FLAGS    = -N us -X explicit -M ilp64 -N so -W4\r
+  DEBUG_VS2008xASL_IPF_DLINK_FLAGS  = /NOLOGO /NODEFAULTLIB /LTCG /DLL /OPT:REF,ICF /IGNORE:4086 /MAP /ALIGN:32 /SECTION:.xdata,D /SECTION:.pdata,D /MACHINE:IA64 /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /BASE:0 /DRIVER /MAP:$(DEBUG_DIR)/$(BASE_NAME).map /PDB:$(DEBUG_DIR)/$(BASE_NAME).pdb /DEBUG\r
+RELEASE_VS2008xASL_IPF_DLINK_FLAGS  = /NOLOGO /NODEFAULTLIB /LTCG /DLL /OPT:REF.ICF /IGNORE:4086 /MAP /ALIGN:32 /SECTION:.xdata,D /SECTION:.pdata,D /MACHINE:IA64 /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /BASE:0 /DRIVER /MAP:$(DEBUG_DIR)/$(BASE_NAME).map /PDB:$(DEBUG_DIR)/$(BASE_NAME).pdb\r
+\r
+##################\r
+# EBC definitions\r
+##################\r
+*_VS2008xASL_EBC_*_FAMILY            = INTEL\r
+\r
+*_VS2008xASL_EBC_MAKE_PATH           = DEF(VS2008_BIN)\nmake.exe\r
+*_VS2008xASL_EBC_PP_PATH             = DEF(EBC_BIN)\iec.exe\r
+*_VS2008xASL_EBC_VFRPP_PATH          = DEF(EBC_BIN)\iec.exe\r
+*_VS2008xASL_EBC_CC_PATH             = DEF(EBC_BIN)\iec.exe\r
+*_VS2008xASL_EBC_SLINK_PATH          = DEF(EBC_BIN)\link.exe\r
+*_VS2008xASL_EBC_DLINK_PATH          = DEF(EBC_BIN)\link.exe\r
+\r
+*_VS2008xASL_EBC_MAKE_FLAGS          = /nologo\r
+*_VS2008xASL_EBC_PP_FLAGS            = /nologo /E /TC /FIAutoGen.h\r
+*_VS2008xASL_EBC_CC_FLAGS            = /nologo /c /WX /W3 /FIAutoGen.h /D$(MODULE_ENTRY_POINT)=$(ARCH_ENTRY_POINT)\r
+*_VS2008xASL_EBC_VFRPP_FLAGS         = /nologo /E /TC /DVFRCOMPILE /FI$(MODULE_NAME)StrDefs.h\r
+*_VS2008xASL_EBC_SLINK_FLAGS         = /lib /NOLOGO /MACHINE:EBC\r
+*_VS2008xASL_EBC_DLINK_FLAGS         = "C:\Program Files\Intel\EBC\Lib\EbcLib.lib" /NOLOGO /NODEFAULTLIB /MACHINE:EBC /OPT:REF /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /MAP\r
+\r
+\r
+####################################################################################\r
+#   VS2008x86       - Microsoft Visual Studio 2008 (x86) with Intel ASL\r
+#   ASL  - Intel ACPI Source Language Compiler (iasl.exe)\r
+####################################################################################\r
+#   VS2008x86           - Microsoft Visual Studio 2008 (x86) ALL Edition with Intel ASL\r
+*_VS2008x86_*_*_FAMILY        = MSFT\r
+\r
+*_VS2008x86_*_MAKE_PATH       = DEF(VS2008x86_BIN)\nmake.exe\r
+*_VS2008xASL_*_MAKE_FLAG       = /nologo\r
+*_VS2008xASL_*_RC_PATH         = DEF(WINSDKx86_BIN)\rc.exe\r
+\r
+*_VS2008x86_*_MAKE_FLAGS      = /nologo\r
+*_VS2008x86_*_SLINK_FLAGS     = /NOLOGO /LTCG\r
+*_VS2008x86_*_APP_FLAGS       = /nologo /E /TC\r
+*_VS2008x86_*_PP_FLAGS        = /nologo /E /TC /FIAutoGen.h\r
+*_VS2008x86_*_VFRPP_FLAGS     = /nologo /E /TC /DVFRCOMPILE /FI$(MODULE_NAME)StrDefs.h\r
+\r
+##################\r
+# ASL definitions\r
+##################\r
+*_VS2008x86_*_ASL_PATH        = DEF(WIN_IASL_BIN)\r
+*_VS2008x86_*_ASL_FLAGS       = DEF(DEFAULT_WIN_ASL_FLAGS)\r
+*_VS2008x86_*_ASL_OUTFLAGS    = DEF(DEFAULT_WIN_ASL_OUTFLAGS)\r
+*_VS2008x86_*_ASLCC_FLAGS     = DEF(MSFT_ASLCC_FLAGS)\r
+*_VS2008x86_*_ASLPP_FLAGS     = DEF(MSFT_ASLPP_FLAGS)\r
+*_VS2008x86_*_ASLDLINK_FLAGS  = DEF(MSFT_ASLDLINK_FLAGS)\r
+\r
+##################\r
+# IA32 definitions\r
+##################\r
+*_VS2008x86_IA32_*_DLL        = DEF(VS2008x86_DLL)\r
+\r
+*_VS2008x86_IA32_MAKE_PATH    = DEF(VS2008x86_BIN)\nmake.exe\r
+*_VS2008x86_IA32_CC_PATH      = DEF(VS2008x86_BIN)\cl.exe\r
+*_VS2008x86_IA32_VFRPP_PATH   = DEF(VS2008x86_BIN)\cl.exe\r
+*_VS2008x86_IA32_ASLCC_PATH   = DEF(VS2008x86_BIN)\cl.exe\r
+*_VS2008x86_IA32_ASLPP_PATH   = DEF(VS2008x86_BIN)\cl.exe\r
+*_VS2008x86_IA32_SLINK_PATH   = DEF(VS2008x86_BIN)\lib.exe\r
+*_VS2008x86_IA32_DLINK_PATH   = DEF(VS2008x86_BIN)\link.exe\r
+*_VS2008x86_IA32_ASLDLINK_PATH= DEF(VS2008x86_BIN)\link.exe\r
+*_VS2008x86_IA32_ASMLINK_PATH = DEF(WINDDK_BIN16)\link.exe\r
+*_VS2008x86_IA32_APP_PATH     = DEF(VS2008x86_BIN)\cl.exe\r
+*_VS2008x86_IA32_PP_PATH      = DEF(VS2008x86_BIN)\cl.exe\r
+*_VS2008x86_IA32_ASM_PATH     = DEF(VS2008x86_BIN)\ml.exe\r
+\r
+      *_VS2008x86_IA32_MAKE_FLAGS  = /nologo\r
+  DEBUG_VS2008x86_IA32_CC_FLAGS    = /nologo /c /WX /GS- /W4 /Gs8192 /D UNICODE /O1ib2 /GL /FIAutoGen.h /EHs-c- /GR- /GF /Gy /Zi /Gm\r
+RELEASE_VS2008x86_IA32_CC_FLAGS    = /nologo /c /WX /GS- /W4 /Gs8192 /D UNICODE /O1ib2 /GL /FIAutoGen.h /EHs-c- /GR- /GF\r
+  DEBUG_VS2008x86_IA32_ASM_FLAGS   = /nologo /c /WX /W3 /Cx /coff /Zd /Zi  \r
+RELEASE_VS2008x86_IA32_ASM_FLAGS   = /nologo /c /WX /W3 /Cx /coff /Zd\r
+  DEBUG_VS2008x86_IA32_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4086 /OPT:REF /OPT:ICF=10 /MAP /ALIGN:32 /MACHINE:I386 /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:CONSOLE /SAFESEH:NO /BASE:0 /DRIVER /DEBUG   \r
+RELEASE_VS2008x86_IA32_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4086 /OPT:REF /OPT:ICF=10 /MAP /ALIGN:32 /MACHINE:I386 /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:CONSOLE /SAFESEH:NO /BASE:0 /DRIVER /MERGE:.data=.text /MERGE:.rdata=.text\r
+      *_VS2008x86_IA32_ASMLINK_FLAGS= /nologo /tiny\r
+\r
+##################\r
+# X64 definitions\r
+##################\r
+*_VS2008x86_X64_*_DLL         = DEF(VS2008x86_DLL)\r
+\r
+*_VS2008x86_X64_CC_PATH       = DEF(VS2008x86_BINX64)\cl.exe\r
+*_VS2008x86_X64_PP_PATH       = DEF(VS2008x86_BINX64)\cl.exe\r
+*_VS2008x86_X64_APP_PATH      = DEF(VS2008x86_BINX64)\cl.exe\r
+*_VS2008x86_X64_VFRPP_PATH    = DEF(VS2008x86_BINX64)\cl.exe\r
+*_VS2008x86_X64_ASLCC_PATH    = DEF(VS2008x86_BINX64)\cl.exe\r
+*_VS2008x86_X64_ASLPP_PATH    = DEF(VS2008x86_BINX64)\cl.exe\r
+*_VS2008x86_X64_ASM_PATH      = DEF(VS2008x86_BINX64)\ml64.exe\r
+*_VS2008x86_X64_SLINK_PATH    = DEF(VS2008x86_BINX64)\lib.exe\r
+*_VS2008x86_X64_DLINK_PATH    = DEF(VS2008x86_BINX64)\link.exe\r
+*_VS2008x86_X64_ASLDLINK_PATH = DEF(VS2008x86_BINX64)\link.exe\r
+\r
+  DEBUG_VS2008x86_X64_CC_FLAGS     = /nologo /c /WX /GS- /X /W4 /Gs8192 /D UNICODE /O1ib2s /GL /Gy /FIAutoGen.h /EHs-c- /GR- /GF /Zi /Gm \r
+RELEASE_VS2008x86_X64_CC_FLAGS     = /nologo /c /WX /GS- /X /W4 /Gs8192 /D UNICODE /O1ib2s /GL /Gy /FIAutoGen.h /EHs-c- /GR- /GF\r
+  DEBUG_VS2008x86_X64_ASM_FLAGS    = /nologo /c /WX /W3 /Cx /Zd /Zi\r
+RELEASE_VS2008x86_X64_ASM_FLAGS    = /nologo /c /WX /W3 /Cx /Zd\r
+  DEBUG_VS2008x86_X64_DLINK_FLAGS  = /NOLOGO /NODEFAULTLIB /IGNORE:4086 /OPT:REF /OPT:ICF=10 /MAP /ALIGN:32 /Machine:AMD64 /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:CONSOLE /SAFESEH:NO /BASE:0 /DRIVER /DEBUG\r
+RELEASE_VS2008x86_X64_DLINK_FLAGS  = /NOLOGO /NODEFAULTLIB /IGNORE:4086 /OPT:REF /OPT:ICF=10 /MAP /ALIGN:32 /Machine:AMD64 /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:CONSOLE /SAFESEH:NO /BASE:0 /DRIVER /MERGE:.data=.text /MERGE:.rdata=.text\r
+\r
+##################\r
+# IPF definitions\r
+##################\r
+*_VS2008x86_IPF_*_DLL         = DEF(VS2008x86_DLL)\r
+\r
+*_VS2008x86_IPF_PP_PATH       = DEF(VS2008x86_BIN64)\cl.exe\r
+*_VS2008x86_IPF_APP_PATH      = DEF(VS2008x86_BIN64)\cl.exe\r
+*_VS2008x86_IPF_VFRPP_PATH    = DEF(VS2008x86_BIN64)\cl.exe\r
+*_VS2008x86_IPF_ASLCC_PATH    = DEF(VS2008x86_BIN64)\cl.exe\r
+*_VS2008x86_IPF_ASLPP_PATH    = DEF(VS2008x86_BIN64)\cl.exe\r
+*_VS2008x86_IPF_CC_PATH       = DEF(VS2008x86_BIN64)\cl.exe\r
+*_VS2008x86_IPF_ASM_PATH      = DEF(VS2008x86_BIN64)\ias.exe\r
+*_VS2008x86_IPF_SLINK_PATH    = DEF(VS2008x86_BIN64)\lib.exe\r
+*_VS2008x86_IPF_DLINK_PATH    = DEF(VS2008x86_BIN64)\link.exe\r
+*_VS2008x86_IPF_ASLDLINK_PATH = DEF(VS2008x86_BIN64)\link.exe\r
+\r
+  DEBUG_VS2008x86_IPF_CC_FLAGS     = /nologo /c /WX /GS- /X /W4 /EHs-c- /GR- /Gy /Os /GL /FIAutoGen.h /QIPF_fr32 /Zi\r
+RELEASE_VS2008x86_IPF_CC_FLAGS     = /nologo /c /WX /GS- /X /W4 /EHs-c- /GR- /Gy /Os /GL /FIAutoGen.h /QIPF_fr32\r
+  DEBUG_VS2008x86_IPF_ASM_FLAGS    = -N us -X explicit -M ilp64 -N so -W4 -d debug\r
+RELEASE_VS2008x86_IPF_ASM_FLAGS    = -N us -X explicit -M ilp64 -N so -W4\r
+  DEBUG_VS2008x86_IPF_DLINK_FLAGS  = /NOLOGO /NODEFAULTLIB /LTCG /DLL /OPT:REF,ICF /IGNORE:4086 /MAP /ALIGN:32 /MACHINE:IA64 /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /BASE:0 /DRIVER /MAP:$(DEBUG_DIR)/$(BASE_NAME).map /PDB:$(DEBUG_DIR)/$(BASE_NAME).pdb /DEBUG\r
+RELEASE_VS2008x86_IPF_DLINK_FLAGS  = /NOLOGO /NODEFAULTLIB /LTCG /DLL /OPT:REF,ICF /IGNORE:4086 /MAP /ALIGN:32 /MACHINE:IA64 /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /BASE:0 /DRIVER /MAP:$(DEBUG_DIR)/$(BASE_NAME).map /PDB:$(DEBUG_DIR)/$(BASE_NAME).pdb\r
+\r
+\r
+####################################################################################\r
+#   VS2008x86xASL     - Microsoft Visual Studio 2008 with Microsoft ASL\r
+#   ASL  - Microsoft ACPI Source Language Compiler (asl.exe)\r
+####################################################################################\r
+*_VS2008x86xASL_*_*_FAMILY        = MSFT\r
+\r
+*_VS2008x86xASL_*_MAKE_PATH       = DEF(VS2008x86_BIN)\nmake.exe\r
+*_VS2008xASL_*_MAKE_FLAG       = /nologo\r
+*_VS2008xASL_*_RC_PATH         = DEF(WINSDKx86_BIN)\rc.exe\r
+\r
+*_VS2008x86xASL_*_MAKE_FLAGS      = /nologo\r
+*_VS2008x86xASL_*_SLINK_FLAGS     = /NOLOGO /LTCG\r
+*_VS2008x86xASL_*_APP_FLAGS       = /nologo /E /TC\r
+*_VS2008x86xASL_*_PP_FLAGS        = /nologo /E /TC /FIAutoGen.h\r
+*_VS2008x86xASL_*_VFRPP_FLAGS     = /nologo /E /TC /DVFRCOMPILE /FI$(MODULE_NAME)StrDefs.h\r
+\r
+##################\r
+# ASL definitions\r
+##################\r
+*_VS2008x86xASL_*_ASL_PATH        = DEF(WIN_ASL_BIN)\r
+*_VS2008x86xASL_*_ASL_FLAGS       = DEF(MS_ASL_FLAGS)\r
+*_VS2008x86xASL_*_ASL_OUTFLAGS    = DEF(MS_ASL_OUTFLAGS)\r
+*_VS2008x86xASL_*_ASLCC_FLAGS     = DEF(MSFT_ASLCC_FLAGS)\r
+*_VS2008x86xASL_*_ASLPP_FLAGS     = DEF(MSFT_ASLPP_FLAGS)\r
+*_VS2008x86xASL_*_ASLDLINK_FLAGS  = DEF(MSFT_ASLDLINK_FLAGS)\r
+\r
+##################\r
+# IA32 definitions\r
+##################\r
+*_VS2008x86xASL_IA32_*_DLL        = DEF(VS2008x86_DLL)\r
+\r
+*_VS2008x86xASL_IA32_MAKE_PATH    = DEF(VS2008x86_BIN)\nmake.exe\r
+*_VS2008x86xASL_IA32_CC_PATH      = DEF(VS2008x86_BIN)\cl.exe\r
+*_VS2008x86xASL_IA32_VFRPP_PATH   = DEF(VS2008x86_BIN)\cl.exe\r
+*_VS2008x86xASL_IA32_ASLCC_PATH   = DEF(VS2008x86_BIN)\cl.exe\r
+*_VS2008x86xASL_IA32_ASLPP_PATH   = DEF(VS2008x86_BIN)\cl.exe\r
+*_VS2008x86xASL_IA32_SLINK_PATH   = DEF(VS2008x86_BIN)\lib.exe\r
+*_VS2008x86xASL_IA32_DLINK_PATH   = DEF(VS2008x86_BIN)\link.exe\r
+*_VS2008x86xASL_IA32_ASLDLINK_PATH= DEF(VS2008x86_BIN)\link.exe\r
+*_VS2008x86xASL_IA32_ASMLINK_PATH = DEF(WINDDK_BIN16)\link.exe\r
+*_VS2008x86xASL_IA32_APP_PATH     = DEF(VS2008x86_BIN)\cl.exe\r
+*_VS2008x86xASL_IA32_PP_PATH      = DEF(VS2008x86_BIN)\cl.exe\r
+*_VS2008x86xASL_IA32_ASM_PATH     = DEF(VS2008x86_BIN)\ml.exe\r
+\r
+      *_VS2008x86xASL_IA32_MAKE_FLAGS  = /nologo\r
+  DEBUG_VS2008x86xASL_IA32_CC_FLAGS    = /nologo /c /WX /GS- /W4 /Gs8192 /D UNICODE /O1ib2 /GL /FIAutoGen.h /EHs-c- /GR- /GF /Gy /Zi /Gm\r
+RELEASE_VS2008x86xASL_IA32_CC_FLAGS    = /nologo /c /WX /GS- /W4 /Gs8192 /D UNICODE /O1ib2 /GL /FIAutoGen.h /EHs-c- /GR- /GF\r
+  DEBUG_VS2008x86xASL_IA32_ASM_FLAGS   = /nologo /c /WX /W3 /Cx /coff /Zd /Zi  \r
+RELEASE_VS2008x86xASL_IA32_ASM_FLAGS   = /nologo /c /WX /W3 /Cx /coff /Zd\r
+  DEBUG_VS2008x86xASL_IA32_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4086 /OPT:REF /OPT:ICF=10 /MAP /ALIGN:32 /MACHINE:I386 /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:CONSOLE /SAFESEH:NO /BASE:0 /DRIVER /DEBUG   \r
+RELEASE_VS2008x86xASL_IA32_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4086 /OPT:REF /OPT:ICF=10 /MAP /ALIGN:32 /MACHINE:I386 /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:CONSOLE /SAFESEH:NO /BASE:0 /DRIVER /MERGE:.data=.text /MERGE:.rdata=.text\r
+      *_VS2008x86xASL_IA32_ASMLINK_FLAGS= /nologo /tiny\r
+\r
+##################\r
+# X64 definitions\r
+##################\r
+*_VS2008x86xASL_X64_*_DLL         = DEF(VS2008x86_DLL)\r
+\r
+*_VS2008x86xASL_X64_CC_PATH       = DEF(VS2008x86_BINX64)\cl.exe\r
+*_VS2008x86xASL_X64_PP_PATH       = DEF(VS2008x86_BINX64)\cl.exe\r
+*_VS2008x86xASL_X64_APP_PATH      = DEF(VS2008x86_BINX64)\cl.exe\r
+*_VS2008x86xASL_X64_VFRPP_PATH    = DEF(VS2008x86_BINX64)\cl.exe\r
+*_VS2008x86xASL_X64_ASLCC_PATH    = DEF(VS2008x86_BINX64)\cl.exe\r
+*_VS2008x86xASL_X64_ASLPP_PATH    = DEF(VS2008x86_BINX64)\cl.exe\r
+*_VS2008x86xASL_X64_ASM_PATH      = DEF(VS2008x86_BINX64)\ml64.exe\r
+*_VS2008x86xASL_X64_SLINK_PATH    = DEF(VS2008x86_BINX64)\lib.exe\r
+*_VS2008x86xASL_X64_DLINK_PATH    = DEF(VS2008x86_BINX64)\link.exe\r
+*_VS2008x86xASL_X64_ASLDLINK_PATH = DEF(VS2008x86_BINX64)\link.exe\r
+\r
+  DEBUG_VS2008x86xASL_X64_CC_FLAGS     = /nologo /c /WX /GS- /X /W4 /Gs8192 /D UNICODE /O1ib2s /GL /Gy /FIAutoGen.h /EHs-c- /GR- /GF /Zi /Gm \r
+RELEASE_VS2008x86xASL_X64_CC_FLAGS     = /nologo /c /WX /GS- /X /W4 /Gs8192 /D UNICODE /O1ib2s /GL /Gy /FIAutoGen.h /EHs-c- /GR- /GF\r
+  DEBUG_VS2008x86xASL_X64_ASM_FLAGS    = /nologo /c /WX /W3 /Cx /Zd /Zi\r
+RELEASE_VS2008x86xASL_X64_ASM_FLAGS    = /nologo /c /WX /W3 /Cx /Zd\r
+  DEBUG_VS2008x86xASL_X64_DLINK_FLAGS  = /NOLOGO /NODEFAULTLIB /IGNORE:4086 /OPT:REF /OPT:ICF=10 /MAP /ALIGN:32 /Machine:AMD64 /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:CONSOLE /SAFESEH:NO /BASE:0 /DRIVER /DEBUG\r
+RELEASE_VS2008x86xASL_X64_DLINK_FLAGS  = /NOLOGO /NODEFAULTLIB /IGNORE:4086 /OPT:REF /OPT:ICF=10 /MAP /ALIGN:32 /Machine:AMD64 /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:CONSOLE /SAFESEH:NO /BASE:0 /DRIVER /MERGE:.data=.text /MERGE:.rdata=.text\r
+\r
+##################\r
+# IPF definitions\r
+##################\r
+*_VS2008x86xASL_IPF_*_DLL         = DEF(VS2008x86_DLL)\r
+\r
+*_VS2008x86xASL_IPF_PP_PATH       = DEF(VS2008x86_BIN64)\cl.exe\r
+*_VS2008x86xASL_IPF_APP_PATH      = DEF(VS2008x86_BIN64)\cl.exe\r
+*_VS2008x86xASL_IPF_VFRPP_PATH    = DEF(VS2008x86_BIN64)\cl.exe\r
+*_VS2008x86xASL_IPF_ASLCC_PATH    = DEF(VS2008x86_BIN64)\cl.exe\r
+*_VS2008x86xASL_IPF_ASLPP_PATH    = DEF(VS2008x86_BIN64)\cl.exe\r
+*_VS2008x86xASL_IPF_CC_PATH       = DEF(VS2008x86_BIN64)\cl.exe\r
+*_VS2008x86xASL_IPF_ASM_PATH      = DEF(VS2008x86_BIN64)\ias.exe\r
+*_VS2008x86xASL_IPF_SLINK_PATH    = DEF(VS2008x86_BIN64)\lib.exe\r
+*_VS2008x86xASL_IPF_DLINK_PATH    = DEF(VS2008x86_BIN64)\link.exe\r
+*_VS2008x86xASL_IPF_ASLDLINK_PATH = DEF(VS2008x86_BIN64)\link.exe\r
+\r
+  DEBUG_VS2008x86xASL_IPF_CC_FLAGS     = /nologo /c /WX /GS- /X /W4 /EHs-c- /GR- /Gy /Os /GL /FIAutoGen.h /QIPF_fr32 /Zi\r
+RELEASE_VS2008x86xASL_IPF_CC_FLAGS     = /nologo /c /WX /GS- /X /W4 /EHs-c- /GR- /Gy /Os /GL /FIAutoGen.h /QIPF_fr32\r
+  DEBUG_VS2008x86xASL_IPF_ASM_FLAGS    = -N us -X explicit -M ilp64 -N so -W4 -d debug\r
+RELEASE_VS2008x86xASL_IPF_ASM_FLAGS    = -N us -X explicit -M ilp64 -N so -W4\r
+  DEBUG_VS2008x86xASL_IPF_DLINK_FLAGS  = /NOLOGO /NODEFAULTLIB /LTCG /DLL /OPT:REF,ICF /IGNORE:4086 /MAP /ALIGN:32 /MACHINE:IA64 /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /BASE:0 /DRIVER /MAP:$(DEBUG_DIR)/$(BASE_NAME).map /PDB:$(DEBUG_DIR)/$(BASE_NAME).pdb /DEBUG\r
+RELEASE_VS2008x86xASL_IPF_DLINK_FLAGS  = /NOLOGO /NODEFAULTLIB /LTCG /DLL /OPT:REF,ICF /IGNORE:4086 /MAP /ALIGN:32 /MACHINE:IA64 /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /BASE:0 /DRIVER /MAP:$(DEBUG_DIR)/$(BASE_NAME).map /PDB:$(DEBUG_DIR)/$(BASE_NAME).pdb\r
+\r
+\r
 ####################################################################################\r
 #\r
 # Microsoft Device Driver Kit 3790.1830 (IA-32, X64, Itanium, with Link Time Code Generation)\r
@@ -1083,11 +1548,11 @@ RELEASE_DDK3790xASL_IPF_DLINK_FLAGS  = /NOLOGO /NODEFAULTLIB /LTCG /DLL /OPT:REF
 *_*_*_SYMRENAME_PATH            = echo\r
 *_*_*_SYMRENAME_FLAGS           = Symbol renaming not needed for\r
 \r
-DEFINE GCC_ALL_CC_FLAGS            = -Os -fshort-wchar -fno-strict-aliasing -Wall -Werror -Wno-missing-braces -Wno-array-bounds -c -include AutoGen.h\r
+DEFINE GCC_ALL_CC_FLAGS            = -g -Os -fshort-wchar -fno-strict-aliasing -Wall -Werror -Wno-missing-braces -Wno-array-bounds -c -include AutoGen.h\r
 DEFINE GCC_IA32_CC_FLAGS           = DEF(GCC_ALL_CC_FLAGS) -m32 -malign-double -freorder-blocks -freorder-blocks-and-partition -O2\r
 DEFINE GCC_X64_CC_FLAGS            = DEF(GCC_ALL_CC_FLAGS) -mno-red-zone -Wno-address\r
 DEFINE GCC_IPF_CC_FLAGS            = DEF(GCC_ALL_CC_FLAGS) -minline-int-divide-min-latency\r
-DEFINE GCC_DLINK_FLAGS_COMMON      = -nostdlib -s --pie\r
+DEFINE GCC_DLINK_FLAGS_COMMON      = -nostdlib --pie\r
 DEFINE GCC_IA32_X64_DLINK_COMMON   = DEF(GCC_DLINK_FLAGS_COMMON) --gc-sections\r
 DEFINE GCC_IA32_X64_ASLDLINK_FLAGS = DEF(GCC_IA32_X64_DLINK_COMMON) --entry _ReferenceAcpiTable -u $(IMAGE_ENTRY_POINT)\r
 DEFINE GCC_IA32_X64_DLINK_FLAGS    = DEF(GCC_IA32_X64_DLINK_COMMON) --entry _$(IMAGE_ENTRY_POINT) --file-alignment 0x20 --section-alignment 0x20 -Map $(DEST_DIR_DEBUG)/$(BASE_NAME).map\r
@@ -1104,9 +1569,9 @@ DEFINE GCC_IA32_RC_FLAGS           = -I binary -O elf32-i386        -B i386 --re
 DEFINE GCC_X64_RC_FLAGS            = -I binary -O elf64-x86-64      -B i386 --rename-section .data=.hii\r
 DEFINE GCC_IPF_RC_FLAGS            = -I binary -O elf64-ia64-little -B ia64 --rename-section .data=.hii\r
 \r
-DEFINE GCC44_ALL_CC_FLAGS            = -fshort-wchar -fno-stack-protector -fno-strict-aliasing -Wall -Werror -Wno-missing-braces -Wno-array-bounds -ffunction-sections -c -include AutoGen.h -DSTRING_ARRAY_NAME=$(BASE_NAME)Strings\r
+DEFINE GCC44_ALL_CC_FLAGS            = -g -fshort-wchar -fno-stack-protector -fno-strict-aliasing -Wall -Werror -Wno-missing-braces -Wno-array-bounds -ffunction-sections -fdata-sections -c -include AutoGen.h -DSTRING_ARRAY_NAME=$(BASE_NAME)Strings\r
 DEFINE GCC44_IA32_CC_FLAGS           = DEF(GCC44_ALL_CC_FLAGS) -m32 -malign-double -D EFI32\r
-DEFINE GCC44_X64_CC_FLAGS            = DEF(GCC44_ALL_CC_FLAGS) "-DEFIAPI=__attribute__((ms_abi))" -mno-red-zone -Wno-address\r
+DEFINE GCC44_X64_CC_FLAGS            = DEF(GCC44_ALL_CC_FLAGS) -m64 "-DEFIAPI=__attribute__((ms_abi))" -mno-red-zone -Wno-address\r
 DEFINE GCC44_IA32_X64_DLINK_COMMON   = -nostdlib -n -q --gc-sections\r
 DEFINE GCC44_IA32_X64_ASLDLINK_FLAGS = DEF(GCC44_IA32_X64_DLINK_COMMON) --entry ReferenceAcpiTable -u ReferenceAcpiTable\r
 DEFINE GCC44_IA32_X64_DLINK_FLAGS    = DEF(GCC44_IA32_X64_DLINK_COMMON) --entry $(IMAGE_ENTRY_POINT) -u $(IMAGE_ENTRY_POINT) -Map $(DEST_DIR_DEBUG)/$(BASE_NAME).map\r
@@ -1169,9 +1634,11 @@ DEFINE GCC44_ASM_FLAGS               = DEF(GCC_ASM_FLAGS)
 *_UNIXGCC_X64_ASLPP_PATH            = DEF(UNIXGCC_X64_PETOOLS_PREFIX)gcc\r
 *_UNIXGCC_X64_VFRPP_PATH            = DEF(UNIXGCC_X64_PETOOLS_PREFIX)gcc\r
 *_UNIXGCC_X64_RC_PATH               = DEF(UNIXGCC_X64_PETOOLS_PREFIX)objcopy\r
+*_UNIXGCC_X64_OBJCOPY_PATH          = DEF(UNIXGCC_X64_PETOOLS_PREFIX)objcopy\r
 \r
 *_UNIXGCC_X64_CC_FLAGS              = DEF(GCC_X64_CC_FLAGS)\r
 *_UNIXGCC_X64_RC_FLAGS              = DEF(GCC_X64_RC_FLAGS)\r
+*_UNIXGCC_X64_OBJCOPY_FLAGS         =\r
 \r
 ##################\r
 # IPF definitions\r
@@ -1228,15 +1695,14 @@ DEFINE GCC44_ASM_FLAGS               = DEF(GCC_ASM_FLAGS)
 *_GCC44_IA32_ASLCC_PATH           = DEF(GCC44_IA32_PREFIX)gcc\r
 *_GCC44_IA32_ASLPP_PATH           = DEF(GCC44_IA32_PREFIX)gcc\r
 *_GCC44_IA32_RC_PATH              = DEF(GCC44_IA32_PREFIX)objcopy\r
-*_GCC44_IA32_OBJCOPY_PATH         = DEF(GCC44_IA32_PREFIX)objcopy\r
 \r
 *_GCC44_IA32_ASLCC_FLAGS          = DEF(GCC_ASLCC_FLAGS) -m32\r
 *_GCC44_IA32_ASLDLINK_FLAGS       = DEF(GCC44_IA32_X64_ASLDLINK_FLAGS) -m elf_i386\r
 *_GCC44_IA32_ASM_FLAGS            = DEF(GCC44_ASM_FLAGS) -m32 --32 -march=i386\r
-*_GCC44_IA32_CC_FLAGS             = DEF(GCC44_IA32_CC_FLAGS)\r
+*_GCC44_IA32_CC_FLAGS             = DEF(GCC44_IA32_CC_FLAGS) -Os\r
 *_GCC44_IA32_DLINK_FLAGS          = DEF(GCC44_IA32_X64_DLINK_FLAGS) -m elf_i386 --oformat=elf32-i386\r
 *_GCC44_IA32_RC_FLAGS             = DEF(GCC_IA32_RC_FLAGS)\r
-*_GCC44_IA32_OBJCOPY_FLAGS        =\r
+\r
 \r
 ####################################################################################\r
 #\r
@@ -2250,17 +2716,17 @@ RELEASE_XCODE32_X64_ASM_FLAGS  = -arch x86_64
 RELEASE_XCODE32_X64_CC_FLAGS   = -arch x86_64 -Oz -combine -mms-bitfields -fshort-wchar -fno-strict-aliasing -Wall -Werror -Wno-missing-braces -Wno-address  -fomit-frame-pointer -static  -c -include AutoGen.h -fno-stack-protector\r
 \r
 ##################\r
-# ARM definitions - still a work in progress (Assumes iPhone SDK installed)\r
+# ARM definitions - (Assumes iPhone SDK installed on Snow Leopard)\r
 ##################\r
 \r
-*_XCODE32_ARM_ARCHCC_FLAGS    = -arch armv6 -march=armv6 -mthumb\r
-*_XCODE32_ARM_ARCHASM_FLAGS   = -arch armv6 \r
-*_XCODE32_ARM_ARCHDLINK_FLAGS = -arch armv6 \r
+*_XCODE32_ARM_ARCHCC_FLAGS    = -arch armv7 -march=armv7 -mthumb\r
+*_XCODE32_ARM_ARCHASM_FLAGS   = -arch armv7 \r
+*_XCODE32_ARM_ARCHDLINK_FLAGS = -arch armv7 \r
 *_XCODE32_ARM_PLATFORM_FLAGS  =\r
 \r
 *_XCODE32_ARM_CC_PATH       = DEF(IPHONE_TOOLS)/usr/bin/gcc\r
 *_XCODE32_ARM_SLINK_PATH    = DEF(IPHONE_TOOLS)/usr/bin/libtool\r
-*_XCODE32_ARM_DLINK_PATH    = DEF(IPHONE_TOOLS)/usr/bin/ld\r
+*_XCODE32_ARM_DLINK_PATH    = ld\r
 *_XCODE32_ARM_ASM_PATH      = DEF(IPHONE_TOOLS)/usr/bin/as\r
 *_XCODE32_ARM_PP_PATH       = DEF(IPHONE_TOOLS)/usr/bin/gcc\r
 *_XCODE32_ARM_VFRPP_PATH    = DEF(IPHONE_TOOLS)/usr/bin/gcc\r
@@ -2291,8 +2757,8 @@ RELEASE_XCODE32_ARM_CC_FLAGS   = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) -mthumb-inter
 #\r
 # Use default values, or override in DSC file\r
 #\r
-*_RVCT31_ARM_ARCHCC_FLAGS    = --cpu Cortex-A8 --thumb\r
-*_RVCT31_ARM_ARCHASM_FLAGS   = --cpu Cortex-A8\r
+*_RVCT31_ARM_ARCHCC_FLAGS    = --thumb --cpu 7-A\r
+*_RVCT31_ARM_ARCHASM_FLAGS   = --cpu 7-A\r
 *_RVCT31_ARM_ARCHDLINK_FLAGS = \r
 *_RVCT31_ARM_PLATFORM_FLAGS  =\r
 \r
@@ -2341,8 +2807,8 @@ RELEASE_RVCT31_ARM_CC_FLAGS  = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) --c90    -Ospac
 #\r
 # Use default values, or override in DSC file\r
 #\r
-*_RVCT31CYGWIN_ARM_ARCHCC_FLAGS    = --cpu Cortex-A8 --thumb\r
-*_RVCT31CYGWIN_ARM_ARCHASM_FLAGS   = --cpu Cortex-A8 \r
+*_RVCT31CYGWIN_ARM_ARCHCC_FLAGS    = --thumb --cpu 7-A\r
+*_RVCT31CYGWIN_ARM_ARCHASM_FLAGS   = --cpu 7-A\r
 *_RVCT31CYGWIN_ARM_ARCHDLINK_FLAGS = \r
 *_RVCT31CYGWIN_ARM_PLATFORM_FLAGS  =\r
 \r
index d8dc890..7386bcf 100644 (file)
@@ -4,7 +4,7 @@ Abstract:
   Patch the BPB information in boot sector image file.\r
   Patch the MBR code in MBR image file.\r
 \r
-Copyright 2006 - 2008, Intel Corporation                                                         \r
+Copyright 2006 - 2010, Intel Corporation                                                         \r
 All rights reserved. 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
@@ -56,7 +56,7 @@ Returns:
 --*/\r
 {\r
   printf ("%s v%d.%d - Utility to break a file into two pieces at the specified offset.\n", UTILITY_NAME, UTILITY_MAJOR_VERSION, UTILITY_MINOR_VERSION);\r
-  printf ("Copyright (c) 1999-2007 Intel Corporation. All rights reserved.\n");\r
+  printf ("Copyright (c) 1999-2010 Intel Corporation. All rights reserved.\n");\r
 }\r
 \r
 void\r
index 68cf024..0e7608d 100644 (file)
@@ -44,18 +44,6 @@ STATIC UINT32 mMaxWarnings            = 0;
 STATIC UINT32 mMaxWarningsPlusErrors  = 0;\r
 STATIC INT8   mPrintLimitsSet         = 0;\r
 \r
-STATIC\r
-VOID\r
-PrintMessage (\r
-  CHAR8   *Type,\r
-  CHAR8   *FileName,\r
-  UINT32  LineNumber,\r
-  UINT32  MessageCode,\r
-  CHAR8   *Text,\r
-  CHAR8   *MsgFmt,\r
-  va_list List\r
-  );\r
-\r
 STATIC\r
 VOID\r
 PrintLimitExceeded (\r
@@ -151,12 +139,6 @@ Notes:
   va_start (List, MsgFmt);\r
   PrintMessage ("ERROR", FileName, LineNumber, MessageCode, Text, MsgFmt, List);\r
   va_end (List);\r
-  //\r
-  // Set status accordingly\r
-  //\r
-  if (mStatus < STATUS_ERROR) {\r
-    mStatus = STATUS_ERROR;\r
-  }\r
 }\r
 \r
 VOID\r
@@ -211,12 +193,6 @@ Returns:
   va_start (List, MsgFmt);\r
   PrintMessage ("ERROR", mSourceFileName, mSourceFileLineNum, MessageCode, Text, MsgFmt, List);\r
   va_end (List);\r
-  //\r
-  // Set status accordingly\r
-  //\r
-  if (mStatus < STATUS_ERROR) {\r
-    mStatus = STATUS_ERROR;\r
-  }\r
 }\r
 \r
 VOID\r
@@ -396,7 +372,6 @@ Returns:
   va_end (List);\r
 }\r
 \r
-STATIC\r
 VOID\r
 PrintMessage (\r
   CHAR8   *Type,\r
@@ -517,6 +492,15 @@ Notes:
         sprintf (Line, "%s", mUtilityName);\r
       }\r
     }\r
+\r
+    if (strcmp (Type, "ERROR") == 0) {\r
+      //\r
+      // Set status accordingly for ERROR information.\r
+      //\r
+      if (mStatus < STATUS_ERROR) {\r
+        mStatus = STATUS_ERROR;\r
+      }\r
+    }\r
   }\r
 \r
   //\r
@@ -545,6 +529,7 @@ Notes:
     vsprintf (Line2, MsgFmt, List);\r
     fprintf (stdout, "  %s\n", Line2);\r
   }\r
+\r
 }\r
 \r
 STATIC\r
index 40e6e17..8986a59 100644 (file)
@@ -70,6 +70,17 @@ SetUtilityName (
   )\r
 ;\r
 \r
+VOID\r
+PrintMessage (\r
+  CHAR8   *Type,\r
+  CHAR8   *FileName,\r
+  UINT32  LineNumber,\r
+  UINT32  MessageCode,\r
+  CHAR8   *Text,\r
+  CHAR8   *MsgFmt,\r
+  va_list List\r
+  );\r
+\r
 VOID\r
 Error (\r
   CHAR8   *FileName,\r
index cd10da9..2ce25be 100644 (file)
@@ -1,6 +1,6 @@
 /** @file\r
 \r
-Copyright (c) 2004 - 2008, Intel Corporation                                                         \r
+Copyright (c) 2004 - 2010, Intel Corporation                                                         \r
 All rights reserved. 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
@@ -484,13 +484,14 @@ Returns:
 --*/\r
 {\r
   UINT8   Index;\r
-  UINT64  HexNumber;\r
+  UINT64  Value;\r
   CHAR8   CurrentChar;\r
   \r
   //\r
   // Initialize the result\r
   //\r
-  HexNumber = 0;\r
+  Value = 0;\r
+  Index = 0;\r
   \r
   //\r
   // Check input paramter\r
@@ -498,50 +499,65 @@ Returns:
   if (AsciiString == NULL || ReturnValue == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
+  while (AsciiString[Index] == ' ') {\r
+    Index ++;\r
+  }\r
+  \r
   //\r
   // Add each character to the result\r
   //\r
-  if (IsHex || (AsciiString[0] == '0' && (AsciiString[1] == 'x' || AsciiString[1] == 'X'))) {\r
-    //\r
-    // Verify string is a hex number\r
-    //\r
-    for (Index = 2; Index < strlen (AsciiString); Index++) {\r
-      if (isxdigit ((int)AsciiString[Index]) == 0) {\r
-        return EFI_ABORTED;\r
-      }\r
-    }\r
+  if (IsHex || (AsciiString[Index] == '0' && (AsciiString[Index + 1] == 'x' || AsciiString[Index + 1] == 'X'))) {\r
     //\r
     // Convert the hex string.\r
     //\r
-    for (Index = 2; AsciiString[Index] != '\0'; Index++) {\r
+    for (Index = Index + 2; AsciiString[Index] != '\0'; Index++) {\r
       CurrentChar = AsciiString[Index];\r
-      HexNumber *= 16;\r
+      if (CurrentChar == ' ') {\r
+        break;\r
+      }\r
+      //\r
+      // Verify Hex string\r
+      //\r
+      if (isxdigit ((int)CurrentChar) == 0) {\r
+        return EFI_ABORTED;\r
+      }\r
+      //\r
+      // Add hex value\r
+      //\r
+      Value *= 16;\r
       if (CurrentChar >= '0' && CurrentChar <= '9') {\r
-        HexNumber += CurrentChar - '0';\r
+        Value += CurrentChar - '0';\r
       } else if (CurrentChar >= 'a' && CurrentChar <= 'f') {\r
-        HexNumber += CurrentChar - 'a' + 10;\r
+        Value += CurrentChar - 'a' + 10;\r
       } else if (CurrentChar >= 'A' && CurrentChar <= 'F') {\r
-        HexNumber += CurrentChar - 'A' + 10;\r
-      } else {\r
-        //\r
-        // Unrecognized character\r
-        //\r
-        return EFI_ABORTED;\r
+        Value += CurrentChar - 'A' + 10;\r
       }\r
     }\r
 \r
-    *ReturnValue = HexNumber;\r
+    *ReturnValue = Value;\r
   } else {\r
     //\r
-    // Verify string is a number\r
+    // Convert dec string is a number\r
     //\r
-    for (Index = 0; Index < strlen (AsciiString); Index++) {\r
-      if (isdigit ((int)AsciiString[Index]) == 0) {\r
+    for (; Index < strlen (AsciiString); Index++) {\r
+      CurrentChar = AsciiString[Index];\r
+      if (CurrentChar == ' ') {\r
+        break;\r
+      }\r
+      //\r
+      // Verify Dec string\r
+      //\r
+      if (isdigit ((int)CurrentChar) == 0) {\r
         return EFI_ABORTED;\r
       }\r
+      //\r
+      // Add dec value\r
+      //\r
+      Value = Value * 10;\r
+      Value += CurrentChar - '0';\r
     }\r
 \r
-    *ReturnValue = atol (AsciiString);\r
+    *ReturnValue = Value;\r
   }\r
 \r
   return EFI_SUCCESS;\r
index c2c8111..7a3b4a2 100644 (file)
@@ -1,6 +1,6 @@
 /** @file\r
 \r
-Copyright 2006 - 2008, Intel Corporation                                                         \r
+Copyright 2006 - 2010, Intel Corporation                                                         \r
 All rights reserved. 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
@@ -84,7 +84,7 @@ Returns:
 --*/\r
 {\r
   printf ("%s v%d.%d -Utility to break a file into two pieces at the request offset.\n", UTILITY_NAME, UTILITY_MAJOR_VERSION, UTILITY_MINOR_VERSION);\r
-  printf ("Copyright (c) 1999-2007 Intel Corporation. All rights reserved.\n");\r
+  printf ("Copyright (c) 1999-2010 Intel Corporation. All rights reserved.\n");\r
 }\r
 \r
 VOID\r
index d43520a..981786c 100644 (file)
@@ -1,6 +1,6 @@
 /** @file\r
 \r
-Copyright (c)  1999-2008 Intel Corporation. All rights reserved\r
+Copyright (c)  1999-2010 Intel Corporation. All rights reserved\r
 This program and the accompanying materials are licensed and made available \r
 under the terms and conditions of the BSD License which accompanies this \r
 distribution.  The full text of the license may be found at\r
@@ -1205,7 +1205,7 @@ Returns:
   //\r
   // Copyright declaration\r
   // \r
-  fprintf (stdout, "Copyright (c) 2007 - 2009, Intel Corporation. All rights reserved.\n\n");\r
+  fprintf (stdout, "Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.\n\n");\r
 \r
   //\r
   // Details Option\r
index 05839bb..e4a79be 100644 (file)
@@ -1,6 +1,6 @@
 /** @file\r
 \r
-Copyright 2006 - 2008, Intel Corporation                                                         \r
+Copyright 2006 - 2010, Intel Corporation                                                         \r
 All rights reserved. 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
@@ -542,7 +542,7 @@ Returns:
 --*/\r
 {\r
   printf ("%s v%d.%d -Utility to retrieve and update the boot sector or MBR.\n", UTILITY_NAME, UTILITY_MAJOR_VERSION, UTILITY_MINOR_VERSION);\r
-  printf ("Copyright (c) 2009 Intel Corporation. All rights reserved.\n");\r
+  printf ("Copyright (c) 2009 - 2010 Intel Corporation. All rights reserved.\n");\r
 }\r
 \r
 VOID\r
index a94f920..34d1a7a 100644 (file)
@@ -1,6 +1,6 @@
 /** @file\r
 \r
-Copyright (c) 2007 - 2008, Intel Corporation                                              \r
+Copyright (c) 2007 - 2010, Intel Corporation                                              \r
 All rights reserved. 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
@@ -86,7 +86,7 @@ Returns:
   //\r
   // Copyright declaration\r
   // \r
-  fprintf (stdout, "Copyright (c) 2007 - 2009, Intel Corporation. All rights reserved.\n\n");\r
+  fprintf (stdout, "Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.\n\n");\r
 \r
   //\r
   // Details Option\r
index 324490a..cdaba0c 100644 (file)
@@ -1,6 +1,6 @@
 /**\r
 \r
-Copyright (c) 2004-2008, Intel Corporation                                                         \r
+Copyright (c) 2004-2010, Intel Corporation                                                         \r
 All rights reserved. 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
@@ -119,7 +119,7 @@ Returns:
   //\r
   // Copyright declaration\r
   // \r
-  fprintf (stdout, "Copyright (c) 2007, Intel Corporation. All rights reserved.\n\n");\r
+  fprintf (stdout, "Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.\n\n");\r
 \r
   //\r
   // Details Option\r
@@ -287,6 +287,8 @@ Returns:
   EFI_COMMON_SECTION_HEADER  TempSectHeader;\r
   EFI_TE_IMAGE_HEADER        TeHeader;\r
   UINT32                     TeOffset;\r
+  EFI_GUID_DEFINED_SECTION   GuidSectHeader;\r
+  UINT32                     HeaderSize;\r
 \r
   Size          = 0;\r
   Offset        = 0;\r
@@ -330,6 +332,7 @@ Returns:
     // Check this section is Te/Pe section, and Calculate the numbers of Te/Pe section.\r
     //\r
     TeOffset = 0;\r
+    HeaderSize = sizeof (EFI_COMMON_SECTION_HEADER);\r
     fread (&TempSectHeader, 1, sizeof (TempSectHeader), InFile);\r
     if (TempSectHeader.Type == EFI_SECTION_TE) {\r
       (*PESectionNum) ++;\r
@@ -339,8 +342,14 @@ Returns:
       }\r
     } else if (TempSectHeader.Type == EFI_SECTION_PE32) {\r
       (*PESectionNum) ++;\r
+    } else if (TempSectHeader.Type == EFI_SECTION_GUID_DEFINED) {\r
+      fseek (InFile, 0, SEEK_SET);\r
+      fread (&GuidSectHeader, 1, sizeof (GuidSectHeader), InFile);\r
+      if ((GuidSectHeader.Attributes & EFI_GUIDED_SECTION_PROCESSING_REQUIRED) == 0) {\r
+        HeaderSize = GuidSectHeader.DataOffset;\r
+      }\r
+      (*PESectionNum) ++;\r
     } else if (TempSectHeader.Type == EFI_SECTION_COMPRESSION || \r
-               TempSectHeader.Type == EFI_SECTION_GUID_DEFINED ||\r
                TempSectHeader.Type == EFI_SECTION_FIRMWARE_VOLUME_IMAGE) {\r
       //\r
       // for the encapsulated section, assume it contains Pe/Te section \r
@@ -358,17 +367,18 @@ Returns:
       TeOffset = InputFileAlign [Index] - (TeOffset % InputFileAlign [Index]);\r
       TeOffset = TeOffset % InputFileAlign [Index];\r
     }\r
-     \r
+\r
     //\r
     // make sure section data meet its alignment requirement by adding one raw pad section.\r
     // But the different sections have the different section header. Necessary or not?\r
     // Based on section type to adjust offset? Todo\r
     //\r
-    if ((InputFileAlign [Index] != 0) && (((Size + sizeof (EFI_COMMON_SECTION_HEADER) + TeOffset) % InputFileAlign [Index]) != 0)) {\r
-      Offset = (Size + 2 * sizeof (EFI_COMMON_SECTION_HEADER) + TeOffset + InputFileAlign [Index] - 1) & ~(InputFileAlign [Index] - 1);\r
-      Offset = Offset - Size - sizeof (EFI_COMMON_SECTION_HEADER) - TeOffset;\r
+    if ((InputFileAlign [Index] != 0) && (((Size + HeaderSize + TeOffset) % InputFileAlign [Index]) != 0)) {\r
+      Offset = (Size + sizeof (EFI_COMMON_SECTION_HEADER) + HeaderSize + TeOffset + InputFileAlign [Index] - 1) & ~(InputFileAlign [Index] - 1);\r
+      Offset = Offset - Size - HeaderSize - TeOffset;\r
        \r
       if (FileBuffer != NULL && ((Size + Offset) < *BufferLength)) {\r
+        memset (FileBuffer + Size, 0, Offset);\r
         SectHeader          = (EFI_COMMON_SECTION_HEADER *) (FileBuffer + Size);\r
         SectHeader->Type    = EFI_SECTION_RAW;\r
         SectHeader->Size[0] = (UINT8) (Offset & 0xff);\r
index 135c9ed..5b7f72e 100644 (file)
@@ -1,6 +1,6 @@
 /** @file\r
 \r
-Copyright (c) 2007 - 2009, Intel Corporation                                                         \r
+Copyright (c) 2007 - 2010, Intel Corporation                                                         \r
 All rights reserved. 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
@@ -40,7 +40,7 @@ Abstract:
 //\r
 #define UTILITY_MAJOR_VERSION 0\r
 #define UTILITY_MINOR_VERSION 1\r
-#define GENFV_UPDATE_TIME           " updated on 2008/11/21"\r
+#define GENFV_UPDATE_TIME           " updated on 2010/2/1"\r
 \r
 EFI_GUID  mEfiFirmwareFileSystem2Guid = EFI_FIRMWARE_FILE_SYSTEM2_GUID;\r
 \r
@@ -97,7 +97,7 @@ Returns:
   //\r
   // Copyright declaration\r
   // \r
-  fprintf (stdout, "Copyright (c) 2007, Intel Corporation. All rights reserved.\n\n");\r
+  fprintf (stdout, "Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.\n\n");\r
 \r
   //\r
   // Details Option\r
@@ -126,11 +126,8 @@ Returns:
                         run in Flash. It supports DEC or HEX digital format.\n\\r
                         If it is set to zero, no rebase action will be taken\n");\r
   fprintf (stdout, "  -a AddressFile, --addrfile AddressFile\n\\r
-                        AddressFile is one file used to record boot driver base\n\\r
-                        address and runtime driver base address. And this tool\n\\r
-                        will update these two addresses after it relocates all\n\\r
-                        boot drivers and runtime drivers in this fv iamge to\n\\r
-                        the preferred loaded memory address.\n");\r
+                        AddressFile is one file used to record the child\n\\r
+                        FV base address when current FV base address is set.\n");\r
   fprintf (stdout, "  -m logfile, --map logfile\n\\r
                         Logfile is the output fv map file name. if it is not\n\\r
                         given, the FvName.map will be the default map file name\n"); \r
@@ -194,10 +191,8 @@ Returns:
   CHAR8                 *InfFileImage;\r
   UINT32                InfFileSize;\r
   CHAR8                 *OutFileName;\r
-  CHAR8                 ValueString[_MAX_PATH];\r
   BOOLEAN               CapsuleFlag;\r
   BOOLEAN               DumpCapsule;\r
-  MEMORY_FILE           AddrMemoryFile;\r
   FILE                  *FpFile;\r
   EFI_CAPSULE_HEADER    *CapsuleHeader;\r
   UINT64                LogLevel, TempNumber;\r
@@ -545,62 +540,6 @@ Returns:
     VerboseMsg ("the output file name is %s", OutFileName);\r
   }\r
   \r
-  //\r
-  // Read boot and runtime address from address file\r
-  //\r
-  if (AddrFileName != NULL) {\r
-    VerboseMsg ("the input address file name is %s", AddrFileName);\r
-    Status = GetFileImage (AddrFileName, &InfFileImage, &InfFileSize);\r
-    if (EFI_ERROR (Status)) {\r
-      return STATUS_ERROR;\r
-    }\r
-\r
-    AddrMemoryFile.FileImage           = InfFileImage;\r
-    AddrMemoryFile.CurrentFilePointer  = InfFileImage;\r
-    AddrMemoryFile.Eof                 = InfFileImage + InfFileSize;\r
-\r
-    //\r
-    // Read the boot driver base address for this FV image\r
-    //\r
-    Status = FindToken (&AddrMemoryFile, OPTIONS_SECTION_STRING, EFI_FV_BOOT_DRIVER_BASE_ADDRESS_STRING, 0, ValueString);\r
-    if (Status == EFI_SUCCESS) {\r
-      //\r
-      // Get the base address\r
-      //\r
-      Status = AsciiStringToUint64 (ValueString, FALSE, &TempNumber);\r
-      if (EFI_ERROR (Status)) {\r
-        Error (NULL, 0, 2000, "Invalid parameter", "%s = %s", EFI_FV_BOOT_DRIVER_BASE_ADDRESS_STRING, ValueString);\r
-        return STATUS_ERROR;\r
-      }\r
-      mFvDataInfo.BootBaseAddress = TempNumber;\r
-      DebugMsg (NULL, 0, 9, "Boot driver base address", "%s = %s", EFI_FV_BOOT_DRIVER_BASE_ADDRESS_STRING, ValueString);\r
-    }\r
-  \r
-    //\r
-    // Read the FV runtime driver base address\r
-    //\r
-    Status = FindToken (&AddrMemoryFile, OPTIONS_SECTION_STRING, EFI_FV_RUNTIME_DRIVER_BASE_ADDRESS_STRING, 0, ValueString);\r
-    if (Status == EFI_SUCCESS) {\r
-      //\r
-      // Get the base address\r
-      //\r
-      Status = AsciiStringToUint64 (ValueString, FALSE, &TempNumber);\r
-      if (EFI_ERROR (Status)) {\r
-        Error (NULL, 0, 2000, "Invalid parameter", "%s = %s", EFI_FV_RUNTIME_DRIVER_BASE_ADDRESS_STRING, ValueString);\r
-        return STATUS_ERROR;\r
-      }\r
-      mFvDataInfo.RuntimeBaseAddress = TempNumber;\r
-      DebugMsg (NULL, 0, 9, "Runtime driver base address", "%s = %s", EFI_FV_RUNTIME_DRIVER_BASE_ADDRESS_STRING, ValueString);\r
-    }\r
-    \r
-    //\r
-    // free the allocated memory space for addr file.\r
-    //\r
-    free (InfFileImage);\r
-    InfFileImage = NULL;\r
-    InfFileSize  = 0;\r
-  }\r
-\r
   //\r
   // Read the INF file image\r
   //\r
@@ -683,32 +622,22 @@ Returns:
   //\r
   //  update boot driver address and runtime driver address in address file\r
   //\r
-  if (Status == EFI_SUCCESS && AddrFileName != NULL) {\r
+  if (Status == EFI_SUCCESS && AddrFileName != NULL && mFvBaseAddressNumber > 0) {\r
     FpFile = fopen (AddrFileName, "w");\r
     if (FpFile == NULL) {\r
       Error (NULL, 0, 0001, "Error opening file", AddrFileName);\r
       return STATUS_ERROR;\r
     }\r
-    fprintf (FpFile, OPTIONS_SECTION_STRING);\r
+    fprintf (FpFile, FV_BASE_ADDRESS_STRING);\r
     fprintf (FpFile, "\n");\r
-    if (mFvDataInfo.BootBaseAddress != 0) {\r
-      fprintf (FpFile, EFI_FV_BOOT_DRIVER_BASE_ADDRESS_STRING);\r
-      fprintf (\r
-        FpFile,\r
-        " = 0x%llx\n",\r
-        (unsigned long long)mFvDataInfo.BootBaseAddress\r
-        );\r
-      DebugMsg (NULL, 0, 9, "Updated boot driver base address", "%s = 0x%llx", EFI_FV_RUNTIME_DRIVER_BASE_ADDRESS_STRING, (unsigned long long) mFvDataInfo.BootBaseAddress);\r
-    }\r
-    if (mFvDataInfo.RuntimeBaseAddress != 0) {\r
-      fprintf (FpFile, EFI_FV_RUNTIME_DRIVER_BASE_ADDRESS_STRING);\r
+    for (Index = 0; Index < mFvBaseAddressNumber; Index ++) {\r
       fprintf (\r
         FpFile,\r
-        " = 0x%llx\n",\r
-        (unsigned long long)mFvDataInfo.RuntimeBaseAddress\r
+        "0x%llx\n",\r
+        (unsigned long long)mFvBaseAddress[Index]\r
         );\r
-      DebugMsg (NULL, 0, 9, "Updated runtime driver base address", "%s = 0x%llx", EFI_FV_RUNTIME_DRIVER_BASE_ADDRESS_STRING, (unsigned long long) mFvDataInfo.RuntimeBaseAddress);\r
     }\r
+    fflush (FpFile);\r
     fclose (FpFile);\r
   }\r
   \r
index d17a2ff..00d0085 100644 (file)
@@ -1,6 +1,6 @@
 /** @file\r
 \r
-Copyright (c) 2004 - 2009, Intel Corporation                                                         \r
+Copyright (c) 2004 - 2010, Intel Corporation                                                         \r
 All rights reserved. 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
@@ -159,6 +159,9 @@ UINT8                                   m64kRecoveryStartupApDataArray[SIZEOF_ST
 FV_INFO                     mFvDataInfo;\r
 CAP_INFO                    mCapDataInfo;\r
 \r
+EFI_PHYSICAL_ADDRESS mFvBaseAddress[0x10];\r
+UINT32               mFvBaseAddressNumber = 0;\r
+\r
 EFI_STATUS\r
 ParseFvInf (\r
   IN  MEMORY_FILE  *InfFile,\r
@@ -716,6 +719,11 @@ Returns:
   EFI_TE_IMAGE_HEADER                 *TEImageHeader;\r
   EFI_IMAGE_SECTION_HEADER            *SectionHeader;\r
   unsigned long long                  TempLongAddress;\r
+  UINT32                              TextVirtualAddress;\r
+  UINT32                              DataVirtualAddress;\r
+  EFI_PHYSICAL_ADDRESS                LinkTimeBaseAddress;\r
+\r
+  \r
   //\r
   // Init local variable\r
   //\r
@@ -789,29 +797,35 @@ Returns:
     SectionHeader = (EFI_IMAGE_SECTION_HEADER *) (TEImageHeader + 1);\r
     Index = TEImageHeader->NumberOfSections;\r
   }\r
-  \r
+\r
   //\r
   // module information output\r
   //\r
   if (ImageBaseAddress == 0) {\r
     fprintf (FvMapFile, "%s (dummy) (", KeyWord);\r
-    fprintf (FvMapFile, "BaseAddress=%08llx, ", (unsigned long long) ImageBaseAddress);\r
+    fprintf (FvMapFile, "BaseAddress=%010llx, ", (unsigned long long) ImageBaseAddress);\r
   } else {\r
-    fprintf (FvMapFile, "%s (", KeyWord);\r
-    fprintf (FvMapFile, "BaseAddress=%08llx, ", (unsigned long long) (ImageBaseAddress + Offset));\r
+    fprintf (FvMapFile, "%s (Fixed Flash Address, ", KeyWord);\r
+    fprintf (FvMapFile, "BaseAddress=0x%010llx, ", (unsigned long long) (ImageBaseAddress + Offset));\r
   }\r
-  fprintf (FvMapFile, "EntryPoint=%08llx, ", (unsigned long long) (ImageBaseAddress + AddressOfEntryPoint));\r
-  fprintf (FvMapFile, "GUID=%s", FileGuidName);\r
+  fprintf (FvMapFile, "EntryPoint=0x%010llx", (unsigned long long) (ImageBaseAddress + AddressOfEntryPoint));\r
   fprintf (FvMapFile, ")\n"); \r
   \r
+  fprintf (FvMapFile, "(GUID=%s", FileGuidName);\r
+  TextVirtualAddress = 0;\r
+  DataVirtualAddress = 0;\r
   for (; Index > 0; Index --, SectionHeader ++) {\r
-        if (stricmp ((CHAR8 *)SectionHeader->Name, ".text") == 0) {\r
-               fprintf (FvMapFile, ".textbaseaddress=%08llx ", (unsigned long long) (ImageBaseAddress + SectionHeader->VirtualAddress));\r
+    if (stricmp ((CHAR8 *)SectionHeader->Name, ".text") == 0) {\r
+               TextVirtualAddress = SectionHeader->VirtualAddress;\r
        } else if (stricmp ((CHAR8 *)SectionHeader->Name, ".data") == 0) {\r
-         fprintf (FvMapFile, ".databaseaddress=%08llx ", (unsigned long long) (ImageBaseAddress + SectionHeader->VirtualAddress));\r
+         DataVirtualAddress = SectionHeader->VirtualAddress;\r
+       } else if (stricmp ((CHAR8 *)SectionHeader->Name, ".sdata") == 0) {\r
+         DataVirtualAddress = SectionHeader->VirtualAddress;\r
        }\r
   }\r
-  fprintf (FvMapFile, "\n\n"); \r
+  fprintf (FvMapFile, " .textbaseaddress=0x%010llx", (unsigned long long) (ImageBaseAddress + TextVirtualAddress));\r
+  fprintf (FvMapFile, " .databaseaddress=0x%010llx", (unsigned long long) (ImageBaseAddress + DataVirtualAddress));\r
+  fprintf (FvMapFile, ")\n\n");\r
    \r
   //\r
   // Open PeMapFile\r
@@ -826,6 +840,7 @@ Returns:
   //\r
   // Output Functions information into Fv Map file\r
   //\r
+  LinkTimeBaseAddress = 0;\r
   while (fgets (Line, MAX_LINE_LEN, PeMapFile) != NULL) {\r
     //\r
     // Skip blank line\r
@@ -851,6 +866,9 @@ Returns:
         //\r
         FunctionType = 2;\r
         fgets (Line, MAX_LINE_LEN, PeMapFile);\r
+      } else if (stricmp (KeyWord, "Preferred") ==0) {\r
+        sscanf (Line + strlen (" Preferred load address is"), "%llx", &TempLongAddress);\r
+        LinkTimeBaseAddress = (UINT64) TempLongAddress;\r
       }\r
       continue;\r
     }\r
@@ -861,24 +879,14 @@ Returns:
       sscanf (Line, "%s %s %llx %s", KeyWord, FunctionName, &TempLongAddress, FunctionTypeName);\r
       FunctionAddress = (UINT64) TempLongAddress;\r
       if (FunctionTypeName [1] == '\0' && (FunctionTypeName [0] == 'f' || FunctionTypeName [0] == 'F')) {\r
-        fprintf (FvMapFile, "  %016llx ", (unsigned long long) (ImageBaseAddress + FunctionAddress));\r
-        fprintf (FvMapFile, "(%08llx) F  ", (unsigned long long) (FunctionAddress - Offset));\r
-        fprintf (FvMapFile, "%s\n", FunctionName);\r
-    } else {\r
-        fprintf (FvMapFile, "  %016llx ", (unsigned long long) (ImageBaseAddress + FunctionAddress));\r
-        fprintf (FvMapFile, "(%08llx)    ", (unsigned long long) (FunctionAddress - Offset));\r
+        fprintf (FvMapFile, "  0x%010llx    ", (unsigned long long) (ImageBaseAddress + FunctionAddress - LinkTimeBaseAddress));\r
         fprintf (FvMapFile, "%s\n", FunctionName);\r
       }\r
     } else if (FunctionType == 2) {\r
       sscanf (Line, "%s %s %llx %s", KeyWord, FunctionName, &TempLongAddress, FunctionTypeName);\r
       FunctionAddress = (UINT64) TempLongAddress;\r
       if (FunctionTypeName [1] == '\0' && (FunctionTypeName [0] == 'f' || FunctionTypeName [0] == 'F')) {\r
-        fprintf (FvMapFile, "  %016llx ", (unsigned long long) (ImageBaseAddress + FunctionAddress));\r
-        fprintf (FvMapFile, "(%08llx) FS ", (unsigned long long) (FunctionAddress - Offset));\r
-        fprintf (FvMapFile, "%s\n", FunctionName);\r
-      } else {\r
-        fprintf (FvMapFile, "  %016llx ", (unsigned long long) (ImageBaseAddress + FunctionAddress));\r
-        fprintf (FvMapFile, "(%08llx)    ", (unsigned long long) (FunctionAddress - Offset));\r
+        fprintf (FvMapFile, "  0x%010llx    ", (unsigned long long) (ImageBaseAddress + FunctionAddress - LinkTimeBaseAddress));\r
         fprintf (FvMapFile, "%s\n", FunctionName);\r
       }\r
     }\r
@@ -898,7 +906,8 @@ AddFile (
   IN FV_INFO                  *FvInfo,\r
   IN UINTN                    Index,\r
   IN OUT EFI_FFS_FILE_HEADER  **VtfFileImage,\r
-  IN FILE                     *FvMapFile  \r
+  IN FILE                     *FvMapFile,\r
+  IN FILE                     *FvReportFile\r
   )\r
 /*++\r
 \r
@@ -916,6 +925,7 @@ Arguments:
   VtfFileImage  A pointer to the VTF file within the FvImage.  If this is equal\r
                 to the end of the FvImage then no VTF previously found.\r
   FvMapFile     Pointer to FvMap File\r
+  FvReportFile  Pointer to FvReport File\r
 \r
 Returns:\r
 \r
@@ -933,6 +943,7 @@ Returns:
   UINT32                CurrentFileAlignment;\r
   EFI_STATUS            Status;\r
   UINTN                 Index1;\r
+  UINT8                 FileGuidString[PRINTED_GUID_BUFFER_SIZE];\r
   \r
   Index1 = 0;\r
   //\r
@@ -1071,6 +1082,10 @@ Returns:
       // copy VTF File\r
       //\r
       memcpy (*VtfFileImage, FileBuffer, FileSize);\r
+      \r
+      PrintGuidToBuffer ((EFI_GUID *) FileBuffer, FileGuidString, sizeof (FileGuidString), TRUE); \r
+      fprintf (FvReportFile, "0x%08X %s\n", (unsigned)(UINTN) (((UINT8 *)*VtfFileImage) - (UINTN)FvImage->FileImage), FileGuidString);\r
+\r
       free (FileBuffer);\r
       DebugMsg (NULL, 0, 9, "Add VTF FFS file in FV image", NULL);\r
       return EFI_SUCCESS;\r
@@ -1106,6 +1121,8 @@ Returns:
     // Copy the file\r
     //\r
     memcpy (FvImage->CurrentFilePointer, FileBuffer, FileSize);\r
+    PrintGuidToBuffer ((EFI_GUID *) FileBuffer, FileGuidString, sizeof (FileGuidString), TRUE); \r
+    fprintf (FvReportFile, "0x%08X %s\n", (unsigned) (FvImage->CurrentFilePointer - FvImage->FileImage), FileGuidString);\r
     FvImage->CurrentFilePointer += FileSize;\r
   } else {\r
     Error (NULL, 0, 4002, "Resource", "FV space is full, cannot add file %s.", FvInfo->FvFiles[Index]);\r
@@ -1967,10 +1984,13 @@ Returns:
   EFI_FIRMWARE_VOLUME_EXT_HEADER  *FvExtHeader;\r
   FILE                            *FvExtHeaderFile;\r
   UINTN                           FileSize;\r
+  CHAR8                           FvReportName[_MAX_PATH];\r
+  FILE                            *FvReportFile;\r
 \r
   FvBufferHeader = NULL;\r
   FvFile         = NULL;\r
   FvMapFile      = NULL;\r
+  FvReportFile   = NULL;\r
 \r
   if (InfFileImage != NULL) {\r
     //\r
@@ -2109,6 +2129,12 @@ Returns:
   }\r
   VerboseMsg ("FV Map file name is %s", FvMapName);\r
 \r
+  //\r
+  // FvReport file to log the FV information in one Fvimage\r
+  //\r
+  strcpy (FvReportName, FvFileName);\r
+  strcat (FvReportName, ".txt");\r
+\r
   //\r
   // Calculate the FV size and Update Fv Size based on the actual FFS files.\r
   // And Update mFvDataInfo data.\r
@@ -2224,6 +2250,14 @@ Returns:
     return EFI_ABORTED;\r
   }\r
   \r
+  //\r
+  // Open FvReport file\r
+  //\r
+  FvReportFile = fopen(FvReportName, "w");\r
+  if (FvReportFile == NULL) {\r
+    Error (NULL, 0, 0001, "Error opening file", FvReportName);\r
+    return EFI_ABORTED;\r
+  }\r
   //\r
   // record FV size information into FvMap file.\r
   //\r
@@ -2240,6 +2274,12 @@ Returns:
     fprintf (FvMapFile, " = 0x%x\n\n", (unsigned) (mFvTotalSize - mFvTakenSize));\r
   }\r
 \r
+  //\r
+  // record FV size information to FvReportFile.\r
+  //\r
+  fprintf (FvReportFile, "%s = 0x%x\n", EFI_FV_TOTAL_SIZE_STRING, (unsigned) mFvTotalSize);\r
+  fprintf (FvReportFile, "%s = 0x%x\n", EFI_FV_TAKEN_SIZE_STRING, (unsigned) mFvTakenSize);\r
+\r
   //\r
   // Add PI FV extension header\r
   //\r
@@ -2263,7 +2303,7 @@ Returns:
     //\r
     // Add the file\r
     //\r
-    Status = AddFile (&FvImageMemoryFile, &mFvDataInfo, Index, &VtfFileImage, FvMapFile);\r
+    Status = AddFile (&FvImageMemoryFile, &mFvDataInfo, Index, &VtfFileImage, FvMapFile, FvReportFile);\r
 \r
     //\r
     // Exit if error detected while adding the file\r
@@ -2358,13 +2398,19 @@ Finish:
   }\r
   \r
   if (FvFile != NULL) {\r
+    fflush (FvFile);\r
     fclose (FvFile);\r
   }\r
   \r
   if (FvMapFile != NULL) {\r
+    fflush (FvMapFile);\r
     fclose (FvMapFile);\r
   }\r
 \r
+  if (FvReportFile != NULL) {\r
+    fflush (FvReportFile);\r
+    fclose (FvReportFile);\r
+  }\r
   return Status;\r
 }\r
 \r
@@ -2652,6 +2698,54 @@ Returns:
   return EFI_SUCCESS;\r
 }\r
 \r
+EFI_STATUS\r
+GetChildFvFromFfs (\r
+  IN      FV_INFO               *FvInfo, \r
+  IN      EFI_FFS_FILE_HEADER   *FfsFile,\r
+  IN      UINTN                 XipOffset\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  This function gets all child FvImages in the input FfsFile, and records\r
+  their base address to the parent image.\r
+\r
+Arguments:\r
+  FvInfo            A pointer to FV_INFO struture.\r
+  FfsFile           A pointer to Ffs file image that may contain FvImage.\r
+  XipOffset         The offset address to the parent FvImage base.\r
+\r
+Returns:\r
+\r
+  EFI_SUCCESS        Base address of child Fv image is recorded.\r
+--*/\r
+{\r
+  EFI_STATUS                          Status;\r
+  UINTN                               Index;\r
+  EFI_FILE_SECTION_POINTER            SubFvSection;\r
+  EFI_FIRMWARE_VOLUME_HEADER          *SubFvImageHeader;\r
+  EFI_PHYSICAL_ADDRESS                SubFvBaseAddress;\r
+\r
+  for (Index = 1;; Index++) {\r
+    //\r
+    // Find FV section \r
+    //\r
+    Status = GetSectionByType (FfsFile, EFI_SECTION_FIRMWARE_VOLUME_IMAGE, Index, &SubFvSection);\r
+    if (EFI_ERROR (Status)) {\r
+      break;\r
+    }\r
+    SubFvImageHeader = (EFI_FIRMWARE_VOLUME_HEADER *) ((UINT8 *) SubFvSection.FVImageSection + sizeof (EFI_FIRMWARE_VOLUME_IMAGE_SECTION));\r
+    //\r
+    // Rebase on Flash\r
+    //\r
+    SubFvBaseAddress = FvInfo->BaseAddress + (UINTN) SubFvImageHeader - (UINTN) FfsFile + XipOffset;\r
+    mFvBaseAddress[mFvBaseAddressNumber ++ ] = SubFvBaseAddress;\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
 EFI_STATUS\r
 FfsRebase ( \r
   IN OUT  FV_INFO               *FvInfo, \r
@@ -2696,7 +2790,6 @@ Returns:
   EFI_FFS_FILE_STATE                    SavedState;\r
   EFI_IMAGE_OPTIONAL_HEADER_UNION       *ImgHdr;\r
   EFI_TE_IMAGE_HEADER                   *TEImageHeader;\r
-  UINT8                                 Flags;\r
   UINT8                                 *MemoryImagePointer;\r
   EFI_IMAGE_SECTION_HEADER              *SectionHeader;\r
   CHAR8                                 PeFileName [_MAX_PATH];\r
@@ -2717,26 +2810,12 @@ Returns:
   PeFileBuffer       = NULL;\r
 \r
   //\r
-  // Check XipAddress, BootAddress and RuntimeAddress\r
+  // Don't need to relocate image when BaseAddress is not set.\r
   //\r
-  Flags   = 0;\r
-  XipBase = 0;\r
-  if (FvInfo->BaseAddress != 0) {\r
-    Flags  |= REBASE_XIP_FILE;\r
-    XipBase = FvInfo->BaseAddress + XipOffset;\r
-  }\r
-  if (FvInfo->BootBaseAddress != 0) {\r
-    Flags  |= REBASE_BOOTTIME_FILE;\r
-  }\r
-  if (FvInfo->RuntimeBaseAddress != 0) {\r
-    Flags  |= REBASE_RUNTIME_FILE;\r
+  if (FvInfo->BaseAddress == 0) {\r
+    return EFI_SUCCESS;\r
   }\r
-\r
-  //\r
-  //  Don't Rebase this FFS.\r
-  //  Only copy the original map file into the FvMap file \r
-  //  for the image that is not required to be relocated.\r
-  //\r
+  XipBase = FvInfo->BaseAddress + XipOffset;\r
 \r
   //\r
   // We only process files potentially containing PE32 sections.\r
@@ -2749,6 +2828,16 @@ Returns:
     case EFI_FV_FILETYPE_DRIVER:\r
     case EFI_FV_FILETYPE_DXE_CORE:\r
       break;\r
+    case EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE:\r
+      //\r
+      // Rebase the inside FvImage.\r
+      //\r
+      GetChildFvFromFfs (FvInfo, FfsFile, XipOffset);\r
+\r
+      //\r
+      // Search PE/TE section in FV sectin.\r
+      //\r
+      break;\r
     default:\r
       return EFI_SUCCESS;\r
   }\r
@@ -2809,13 +2898,6 @@ Returns:
       case EFI_FV_FILETYPE_PEI_CORE:\r
       case EFI_FV_FILETYPE_PEIM:\r
       case EFI_FV_FILETYPE_COMBINED_PEIM_DRIVER:\r
-        if ((Flags & REBASE_XIP_FILE) == 0) {\r
-          //\r
-          // We aren't relocating XIP code, so skip it.\r
-          //\r
-          goto WritePeMap;\r
-        }\r
-        \r
         //\r
         // Check if section-alignment and file-alignment match or not\r
         //\r
@@ -2889,70 +2971,18 @@ Returns:
 \r
       case EFI_FV_FILETYPE_DRIVER:\r
       case EFI_FV_FILETYPE_DXE_CORE:\r
-        switch (ImgHdr->Pe32.OptionalHeader.Subsystem) {\r
-          case EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER:\r
-                                               if ((Flags & REBASE_XIP_FILE) == REBASE_XIP_FILE) {\r
-                               //\r
-                               // Check if section-alignment and file-alignment match or not\r
-                               //\r
-                               if ((ImgHdr->Pe32.OptionalHeader.SectionAlignment != ImgHdr->Pe32.OptionalHeader.FileAlignment)) {\r
-                                 //\r
-                                 // Xip module has the same section alignment and file alignment.\r
-                                 //\r
-                                 Error (NULL, 0, 3000, "Invalid", "Section-Alignment and File-Alignment do not match : %s.", FileName);\r
-                                 return EFI_ABORTED;\r
-                               }\r
-                               NewPe32BaseAddress = XipBase + (UINTN) CurrentPe32Section.Pe32Section + sizeof (EFI_PE32_SECTION) - (UINTN)FfsFile;\r
-                               BaseToUpdate = &XipBase;                        \r
-                 } else if ((Flags & REBASE_RUNTIME_FILE) == REBASE_RUNTIME_FILE) {\r
-                   //\r
-                   // make sure image base address at the section alignment\r
-                   //\r
-                   FvInfo->RuntimeBaseAddress = (FvInfo->RuntimeBaseAddress - ImageContext.ImageSize) & (~(ImageContext.SectionAlignment - 1));\r
-                   FvInfo->RuntimeBaseAddress = FvInfo->RuntimeBaseAddress & (~(EFI_PAGE_SIZE - 1));\r
-                   NewPe32BaseAddress = FvInfo->RuntimeBaseAddress;\r
-                   BaseToUpdate = &(FvInfo->RuntimeBaseAddress);\r
-                 } else {\r
-              //\r
-              // RT drivers aren't supposed to be relocated\r
-              //\r
-              goto WritePeMap;\r
-            }\r
-            break;\r
-\r
-          default:\r
-            //\r
-            // We treat all other subsystems the same as BS_DRIVER\r
-            //\r
-                                               if ((Flags & REBASE_XIP_FILE) == REBASE_XIP_FILE) {\r
-                               //\r
-                               // Check if section-alignment and file-alignment match or not\r
-                               //\r
-                               if ((ImgHdr->Pe32.OptionalHeader.SectionAlignment != ImgHdr->Pe32.OptionalHeader.FileAlignment)) {\r
-                                 //\r
-                                 // Xip module has the same section alignment and file alignment.\r
-                                 //\r
-                                 Error (NULL, 0, 3000, "Invalid", "Section-Alignment and File-Alignment do not match : %s.", FileName);\r
-                                 return EFI_ABORTED;\r
-                               }\r
-                               NewPe32BaseAddress = XipBase + (UINTN) CurrentPe32Section.Pe32Section + sizeof (EFI_PE32_SECTION) - (UINTN)FfsFile;\r
-                               BaseToUpdate = &XipBase;                        \r
-                 } else if ((Flags & REBASE_BOOTTIME_FILE) == REBASE_BOOTTIME_FILE) {\r
-                   //\r
-                   // make sure image base address at the Section and Page alignment\r
-                   //\r
-                   FvInfo->BootBaseAddress = (FvInfo->BootBaseAddress - ImageContext.ImageSize) & (~(ImageContext.SectionAlignment - 1));\r
-                   FvInfo->BootBaseAddress = FvInfo->BootBaseAddress & (~(EFI_PAGE_SIZE - 1));\r
-                   NewPe32BaseAddress = FvInfo->BootBaseAddress;\r
-                   BaseToUpdate = &(FvInfo->BootBaseAddress);\r
-                 } else {\r
-              //\r
-              // Skip all BS_DRIVER's\r
-              //\r
-              goto WritePeMap;\r
-            }\r
-            break;\r
+        //\r
+        // Check if section-alignment and file-alignment match or not\r
+        //\r
+        if ((ImgHdr->Pe32.OptionalHeader.SectionAlignment != ImgHdr->Pe32.OptionalHeader.FileAlignment)) {\r
+          //\r
+          // Xip module has the same section alignment and file alignment.\r
+          //\r
+          Error (NULL, 0, 3000, "Invalid", "Section-Alignment and File-Alignment do not match : %s.", FileName);\r
+          return EFI_ABORTED;\r
         }\r
+        NewPe32BaseAddress = XipBase + (UINTN) CurrentPe32Section.Pe32Section + sizeof (EFI_PE32_SECTION) - (UINTN)FfsFile;\r
+        BaseToUpdate = &XipBase;                       \r
         break;\r
 \r
       default:\r
@@ -2963,68 +2993,74 @@ Returns:
     }\r
     \r
     //\r
-    // Relocation exist and rebase\r
+    // Relocation doesn't exist\r
     //\r
-    if (!ImageContext.RelocationsStripped) {  \r
-      //\r
-      // Load and Relocate Image Data\r
-      //\r
-      MemoryImagePointer = (UINT8 *) malloc ((UINTN) ImageContext.ImageSize + ImageContext.SectionAlignment);\r
-      if (MemoryImagePointer == NULL) {\r
-        Error (NULL, 0, 4001, "Resource", "memory cannot be allocated on rebase of %s", FileName);\r
-        return EFI_OUT_OF_RESOURCES;\r
-      }\r
-      memset ((VOID *) MemoryImagePointer, 0, (UINTN) ImageContext.ImageSize + ImageContext.SectionAlignment);\r
-      ImageContext.ImageAddress = ((UINTN) MemoryImagePointer + ImageContext.SectionAlignment - 1) & (~((INT64)ImageContext.SectionAlignment - 1));\r
-      \r
-      Status =  PeCoffLoaderLoadImage (&ImageContext);\r
-      if (EFI_ERROR (Status)) {\r
-        Error (NULL, 0, 3000, "Invalid", "LocateImage() call failed on rebase of %s", FileName);\r
-        free ((VOID *) MemoryImagePointer);\r
-        return Status;\r
-      }\r
-           \r
-      ImageContext.DestinationAddress = NewPe32BaseAddress;\r
-      Status                          = PeCoffLoaderRelocateImage (&ImageContext);\r
-      if (EFI_ERROR (Status)) {\r
-        Error (NULL, 0, 3000, "Invalid", "RelocateImage() call failed on rebase of %s", FileName);\r
-        free ((VOID *) MemoryImagePointer);\r
-        return Status;\r
-      }\r
+    if (ImageContext.RelocationsStripped) {\r
+      Warning (NULL, 0, 0, "Invalid", "The file %s has no .reloc section.", FileName);\r
+      continue;\r
+    }\r
 \r
-      //\r
-      // Copy Relocated data to raw image file.\r
-      //\r
-      SectionHeader = (EFI_IMAGE_SECTION_HEADER *) (\r
-                         (UINTN) ImgHdr +\r
-                         sizeof (UINT32) + \r
-                         sizeof (EFI_IMAGE_FILE_HEADER) +  \r
-                         ImgHdr->Pe32.FileHeader.SizeOfOptionalHeader\r
-                         );\r
-      \r
-      for (Index = 0; Index < ImgHdr->Pe32.FileHeader.NumberOfSections; Index ++, SectionHeader ++) {\r
-        CopyMem (\r
-          (UINT8 *) CurrentPe32Section.Pe32Section + sizeof (EFI_COMMON_SECTION_HEADER) + SectionHeader->PointerToRawData, \r
-          (VOID*) (UINTN) (ImageContext.ImageAddress + SectionHeader->VirtualAddress), \r
-          SectionHeader->SizeOfRawData\r
-          );\r
-      }\r
-  \r
+    //\r
+    // Relocation exist and rebase\r
+    //\r
+    //\r
+    // Load and Relocate Image Data\r
+    //\r
+    MemoryImagePointer = (UINT8 *) malloc ((UINTN) ImageContext.ImageSize + ImageContext.SectionAlignment);\r
+    if (MemoryImagePointer == NULL) {\r
+      Error (NULL, 0, 4001, "Resource", "memory cannot be allocated on rebase of %s", FileName);\r
+      return EFI_OUT_OF_RESOURCES;\r
+    }\r
+    memset ((VOID *) MemoryImagePointer, 0, (UINTN) ImageContext.ImageSize + ImageContext.SectionAlignment);\r
+    ImageContext.ImageAddress = ((UINTN) MemoryImagePointer + ImageContext.SectionAlignment - 1) & (~((INT64)ImageContext.SectionAlignment - 1));\r
+    \r
+    Status =  PeCoffLoaderLoadImage (&ImageContext);\r
+    if (EFI_ERROR (Status)) {\r
+      Error (NULL, 0, 3000, "Invalid", "LocateImage() call failed on rebase of %s", FileName);\r
       free ((VOID *) MemoryImagePointer);\r
-      MemoryImagePointer = NULL;\r
-      if (PeFileBuffer != NULL) {\r
-        free (PeFileBuffer);\r
-        PeFileBuffer = NULL;\r
-      }\r
+      return Status;\r
+    }\r
+         \r
+    ImageContext.DestinationAddress = NewPe32BaseAddress;\r
+    Status                          = PeCoffLoaderRelocateImage (&ImageContext);\r
+    if (EFI_ERROR (Status)) {\r
+      Error (NULL, 0, 3000, "Invalid", "RelocateImage() call failed on rebase of %s", FileName);\r
+      free ((VOID *) MemoryImagePointer);\r
+      return Status;\r
+    }\r
+\r
+    //\r
+    // Copy Relocated data to raw image file.\r
+    //\r
+    SectionHeader = (EFI_IMAGE_SECTION_HEADER *) (\r
+                       (UINTN) ImgHdr +\r
+                       sizeof (UINT32) + \r
+                       sizeof (EFI_IMAGE_FILE_HEADER) +  \r
+                       ImgHdr->Pe32.FileHeader.SizeOfOptionalHeader\r
+                       );\r
+    \r
+    for (Index = 0; Index < ImgHdr->Pe32.FileHeader.NumberOfSections; Index ++, SectionHeader ++) {\r
+      CopyMem (\r
+        (UINT8 *) CurrentPe32Section.Pe32Section + sizeof (EFI_COMMON_SECTION_HEADER) + SectionHeader->PointerToRawData, \r
+        (VOID*) (UINTN) (ImageContext.ImageAddress + SectionHeader->VirtualAddress), \r
+        SectionHeader->SizeOfRawData\r
+        );\r
+    }\r
+\r
+    free ((VOID *) MemoryImagePointer);\r
+    MemoryImagePointer = NULL;\r
+    if (PeFileBuffer != NULL) {\r
+      free (PeFileBuffer);\r
+      PeFileBuffer = NULL;\r
     }\r
     \r
     //\r
     // Update Image Base Address\r
     //\r
     if (ImgHdr->Pe32.OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
-      ImgHdr->Pe32.OptionalHeader.ImageBase     = (UINT32) NewPe32BaseAddress;\r
+      ImgHdr->Pe32.OptionalHeader.ImageBase = (UINT32) NewPe32BaseAddress;\r
     } else if (ImgHdr->Pe32Plus.OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC) {\r
-      ImgHdr->Pe32Plus.OptionalHeader.ImageBase     = NewPe32BaseAddress;\r
+      ImgHdr->Pe32Plus.OptionalHeader.ImageBase = NewPe32BaseAddress;\r
     } else {\r
       Error (NULL, 0, 3000, "Invalid", "unknown PE magic signature %X in PE32 image %s",\r
         ImgHdr->Pe32.OptionalHeader.Magic,\r
@@ -3033,11 +3069,6 @@ Returns:
       return EFI_ABORTED;\r
     }\r
 \r
-    //\r
-    // Update BASE address by add one page size.\r
-    //\r
-    *BaseToUpdate -= EFI_PAGE_SIZE;\r
-\r
     //\r
     // Now update file checksum\r
     //\r
@@ -3055,7 +3086,7 @@ Returns:
     //\r
     // Get this module function address from ModulePeMapFile and add them into FvMap file\r
     //\r
-WritePeMap:\r
+\r
     //\r
     // Default use FileName as map file path\r
     //\r
@@ -3069,7 +3100,8 @@ WritePeMap:
   if (FfsFile->Type != EFI_FV_FILETYPE_SECURITY_CORE &&\r
       FfsFile->Type != EFI_FV_FILETYPE_PEI_CORE &&\r
       FfsFile->Type != EFI_FV_FILETYPE_PEIM &&\r
-      FfsFile->Type != EFI_FV_FILETYPE_COMBINED_PEIM_DRIVER\r
+      FfsFile->Type != EFI_FV_FILETYPE_COMBINED_PEIM_DRIVER &&\r
+      FfsFile->Type != EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE\r
       ) {\r
     //\r
     // Only Peim code may have a TE section\r
@@ -3122,13 +3154,6 @@ WritePeMap:
     // Get File PdbPointer\r
     //\r
     PdbPointer = PeCoffLoaderGetPdbPointer (ImageContext.Handle);\r
-    \r
-    if ((Flags & REBASE_XIP_FILE) == 0) {\r
-      //\r
-      // For none XIP PEIM module, their map info also are collected.\r
-      //\r
-      goto WriteTeMap;\r
-    }\r
 \r
     //\r
     // Set new rebased address.\r
@@ -3139,7 +3164,7 @@ WritePeMap:
     //\r
     // if reloc is stripped, try to get the original efi image to get reloc info.\r
     //\r
-    if (ImageContext.RelocationsStripped == TRUE) {\r
+    if (ImageContext.RelocationsStripped) {\r
       //\r
       // Construct the original efi file name \r
       //\r
@@ -3194,70 +3219,75 @@ WritePeMap:
         ImageContext.RelocationsStripped = FALSE;\r
       }\r
     }\r
+    //\r
+    // Relocation doesn't exist\r
+    //\r
+    if (ImageContext.RelocationsStripped) {\r
+      Warning (NULL, 0, 0, "Invalid", "The file %s has no .reloc section.", FileName);\r
+      continue;\r
+    }\r
 \r
     //\r
     // Relocation exist and rebase\r
     //\r
-    if (!ImageContext.RelocationsStripped) {\r
-      //\r
-      // Load and Relocate Image Data\r
-      //\r
-      MemoryImagePointer = (UINT8 *) malloc ((UINTN) ImageContext.ImageSize + ImageContext.SectionAlignment);\r
-      if (MemoryImagePointer == NULL) {\r
-        Error (NULL, 0, 4001, "Resource", "memory cannot be allocated on rebase of %s", FileName);\r
-        return EFI_OUT_OF_RESOURCES;\r
-      }\r
-      memset ((VOID *) MemoryImagePointer, 0, (UINTN) ImageContext.ImageSize + ImageContext.SectionAlignment);\r
-      ImageContext.ImageAddress = ((UINTN) MemoryImagePointer + ImageContext.SectionAlignment - 1) & (~(ImageContext.SectionAlignment - 1));\r
-  \r
-      Status =  PeCoffLoaderLoadImage (&ImageContext);\r
-      if (EFI_ERROR (Status)) {\r
-        Error (NULL, 0, 3000, "Invalid", "LocateImage() call failed on rebase of %s", FileName);\r
-        free ((VOID *) MemoryImagePointer);\r
-        return Status;\r
-      }\r
-      //\r
-      // Reloacate TeImage\r
-      // \r
-      ImageContext.DestinationAddress = NewPe32BaseAddress;\r
-      Status                          = PeCoffLoaderRelocateImage (&ImageContext);\r
-      if (EFI_ERROR (Status)) {\r
-        Error (NULL, 0, 3000, "Invalid", "RelocateImage() call failed on rebase of TE image %s", FileName);\r
-        free ((VOID *) MemoryImagePointer);\r
-        return Status;\r
-      }\r
-      \r
-      //\r
-      // Copy the relocated image into raw image file.\r
-      //\r
-      SectionHeader = (EFI_IMAGE_SECTION_HEADER *) (TEImageHeader + 1);\r
-      for (Index = 0; Index < TEImageHeader->NumberOfSections; Index ++, SectionHeader ++) {\r
-        if (!ImageContext.IsTeImage) {\r
-          CopyMem (\r
-            (UINT8 *) TEImageHeader + sizeof (EFI_TE_IMAGE_HEADER) - TEImageHeader->StrippedSize + SectionHeader->PointerToRawData, \r
-            (VOID*) (UINTN) (ImageContext.ImageAddress + SectionHeader->VirtualAddress), \r
-            SectionHeader->SizeOfRawData\r
-            );\r
-        } else {\r
-          CopyMem (\r
-            (UINT8 *) TEImageHeader + sizeof (EFI_TE_IMAGE_HEADER) - TEImageHeader->StrippedSize + SectionHeader->PointerToRawData, \r
-            (VOID*) (UINTN) (ImageContext.ImageAddress + sizeof (EFI_TE_IMAGE_HEADER) - TEImageHeader->StrippedSize + SectionHeader->VirtualAddress), \r
-            SectionHeader->SizeOfRawData\r
-            );\r
-        }\r
-      }\r
-      \r
-      //\r
-      // Free the allocated memory resource\r
-      //\r
+    //\r
+    // Load and Relocate Image Data\r
+    //\r
+    MemoryImagePointer = (UINT8 *) malloc ((UINTN) ImageContext.ImageSize + ImageContext.SectionAlignment);\r
+    if (MemoryImagePointer == NULL) {\r
+      Error (NULL, 0, 4001, "Resource", "memory cannot be allocated on rebase of %s", FileName);\r
+      return EFI_OUT_OF_RESOURCES;\r
+    }\r
+    memset ((VOID *) MemoryImagePointer, 0, (UINTN) ImageContext.ImageSize + ImageContext.SectionAlignment);\r
+    ImageContext.ImageAddress = ((UINTN) MemoryImagePointer + ImageContext.SectionAlignment - 1) & (~(ImageContext.SectionAlignment - 1));\r
+\r
+    Status =  PeCoffLoaderLoadImage (&ImageContext);\r
+    if (EFI_ERROR (Status)) {\r
+      Error (NULL, 0, 3000, "Invalid", "LocateImage() call failed on rebase of %s", FileName);\r
       free ((VOID *) MemoryImagePointer);\r
-      MemoryImagePointer = NULL;\r
-      if (PeFileBuffer != NULL) {\r
-        free (PeFileBuffer);\r
-        PeFileBuffer = NULL;\r
+      return Status;\r
+    }\r
+    //\r
+    // Reloacate TeImage\r
+    // \r
+    ImageContext.DestinationAddress = NewPe32BaseAddress;\r
+    Status                          = PeCoffLoaderRelocateImage (&ImageContext);\r
+    if (EFI_ERROR (Status)) {\r
+      Error (NULL, 0, 3000, "Invalid", "RelocateImage() call failed on rebase of TE image %s", FileName);\r
+      free ((VOID *) MemoryImagePointer);\r
+      return Status;\r
+    }\r
+    \r
+    //\r
+    // Copy the relocated image into raw image file.\r
+    //\r
+    SectionHeader = (EFI_IMAGE_SECTION_HEADER *) (TEImageHeader + 1);\r
+    for (Index = 0; Index < TEImageHeader->NumberOfSections; Index ++, SectionHeader ++) {\r
+      if (!ImageContext.IsTeImage) {\r
+        CopyMem (\r
+          (UINT8 *) TEImageHeader + sizeof (EFI_TE_IMAGE_HEADER) - TEImageHeader->StrippedSize + SectionHeader->PointerToRawData, \r
+          (VOID*) (UINTN) (ImageContext.ImageAddress + SectionHeader->VirtualAddress), \r
+          SectionHeader->SizeOfRawData\r
+          );\r
+      } else {\r
+        CopyMem (\r
+          (UINT8 *) TEImageHeader + sizeof (EFI_TE_IMAGE_HEADER) - TEImageHeader->StrippedSize + SectionHeader->PointerToRawData, \r
+          (VOID*) (UINTN) (ImageContext.ImageAddress + sizeof (EFI_TE_IMAGE_HEADER) - TEImageHeader->StrippedSize + SectionHeader->VirtualAddress), \r
+          SectionHeader->SizeOfRawData\r
+          );\r
       }\r
     }\r
     \r
+    //\r
+    // Free the allocated memory resource\r
+    //\r
+    free ((VOID *) MemoryImagePointer);\r
+    MemoryImagePointer = NULL;\r
+    if (PeFileBuffer != NULL) {\r
+      free (PeFileBuffer);\r
+      PeFileBuffer = NULL;\r
+    }\r
+    \r
     //\r
     // Update Image Base Address\r
     //\r
@@ -3279,7 +3309,7 @@ WritePeMap:
     //\r
     // Get this module function address from ModulePeMapFile and add them into FvMap file\r
     //\r
-WriteTeMap:\r
+\r
     //\r
     // Default use FileName as map file path\r
     //\r
index 3c0e933..b82fac8 100644 (file)
@@ -1,6 +1,6 @@
 /** @file\r
 \r
-Copyright (c) 2004 - 2008, Intel Corporation                                                         \r
+Copyright (c) 2004 - 2010, Intel Corporation                                                         \r
 All rights reserved. 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
@@ -67,6 +67,7 @@ Abstract:
 #define OPTIONS_SECTION_STRING                "[options]"\r
 #define ATTRIBUTES_SECTION_STRING             "[attributes]"\r
 #define FILES_SECTION_STRING                  "[files]"\r
+#define FV_BASE_ADDRESS_STRING                "[FV_BASE_ADDRESS]"\r
 \r
 //\r
 // Options section\r
@@ -82,8 +83,6 @@ Abstract:
 #define EFI_CAPSULE_HEADER_SIZE_STRING    "EFI_CAPSULE_HEADER_SIZE"\r
 #define EFI_CAPSULE_FLAGS_STRING          "EFI_CAPSULE_FLAGS"\r
 #define EFI_CAPSULE_VERSION_STRING        "EFI_CAPSULE_VERSION"\r
-#define EFI_FV_BOOT_DRIVER_BASE_ADDRESS_STRING    "EFI_BOOT_DRIVER_BASE_ADDRESS"\r
-#define EFI_FV_RUNTIME_DRIVER_BASE_ADDRESS_STRING "EFI_RUNTIME_DRIVER_BASE_ADDRESS"\r
 \r
 #define EFI_FV_TOTAL_SIZE_STRING    "EFI_FV_TOTAL_SIZE"\r
 #define EFI_FV_TAKEN_SIZE_STRING    "EFI_FV_TAKEN_SIZE"\r
@@ -204,13 +203,6 @@ Abstract:
 #define FIT_TYPE_MASK         0x7F\r
 #define CHECKSUM_BIT_MASK     0x80\r
 \r
-//\r
-// Rebase File type\r
-//\r
-#define REBASE_XIP_FILE       0x1\r
-#define REBASE_BOOTTIME_FILE  0x2\r
-#define REBASE_RUNTIME_FILE   0x4\r
-\r
 //\r
 // Private data types\r
 //\r
@@ -228,8 +220,6 @@ typedef struct {
 typedef struct {\r
   BOOLEAN                 BaseAddressSet;\r
   EFI_PHYSICAL_ADDRESS    BaseAddress;\r
-  EFI_PHYSICAL_ADDRESS    BootBaseAddress;\r
-  EFI_PHYSICAL_ADDRESS    RuntimeBaseAddress;  \r
   EFI_GUID                FvFileSystemGuid;\r
   BOOLEAN                 FvFileSystemGuidSet;\r
   EFI_GUID                FvNameGuid;\r
@@ -270,6 +260,9 @@ extern CAP_INFO   mCapDataInfo;
 extern EFI_GUID   mEfiFirmwareFileSystem2Guid;\r
 extern UINT32     mFvTotalSize;\r
 extern UINT32     mFvTakenSize;\r
+\r
+extern EFI_PHYSICAL_ADDRESS mFvBaseAddress[];\r
+extern UINT32               mFvBaseAddressNumber;\r
 //\r
 // Local function prototypes\r
 //\r
index aabd143..d42c88e 100644 (file)
@@ -1,6 +1,6 @@
 /** @file\r
 \r
-Copyright (c) 2004 - 2009, Intel Corporation\r
+Copyright (c) 2004 - 2010, Intel Corporation\r
 All rights reserved. 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
@@ -78,6 +78,8 @@ Abstract:
 #define FW_RELOC_STRIPEED_IMAGE 9\r
 #define FW_HII_PACKAGE_LIST_RCIMAGE 10\r
 #define FW_HII_PACKAGE_LIST_BINIMAGE 11\r
+#define FW_REBASE_IMAGE      12\r
+#define FW_SET_ADDRESS_IMAGE 13\r
 \r
 #define DUMP_TE_HEADER       0x11\r
 \r
@@ -116,6 +118,12 @@ static const char *gHiiPackageRCFileHeader[] = {
 \r
 STATIC CHAR8 *mInImageName;\r
 \r
+//\r
+// Module image information\r
+//\r
+STATIC UINT32 mImageTimeStamp = 0;\r
+STATIC UINT32 mImageSize = 0;\r
+\r
 STATIC\r
 EFI_STATUS\r
 ZeroDebugData (\r
@@ -190,7 +198,7 @@ Returns:
   //\r
   // Copyright declaration\r
   //\r
-  fprintf (stdout, "Copyright (c) 2007, Intel Corporation. All rights reserved.\n\n");\r
+  fprintf (stdout, "Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.\n\n");\r
 \r
   //\r
   // Details Option\r
@@ -244,7 +252,9 @@ Returns:
   fprintf (stdout, "  -s timedate, --stamp timedate\n\\r
                         timedate format is \"yyyy-mm-dd 00:00:00\". if timedata \n\\r
                         is set to NOW, current system time is used. The support\n\\r
-                        date scope is 1970-1-1 8:0:0 ~ 2038-1-19 3:14:07\n\\r
+                        date scope is 1970-01-01 00+timezone:00:00\n\\r
+                        ~ 2038-01-19 03+timezone:14:07\n\\r
+                        The scope is adjusted according to the different zones.\n\\r
                         It can't be combined with other action options\n\\r
                         except for -o, -r option. It is a action option.\n\\r
                         If it is combined with other action options, the later\n\\r
@@ -288,6 +298,18 @@ Returns:
                         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, "  --rebase NewAddress   Rebase image to new base address. New address \n\\r
+                        is also set to the first none code section header.\n\\r
+                        It can't be combined with other action options\n\\r
+                        except for -o or -r 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, "  --address NewAddress  Set new address into the first none code \n\\r
+                        section header of the input image.\n\\r
+                        It can't be combined with other action options\n\\r
+                        except for -o or -r 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
@@ -860,6 +882,7 @@ ScanSections(
 \r
   NtHdr->Pe32.FileHeader.NumberOfSections = CoffNbrSections;\r
   NtHdr->Pe32.FileHeader.TimeDateStamp = (UINT32) time(NULL);\r
+  mImageTimeStamp = NtHdr->Pe32.FileHeader.TimeDateStamp;\r
   NtHdr->Pe32.FileHeader.PointerToSymbolTable = 0;\r
   NtHdr->Pe32.FileHeader.NumberOfSymbols = 0;\r
   NtHdr->Pe32.FileHeader.SizeOfOptionalHeader = sizeof(NtHdr->Pe32.OptionalHeader);\r
@@ -1639,6 +1662,257 @@ Returns:
   return HiiSectionHeader;\r
 }\r
 \r
+EFI_STATUS\r
+RebaseImageRead (\r
+  IN     VOID    *FileHandle,\r
+  IN     UINTN   FileOffset,\r
+  IN OUT UINT32  *ReadSize,\r
+  OUT    VOID    *Buffer\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Support routine for the PE/COFF Loader that reads a buffer from a PE/COFF file\r
+\r
+Arguments:\r
+\r
+  FileHandle - The handle to the PE/COFF file\r
+\r
+  FileOffset - The offset, in bytes, into the file to read\r
+\r
+  ReadSize   - The number of bytes to read from the file starting at FileOffset\r
+\r
+  Buffer     - A pointer to the buffer to read the data into.\r
+\r
+Returns:\r
+\r
+  EFI_SUCCESS - ReadSize bytes of data were read into Buffer from the PE/COFF file starting at FileOffset\r
+\r
+--*/\r
+{\r
+  CHAR8   *Destination8;\r
+  CHAR8   *Source8;\r
+  UINT32  Length;\r
+\r
+  Destination8  = Buffer;\r
+  Source8       = (CHAR8 *) ((UINTN) FileHandle + FileOffset);\r
+  Length        = *ReadSize;\r
+  while (Length--) {\r
+    *(Destination8++) = *(Source8++);\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+EFI_STATUS\r
+SetAddressToSectionHeader (\r
+  IN     CHAR8   *FileName,\r
+  IN OUT UINT8   *FileBuffer,\r
+  IN     UINT64  NewPe32BaseAddress\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Set new base address into the section header of PeImage\r
+\r
+Arguments:\r
+\r
+  FileName           - Name of file\r
+  FileBuffer         - Pointer to PeImage.\r
+  NewPe32BaseAddress - New Base Address for PE image.\r
+\r
+Returns:\r
+\r
+  EFI_SUCCESS          Set new base address into this image successfully.\r
+\r
+--*/\r
+{\r
+  EFI_STATUS                            Status;\r
+  PE_COFF_LOADER_IMAGE_CONTEXT          ImageContext;\r
+  UINTN                                 Index;\r
+  EFI_IMAGE_OPTIONAL_HEADER_UNION       *ImgHdr;\r
+  EFI_IMAGE_SECTION_HEADER              *SectionHeader;\r
+\r
+  //\r
+  // Initialize context\r
+  //\r
+  memset (&ImageContext, 0, sizeof (ImageContext));\r
+  ImageContext.Handle     = (VOID *) FileBuffer;\r
+  ImageContext.ImageRead  = (PE_COFF_LOADER_READ_FILE) RebaseImageRead;\r
+  Status                  = PeCoffLoaderGetImageInfo (&ImageContext);\r
+  if (EFI_ERROR (Status)) {\r
+    Error (NULL, 0, 3000, "Invalid", "The input PeImage %s is not valid", FileName);\r
+    return Status;\r
+  }\r
+\r
+  if (ImageContext.RelocationsStripped) {\r
+    Error (NULL, 0, 3000, "Invalid", "The input PeImage %s has no relocation to be fixed up", FileName);\r
+    return Status;    \r
+  }\r
+\r
+  //\r
+  // Get PeHeader pointer\r
+  //\r
+  ImgHdr = (EFI_IMAGE_OPTIONAL_HEADER_UNION *)(FileBuffer + ImageContext.PeCoffHeaderOffset);\r
+\r
+  //\r
+  // Get section header list\r
+  //\r
+  SectionHeader = (EFI_IMAGE_SECTION_HEADER *) (\r
+    (UINTN) ImgHdr +\r
+    sizeof (UINT32) + \r
+    sizeof (EFI_IMAGE_FILE_HEADER) +  \r
+    ImgHdr->Pe32.FileHeader.SizeOfOptionalHeader\r
+    );\r
+\r
+  //\r
+  // Set base address into the first section header that doesn't point to code section.\r
+  //\r
+  for (Index = 0; Index < ImgHdr->Pe32.FileHeader.NumberOfSections; Index ++, SectionHeader ++) {\r
+    if ((SectionHeader->Characteristics & EFI_IMAGE_SCN_CNT_CODE) == 0) {\r
+      *(UINT64 *) &SectionHeader->PointerToRelocations = NewPe32BaseAddress;\r
+      break;\r
+    }\r
+  }\r
+\r
+  //\r
+  // No available section header is found.\r
+  //\r
+  if (Index == ImgHdr->Pe32.FileHeader.NumberOfSections) {\r
+    return EFI_NOT_FOUND;\r
+  }\r
+  \r
+  //\r
+  // BaseAddress is set to section header.\r
+  //\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+EFI_STATUS\r
+RebaseImage (\r
+  IN     CHAR8   *FileName,\r
+  IN OUT UINT8   *FileBuffer,\r
+  IN     UINT64  NewPe32BaseAddress\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Set new base address into PeImage, and fix up PeImage based on new address.\r
+\r
+Arguments:\r
+\r
+  FileName           - Name of file\r
+  FileBuffer         - Pointer to PeImage.\r
+  NewPe32BaseAddress - New Base Address for PE image.\r
+\r
+Returns:\r
+\r
+  EFI_INVALID_PARAMETER   - BaseAddress is not valid.\r
+  EFI_SUCCESS             - Update PeImage is correctly.\r
+\r
+--*/\r
+{\r
+  EFI_STATUS                            Status;\r
+  PE_COFF_LOADER_IMAGE_CONTEXT          ImageContext;\r
+  UINTN                                 Index;\r
+  EFI_IMAGE_OPTIONAL_HEADER_UNION       *ImgHdr;\r
+  UINT8                                 *MemoryImagePointer;\r
+  EFI_IMAGE_SECTION_HEADER              *SectionHeader;\r
+\r
+  //\r
+  // Initialize context\r
+  //\r
+  memset (&ImageContext, 0, sizeof (ImageContext));\r
+  ImageContext.Handle     = (VOID *) FileBuffer;\r
+  ImageContext.ImageRead  = (PE_COFF_LOADER_READ_FILE) RebaseImageRead;\r
+  Status                  = PeCoffLoaderGetImageInfo (&ImageContext);\r
+  if (EFI_ERROR (Status)) {\r
+    Error (NULL, 0, 3000, "Invalid", "The input PeImage %s is not valid", FileName);\r
+    return Status;\r
+  }\r
+\r
+  if (ImageContext.RelocationsStripped) {\r
+    Error (NULL, 0, 3000, "Invalid", "The input PeImage %s has no relocation to be fixed up", FileName);\r
+    return Status;    \r
+  }\r
+\r
+  //\r
+  // Get PeHeader pointer\r
+  //\r
+  ImgHdr = (EFI_IMAGE_OPTIONAL_HEADER_UNION *)(FileBuffer + ImageContext.PeCoffHeaderOffset);\r
+\r
+  //\r
+  // Load and Relocate Image Data\r
+  //\r
+  MemoryImagePointer = (UINT8 *) malloc ((UINTN) ImageContext.ImageSize + ImageContext.SectionAlignment);\r
+  if (MemoryImagePointer == NULL) {\r
+    Error (NULL, 0, 4001, "Resource", "memory cannot be allocated on rebase of %s", FileName);\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+  memset ((VOID *) MemoryImagePointer, 0, (UINTN) ImageContext.ImageSize + ImageContext.SectionAlignment);\r
+  ImageContext.ImageAddress = ((UINTN) MemoryImagePointer + ImageContext.SectionAlignment - 1) & (~((INT64)ImageContext.SectionAlignment - 1));\r
+\r
+  Status =  PeCoffLoaderLoadImage (&ImageContext);\r
+  if (EFI_ERROR (Status)) {\r
+    Error (NULL, 0, 3000, "Invalid", "LocateImage() call failed on rebase of %s", FileName);\r
+    free ((VOID *) MemoryImagePointer);\r
+    return Status;\r
+  }\r
+\r
+  ImageContext.DestinationAddress = NewPe32BaseAddress;\r
+  Status                          = PeCoffLoaderRelocateImage (&ImageContext);\r
+  if (EFI_ERROR (Status)) {\r
+    Error (NULL, 0, 3000, "Invalid", "RelocateImage() call failed on rebase of %s", FileName);\r
+    free ((VOID *) MemoryImagePointer);\r
+    return Status;\r
+  }\r
+\r
+  //\r
+  // Copy Relocated data to raw image file.\r
+  //\r
+  SectionHeader = (EFI_IMAGE_SECTION_HEADER *) (\r
+    (UINTN) ImgHdr +\r
+    sizeof (UINT32) + \r
+    sizeof (EFI_IMAGE_FILE_HEADER) +  \r
+    ImgHdr->Pe32.FileHeader.SizeOfOptionalHeader\r
+    );\r
+\r
+  for (Index = 0; Index < ImgHdr->Pe32.FileHeader.NumberOfSections; Index ++, SectionHeader ++) {\r
+    CopyMem (\r
+      FileBuffer + SectionHeader->PointerToRawData, \r
+      (VOID*) (UINTN) (ImageContext.ImageAddress + SectionHeader->VirtualAddress), \r
+      SectionHeader->SizeOfRawData\r
+      );\r
+  }\r
+\r
+  free ((VOID *) MemoryImagePointer);\r
+\r
+  //\r
+  // Update Image Base Address\r
+  //\r
+  if ((ImgHdr->Pe32.OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) && (ImgHdr->Pe32.FileHeader.Machine != IMAGE_FILE_MACHINE_IA64)) {\r
+    ImgHdr->Pe32.OptionalHeader.ImageBase = (UINT32) NewPe32BaseAddress;\r
+  } else if (ImgHdr->Pe32Plus.OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC) {\r
+    ImgHdr->Pe32Plus.OptionalHeader.ImageBase = NewPe32BaseAddress;\r
+  } else {\r
+    Error (NULL, 0, 3000, "Invalid", "unknown PE magic signature %X in PE32 image %s",\r
+      ImgHdr->Pe32.OptionalHeader.Magic,\r
+      FileName\r
+      );\r
+    return EFI_ABORTED;\r
+  }\r
+\r
+  //\r
+  // Set new base address into section header\r
+  //\r
+  Status = SetAddressToSectionHeader (FileName, FileBuffer, NewPe32BaseAddress);\r
+\r
+  return Status;\r
+}\r
+\r
 int\r
 main (\r
   int  argc,\r
@@ -1686,6 +1960,8 @@ Returns:
   UINT32                           FileLength;\r
   UINT8                            *OutputFileBuffer;\r
   UINT32                           OutputFileLength;\r
+  UINT8                            *InputFileBuffer;\r
+  UINT32                           InputFileLength;\r
   RUNTIME_FUNCTION                 *RuntimeFunction;\r
   UNWIND_INFO                      *UnwindInfo;\r
   STATUS                           Status;\r
@@ -1712,12 +1988,18 @@ Returns:
   EFI_HII_PACKAGE_HEADER           EndPackage;\r
   UINT32                           HiiSectionHeaderSize;\r
   UINT8                            *HiiSectionHeader;\r
+  UINT64                           NewBaseAddress;\r
+  BOOLEAN                          NegativeAddr;\r
+  FILE                             *ReportFile;\r
+  CHAR8                            *ReportFileName;\r
+  UINTN                            FileLen;\r
 \r
   SetUtilityName (UTILITY_NAME);\r
 \r
   //\r
   // Assign to fix compile warning\r
   //\r
+  FileLen           = 0;\r
   InputFileNum      = 0;\r
   InputFileName     = NULL;\r
   mInImageName      = NULL;\r
@@ -1740,6 +2022,8 @@ Returns:
   LogLevel          = 0;\r
   OutputFileBuffer  = NULL;\r
   OutputFileLength  = 0;\r
+  InputFileBuffer   = NULL;\r
+  InputFileLength   = 0;\r
   Optional32        = NULL;\r
   Optional64        = NULL;\r
   KeepExceptionTableFlag = FALSE;\r
@@ -1752,6 +2036,8 @@ Returns:
   memset (&HiiPackageListGuid, 0, sizeof (HiiPackageListGuid));\r
   HiiSectionHeaderSize   = 0;\r
   HiiSectionHeader       = NULL;\r
+  NewBaseAddress         = 0;\r
+  NegativeAddr           = FALSE;\r
 \r
   if (argc == 1) {\r
     Error (NULL, 0, 1001, "Missing options", "No input options.");\r
@@ -1899,6 +2185,44 @@ Returns:
       continue;\r
     }\r
 \r
+    if ((stricmp (argv[0], "--rebase") == 0)) {\r
+      if (argv[1][0] == '-') {\r
+        NegativeAddr = TRUE;\r
+        Status = AsciiStringToUint64 (argv[1] + 1, FALSE, &Temp64);\r
+      } else {\r
+        NegativeAddr = FALSE;\r
+        Status = AsciiStringToUint64 (argv[1], FALSE, &Temp64);\r
+      }\r
+      if (Status != EFI_SUCCESS) {\r
+        Error (NULL, 0, 1003, "Invalid option value", "%s = %s", argv[0], argv[1]);\r
+        goto Finish;\r
+      }\r
+      OutImageType = FW_REBASE_IMAGE;\r
+      NewBaseAddress = (UINT64) Temp64;\r
+      argc -= 2;\r
+      argv += 2;\r
+      continue;\r
+    }\r
+\r
+    if ((stricmp (argv[0], "--address") == 0)) {\r
+      if (argv[1][0] == '-') {\r
+        NegativeAddr = TRUE;\r
+        Status = AsciiStringToUint64 (argv[1] + 1, FALSE, &Temp64);\r
+      } else {\r
+        NegativeAddr = FALSE;\r
+        Status = AsciiStringToUint64 (argv[1], FALSE, &Temp64);\r
+      }\r
+      if (Status != EFI_SUCCESS) {\r
+        Error (NULL, 0, 1003, "Invalid option value", "%s = %s", argv[0], argv[1]);\r
+        goto Finish;\r
+      }\r
+      OutImageType = FW_SET_ADDRESS_IMAGE;\r
+      NewBaseAddress = (UINT64) Temp64;\r
+      argc -= 2;\r
+      argv += 2;\r
+      continue;\r
+    }\r
+\r
     if ((stricmp (argv[0], "-p") == 0) || (stricmp (argv[0], "--pad") == 0)) {\r
       if (AsciiStringToUint64 (argv[1], FALSE, &Temp64) != EFI_SUCCESS) {\r
         Error (NULL, 0, 1003, "Invalid option value", "%s = %s", argv[0], argv[1]);\r
@@ -1942,7 +2266,7 @@ Returns:
       argv += 2;\r
       continue;\r
     }\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
@@ -1988,9 +2312,9 @@ Returns:
       // InputFileName buffer too small, need to realloc\r
       //\r
       InputFileName = (CHAR8 **) realloc (\r
-                                  InputFileName,\r
-                                  (InputFileNum + MAXIMUM_INPUT_FILE_NUM) * sizeof (CHAR8 *)\r
-                                  );\r
+        InputFileName,\r
+        (InputFileNum + MAXIMUM_INPUT_FILE_NUM) * sizeof (CHAR8 *)\r
+        );\r
 \r
       if (InputFileName == NULL) {\r
         Error (NULL, 0, 4001, "Resource", "memory cannot be allocated!");\r
@@ -2090,6 +2414,12 @@ Returns:
   case FW_HII_PACKAGE_LIST_BINIMAGE:\r
     VerboseMsg ("Combine the input multi hii bin packages to one binary pacakge list file.");\r
     break;\r
+  case FW_REBASE_IMAGE:\r
+    VerboseMsg ("Rebase the input image to new base address.");\r
+    break;\r
+  case FW_SET_ADDRESS_IMAGE:\r
+    VerboseMsg ("Set the preferred address into the section header of the input image");\r
+    break;\r
   default:\r
     break;\r
   }\r
@@ -2114,33 +2444,52 @@ Returns:
       }\r
       fread (OutputFileBuffer, 1, OutputFileLength, fpOut);\r
       fclose (fpOut);\r
-    }\r
-    fpOut = fopen (OutImageName, "wb");\r
-    if (!fpOut) {\r
-      Error (NULL, 0, 0001, "Error opening output file", OutImageName);\r
-      goto Finish;\r
+      fpOut = NULL;\r
     }\r
     VerboseMsg ("Output file name is %s", OutImageName);\r
-  } else if (!ReplaceFlag) {\r
-    if (OutImageType == DUMP_TE_HEADER) {\r
-      fpOut = stdout;\r
-    } else {\r
-      Error (NULL, 0, 1001, "Missing option", "output file");\r
-      goto Finish;\r
-    }\r
+  } else if (!ReplaceFlag && OutImageType != DUMP_TE_HEADER) {\r
+    Error (NULL, 0, 1001, "Missing option", "output file");\r
+    goto Finish;\r
   }\r
 \r
+  //\r
+  // Open input file and read file data into file buffer.\r
+  //\r
+  fpIn = fopen (mInImageName, "rb");\r
+  if (fpIn == NULL) {\r
+    Error (NULL, 0, 0001, "Error opening file", mInImageName);\r
+    goto Finish;\r
+  }\r
+  InputFileLength = _filelength (fileno (fpIn));\r
+  InputFileBuffer = malloc (InputFileLength);\r
+  if (InputFileBuffer == NULL) {\r
+    Error (NULL, 0, 4001, "Resource", "memory cannot be allocated!");\r
+    fclose (fpIn);\r
+    goto Finish;\r
+  }\r
+  fread (InputFileBuffer, 1, InputFileLength, fpIn);\r
+  fclose (fpIn);\r
+  DebugMsg (NULL, 0, 9, "input file info", "the input file size is %u bytes", (unsigned) InputFileLength);\r
+\r
   //\r
   // Combine multi binary HII package files.\r
   //\r
   if (OutImageType == FW_HII_PACKAGE_LIST_RCIMAGE || OutImageType == FW_HII_PACKAGE_LIST_BINIMAGE) {\r
+    //\r
+    // Open output file handle.\r
+    //\r
+    fpOut = fopen (OutImageName, "wb");\r
+    if (!fpOut) {\r
+      Error (NULL, 0, 0001, "Error opening output file", OutImageName);\r
+      goto Finish;\r
+    }\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
+      if (fpIn == NULL) {\r
         Error (NULL, 0, 0001, "Error opening file", InputFileName [Index]);\r
         goto Finish;\r
       }\r
@@ -2186,7 +2535,7 @@ Returns:
     HiiPackageDataPointer = HiiPackageListBuffer + sizeof (HiiPackageListHeader);\r
     for (Index = 0; Index < InputFileNum; Index ++) {\r
       fpIn = fopen (InputFileName [Index], "rb");\r
-      if (!fpIn) {\r
+      if (fpIn == NULL) {\r
         Error (NULL, 0, 0001, "Error opening file", InputFileName [Index]);\r
         free (HiiPackageListBuffer);\r
         goto Finish;\r
@@ -2240,7 +2589,7 @@ Returns:
         fprintf (fpOut, " 0x%04X,", *(UINT16 *) HiiPackageDataPointer);\r
         HiiPackageDataPointer += 2;\r
       }\r
-      \r
+\r
       if (Index % 16 == 0) {\r
         fprintf (fpOut, "\n ");\r
       }\r
@@ -2262,6 +2611,14 @@ Returns:
   // Combine MciBinary files to one file\r
   //\r
   if (OutImageType == FW_MERGE_IMAGE) {\r
+    //\r
+    // Open output file handle.\r
+    //\r
+    fpOut = fopen (OutImageName, "wb");\r
+    if (!fpOut) {\r
+      Error (NULL, 0, 0001, "Error opening output file", OutImageName);\r
+      goto Finish;\r
+    }\r
     for (Index = 0; Index < InputFileNum; Index ++) {\r
       fpIn = fopen (InputFileName [Index], "rb");\r
       if (!fpIn) {\r
@@ -2306,7 +2663,7 @@ Returns:
   //\r
   if (OutImageType == FW_MCI_IMAGE) {\r
     fpIn = fopen (mInImageName, "r");\r
-    if (!fpIn) {\r
+    if (fpIn == NULL) {\r
       Error (NULL, 0, 0001, "Error opening file", mInImageName);\r
       goto Finish;\r
     }\r
@@ -2400,63 +2757,21 @@ Returns:
     //\r
     // Open the output file and write the buffer contents\r
     //\r
-    if (fpOut != NULL) {\r
-      if (fwrite (FileBuffer, FileLength, 1, fpOut) != 1) {\r
-        Error (NULL, 0, 0002, "Error writing file", OutImageName);\r
-        goto Finish;\r
-      }\r
-    }\r
-\r
-    if (ReplaceFlag) {\r
-      fpInOut = fopen (mInImageName, "wb");\r
-      if (fpInOut != NULL) {\r
-        Error (NULL, 0, 0001, "Error opening file", mInImageName);\r
-        goto Finish;\r
-      }\r
-      if (fwrite (FileBuffer, FileLength, 1, fpInOut) != 1) {\r
-        Error (NULL, 0, 0002, "Error writing file", mInImageName);\r
-        goto Finish;\r
-      }\r
-    }\r
     VerboseMsg ("the size of output file is %u bytes", (unsigned) FileLength);\r
-    //\r
-    //  Convert Mci.TXT to Mci.bin file successfully\r
-    //\r
-    goto Finish;\r
+    goto WriteFile;\r
   }\r
 \r
   //\r
   // Open input file and read file data into file buffer.\r
   //\r
-  fpIn = fopen (mInImageName, "rb");\r
-  if (!fpIn) {\r
-    Error (NULL, 0, 0001, "Error opening file", mInImageName);\r
-    goto Finish;\r
-  }\r
-\r
-  FileLength = _filelength (fileno (fpIn));\r
+  FileLength = InputFileLength;\r
   FileBuffer = malloc (FileLength);\r
   if (FileBuffer == NULL) {\r
     Error (NULL, 0, 4001, "Resource", "memory cannot be allocated!");\r
-    fclose (fpIn);\r
     goto Finish;\r
   }\r
+  memcpy (FileBuffer, InputFileBuffer, InputFileLength);\r
 \r
-  fread (FileBuffer, 1, FileLength, fpIn);\r
-  fclose (fpIn);\r
-\r
-  DebugMsg (NULL, 0, 9, "input file info", "the input file size is %u bytes", (unsigned) FileLength);\r
-\r
-  //\r
-  // Replace file\r
-  //\r
-  if (ReplaceFlag) {\r
-    fpInOut = fopen (mInImageName, "wb");\r
-    if (!fpInOut) {\r
-      Error (NULL, 0, 0001, "Error opening file", mInImageName);\r
-      goto Finish;\r
-    }\r
-  }\r
   //\r
   // Dump TeImage Header into output file.\r
   //\r
@@ -2466,6 +2781,26 @@ Returns:
       Error (NULL, 0, 3000, "Invalid", "TE header signature of file %s is not correct.", mInImageName);\r
       goto Finish;\r
     }\r
+    //\r
+    // Open the output file handle.\r
+    //\r
+    if (ReplaceFlag) {\r
+      fpInOut = fopen (mInImageName, "wb");\r
+      if (fpInOut == NULL) {\r
+        Error (NULL, 0, 0001, "Error opening file", mInImageName);\r
+        goto Finish;\r
+      }\r
+    } else {\r
+      if (OutImageName != NULL) {\r
+        fpOut = fopen (OutImageName, "wb");\r
+      } else {\r
+        fpOut = stdout;\r
+      }\r
+      if (fpOut == NULL) {\r
+        Error (NULL, 0, 0001, "Error opening output file", OutImageName);\r
+        goto Finish;\r
+      }\r
+    }\r
     if (fpInOut != NULL) {\r
       fprintf (fpInOut, "Dump of file %s\n\n", mInImageName);\r
       fprintf (fpInOut, "TE IMAGE HEADER VALUES\n");\r
@@ -2479,7 +2814,6 @@ Returns:
       fprintf (fpInOut, "%17X [%8X] RVA [size] of Base Relocation Directory\n", (unsigned) TEImageHeader.DataDirectory[0].VirtualAddress, (unsigned) TEImageHeader.DataDirectory[0].Size);\r
       fprintf (fpInOut, "%17X [%8X] RVA [size] of Debug Directory\n", (unsigned) TEImageHeader.DataDirectory[1].VirtualAddress, (unsigned) TEImageHeader.DataDirectory[1].Size);\r
     }\r
-\r
     if (fpOut != NULL) {\r
       fprintf (fpOut, "Dump of file %s\n\n", mInImageName);\r
       fprintf (fpOut, "TE IMAGE HEADER VALUES\n");\r
@@ -2514,36 +2848,36 @@ Returns:
       }\r
     } else {\r
       if (stricmp (ModuleType, "BASE") == 0 ||\r
-          stricmp (ModuleType, "SEC") == 0 ||\r
-          stricmp (ModuleType, "SECURITY_CORE") == 0 ||\r
-          stricmp (ModuleType, "PEI_CORE") == 0 ||\r
-          stricmp (ModuleType, "PEIM") == 0 ||\r
-          stricmp (ModuleType, "COMBINED_PEIM_DRIVER") == 0 ||\r
-          stricmp (ModuleType, "PIC_PEIM") == 0 ||\r
-          stricmp (ModuleType, "RELOCATABLE_PEIM") == 0 ||\r
-          stricmp (ModuleType, "DXE_CORE") == 0 ||\r
-          stricmp (ModuleType, "BS_DRIVER") == 0  ||\r
-          stricmp (ModuleType, "DXE_DRIVER") == 0 ||\r
-          stricmp (ModuleType, "DXE_SMM_DRIVER") == 0  ||\r
-          stricmp (ModuleType, "UEFI_DRIVER") == 0 ||\r
-          stricmp (ModuleType, "SMM_CORE") == 0) {\r
-        Type = EFI_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER;\r
-        VerboseMsg ("Efi Image subsystem type is efi boot service driver.");\r
+        stricmp (ModuleType, "SEC") == 0 ||\r
+        stricmp (ModuleType, "SECURITY_CORE") == 0 ||\r
+        stricmp (ModuleType, "PEI_CORE") == 0 ||\r
+        stricmp (ModuleType, "PEIM") == 0 ||\r
+        stricmp (ModuleType, "COMBINED_PEIM_DRIVER") == 0 ||\r
+        stricmp (ModuleType, "PIC_PEIM") == 0 ||\r
+        stricmp (ModuleType, "RELOCATABLE_PEIM") == 0 ||\r
+        stricmp (ModuleType, "DXE_CORE") == 0 ||\r
+        stricmp (ModuleType, "BS_DRIVER") == 0  ||\r
+        stricmp (ModuleType, "DXE_DRIVER") == 0 ||\r
+        stricmp (ModuleType, "DXE_SMM_DRIVER") == 0  ||\r
+        stricmp (ModuleType, "UEFI_DRIVER") == 0 ||\r
+        stricmp (ModuleType, "SMM_CORE") == 0) {\r
+          Type = EFI_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER;\r
+          VerboseMsg ("Efi Image subsystem type is efi boot service driver.");\r
 \r
       } else if (stricmp (ModuleType, "UEFI_APPLICATION") == 0 ||\r
-                 stricmp (ModuleType, "APPLICATION") == 0) {\r
-        Type = EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION;\r
-        VerboseMsg ("Efi Image subsystem type is efi application.");\r
+        stricmp (ModuleType, "APPLICATION") == 0) {\r
+          Type = EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION;\r
+          VerboseMsg ("Efi Image subsystem type is efi application.");\r
 \r
       } else if (stricmp (ModuleType, "DXE_RUNTIME_DRIVER") == 0 ||\r
-                 stricmp (ModuleType, "RT_DRIVER") == 0) {\r
-        Type = EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER;\r
-        VerboseMsg ("Efi Image subsystem type is efi runtime driver.");\r
+        stricmp (ModuleType, "RT_DRIVER") == 0) {\r
+          Type = EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER;\r
+          VerboseMsg ("Efi Image subsystem type is efi runtime driver.");\r
 \r
       } else if (stricmp (ModuleType, "DXE_SAL_DRIVER") == 0 ||\r
-                 stricmp (ModuleType, "SAL_RT_DRIVER") == 0) {\r
-        Type = EFI_IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER;\r
-        VerboseMsg ("Efi Image subsystem type is efi sal runtime driver.");\r
+        stricmp (ModuleType, "SAL_RT_DRIVER") == 0) {\r
+          Type = EFI_IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER;\r
+          VerboseMsg ("Efi Image subsystem type is efi sal runtime driver.");\r
 \r
       } else {\r
         Error (NULL, 0, 1003, "Invalid option value", "EFI_FILETYPE = %s", ModuleType);\r
@@ -2559,7 +2893,7 @@ Returns:
     VerboseMsg ("Convert the input ELF Image to Pe Image");\r
     ConvertElf(&FileBuffer, &FileLength);\r
   }\r
\r
+\r
   //\r
   // Make sure File Offsets and Virtual Offsets are the same in the image so it is XIP\r
   // XIP == eXecute In Place\r
@@ -2583,15 +2917,15 @@ Returns:
           //\r
           if ((SectionHeader->PointerToRawData + SectionHeader->SizeOfRawData) ==\r
             (FileLength + TeHdr->StrippedSize - sizeof (EFI_TE_IMAGE_HEADER))) {\r
-            //\r
-            // Remove .reloc section and update TeImage Header\r
-            //\r
-            FileLength = FileLength - SectionHeader->SizeOfRawData;\r
-            SectionHeader->SizeOfRawData = 0;\r
-            SectionHeader->Misc.VirtualSize = 0;\r
-            TeHdr->DataDirectory[EFI_TE_IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress = 0;\r
-            TeHdr->DataDirectory[EFI_TE_IMAGE_DIRECTORY_ENTRY_BASERELOC].Size           = 0;\r
-            break;\r
+              //\r
+              // Remove .reloc section and update TeImage Header\r
+              //\r
+              FileLength = FileLength - SectionHeader->SizeOfRawData;\r
+              SectionHeader->SizeOfRawData = 0;\r
+              SectionHeader->Misc.VirtualSize = 0;\r
+              TeHdr->DataDirectory[EFI_TE_IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress = 0;\r
+              TeHdr->DataDirectory[EFI_TE_IMAGE_DIRECTORY_ENTRY_BASERELOC].Size           = 0;\r
+              break;\r
           }\r
         }\r
       }\r
@@ -2677,13 +3011,50 @@ Returns:
       goto Finish;\r
     }\r
   }\r
-  \r
+\r
   if (PeHdr->Pe32.FileHeader.Machine == IMAGE_FILE_MACHINE_ARM) {\r
     // Some tools kick out IMAGE_FILE_MACHINE_ARM (0x1c0) vs IMAGE_FILE_MACHINE_ARMT (0x1c2)\r
     // so patch back to the offical UEFI value.\r
     PeHdr->Pe32.FileHeader.Machine = IMAGE_FILE_MACHINE_ARMT;\r
   }\r
 \r
+  //\r
+  // Set new base address into image\r
+  //\r
+  if (OutImageType == FW_REBASE_IMAGE || OutImageType == FW_SET_ADDRESS_IMAGE) {\r
+    if ((PeHdr->Pe32.OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) && (PeHdr->Pe32.FileHeader.Machine != IMAGE_FILE_MACHINE_IA64)) {\r
+      if (NewBaseAddress >= 0x100000000ULL) {\r
+        Error (NULL, 0, 3000, "Invalid", "New base address is larger than 4G for 32bit PE image");\r
+        goto Finish;\r
+      }\r
+    }\r
+    \r
+    if (NegativeAddr) {\r
+      //\r
+      // Set Base Address to a negative value.\r
+      //\r
+      NewBaseAddress = (UINT64) (0 - NewBaseAddress);\r
+    }\r
+    if (OutImageType == FW_REBASE_IMAGE) {\r
+      Status = RebaseImage (mInImageName, FileBuffer, NewBaseAddress);\r
+    } else {\r
+      Status = SetAddressToSectionHeader (mInImageName, FileBuffer, NewBaseAddress);\r
+    }\r
+    if (EFI_ERROR (Status)) {\r
+      if (NegativeAddr) {\r
+        Error (NULL, 0, 3000, "Invalid", "Rebase/Set Image %s to Base address -0x%llx can't success", mInImageName, 0 - NewBaseAddress);\r
+      } else {\r
+        Error (NULL, 0, 3000, "Invalid", "Rebase/Set Image %s to Base address 0x%llx can't success", mInImageName, NewBaseAddress);\r
+      }\r
+      goto Finish;\r
+    }\r
+\r
+    //\r
+    // Write file\r
+    //\r
+    goto WriteFile;\r
+  }\r
+\r
   //\r
   // Extract bin data from Pe image.\r
   //\r
@@ -2695,14 +3066,10 @@ Returns:
     //\r
     // Output bin data from exe file\r
     //\r
-    if (fpOut != NULL) {\r
-      fwrite (FileBuffer + PeHdr->Pe32.OptionalHeader.SizeOfHeaders, 1, FileLength - PeHdr->Pe32.OptionalHeader.SizeOfHeaders, fpOut);\r
-    }\r
-    if (fpInOut != NULL) {\r
-      fwrite (FileBuffer + PeHdr->Pe32.OptionalHeader.SizeOfHeaders, 1, FileLength - PeHdr->Pe32.OptionalHeader.SizeOfHeaders, fpInOut);\r
-    }\r
-    VerboseMsg ("the size of output file is %u bytes", (unsigned) (FileLength - PeHdr->Pe32.OptionalHeader.SizeOfHeaders));\r
-    goto Finish;\r
+    FileLength = FileLength - PeHdr->Pe32.OptionalHeader.SizeOfHeaders;\r
+    memcpy (FileBuffer, FileBuffer + PeHdr->Pe32.OptionalHeader.SizeOfHeaders, FileLength);\r
+    VerboseMsg ("the size of output file is %u bytes", (unsigned) FileLength);\r
+    goto WriteFile;\r
   }\r
 \r
   //\r
@@ -2715,14 +3082,11 @@ Returns:
       goto Finish;\r
     }\r
 \r
-    if (fpOut != NULL) {\r
-      fwrite (FileBuffer, 1, FileLength, fpOut);\r
-    }\r
-    if (fpInOut != NULL) {\r
-      fwrite (FileBuffer, 1, FileLength, fpInOut);\r
-    }\r
+    //\r
+    // Write the updated Image\r
+    //\r
     VerboseMsg ("the size of output file is %u bytes", (unsigned) FileLength);\r
-    goto Finish;\r
+    goto WriteFile;\r
   }\r
 \r
   //\r
@@ -2734,14 +3098,11 @@ Returns:
       goto Finish;\r
     }\r
 \r
-    if (fpOut != NULL) {\r
-      fwrite (FileBuffer, 1, FileLength, fpOut);\r
-    }\r
-    if (fpInOut != NULL) {\r
-      fwrite (FileBuffer, 1, FileLength, fpInOut);\r
-    }\r
+    //\r
+    // Write the updated Image\r
+    //\r
     VerboseMsg ("the size of output file is %u bytes", (unsigned) FileLength);\r
-    goto Finish;\r
+    goto WriteFile;\r
   }\r
 \r
   //\r
@@ -2768,14 +3129,9 @@ Returns:
         //\r
         // Output Apci data to file\r
         //\r
-        if (fpOut != NULL) {\r
-          fwrite (FileBuffer + SectionHeader->PointerToRawData, 1, FileLength, fpOut);\r
-        }\r
-        if (fpInOut != NULL) {\r
-          fwrite (FileBuffer + SectionHeader->PointerToRawData, 1, FileLength, fpInOut);\r
-        }\r
+        memcpy (FileBuffer, FileBuffer + SectionHeader->PointerToRawData, FileLength);\r
         VerboseMsg ("the size of output file is %u bytes", (unsigned) FileLength);\r
-        goto Finish;\r
+        goto WriteFile;\r
       }\r
     }\r
     Error (NULL, 0, 3000, "Invalid", "failed to get ACPI table from %s.", mInImageName);\r
@@ -2789,7 +3145,7 @@ Returns:
     memset (DosHdr, 0, sizeof (EFI_IMAGE_DOS_HEADER));\r
     DosHdr->e_magic  = BackupDosHdr.e_magic;\r
     DosHdr->e_lfanew = BackupDosHdr.e_lfanew;\r
-  \r
+\r
     for (Index = sizeof (EFI_IMAGE_DOS_HEADER); Index < (UINT32 ) DosHdr->e_lfanew; Index++) {\r
       FileBuffer[Index] = (UINT8) DosHdr->e_cp;\r
     }\r
@@ -2804,7 +3160,7 @@ Returns:
   TEImageHeader.NumberOfSections = (UINT8) PeHdr->Pe32.FileHeader.NumberOfSections;\r
   TEImageHeader.StrippedSize     = (UINT16) ((UINTN) ((UINT8 *) &(PeHdr->Pe32.OptionalHeader) + PeHdr->Pe32.FileHeader.SizeOfOptionalHeader) - (UINTN) FileBuffer);\r
   TEImageHeader.Subsystem        = (UINT8) Type;\r
-  \r
+\r
   //\r
   // Patch the PE header\r
   //\r
@@ -2845,28 +3201,28 @@ Returns:
     // Zero .pdata section data.\r
     //\r
     if (!KeepExceptionTableFlag && Optional32->NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION &&\r
-        Optional32->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION].VirtualAddress != 0 &&\r
-        Optional32->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION].Size != 0) {\r
-      SectionHeader = (EFI_IMAGE_SECTION_HEADER *) ((UINT8 *) &(PeHdr->Pe32.OptionalHeader) + PeHdr->Pe32.FileHeader.SizeOfOptionalHeader);\r
-      for (Index = 0; Index < PeHdr->Pe32.FileHeader.NumberOfSections; Index++, SectionHeader++) {\r
-        if (SectionHeader->VirtualAddress == Optional32->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION].VirtualAddress) {\r
-          //\r
-          // Zero .pdata Section data\r
-          //\r
-          memset (FileBuffer + SectionHeader->PointerToRawData, 0, SectionHeader->SizeOfRawData);\r
-          //\r
-          // Zero .pdata Section header name\r
-          //\r
-          memset (SectionHeader->Name, 0, sizeof (SectionHeader->Name));\r
-          //\r
-          // Zero Execption Table\r
-          //\r
-          Optional32->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION].VirtualAddress = 0;\r
-          Optional32->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION].Size           = 0;\r
-          DebugMsg (NULL, 0, 9, "Zero the .pdata section for PE image", NULL);\r
-          break;\r
+      Optional32->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION].VirtualAddress != 0 &&\r
+      Optional32->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION].Size != 0) {\r
+        SectionHeader = (EFI_IMAGE_SECTION_HEADER *) ((UINT8 *) &(PeHdr->Pe32.OptionalHeader) + PeHdr->Pe32.FileHeader.SizeOfOptionalHeader);\r
+        for (Index = 0; Index < PeHdr->Pe32.FileHeader.NumberOfSections; Index++, SectionHeader++) {\r
+          if (SectionHeader->VirtualAddress == Optional32->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION].VirtualAddress) {\r
+            //\r
+            // Zero .pdata Section data\r
+            //\r
+            memset (FileBuffer + SectionHeader->PointerToRawData, 0, SectionHeader->SizeOfRawData);\r
+            //\r
+            // Zero .pdata Section header name\r
+            //\r
+            memset (SectionHeader->Name, 0, sizeof (SectionHeader->Name));\r
+            //\r
+            // Zero Execption Table\r
+            //\r
+            Optional32->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION].VirtualAddress = 0;\r
+            Optional32->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION].Size           = 0;\r
+            DebugMsg (NULL, 0, 9, "Zero the .pdata section for PE image", NULL);\r
+            break;\r
+          }\r
         }\r
-      }\r
     }\r
 \r
     //\r
@@ -2941,40 +3297,40 @@ Returns:
     //\r
     if ((!KeepExceptionTableFlag && PeHdr->Pe32.FileHeader.Machine == IMAGE_FILE_MACHINE_X64) || PeHdr->Pe32.FileHeader.Machine == IMAGE_FILE_MACHINE_IA64) {\r
       if (Optional64->NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION &&\r
-          Optional64->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION].VirtualAddress != 0 &&\r
-          Optional64->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION].Size != 0) {\r
-        SectionHeader = (EFI_IMAGE_SECTION_HEADER *) ((UINT8 *) &(PeHdr->Pe32.OptionalHeader) + PeHdr->Pe32.FileHeader.SizeOfOptionalHeader);\r
-        for (Index = 0; Index < PeHdr->Pe32.FileHeader.NumberOfSections; Index++, SectionHeader++) {\r
-          if (SectionHeader->VirtualAddress == Optional64->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION].VirtualAddress) {\r
-            //\r
-            // Zero .pdata Section header name\r
-            //\r
-            memset (SectionHeader->Name, 0, sizeof (SectionHeader->Name));\r
-\r
-            RuntimeFunction = (RUNTIME_FUNCTION *)(FileBuffer + SectionHeader->PointerToRawData);\r
-            for (Index1 = 0; Index1 < Optional64->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION].Size / sizeof (RUNTIME_FUNCTION); Index1++, RuntimeFunction++) {\r
-              SectionHeader = (EFI_IMAGE_SECTION_HEADER *) ((UINT8 *) &(PeHdr->Pe32.OptionalHeader) + PeHdr->Pe32.FileHeader.SizeOfOptionalHeader);\r
-              for (Index2 = 0; Index2 < PeHdr->Pe32.FileHeader.NumberOfSections; Index2++, SectionHeader++) {\r
-                if (RuntimeFunction->UnwindInfoAddress >= SectionHeader->VirtualAddress && RuntimeFunction->UnwindInfoAddress < (SectionHeader->VirtualAddress + SectionHeader->SizeOfRawData)) {\r
-                  UnwindInfo = (UNWIND_INFO *)(FileBuffer + SectionHeader->PointerToRawData + (RuntimeFunction->UnwindInfoAddress - SectionHeader->VirtualAddress));\r
-                  if (UnwindInfo->Version == 1) {\r
-                    memset (UnwindInfo + 1, 0, UnwindInfo->CountOfUnwindCodes * sizeof (UINT16));\r
-                    memset (UnwindInfo, 0, sizeof (UNWIND_INFO));\r
+        Optional64->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION].VirtualAddress != 0 &&\r
+        Optional64->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION].Size != 0) {\r
+          SectionHeader = (EFI_IMAGE_SECTION_HEADER *) ((UINT8 *) &(PeHdr->Pe32.OptionalHeader) + PeHdr->Pe32.FileHeader.SizeOfOptionalHeader);\r
+          for (Index = 0; Index < PeHdr->Pe32.FileHeader.NumberOfSections; Index++, SectionHeader++) {\r
+            if (SectionHeader->VirtualAddress == Optional64->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION].VirtualAddress) {\r
+              //\r
+              // Zero .pdata Section header name\r
+              //\r
+              memset (SectionHeader->Name, 0, sizeof (SectionHeader->Name));\r
+\r
+              RuntimeFunction = (RUNTIME_FUNCTION *)(FileBuffer + SectionHeader->PointerToRawData);\r
+              for (Index1 = 0; Index1 < Optional64->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION].Size / sizeof (RUNTIME_FUNCTION); Index1++, RuntimeFunction++) {\r
+                SectionHeader = (EFI_IMAGE_SECTION_HEADER *) ((UINT8 *) &(PeHdr->Pe32.OptionalHeader) + PeHdr->Pe32.FileHeader.SizeOfOptionalHeader);\r
+                for (Index2 = 0; Index2 < PeHdr->Pe32.FileHeader.NumberOfSections; Index2++, SectionHeader++) {\r
+                  if (RuntimeFunction->UnwindInfoAddress >= SectionHeader->VirtualAddress && RuntimeFunction->UnwindInfoAddress < (SectionHeader->VirtualAddress + SectionHeader->SizeOfRawData)) {\r
+                    UnwindInfo = (UNWIND_INFO *)(FileBuffer + SectionHeader->PointerToRawData + (RuntimeFunction->UnwindInfoAddress - SectionHeader->VirtualAddress));\r
+                    if (UnwindInfo->Version == 1) {\r
+                      memset (UnwindInfo + 1, 0, UnwindInfo->CountOfUnwindCodes * sizeof (UINT16));\r
+                      memset (UnwindInfo, 0, sizeof (UNWIND_INFO));\r
+                    }\r
+                    break;\r
                   }\r
-                  break;\r
                 }\r
+                memset (RuntimeFunction, 0, sizeof (RUNTIME_FUNCTION));\r
               }\r
-              memset (RuntimeFunction, 0, sizeof (RUNTIME_FUNCTION));\r
+              //\r
+              // Zero Execption Table\r
+              //\r
+              Optional64->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION].Size = 0;\r
+              Optional64->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION].VirtualAddress = 0;\r
+              DebugMsg (NULL, 0, 9, "Zero the .pdata section if the machine type is X64 for PE32+ image", NULL);\r
+              break;\r
             }\r
-            //\r
-            // Zero Execption Table\r
-            //\r
-            Optional64->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION].Size = 0;\r
-            Optional64->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION].VirtualAddress = 0;\r
-            DebugMsg (NULL, 0, 9, "Zero the .pdata section if the machine type is X64 for PE32+ image", NULL);\r
-            break;\r
           }\r
-        }\r
       }\r
     }\r
 \r
@@ -3017,19 +3373,19 @@ Returns:
     Error (NULL, 0, 3000, "Invalid", "Magic 0x%x of PeImage %s is unknown.", PeHdr->Pe32.OptionalHeader.Magic, mInImageName);\r
     goto Finish;\r
   }\r
-  \r
+\r
   if (((PeHdr->Pe32.FileHeader.Characteristics & EFI_IMAGE_FILE_RELOCS_STRIPPED) == 0) && \\r
     (TEImageHeader.DataDirectory[EFI_TE_IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress == 0) && \\r
     (TEImageHeader.DataDirectory[EFI_TE_IMAGE_DIRECTORY_ENTRY_BASERELOC].Size == 0)) {\r
-    //\r
-    // PeImage can be loaded into memory, but it has no relocation section. \r
-    // Fix TeImage Header to set VA of relocation data directory to not zero, the size is still zero.\r
-    //\r
-    if (Optional32 != NULL) {\r
-      TEImageHeader.DataDirectory[EFI_TE_IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress = Optional32->SizeOfImage - sizeof (EFI_IMAGE_BASE_RELOCATION);\r
-    } else if (Optional64 != NULL) {\r
-      TEImageHeader.DataDirectory[EFI_TE_IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress = Optional64->SizeOfImage - sizeof (EFI_IMAGE_BASE_RELOCATION);\r
-    }\r
+      //\r
+      // PeImage can be loaded into memory, but it has no relocation section. \r
+      // Fix TeImage Header to set VA of relocation data directory to not zero, the size is still zero.\r
+      //\r
+      if (Optional32 != NULL) {\r
+        TEImageHeader.DataDirectory[EFI_TE_IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress = Optional32->SizeOfImage - sizeof (EFI_IMAGE_BASE_RELOCATION);\r
+      } else if (Optional64 != NULL) {\r
+        TEImageHeader.DataDirectory[EFI_TE_IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress = Optional64->SizeOfImage - sizeof (EFI_IMAGE_BASE_RELOCATION);\r
+      }\r
   }\r
 \r
   //\r
@@ -3102,40 +3458,54 @@ Returns:
     }\r
 \r
     DebugMsg (NULL, 0, 9, "TeImage Header Info", "Machine type is %X, Number of sections is %X, Stripped size is %X, EntryPoint is %X, BaseOfCode is %X, ImageBase is %llX",\r
-              TEImageHeader.Machine, TEImageHeader.NumberOfSections, TEImageHeader.StrippedSize, (unsigned) TEImageHeader.AddressOfEntryPoint, (unsigned) TEImageHeader.BaseOfCode, (unsigned long long) TEImageHeader.ImageBase);\r
+      TEImageHeader.Machine, TEImageHeader.NumberOfSections, TEImageHeader.StrippedSize, (unsigned) TEImageHeader.AddressOfEntryPoint, (unsigned) TEImageHeader.BaseOfCode, (unsigned long long) TEImageHeader.ImageBase);\r
     //\r
     // Update Image to TeImage\r
     //\r
-    if (fpOut != NULL) {\r
-      fwrite (&TEImageHeader, 1, sizeof (EFI_TE_IMAGE_HEADER), fpOut);\r
-      fwrite (FileBuffer + TEImageHeader.StrippedSize, 1, FileLength - TEImageHeader.StrippedSize, fpOut);\r
-    }\r
-    if (fpInOut != NULL) {\r
-      fwrite (&TEImageHeader, 1, sizeof (EFI_TE_IMAGE_HEADER), fpInOut);\r
-      fwrite (FileBuffer + TEImageHeader.StrippedSize, 1, FileLength - TEImageHeader.StrippedSize, fpInOut);\r
-    }\r
-    VerboseMsg ("the size of output file is %u bytes", (unsigned) (FileLength - TEImageHeader.StrippedSize));\r
-    goto Finish;\r
+    FileLength = FileLength - TEImageHeader.StrippedSize;\r
+    memcpy (FileBuffer + sizeof (EFI_TE_IMAGE_HEADER), FileBuffer + TEImageHeader.StrippedSize, FileLength);\r
+    FileLength = FileLength + sizeof (EFI_TE_IMAGE_HEADER);\r
+    memcpy (FileBuffer, &TEImageHeader, sizeof (EFI_TE_IMAGE_HEADER));\r
+    VerboseMsg ("the size of output file is %u bytes", (unsigned) (FileLength));\r
   }\r
+\r
 WriteFile:\r
   //\r
-  // Update Image to EfiImage\r
+  // Update Image to EfiImage or TE image\r
   //\r
-  if (fpOut != NULL) {\r
-    fwrite (FileBuffer, 1, FileLength, fpOut);\r
-  }\r
-  if (fpInOut != NULL) {\r
-    fwrite (FileBuffer, 1, FileLength, fpInOut);\r
+  if (ReplaceFlag) {\r
+    if ((FileLength != InputFileLength) || (memcmp (FileBuffer, InputFileBuffer, FileLength) != 0)) {\r
+      //\r
+      // Update File when File is changed.\r
+      //\r
+      fpInOut = fopen (mInImageName, "wb");\r
+      if (fpInOut == NULL) {\r
+        Error (NULL, 0, 0001, "Error opening file", mInImageName);\r
+        goto Finish;\r
+      }\r
+      fwrite (FileBuffer, 1, FileLength, fpInOut);\r
+      VerboseMsg ("the size of output file is %u bytes", (unsigned) FileLength);\r
+    }\r
+  } else {\r
+    if ((FileLength != OutputFileLength) || (memcmp (FileBuffer, OutputFileBuffer, FileLength) != 0)) {\r
+      fpOut = fopen (OutImageName, "wb");\r
+      if (fpOut == NULL) {\r
+        Error (NULL, 0, 0001, "Error opening output file", OutImageName);\r
+        goto Finish;\r
+      }\r
+      fwrite (FileBuffer, 1, FileLength, fpOut);\r
+      VerboseMsg ("the size of output file is %u bytes", (unsigned) FileLength);\r
+    }\r
   }\r
-  VerboseMsg ("the size of output file is %u bytes", (unsigned) FileLength);\r
+  mImageSize = FileLength;\r
 \r
 Finish:\r
   if (fpInOut != NULL) {\r
     if (GetUtilityStatus () != STATUS_SUCCESS) {\r
       //\r
-      // when file updates failed, original file is still recoveried.\r
+      // when file updates failed, original file is still recovered.\r
       //\r
-      fwrite (FileBuffer, 1, FileLength, fpInOut);\r
+      fwrite (InputFileBuffer, 1, InputFileLength, fpInOut);\r
     }\r
     //\r
     // Write converted data into fpInOut file and close input file.\r
@@ -3163,11 +3533,38 @@ Finish:
         fpOut = fopen (OutImageName, "wb");\r
         fwrite (OutputFileBuffer, 1, OutputFileLength, fpOut);\r
         fclose (fpOut);\r
-        free (OutputFileBuffer);\r
       }\r
     }\r
   }\r
+  \r
+  if (InputFileBuffer != NULL) {\r
+    free (InputFileBuffer);\r
+  }\r
+\r
+  if (OutputFileBuffer != NULL) {\r
+    free (OutputFileBuffer);\r
+  }\r
 \r
+  //\r
+  // Write module size and time stamp to report file.\r
+  //\r
+  if (OutImageName != NULL) {\r
+    FileLen = strlen (OutImageName);\r
+  }\r
+  if (FileLen >= 4 && strcmp (OutImageName + (FileLen - 4), ".efi") == 0) {\r
+    ReportFileName = (CHAR8 *) malloc (FileLen + 1);\r
+    if (ReportFileName != NULL) {\r
+      strcpy (ReportFileName, OutImageName);\r
+      strcpy (ReportFileName + (FileLen - 4), ".txt"); \r
+      ReportFile = fopen (ReportFileName, "w+");\r
+      if (ReportFile != NULL) {\r
+        fprintf (ReportFile, "MODULE_SIZE = %u\n", (unsigned) mImageSize);\r
+        fprintf (ReportFile, "TIME_STAMP = %u\n", (unsigned) mImageTimeStamp);\r
+        fclose(ReportFile);\r
+      }\r
+      free (ReportFileName);\r
+    }\r
+  }\r
   VerboseMsg ("%s tool done with return code is 0x%x.", UTILITY_NAME, GetUtilityStatus ());\r
 \r
   return GetUtilityStatus ();\r
@@ -3302,7 +3699,7 @@ Returns:
   //Zero Debug Data and TimeStamp\r
   //\r
   FileHdr->TimeDateStamp = 0;\r
-\r
+  mImageTimeStamp = 0;\r
   if (ExportDirectoryEntryFileOffset != 0) {\r
     NewTimeStamp  = (UINT32 *) (FileBuffer + ExportDirectoryEntryFileOffset + sizeof (UINT32));\r
     *NewTimeStamp = 0;\r
@@ -3316,6 +3713,7 @@ Returns:
   if (DebugDirectoryEntryFileOffset != 0) {\r
     DebugEntry = (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *) (FileBuffer + DebugDirectoryEntryFileOffset);\r
     DebugEntry->TimeDateStamp = 0;\r
+    mImageTimeStamp = 0;\r
     if (ZeroDebugFlag) {\r
       memset (FileBuffer + DebugEntry->FileOffset, 0, DebugEntry->SizeOfData);\r
       memset (DebugEntry, 0, sizeof (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY));\r
@@ -3542,7 +3940,7 @@ Returns:
   // Set new stamp\r
   //\r
   FileHdr->TimeDateStamp = (UINT32) newtime;\r
-\r
+  mImageTimeStamp = (UINT32) newtime;\r
   if (ExportDirectoryEntryRva != 0) {\r
     NewTimeStamp  = (UINT32 *) (FileBuffer + ExportDirectoryEntryFileOffset + sizeof (UINT32));\r
     *NewTimeStamp = (UINT32) newtime;\r
index 9e47123..0edba15 100644 (file)
@@ -1,3 +1,17 @@
+/** @file
+Ported ELF include files from FreeBSD
+
+Copyright (c) 2009 - 2010, Apple, Inc. All  rights reserved. 
+All rights reserved. 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
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+
+**/
 /*-
  * Copyright (c) 1996-1998 John D. Polstra.
  * All rights reserved.
index 9960888..ba8e85f 100644 (file)
@@ -1,3 +1,16 @@
+/** @file
+Ported ELF include files from FreeBSD
+
+Copyright (c) 2009 - 2010, Apple, Inc. All  rights reserved. 
+All rights reserved. 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
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
 /*-
  * Copyright (c) 1996-1998 John D. Polstra.
  * All rights reserved.
index 471c265..1cd3f53 100644 (file)
@@ -1,3 +1,17 @@
+/** @file
+Ported ELF include files from FreeBSD
+
+Copyright (c) 2009 - 2010, Apple, Inc. All  rights reserved. 
+All rights reserved. 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
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+
+**/
 /*-
  * Copyright (c) 1998 John D. Polstra.
  * All rights reserved.
index dac5588..abcb5e8 100644 (file)
@@ -1,6 +1,6 @@
 /** @file\r
 \r
-Copyright 2006 - 2008, Intel Corporation                                                         \r
+Copyright 2006 - 2010, Intel Corporation                                                         \r
 All rights reserved. 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
@@ -92,7 +92,7 @@ Returns:
 --*/\r
 {\r
   printf ("%s v%d.%d -Utility to generate the EfiLoader image containing page table.\n", UTILITY_NAME, UTILITY_MAJOR_VERSION, UTILITY_MINOR_VERSION);\r
-  printf ("Copyright (c) 2008 - 2009 Intel Corporation. All rights reserved.\n");\r
+  printf ("Copyright (c) 2008 - 2010 Intel Corporation. All rights reserved.\n");\r
 }\r
 \r
 VOID\r
index 9a1d0ca..8c4f874 100644 (file)
@@ -1,6 +1,6 @@
 /** @file\r
 \r
-Copyright (c) 2004 - 2008, Intel Corporation                                                         \r
+Copyright (c) 2004 - 2010, Intel Corporation                                                         \r
 All rights reserved. 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
@@ -27,6 +27,7 @@ Abstract:
 #include <Common/UefiBaseTypes.h>\r
 #include <Common/PiFirmwareFile.h>\r
 #include <Protocol/GuidedSectionExtraction.h>\r
+#include <IndustryStandard/PeImage.h>\r
 \r
 #include "CommonLib.h"\r
 #include "Compress.h"\r
@@ -80,6 +81,11 @@ STATIC CHAR8      *mCompressionTypeName[]    = { "PI_NONE", "PI_STD" };
 #define EFI_GUIDED_SECTION_NONE 0x80\r
 STATIC CHAR8      *mGUIDedSectionAttribue[]  = { "NONE", "PROCESSING_REQUIRED", "AUTH_STATUS_VALID"};\r
 \r
+STATIC CHAR8 *mAlignName[] = {\r
+  "1", "2", "4", "8", "16", "32", "64", "128", "256", "512",\r
+  "1K", "2K", "4K", "8K", "16K", "32K", "64K"\r
+};\r
+\r
 //\r
 // Crc32 GUID section related definitions.\r
 //\r
@@ -144,7 +150,7 @@ Returns:
   //\r
   // Copyright declaration\r
   // \r
-  fprintf (stdout, "Copyright (c) 2007, Intel Corporation. All rights reserved.\n\n");\r
+  fprintf (stdout, "Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.\n\n");\r
 \r
   //\r
   // Details Option\r
@@ -180,6 +186,10 @@ Returns:
   fprintf (stdout, "  -j Number, --buildnumber Number\n\\r
                         Number is an integer value between 0000 and 9999\n\\r
                         used in Ver section.\n");\r
+  fprintf (stdout, "  --sectionalign SectionAlign\n\\r
+                        SectionAlign points to section alignment, which support\n\\r
+                        the alignment scope 1~64K. It is specified in same\n\\r
+                        order that the section file is input.\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
@@ -329,9 +339,50 @@ Done:
   return Status;\r
 }\r
 \r
+STATIC\r
+EFI_STATUS\r
+StringtoAlignment (\r
+  IN  CHAR8  *AlignBuffer,\r
+  OUT UINT32 *AlignNumber\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Converts Align String to align value (1~64K). \r
+\r
+Arguments:\r
+\r
+  AlignBuffer    - Pointer to Align string.\r
+  AlignNumber    - Pointer to Align value.\r
+\r
+Returns:\r
+\r
+  EFI_SUCCESS             Successfully convert align string to align value.\r
+  EFI_INVALID_PARAMETER   Align string is invalid or align value is not in scope.\r
+\r
+--*/\r
+{\r
+  UINT32 Index = 0;\r
+  //\r
+  // Check AlignBuffer\r
+  //\r
+  if (AlignBuffer == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+  for (Index = 0; Index < sizeof (mAlignName) / sizeof (CHAR8 *); Index ++) {\r
+    if (stricmp (AlignBuffer, mAlignName [Index]) == 0) {\r
+      *AlignNumber = 1 << Index;\r
+      return EFI_SUCCESS;\r
+    }\r
+  }\r
+  return EFI_INVALID_PARAMETER;\r
+}\r
+\r
 EFI_STATUS\r
 GetSectionContents (\r
   CHAR8   **InputFileName,\r
+  UINT32  *InputFileAlign,\r
   UINT32  InputFileNum,\r
   UINT8   *FileBuffer,\r
   UINT32  *BufferLength\r
@@ -346,7 +397,9 @@ Routine Description:
 Arguments:\r
                \r
   InputFileName  - Name of the input file.\r
-                \r
+\r
+  InputFileAlign - Alignment required by the input file data.\r
+\r
   InputFileNum   - Number of input files. Should be at least 1.\r
 \r
   FileBuffer     - Output buffer to contain data\r
@@ -362,10 +415,17 @@ Returns:
   EFI_BUFFER_TOO_SMALL FileBuffer is not enough to contain all file data.\r
 --*/\r
 {\r
-  UINT32   Size;\r
-  UINT32   FileSize;\r
-  UINT32   Index;\r
-  FILE    *InFile;\r
+  UINT32                     Size;\r
+  UINT32                     Offset;\r
+  UINT32                     FileSize;\r
+  UINT32                     Index;\r
+  FILE                       *InFile;\r
+  EFI_COMMON_SECTION_HEADER  *SectHeader;\r
+  EFI_COMMON_SECTION_HEADER  TempSectHeader;\r
+  EFI_TE_IMAGE_HEADER        TeHeader;\r
+  UINT32                     TeOffset;\r
+  EFI_GUID_DEFINED_SECTION   GuidSectHeader;\r
+  UINT32                     HeaderSize;\r
 \r
   if (InputFileNum < 1) {\r
     Error (NULL, 0, 2000, "Invalid paramter", "must specify at least one input file");\r
@@ -377,7 +437,9 @@ Returns:
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  Size = 0;\r
+  Size          = 0;\r
+  Offset        = 0;\r
+  TeOffset      = 0;\r
   //\r
   // Go through our array of file names and copy their contents\r
   // to the output buffer.\r
@@ -406,11 +468,66 @@ Returns:
     FileSize = ftell (InFile);\r
     fseek (InFile, 0, SEEK_SET);\r
     DebugMsg (NULL, 0, 9, "Input files", "the input file name is %s and the size is %u bytes", InputFileName[Index], (unsigned) FileSize); \r
+    //\r
+    // Adjust section buffer when section alignment is required.\r
+    //\r
+    if (InputFileAlign != NULL) {\r
+      //\r
+      // Check this section is Te/Pe section, and Calculate the numbers of Te/Pe section.\r
+      //\r
+      TeOffset = 0;\r
+      HeaderSize = sizeof (EFI_COMMON_SECTION_HEADER);\r
+      fread (&TempSectHeader, 1, sizeof (TempSectHeader), InFile);\r
+      if (TempSectHeader.Type == EFI_SECTION_TE) {\r
+        fread (&TeHeader, 1, sizeof (TeHeader), InFile);\r
+        if (TeHeader.Signature == EFI_TE_IMAGE_HEADER_SIGNATURE) {\r
+          TeOffset = TeHeader.StrippedSize - sizeof (TeHeader);\r
+        }\r
+      } else if (TempSectHeader.Type == EFI_SECTION_GUID_DEFINED) {\r
+        fseek (InFile, 0, SEEK_SET);\r
+        fread (&GuidSectHeader, 1, sizeof (GuidSectHeader), InFile);\r
+        if ((GuidSectHeader.Attributes & EFI_GUIDED_SECTION_PROCESSING_REQUIRED) == 0) {\r
+          HeaderSize = GuidSectHeader.DataOffset;\r
+        }\r
+      } \r
+\r
+      fseek (InFile, 0, SEEK_SET);\r
+\r
+      //\r
+      // Revert TeOffset to the converse value relative to Alignment\r
+      // This is to assure the original PeImage Header at Alignment.\r
+      //\r
+      if (TeOffset != 0) {\r
+        TeOffset = InputFileAlign [Index] - (TeOffset % InputFileAlign [Index]);\r
+        TeOffset = TeOffset % InputFileAlign [Index];\r
+      }\r
+\r
+      //\r
+      // make sure section data meet its alignment requirement by adding one raw pad section.\r
+      //\r
+      if ((InputFileAlign [Index] != 0) && (((Size + HeaderSize + TeOffset) % InputFileAlign [Index]) != 0)) {\r
+        Offset = (Size + sizeof (EFI_COMMON_SECTION_HEADER) + HeaderSize + TeOffset + InputFileAlign [Index] - 1) & ~(InputFileAlign [Index] - 1);\r
+        Offset = Offset - Size - HeaderSize - TeOffset;\r
+         \r
+        if (FileBuffer != NULL && ((Size + Offset) < *BufferLength)) {\r
+          memset (FileBuffer + Size, 0, Offset);\r
+          SectHeader          = (EFI_COMMON_SECTION_HEADER *) (FileBuffer + Size);\r
+          SectHeader->Type    = EFI_SECTION_RAW;\r
+          SectHeader->Size[0] = (UINT8) (Offset & 0xff);\r
+          SectHeader->Size[1] = (UINT8) ((Offset & 0xff00) >> 8);\r
+          SectHeader->Size[2] = (UINT8) ((Offset & 0xff0000) >> 16);\r
+        }\r
+        DebugMsg (NULL, 0, 9, "Pad raw section for section data alignment", "Pad Raw section size is %u", (unsigned) Offset);\r
+\r
+        Size = Size + Offset;\r
+      }\r
+    }\r
+\r
     //\r
     // Now read the contents of the file into the buffer\r
     // Buffer must be enough to contain the file content.\r
     //\r
-    if (FileSize > 0 && FileBuffer != NULL && (Size + FileSize) <= *BufferLength) {\r
+    if ((FileSize > 0) && (FileBuffer != NULL) && ((Size + FileSize) <= *BufferLength)) {\r
       if (fread (FileBuffer + Size, (size_t) FileSize, 1, InFile) != 1) {\r
         Error (NULL, 0, 0004, "Error reading file", InputFileName[Index]);\r
         fclose (InFile);\r
@@ -437,6 +554,7 @@ Returns:
 EFI_STATUS\r
 GenSectionCompressionSection (\r
   CHAR8   **InputFileName,\r
+  UINT32  *InputFileAlign,\r
   UINT32  InputFileNum,\r
   UINT8   SectCompSubType,\r
   UINT8   **OutFileBuffer\r
@@ -453,7 +571,9 @@ Routine Description:
 Arguments:\r
                \r
   InputFileName  - Name of the input file.\r
-                \r
+\r
+  InputFileAlign - Alignment required by the input file data.\r
+\r
   InputFileNum   - Number of input files. Should be at least 1.\r
 \r
   SectCompSubType - Specify the compression algorithm requested. \r
@@ -487,6 +607,7 @@ Returns:
   //\r
   Status = GetSectionContents (\r
             InputFileName,\r
+            InputFileAlign,\r
             InputFileNum,\r
             FileBuffer,\r
             &InputLength\r
@@ -503,6 +624,7 @@ Returns:
     //\r
     Status = GetSectionContents (\r
               InputFileName,\r
+              InputFileAlign,\r
               InputFileNum,\r
               FileBuffer,\r
               &InputLength\r
@@ -524,6 +646,16 @@ Returns:
   switch (SectCompSubType) {\r
   case EFI_NOT_COMPRESSED:\r
     CompressedLength = InputLength;\r
+    //\r
+    // Copy file buffer to the none compressed data.\r
+    //\r
+    OutputBuffer = malloc (CompressedLength + sizeof (EFI_COMPRESSION_SECTION));\r
+    if (OutputBuffer == NULL) {\r
+      free (FileBuffer);\r
+      return EFI_OUT_OF_RESOURCES;\r
+    }\r
+    memcpy (OutputBuffer + sizeof (EFI_COMPRESSION_SECTION), FileBuffer, CompressedLength);\r
+    FileBuffer = OutputBuffer;\r
     break;\r
 \r
   case EFI_STANDARD_COMPRESSION:\r
@@ -599,6 +731,7 @@ Returns:
 EFI_STATUS\r
 GenSectionGuidDefinedSection (\r
   CHAR8    **InputFileName,\r
+  UINT32   *InputFileAlign,\r
   UINT32   InputFileNum,\r
   EFI_GUID *VendorGuid,\r
   UINT16   DataAttribute,\r
@@ -618,6 +751,8 @@ Arguments:
                \r
   InputFileName - Name of the input file.\r
                 \r
+  InputFileAlign - Alignment required by the input file data.\r
+\r
   InputFileNum  - Number of input files. Should be at least 1.\r
 \r
   VendorGuid    - Specify vendor guid value.\r
@@ -662,6 +797,7 @@ Returns:
   //\r
   Status = GetSectionContents (\r
             InputFileName,\r
+            InputFileAlign,\r
             InputFileNum,\r
             FileBuffer,\r
             &InputLength\r
@@ -678,6 +814,7 @@ Returns:
     //\r
     Status = GetSectionContents (\r
               InputFileName,\r
+              InputFileAlign,\r
               InputFileNum,\r
               FileBuffer + Offset,\r
               &InputLength\r
@@ -797,7 +934,11 @@ Returns:
   UINT8                     *OutFileBuffer;\r
   EFI_STATUS                Status;\r
   UINT64                    LogLevel;\r
-  \r
+  UINT32                    *InputFileAlign;\r
+  UINT32                    InputFileAlignNum;\r
+\r
+  InputFileAlign        = NULL;\r
+  InputFileAlignNum     = 0;\r
   InputFileName         = NULL;\r
   OutputFileName        = NULL;\r
   SectionName           = NULL;\r
@@ -809,7 +950,7 @@ Returns:
   InputFileNum          = 0;\r
   SectType              = EFI_SECTION_ALL;\r
   SectCompSubType       = 0;\r
-  SectGuidAttribute     = 0;\r
+  SectGuidAttribute     = EFI_GUIDED_SECTION_NONE;\r
   OutFileBuffer         = NULL;\r
   InputLength           = 0;\r
   Status                = STATUS_SUCCESS;\r
@@ -983,6 +1124,41 @@ Returns:
       continue;\r
     }\r
 \r
+    //\r
+    // Section File alignment requirement\r
+    //\r
+    if (stricmp (argv[0], "--sectionalign") == 0) {\r
+      if (InputFileAlignNum == 0) {\r
+        InputFileAlign = (UINT32 *) malloc (MAXIMUM_INPUT_FILE_NUM * sizeof (UINT32));\r
+        if (InputFileAlign == NULL) {\r
+          Error (NULL, 0, 4001, "Resource", "memory cannot be allocated!");\r
+          return 1;\r
+        }\r
+        memset (InputFileAlign, 1, MAXIMUM_INPUT_FILE_NUM * sizeof (UINT32));\r
+      } else if (InputFileAlignNum % MAXIMUM_INPUT_FILE_NUM == 0) {\r
+        InputFileAlign = (UINT32 *) realloc (\r
+          InputFileAlign,\r
+          (InputFileNum + MAXIMUM_INPUT_FILE_NUM) * sizeof (UINT32)\r
+          );\r
+\r
+        if (InputFileAlign == NULL) {\r
+          Error (NULL, 0, 4001, "Resource", "memory cannot be allocated!");\r
+          return 1;\r
+        }\r
+        memset (&(InputFileAlign[InputFileNum]), 1, (MAXIMUM_INPUT_FILE_NUM * sizeof (UINT32)));\r
+      }\r
+      \r
+      Status = StringtoAlignment (argv[1], &(InputFileAlign[InputFileAlignNum]));\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
+      InputFileAlignNum ++;\r
+      continue; \r
+    }\r
+\r
     //\r
     // Get Input file name\r
     //\r
@@ -992,7 +1168,6 @@ Returns:
         Error (NULL, 0, 4001, "Resource", "memory cannot be allcoated");\r
         return 1;\r
       }\r
-\r
       memset (InputFileName, 0, (MAXIMUM_INPUT_FILE_NUM * sizeof (CHAR8 *)));\r
     } else if (InputFileNum % MAXIMUM_INPUT_FILE_NUM == 0) {\r
       //\r
@@ -1007,7 +1182,6 @@ Returns:
         Error (NULL, 0, 4001, "Resource", "memory cannot be allcoated");\r
         return 1;\r
       }\r
-\r
       memset (&(InputFileName[InputFileNum]), 0, (MAXIMUM_INPUT_FILE_NUM * sizeof (CHAR8 *)));\r
     }\r
 \r
@@ -1016,6 +1190,11 @@ Returns:
     argv ++;\r
   }\r
 \r
+  if (InputFileAlignNum > 0 && InputFileAlignNum != InputFileNum) {\r
+    Error (NULL, 0, 1003, "Invalid option", "section alignment must be set for each section");\r
+    goto Finish;\r
+  }\r
+\r
   VerboseMsg ("%s tool start.", UTILITY_NAME);\r
 \r
   //\r
@@ -1050,14 +1229,11 @@ Returns:
       memcpy (&VendorGuid, &mEfiCrc32SectionGuid, sizeof (EFI_GUID));\r
     }\r
     \r
-    if (SectGuidAttribute == 0) {\r
-      SectGuidAttribute = EFI_GUIDED_SECTION_PROCESSING_REQUIRED;\r
-    }\r
     if ((SectGuidAttribute & EFI_GUIDED_SECTION_NONE) != 0) {\r
       //\r
       // NONE attribute, clear attribute value.\r
       //\r
-      SectGuidAttribute = 0;\r
+      SectGuidAttribute = SectGuidAttribute & ~EFI_GUIDED_SECTION_NONE;\r
     }\r
     VerboseMsg ("Vendor Guid is %08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X", \r
                 (unsigned) VendorGuid.Data1,\r
@@ -1161,8 +1337,13 @@ Returns:
   //\r
   switch (SectType) {\r
   case EFI_SECTION_COMPRESSION:\r
+    if (InputFileAlign != NULL) {\r
+      free (InputFileAlign);\r
+      InputFileAlign = NULL;\r
+    }\r
     Status = GenSectionCompressionSection (\r
               InputFileName,\r
+              InputFileAlign,\r
               InputFileNum,\r
               SectCompSubType,\r
               &OutFileBuffer\r
@@ -1170,8 +1351,17 @@ Returns:
     break;\r
 \r
   case EFI_SECTION_GUID_DEFINED:\r
+    if (InputFileAlign != NULL && (CompareGuid (&VendorGuid, &mEfiCrc32SectionGuid) != 0)) {\r
+      //\r
+      // Only process alignment for the default known CRC32 guided section.\r
+      // For the unknown guided section, the alignment is processed when the dummy all section (EFI_SECTION_ALL) is generated.\r
+      //\r
+      free (InputFileAlign);\r
+      InputFileAlign = NULL;\r
+    }\r
     Status = GenSectionGuidDefinedSection (\r
               InputFileName,\r
+              InputFileAlign,\r
               InputFileNum,\r
               &VendorGuid,\r
               SectGuidAttribute,\r
@@ -1232,6 +1422,7 @@ Returns:
     //\r
     Status = GetSectionContents (\r
               InputFileName,\r
+              InputFileAlign,\r
               InputFileNum,\r
               OutFileBuffer,\r
               &InputLength\r
@@ -1248,6 +1439,7 @@ Returns:
       //\r
       Status = GetSectionContents (\r
                 InputFileName,\r
+                InputFileAlign,\r
                 InputFileNum,\r
                 OutFileBuffer,\r
                 &InputLength\r
@@ -1296,6 +1488,10 @@ Finish:
     free (InputFileName);\r
   }\r
 \r
+  if (InputFileAlign != NULL) {\r
+    free (InputFileAlign);\r
+  }\r
+\r
   if (OutFileBuffer != NULL) {\r
     free (OutFileBuffer);\r
   }\r
index 2e417bf..72fb109 100644 (file)
@@ -1,6 +1,6 @@
 /**\r
 \r
-Copyright (c)  1999-2008 Intel Corporation. All rights reserved\r
+Copyright (c)  1999-2010 Intel Corporation. All rights reserved\r
 This program and the accompanying materials are licensed and made available \r
 under the terms and conditions of the BSD License which accompanies this \r
 distribution.  The full text of the license may be found at\r
@@ -342,7 +342,6 @@ Returns:
         VtfInfo->LocationType = SECOND_VTF;\r
       } else {\r
         VtfInfo->LocationType = NONE;\r
-        Warning(UTILITY_NAME, 0, 0001, "Unknown location for component.", VtfInfo->CompName);\r
       }\r
     } else if (strnicmp (*TokenStr, "COMP_TYPE", 9) == 0) {\r
       TokenStr++;\r
@@ -2408,7 +2407,7 @@ Returns:
   //\r
   // Copyright declaration\r
   //\r
-  fprintf (stdout, "Copyright (c) 2007 - 2009, Intel Corporation. All rights reserved.\n\n");\r
+  fprintf (stdout, "Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.\n\n");\r
   //\r
   // Details Option\r
   //\r
index 6a25bee..9e32892 100644 (file)
@@ -1,6 +1,6 @@
 /** @file\r
 \r
-Copyright 2006 - 2009, Intel Corporation                                                         \r
+Copyright 2006 - 2010, Intel Corporation                                                         \r
 All rights reserved. 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
@@ -273,7 +273,7 @@ Version (
   )\r
 {\r
   printf ("%s v%d.%d -Utility to retrieve and update the boot sector or MBR.\n", UTILITY_NAME, UTILITY_MAJOR_VERSION, UTILITY_MINOR_VERSION);\r
-  printf ("Copyright (c) 2007-2009 Intel Corporation. All rights reserved.\n");\r
+  printf ("Copyright (c) 2007-2010 Intel Corporation. All rights reserved.\n");\r
 }\r
 \r
 \r
index 33b5645..4db99dc 100644 (file)
@@ -68,12 +68,10 @@ typedef UINT8 EFI_FFS_FILE_STATE;
 #define FFS_ATTRIB_DATA_ALIGNMENT     0x38\r
 #define FFS_ATTRIB_CHECKSUM           0x40\r
 //\r
-// FFS_FIXED_CHECKSUM is the default checksum value used when the\r
+// FFS_FIXED_CHECKSUM is the checksum value used when the\r
 // FFS_ATTRIB_CHECKSUM attribute bit is clear\r
-// note this is NOT an architecturally defined value, but is in this file for\r
-// implementation convenience\r
 //\r
-#define FFS_FIXED_CHECKSUM  0x5A\r
+#define FFS_FIXED_CHECKSUM  0xAA\r
 \r
 // \r
 // FFS File State Bits.\r
index e76ffd3..9f38247 100644 (file)
@@ -3,7 +3,7 @@
   IFR is primarily consumed by the EFI presentation engine, and produced by EFI\r
   internal application and drivers as well as all add-in card option-ROM drivers\r
 \r
-  Copyright (c) 2006 - 2009, Intel Corporation  All rights reserved.\r
+  Copyright (c) 2006 - 2010, Intel Corporation  All rights reserved.\r
 \r
   This program and the accompanying materials are licensed and made available\r
   under the terms and conditions of the BSD License which accompanies this\r
@@ -618,6 +618,7 @@ typedef union {
 #define EFI_IFR_DISABLE_IF_OP          0x1E\r
 #define EFI_IFR_TO_LOWER_OP            0x20\r
 #define EFI_IFR_TO_UPPER_OP            0x21\r
+#define EFI_IFR_MAP_OP                 0x22\r
 #define EFI_IFR_ORDERED_LIST_OP        0x23\r
 #define EFI_IFR_VARSTORE_OP            0x24\r
 #define EFI_IFR_VARSTORE_NAME_VALUE_OP 0x25\r
@@ -626,6 +627,10 @@ typedef union {
 #define EFI_IFR_VERSION_OP             0x28\r
 #define EFI_IFR_END_OP                 0x29\r
 #define EFI_IFR_MATCH_OP               0x2A\r
+#define EFI_IFR_GET_OP                 0x2B\r
+#define EFI_IFR_SET_OP                 0x2C\r
+#define EFI_IFR_READ_OP                0x2D\r
+#define EFI_IFR_WRITE_OP               0x2E\r
 #define EFI_IFR_EQUAL_OP               0x2F\r
 #define EFI_IFR_NOT_EQUAL_OP           0x30\r
 #define EFI_IFR_GREATER_THAN_OP        0x31\r
@@ -672,6 +677,7 @@ typedef union {
 #define EFI_IFR_VALUE_OP               0x5A\r
 #define EFI_IFR_DEFAULT_OP             0x5B\r
 #define EFI_IFR_DEFAULTSTORE_OP        0x5C\r
+#define EFI_IFR_FORM_MAP_OP            0x5D\r
 #define EFI_IFR_CATENATE_OP            0x5E\r
 #define EFI_IFR_GUID_OP                0x5F\r
 #define EFI_IFR_SECURITY_OP            0x60\r
@@ -730,14 +736,14 @@ typedef struct _EFI_IFR_VARSTORE {
 \r
 typedef struct _EFI_IFR_VARSTORE_EFI {\r
   EFI_IFR_OP_HEADER        Header;\r
-  UINT16                   VarStoreId;\r
+  EFI_VARSTORE_ID          VarStoreId;\r
   EFI_GUID                 Guid;\r
   UINT32                   Attributes;\r
 } EFI_IFR_VARSTORE_EFI;\r
 \r
 typedef struct _EFI_IFR_VARSTORE_NAME_VALUE {\r
   EFI_IFR_OP_HEADER        Header;\r
-  UINT16                   VarStoreId;\r
+  EFI_VARSTORE_ID          VarStoreId;\r
   EFI_GUID                 Guid;\r
 } EFI_IFR_VARSTORE_NAME_VALUE;\r
 \r
@@ -747,7 +753,7 @@ typedef struct _EFI_IFR_FORM_SET {
   EFI_STRING_ID            FormSetTitle;\r
   EFI_STRING_ID            Help;\r
   UINT8                    Flags;\r
-  EFI_GUID                 ClassGuid[1];\r
+  // EFI_GUID              ClassGuid[];\r
 } EFI_IFR_FORM_SET;\r
 \r
 typedef struct _EFI_IFR_END {\r
@@ -1009,6 +1015,9 @@ typedef struct _EFI_IFR_ONE_OF_OPTION {
 #define EFI_IFR_TYPE_DATE              0x06\r
 #define EFI_IFR_TYPE_STRING            0x07\r
 #define EFI_IFR_TYPE_OTHER             0x08\r
+#define EFI_IFR_TYPE_UNDEFINED         0x09\r
+#define EFI_IFR_TYPE_ACTION            0x0A\r
+#define EFI_IFR_TYPE_BUFFER            0x0B\r
 \r
 #define EFI_IFR_OPTION_DEFAULT         0x10\r
 #define EFI_IFR_OPTION_DEFAULT_MFG     0x20\r
@@ -1288,6 +1297,100 @@ typedef struct _EFI_IFR_SECURITY {
   EFI_GUID                 Permissions;\r
 } EFI_IFR_SECURITY;\r
 \r
+typedef struct _EFI_IFR_FORM_MAP_METHOD {\r
+  ///\r
+  /// The string identifier which provides the human-readable name of \r
+  /// the configuration method for this standards map form.\r
+  ///\r
+  EFI_STRING_ID            MethodTitle;\r
+  ///\r
+  /// Identifier which uniquely specifies the configuration methods \r
+  /// associated with this standards map form.\r
+  ///\r
+  EFI_GUID                 MethodIdentifier;\r
+} EFI_IFR_FORM_MAP_METHOD;\r
+\r
+typedef struct _EFI_IFR_FORM_MAP {\r
+  ///\r
+  /// The sequence that defines the type of opcode as well as the length \r
+  /// of the opcode being defined. Header.OpCode = EFI_IFR_FORM_MAP_OP. \r
+  ///\r
+  EFI_IFR_OP_HEADER        Header;\r
+  ///\r
+  /// The unique identifier for this particular form.\r
+  ///\r
+  EFI_FORM_ID              FormId;\r
+  ///\r
+  /// One or more configuration method's name and unique identifier.\r
+  ///\r
+  // EFI_IFR_FORM_MAP_METHOD  Methods[];\r
+} EFI_IFR_FORM_MAP;\r
+\r
+typedef struct _EFI_IFR_SET {\r
+  ///\r
+  /// The sequence that defines the type of opcode as well as the length \r
+  /// of the opcode being defined. Header.OpCode = EFI_IFR_SET_OP. \r
+  ///\r
+  EFI_IFR_OP_HEADER  Header;\r
+  ///\r
+  /// Specifies the identifier of a previously declared variable store to \r
+  /// use when storing the question's value. \r
+  ///\r
+  EFI_VARSTORE_ID    VarStoreId;\r
+  union {\r
+    ///\r
+    /// A 16-bit Buffer Storage offset.\r
+    ///\r
+    EFI_STRING_ID    VarName;\r
+    ///\r
+    /// A Name Value or EFI Variable name (VarName).\r
+    ///\r
+    UINT16           VarOffset;\r
+  }                  VarStoreInfo;\r
+  ///\r
+  /// Specifies the type used for storage. \r
+  ///\r
+  UINT8              VarStoreType;\r
+} EFI_IFR_SET;\r
+\r
+typedef struct _EFI_IFR_GET {\r
+  ///\r
+  /// The sequence that defines the type of opcode as well as the length \r
+  /// of the opcode being defined. Header.OpCode = EFI_IFR_GET_OP. \r
+  ///\r
+  EFI_IFR_OP_HEADER  Header;\r
+  ///\r
+  /// Specifies the identifier of a previously declared variable store to \r
+  /// use when retrieving the value. \r
+  ///\r
+  EFI_VARSTORE_ID    VarStoreId;\r
+  union {\r
+    ///\r
+    /// A 16-bit Buffer Storage offset.\r
+    ///\r
+    EFI_STRING_ID    VarName;\r
+    ///\r
+    /// A Name Value or EFI Variable name (VarName).\r
+    ///\r
+    UINT16           VarOffset;\r
+  }                  VarStoreInfo;\r
+  ///\r
+  /// Specifies the type used for storage. \r
+  ///\r
+  UINT8              VarStoreType;\r
+} EFI_IFR_GET;\r
+\r
+typedef struct _EFI_IFR_READ {\r
+  EFI_IFR_OP_HEADER       Header;\r
+} EFI_IFR_READ;\r
+\r
+typedef struct _EFI_IFR_WRITE {\r
+  EFI_IFR_OP_HEADER      Header;\r
+} EFI_IFR_WRITE;\r
+\r
+typedef struct _EFI_IFR_MAP {\r
+  EFI_IFR_OP_HEADER      Header;\r
+} EFI_IFR_MAP;\r
 //\r
 // Keyboard Package\r
 //\r
index cacb50b..8fc4bcd 100644 (file)
@@ -1,3 +1,15 @@
+@REM ## @file\r
+@REM #\r
+@REM # Copyright (c) 2007 - 2010, Intel Corporation\r
+@REM # All rights reserved. This program and the accompanying materials\r
+@REM # are licensed and made available under the terms and conditions of the BSD License\r
+@REM # which accompanies this distribution.    The full text of the license may be found at\r
+@REM # http://opensource.org/licenses/bsd-license.php\r
+@REM #\r
+@REM # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+@REM # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+\r
+\r
 @echo off\r
 setlocal\r
 SET NMAKE_COMMAND=%1\r
index 2f95003..96fd094 100644 (file)
@@ -1,3 +1,15 @@
+## @file\r
+#\r
+# Copyright (c) 2007 - 2010, Intel Corporation\r
+# All rights reserved. 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
+# http://opensource.org/licenses/bsd-license.php\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+
 MAKEROOT ?= ../..
 
 include $(MAKEROOT)/Makefiles/header.makefile
index 7bdf49c..7877ebc 100644 (file)
@@ -1,3 +1,14 @@
+## @file\r
+#\r
+# Copyright (c) 2007 - 2010, Intel Corporation\r
+# All rights reserved. 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
+# http://opensource.org/licenses/bsd-license.php\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
 DEPFILES = $(OBJECTS:%.o=%.d)
 
 $(MAKEROOT)/libs-$(ARCH):
index 5f69e7b..006a071 100644 (file)
@@ -1,8 +1,19 @@
+## @file\r
+#\r
 # The makefile can be invoked with
 # ARCH = x86_64 or x64 for EM64T build
 # ARCH = ia32 or IA32 for IA32 build
 # ARCH = ia64 or IA64 for IA64 build
 #
+# Copyright (c) 2007 - 2010, Intel Corporation\r
+# All rights reserved. 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
+# http://opensource.org/licenses/bsd-license.php\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
 ARCH ?= IA32
 
 CYGWIN:=$(findstring CYGWIN, $(shell uname -s))
index 2b1a9d4..3d49107 100644 (file)
@@ -1,3 +1,14 @@
+## @file\r
+#\r
+# Copyright (c) 2007 - 2010, Intel Corporation\r
+# All rights reserved. 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
+# http://opensource.org/licenses/bsd-license.php\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
 include $(MAKEROOT)/Makefiles/header.makefile
 
 LIBRARY = $(MAKEROOT)/libs/lib$(LIBNAME).a
index fabc0bc..05c68ed 100644 (file)
@@ -1,3 +1,14 @@
+## @file\r
+#\r
+# Copyright (c) 2007 - 2010, Intel Corporation\r
+# All rights reserved. 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
+# http://opensource.org/licenses/bsd-license.php\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
 !INCLUDE ..\Makefiles\ms.common
 
 APPLICATION = $(BIN_PATH)\$(APPNAME).exe
index 1523ce7..83372a8 100644 (file)
@@ -1,3 +1,14 @@
+## @file\r
+#\r
+# Copyright (c) 2007 - 2010, Intel Corporation\r
+# All rights reserved. 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
+# http://opensource.org/licenses/bsd-license.php\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
 !IFNDEF EDK_TOOLS_PATH
 !ERROR "Please set your EDK_TOOLS_PATH!"
 !ENDIF
index 79fdf55..dd9ef74 100644 (file)
@@ -1,3 +1,14 @@
+## @file\r
+#\r
+# Copyright (c) 2007 - 2010, Intel Corporation\r
+# All rights reserved. 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
+# http://opensource.org/licenses/bsd-license.php\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
 !INCLUDE ..\Makefiles\ms.common
 
 LIBRARY = $(LIB_PATH)\$(LIBNAME).lib
index 94687a0..7702cfa 100644 (file)
@@ -1,3 +1,14 @@
+## @file\r
+#\r
+# Copyright (c) 2007 - 2010, Intel Corporation\r
+# All rights reserved. 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
+# http://opensource.org/licenses/bsd-license.php\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
 #DEPFILES = $(OBJECTS:%.o=%.d)
 
 .c.obj :
index 38a81c3..0abf11e 100644 (file)
@@ -1,3 +1,16 @@
+/** @file\r
+\r
+Copyright (c) 2009 - 2010 Intel Corporation. All rights reserved\r
+This program and the accompanying materials are licensed and made available \r
+under the terms and conditions of the BSD License which accompanies this \r
+distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
 #include <Python.h>\r
 #include <Decompress.h>\r
 \r
index 502735b..c0bc543 100644 (file)
@@ -1,3 +1,14 @@
+## @file\r
+#\r
+# Copyright (c) 2007 - 2010, Intel Corporation\r
+# All rights reserved. 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
+# http://opensource.org/licenses/bsd-license.php\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
 !INCLUDE ..\Makefiles\ms.common
 
 APPNAME = GenSec
index 8f50ae1..51ce9bc 100644 (file)
@@ -1,3 +1,14 @@
+## @file\r
+#\r
+# Copyright (c) 2007 - 2010, Intel Corporation\r
+# All rights reserved. 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
+# http://opensource.org/licenses/bsd-license.php\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
 !INCLUDE ..\Makefiles\ms.common
 
 APPNAME = GenSec
index f06cb92..e80cd70 100644 (file)
@@ -1,3 +1,16 @@
+/** @file\r
+\r
+Copyright (c) 2009 - 2010 Intel Corporation. All rights reserved\r
+This program and the accompanying materials are licensed and made available \r
+under the terms and conditions of the BSD License which accompanies this \r
+distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
 #include <Python.h>\r
 #include <Windows.h>\r
 #include <Common/UefiBaseTypes.h>\r
index d5fe738..8be795f 100644 (file)
@@ -2,7 +2,7 @@
 \r
   Split a file into two pieces at the request offset.\r
 \r
-Copyright (c)  1999-2008 Intel Corporation. All rights reserved\r
+Copyright (c)  1999-2010 Intel Corporation. All rights reserved\r
 This program and the accompanying materials are licensed and made available\r
 under the terms and conditions of the BSD License which accompanies this\r
 distribution.  The full text of the license may be found at\r
@@ -58,7 +58,7 @@ Returns:
 --*/\r
 {\r
   printf ("%s v%d.%d -Utility to break a file into two pieces at the request offset.\n", UTILITY_NAME, UTILITY_MAJOR_VERSION, UTILITY_MINOR_VERSION);\r
-  printf ("Copyright (c) 1999-2007 Intel Corporation. All rights reserved.\n");\r
+  printf ("Copyright (c) 1999-2010 Intel Corporation. All rights reserved.\n");\r
 }\r
 \r
 void\r
index ef35f17..f99176a 100644 (file)
@@ -1,6 +1,6 @@
 /** @file\r
 \r
-Copyright (c) 2007 - 2008, Intel Corporation                                              \r
+Copyright (c) 2007 - 2010, Intel Corporation                                              \r
 All rights reserved. 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
@@ -1695,7 +1695,7 @@ Returns:
   //\r
   // Copyright declaration\r
   // \r
-  fprintf (stdout, "Copyright (c) 2007, Intel Corporation. All rights reserved.\n\n");\r
+  fprintf (stdout, "Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.\n\n");\r
 \r
   //\r
   // Details Option\r
index a88b101..809ca9e 100644 (file)
@@ -1,6 +1,6 @@
 /** @file\r
 \r
-Copyright (c) 2004 - 2008, Intel Corporation                                                         \r
+Copyright (c) 2004 - 2010, Intel Corporation                                                         \r
 All rights reserved. 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
@@ -31,6 +31,7 @@ Abstract:
 #define MAX_VFR_LINE_LEN         4096\r
 \r
 #define EFI_IFR_MAX_LENGTH       0xFF\r
+#define MAX_IFR_EXPRESSION_DEPTH 0x9\r
 \r
 #define EFI_VARSTORE_ID_INVALID  0\r
 #define EFI_VAROFFSET_INVALID    0xFFFF\r
index e3c150c..508b683 100644 (file)
@@ -2,7 +2,7 @@
   \r
   VfrCompiler main class and main function.\r
 \r
-Copyright (c) 2004 - 2008, Intel Corporation                                                         \r
+Copyright (c) 2004 - 2010, Intel Corporation                                                         \r
 All rights reserved. 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
@@ -24,9 +24,19 @@ PACKAGE_DATA  gCBuffer;
 PACKAGE_DATA  gRBuffer;\r
 \r
 VOID \r
-CVfrCompiler::DebugError () {\r
-  Error (NULL, 0, 0001, "Error parsing vfr file", " %s", mOptions.VfrFileName);\r
-  //_asm int 3;\r
+CVfrCompiler::DebugError (\r
+  IN CHAR8         *FileName,\r
+  IN UINT32        LineNumber,\r
+  IN UINT32        MessageCode,\r
+  IN CONST CHAR8   *Text,\r
+  IN CONST CHAR8   *MsgFmt,\r
+  ...\r
+  ) \r
+{\r
+  va_list List;\r
+  va_start (List, MsgFmt);\r
+  PrintMessage ((CHAR8 *) "ERROR", FileName, LineNumber, MessageCode, (CHAR8 *) Text, (CHAR8 *) MsgFmt, List);\r
+  va_end (List);\r
 }\r
 \r
 VOID\r
@@ -53,7 +63,7 @@ CVfrCompiler::OptionInitialization (
 {\r
   INT32         Index;\r
   \r
-  SetUtilityName (PROGRAM_NAME);\r
+  SetUtilityName ((CHAR8*) PROGRAM_NAME);\r
 \r
   mOptions.VfrFileName[0]                = '\0';\r
   mOptions.RecordListFile[0]             = '\0';\r
@@ -84,11 +94,9 @@ CVfrCompiler::OptionInitialization (
       mOptions.CreateRecordListFile = TRUE;\r
       gCIfrRecordInfoDB.TurnOn ();\r
     } else if (stricmp(Argv[Index], "-i") == 0) {\r
-      Error (NULL, 0, 1000, "Unknown option", "unrecognized option %s", Argv[Index]);\r
-      goto Fail;\r
       Index++;\r
       if ((Index >= Argc) || (Argv[Index][0] == '-')) {\r
-        Error (NULL, 0, 1001, "Missing option", "-i missing path argument"); \r
+        DebugError (NULL, 0, 1001, "Missing option", "-i missing path argument"); \r
         goto Fail;\r
       }\r
 \r
@@ -96,7 +104,7 @@ CVfrCompiler::OptionInitialization (
     } else if (stricmp(Argv[Index], "-o") == 0 || stricmp(Argv[Index], "--output-directory") == 0 || stricmp(Argv[Index], "-od") == 0) {\r
       Index++;\r
       if ((Index >= Argc) || (Argv[Index][0] == '-')) {\r
-        Error (NULL, 0, 1001, "Missing option", "-o missing output directory name");\r
+        DebugError (NULL, 0, 1001, "Missing option", "-o missing output directory name");\r
         goto Fail;\r
       }\r
       strcpy (mOptions.OutputDirectory, Argv[Index]);\r
@@ -109,17 +117,15 @@ CVfrCompiler::OptionInitialization (
           strcat (mOptions.OutputDirectory, "\\");\r
         }\r
       }\r
-      DebugMsg (NULL, 0, 9, "Output Directory", mOptions.OutputDirectory);\r
+      DebugMsg (NULL, 0, 9, (CHAR8 *) "Output Directory", mOptions.OutputDirectory);\r
     } else if (stricmp(Argv[Index], "-b") == 0 || stricmp(Argv[Index], "--create-ifr-package") == 0 || stricmp(Argv[Index], "-ibin") == 0) {\r
       mOptions.CreateIfrPkgFile = TRUE;\r
     } else if (stricmp(Argv[Index], "-n") == 0 || stricmp(Argv[Index], "--no-pre-processing") == 0 || stricmp(Argv[Index], "-nopp") == 0) {\r
       mOptions.SkipCPreprocessor = TRUE;\r
     } else if (stricmp(Argv[Index], "-f") == 0 || stricmp(Argv[Index], "--pre-processing-flag") == 0 || stricmp(Argv[Index], "-ppflag") == 0) {\r
-      Error (NULL, 0, 1000, "Unknown option", "unrecognized option %s", Argv[Index]);\r
-      goto Fail;\r
       Index++;\r
       if ((Index >= Argc) || (Argv[Index][0] == '-')) {\r
-        Error (NULL, 0, 1001, "Missing option", "-od - missing C-preprocessor argument");\r
+        DebugError (NULL, 0, 1001, "Missing option", "-od - missing C-preprocessor argument");\r
         goto Fail;\r
       }\r
 \r
@@ -127,13 +133,13 @@ CVfrCompiler::OptionInitialization (
     } else if (stricmp(Argv[Index], "-c") == 0 || stricmp(Argv[Index], "--compatible-framework") == 0) {\r
       mOptions.CompatibleMode = TRUE;\r
     } else {\r
-      Error (NULL, 0, 1000, "Unknown option", "unrecognized option %s", Argv[Index]);\r
+      DebugError (NULL, 0, 1000, "Unknown option", "unrecognized option %s", Argv[Index]);\r
       goto Fail;\r
     }\r
   }\r
 \r
   if (Index != Argc - 1) {\r
-    Error (NULL, 0, 1001, "Missing option", "VFR file name is not specified.");\r
+    DebugError (NULL, 0, 1001, "Missing option", "VFR file name is not specified.");\r
     goto Fail;\r
   } else {\r
     strcpy (mOptions.VfrFileName, Argv[Index]);\r
@@ -192,7 +198,7 @@ CVfrCompiler::AppendIncludePath (
   }\r
   IncludePaths = new CHAR8[Len];\r
   if (IncludePaths == NULL) {\r
-    Error (NULL, 0, 4001, "Resource: memory can't be allocated", NULL);\r
+    DebugError (NULL, 0, 4001, "Resource: memory can't be allocated", NULL);\r
     return;\r
   }\r
   IncludePaths[0] = '\0';\r
@@ -221,7 +227,7 @@ CVfrCompiler::AppendCPreprocessorOptions (
   }\r
   Opt = new CHAR8[Len];\r
   if (Opt == NULL) {\r
-    Error (NULL, 0, 4001, "Resource: memory can't be allocated", NULL);\r
+    DebugError (NULL, 0, 4001, "Resource: memory can't be allocated", NULL);\r
     return;\r
   }\r
   Opt[0] = 0;\r
@@ -339,8 +345,8 @@ CVfrCompiler::CVfrCompiler (
   IN CHAR8      **Argv\r
   )\r
 {\r
-  mPreProcessCmd = PREPROCESSOR_COMMAND;\r
-  mPreProcessOpt = PREPROCESSOR_OPTIONS;\r
+  mPreProcessCmd = (CHAR8 *) PREPROCESSOR_COMMAND;\r
+  mPreProcessOpt = (CHAR8 *) PREPROCESSOR_OPTIONS;\r
 \r
   OptionInitialization(Argc, Argv);\r
 \r
@@ -377,6 +383,7 @@ CVfrCompiler::Usage (
   CONST  CHAR8 *Help[] = {\r
     " ", \r
     "VfrCompile version " VFR_COMPILER_VERSION VFR_COMPILER_UPDATE_TIME,\r
+    "Copyright (c) 2004-2010 Intel Corporation. All rights reserved.",\r
     " ",\r
     "Usage: VfrCompile [options] VfrFile",\r
     " ",\r
@@ -417,7 +424,7 @@ CVfrCompiler::PreProcess (
   }\r
 \r
   if ((pVfrFile = fopen (mOptions.VfrFileName, "r")) == NULL) {\r
-    Error (NULL, 0, 0001, "Error opening the input VFR file", mOptions.VfrFileName);\r
+    DebugError (NULL, 0, 0001, "Error opening the input VFR file", mOptions.VfrFileName);\r
     goto Fail;\r
   }\r
   fclose (pVfrFile);\r
@@ -433,7 +440,7 @@ CVfrCompiler::PreProcess (
 \r
   PreProcessCmd = new CHAR8[CmdLen + 10];\r
   if (PreProcessCmd == NULL) {\r
-    Error (NULL, 0, 4001, "Resource: memory can't be allocated", NULL);\r
+    DebugError (NULL, 0, 4001, "Resource: memory can't be allocated", NULL);\r
     goto Fail;\r
   }\r
   strcpy (PreProcessCmd, mPreProcessCmd), strcat (PreProcessCmd, " ");\r
@@ -448,7 +455,7 @@ CVfrCompiler::PreProcess (
   strcat (PreProcessCmd, mOptions.PreprocessorOutputFileName);\r
 \r
   if (system (PreProcessCmd) != 0) {\r
-    Error (NULL, 0, 0003, "Error parsing file", "failed to spawn C preprocessor on VFR file %s\n", PreProcessCmd);\r
+    DebugError (NULL, 0, 0003, "Error parsing file", "failed to spawn C preprocessor on VFR file %s\n", PreProcessCmd);\r
     goto Fail;\r
   }\r
 \r
@@ -484,7 +491,7 @@ CVfrCompiler::Compile (
   gCVfrErrorHandle.SetInputFile (InFileName);\r
 \r
   if ((pInFile = fopen (InFileName, "r")) == NULL) {\r
-    Error (NULL, 0, 0001, "Error opening the input file", InFileName);\r
+    DebugError (NULL, 0, 0001, "Error opening the input file", InFileName);\r
     goto Fail;\r
   }\r
 \r
@@ -504,7 +511,7 @@ CVfrCompiler::Compile (
 \r
 Fail:\r
   if (!IS_RUN_STATUS(STATUS_DEAD)) {\r
-    Error (NULL, 0, 0003, "Error parsing", "compile error in file %s", InFileName);\r
+    DebugError (NULL, 0, 0003, "Error parsing", "compile error in file %s", InFileName);\r
     SET_RUN_STATUS (STATUS_FAILED);\r
   }\r
   if (pInFile != NULL) {\r
@@ -534,7 +541,7 @@ CVfrCompiler::AdjustBin (
   if (gCBuffer.Buffer != NULL && gRBuffer.Buffer != NULL) {\r
     UINT32 Index;\r
     if (gCBuffer.Size != gRBuffer.Size) {\r
-      Error (NULL, 0, 0001, "Error parsing vfr file", " %s. FormBinary Size 0x%X is not same to RecordBuffer Size 0x%X", mOptions.VfrFileName, gCBuffer.Size, gRBuffer.Size);\r
+      DebugError (NULL, 0, 0001, "Error parsing vfr file", " %s. FormBinary Size 0x%X is not same to RecordBuffer Size 0x%X", mOptions.VfrFileName, gCBuffer.Size, gRBuffer.Size);\r
     }\r
     for (Index = 0; Index < gCBuffer.Size; Index ++) {\r
       if (gCBuffer.Buffer[Index] != gRBuffer.Buffer[Index]) {\r
@@ -542,13 +549,13 @@ CVfrCompiler::AdjustBin (
       }\r
     }\r
     if (Index != gCBuffer.Size) {\r
-      Error (NULL, 0, 0001, "Error parsing vfr file", " %s. the 0x%X byte is different between Form and Record", mOptions.VfrFileName, Index);\r
+      DebugError (NULL, 0, 0001, "Error parsing vfr file", " %s. the 0x%X byte is different between Form and Record", mOptions.VfrFileName, Index);\r
     }\r
-    DebugMsg (NULL, 0, 9, "IFR Buffer", "Form Buffer same to Record Buffer and Size is 0x%X", Index);\r
+    DebugMsg (NULL, 0, 9, (CHAR8 *) "IFR Buffer", (CHAR8 *) "Form Buffer same to Record Buffer and Size is 0x%X", Index);\r
   } else if (gCBuffer.Buffer == NULL && gRBuffer.Buffer == NULL) {\r
     //ok\r
   } else {\r
-    Error (NULL, 0, 0001, "Error parsing vfr file", " %s.Buffer not allocated.", mOptions.VfrFileName);\r
+    DebugError (NULL, 0, 0001, "Error parsing vfr file", " %s.Buffer not allocated.", mOptions.VfrFileName);\r
   }\r
 \r
   //\r
@@ -588,7 +595,7 @@ CVfrCompiler::GenBinary (
 \r
   if (mOptions.CreateIfrPkgFile == TRUE) {\r
     if ((pFile = fopen (mOptions.PkgOutputFileName, "wb")) == NULL) {\r
-      Error (NULL, 0, 0001, "Error opening file", mOptions.PkgOutputFileName);\r
+      DebugError (NULL, 0, 0001, "Error opening file", mOptions.PkgOutputFileName);\r
       goto Fail;\r
     }\r
     if (gCFormPkg.BuildPkg (pFile, &gRBuffer) != VFR_RETURN_SUCCESS) {\r
@@ -631,7 +638,7 @@ CVfrCompiler::GenCFile (
   \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
+      DebugError (NULL, 0, 0001, "Error opening output C file", mOptions.COutputFileName);\r
       goto Fail;\r
     }\r
 \r
@@ -678,12 +685,12 @@ CVfrCompiler::GenRecordListFile (
     }\r
 \r
     if ((pInFile = fopen (InFileName, "r")) == NULL) {\r
-      Error (NULL, 0, 0001, "Error opening the input VFR preprocessor output file", InFileName);\r
+      DebugError (NULL, 0, 0001, "Error opening the input VFR preprocessor output file", InFileName);\r
       return;\r
     }\r
 \r
     if ((pOutFile = fopen (mOptions.RecordListFile, "w")) == NULL) {\r
-      Error (NULL, 0, 0001, "Error opening the record list file", mOptions.RecordListFile);\r
+      DebugError (NULL, 0, 0001, "Error opening the record list file", mOptions.RecordListFile);\r
       goto Err1;\r
     }\r
 \r
@@ -713,8 +720,8 @@ Err1:
 \r
 int\r
 main (\r
-  IN INT32             Argc, \r
-  IN CHAR8             **Argv\r
+  IN int             Argc, \r
+  IN char            **Argv\r
   )\r
 {\r
   COMPILER_RUN_STATUS  Status;\r
@@ -743,3 +750,4 @@ main (
   return GetUtilityStatus ();\r
 }\r
 \r
+\r
index d3aa8ca..fcd2b24 100644 (file)
@@ -102,7 +102,7 @@ public:
   VOID                GenBinary (VOID);\r
   VOID                GenCFile (VOID);\r
   VOID                GenRecordListFile (VOID);\r
-  VOID                DebugError (VOID);\r
+  VOID                DebugError (IN CHAR8*, IN UINT32, IN UINT32, IN CONST CHAR8*, IN CONST CHAR8*, ...);\r
 };\r
 \r
 #endif\r
index 963bd2d..3289101 100644 (file)
@@ -135,7 +135,6 @@ CVfrErrorHandle::ParseFileScopeRecord (
   IN UINT32    WholeScopeLine\r
   )\r
 {\r
-  CHAR8               *FullPathName = NULL;\r
   SVfrFileScopeRecord *pNode        = NULL;\r
 \r
   if (Record == NULL) {\r
@@ -195,19 +194,19 @@ VOID
 CVfrErrorHandle::PrintMsg (\r
   IN UINT32               LineNum,\r
   IN CHAR8                *TokName,\r
-  IN CHAR8                *MsgType,\r
-  IN CHAR8                *ErrorMsg\r
+  IN CONST CHAR8          *MsgType,\r
+  IN CONST CHAR8          *ErrorMsg\r
   )\r
 {\r
   CHAR8                  *FileName = NULL;\r
   UINT32                 FileLine;\r
   \r
   if (strncmp ("Warning", MsgType, strlen ("Warning")) == 0) {\r
-    VerboseMsg (ErrorMsg);\r
+    VerboseMsg ((CHAR8 *) ErrorMsg);\r
     return;\r
   }\r
   GetFileNameLineNum (LineNum, &FileName, &FileLine);\r
-  Error (FileName, FileLine, 0x3000, TokName, "\t%s\n", ErrorMsg);\r
+  Error (FileName, FileLine, 0x3000, TokName, (CHAR8 *) "\t%s\n", (CHAR8 *) ErrorMsg);\r
 }\r
 \r
 UINT8\r
@@ -220,7 +219,7 @@ CVfrErrorHandle::HandleError (
   UINT32                 Index;\r
   CHAR8                  *FileName = NULL;\r
   UINT32                 FileLine;\r
-  CHAR8                  *ErrorMsg = NULL;\r
+  CONST CHAR8            *ErrorMsg = NULL;\r
 \r
   if (mVfrErrorHandleTable == NULL) {\r
     return 1;\r
@@ -235,7 +234,7 @@ CVfrErrorHandle::HandleError (
 \r
   if (ErrorMsg != NULL) {\r
     GetFileNameLineNum (LineNum, &FileName, &FileLine);\r
-    Error (FileName, FileLine, 0x3000, TokName, "\t%s\n", ErrorMsg);\r
+    Error (FileName, FileLine, 0x3000, TokName, (CHAR8 *) "\t%s\n", (CHAR8 *) ErrorMsg);\r
     return 1;\r
   } else {\r
     return 0;\r
index 500926a..916e070 100644 (file)
@@ -47,7 +47,7 @@ typedef enum {
 \r
 typedef struct _SVFR_ERROR_HANDLE {\r
   EFI_VFR_RETURN_CODE    mErrorCode;\r
-  CHAR8                  *mErrorMsg;\r
+  CONST CHAR8            *mErrorMsg;\r
 } SVFR_ERROR_HANDLE;\r
 \r
 struct SVfrFileScopeRecord {\r
@@ -74,8 +74,8 @@ public:
   VOID  SetInputFile (IN CHAR8 *);\r
   VOID  ParseFileScopeRecord (IN CHAR8 *, IN UINT32);\r
   VOID  GetFileNameLineNum (IN UINT32, OUT CHAR8 **, OUT UINT32 *);\r
-  UINT8 HandleError (IN EFI_VFR_RETURN_CODE, IN UINT32 LineNum = 0, IN CHAR8 *TokName = "\0");\r
-  VOID  PrintMsg (IN UINT32 LineNum = 0, IN CHAR8 *TokName = "\0", IN CHAR8 *MsgType = "Error", IN CHAR8 *ErrorMsg = "\0");\r
+  UINT8 HandleError (IN EFI_VFR_RETURN_CODE, IN UINT32 LineNum = 0, IN CHAR8 *TokName = NULL);\r
+  VOID  PrintMsg (IN UINT32 LineNum = 0, IN CHAR8 *TokName = NULL, IN CONST CHAR8 *MsgType = "Error", IN CONST CHAR8 *ErrorMsg = "");\r
 };\r
 \r
 #define CHECK_ERROR_RETURN(f, v) do { EFI_VFR_RETURN_CODE r; if ((r = (f)) != (v)) { return r; } } while (0)\r
index ffa898b..ccbc044 100644 (file)
@@ -2,7 +2,7 @@
   \r
   The definition of CFormPkg's member function\r
 \r
-Copyright (c) 2004 - 2009, Intel Corporation                                                         \r
+Copyright (c) 2004 - 2010, Intel Corporation                                                         \r
 All rights reserved. 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
@@ -25,7 +25,7 @@ SPendingAssign::SPendingAssign (
   IN VOID   *Addr, \r
   IN UINT32 Len, \r
   IN UINT32 LineNo,\r
-  IN CHAR8  *Msg\r
+  IN CONST CHAR8  *Msg\r
   )\r
 {\r
   mKey    = NULL;\r
@@ -352,11 +352,11 @@ CFormPkg::BuildPkg (
 \r
 VOID\r
 CFormPkg::_WRITE_PKG_LINE (\r
-  IN FILE   *pFile,\r
-  IN UINT32 LineBytes,\r
-  IN CHAR8  *LineHeader,\r
-  IN CHAR8  *BlkBuf,\r
-  IN UINT32 BlkSize\r
+  IN FILE         *pFile,\r
+  IN UINT32       LineBytes,\r
+  IN CONST CHAR8  *LineHeader,\r
+  IN CHAR8        *BlkBuf,\r
+  IN UINT32       BlkSize\r
   )\r
 {\r
   UINT32    Index;\r
@@ -375,11 +375,11 @@ CFormPkg::_WRITE_PKG_LINE (
 \r
 VOID\r
 CFormPkg::_WRITE_PKG_END (\r
-  IN FILE   *pFile,\r
-  IN UINT32 LineBytes,\r
-  IN CHAR8  *LineHeader,\r
-  IN CHAR8  *BlkBuf,\r
-  IN UINT32 BlkSize\r
+  IN FILE         *pFile,\r
+  IN UINT32       LineBytes,\r
+  IN CONST CHAR8  *LineHeader,\r
+  IN CHAR8        *BlkBuf,\r
+  IN UINT32       BlkSize\r
   )\r
 {\r
   UINT32    Index;\r
@@ -483,7 +483,7 @@ CFormPkg::AssignPending (
   IN VOID   *ValAddr, \r
   IN UINT32 ValLen,\r
   IN UINT32 LineNo,\r
-  IN CHAR8  *Msg\r
+  IN CONST CHAR8  *Msg\r
   )\r
 {\r
   SPendingAssign *pNew;\r
@@ -1242,7 +1242,7 @@ static struct {
   { 0, 0 },                                    // 0x1F\r
   { sizeof (EFI_IFR_TO_LOWER), 0 },            // EFI_IFR_TO_LOWER_OP - 0x20\r
   { sizeof (EFI_IFR_TO_UPPER), 0 },            // EFI_IFR_TO_UPPER_OP - 0x21\r
-  { 0, 0 },                                    // 0x22\r
+  { sizeof (EFI_IFR_MAP), 1 },                 // EFI_IFR_MAP - 0x22\r
   { sizeof (EFI_IFR_ORDERED_LIST), 1 },        // EFI_IFR_ORDERED_LIST_OP - 0x23\r
   { sizeof (EFI_IFR_VARSTORE), 0 },            // EFI_IFR_VARSTORE_OP\r
   { sizeof (EFI_IFR_VARSTORE_NAME_VALUE), 0 }, // EFI_IFR_VARSTORE_NAME_VALUE_OP\r
@@ -1250,8 +1250,11 @@ static struct {
   { sizeof (EFI_IFR_VARSTORE_DEVICE), 1 },     // EFI_IFR_VARSTORE_DEVICE_OP\r
   { sizeof (EFI_IFR_VERSION), 0 },             // EFI_IFR_VERSION_OP - 0x28\r
   { sizeof (EFI_IFR_END), 0 },                 // EFI_IFR_END_OP\r
-  { sizeof (EFI_IFR_MATCH), 1 },               // EFI_IFR_MATCH_OP - 0x2A\r
-  { 0, 0 }, { 0, 0} , { 0, 0} , { 0, 0} ,      // 0x2B ~ 0x2E\r
+  { sizeof (EFI_IFR_MATCH), 0 },               // EFI_IFR_MATCH_OP - 0x2A\r
+  { sizeof (EFI_IFR_GET), 0 },                 // EFI_IFR_GET - 0x2B\r
+  { sizeof (EFI_IFR_SET), 0 },                 // EFI_IFR_SET - 0x2C\r
+  { sizeof (EFI_IFR_READ), 0 },                // EFI_IFR_READ - 0x2D\r
+  { sizeof (EFI_IFR_WRITE), 0 },               // EFI_IFR_WRITE - 0x2E\r
   { sizeof (EFI_IFR_EQUAL), 0 },               // EFI_IFR_EQUAL_OP - 0x2F\r
   { sizeof (EFI_IFR_NOT_EQUAL), 0 },           // EFI_IFR_NOT_EQUAL_OP\r
   { sizeof (EFI_IFR_GREATER_THAN), 0 },        // EFI_IFR_GREATER_THAN_OP\r
@@ -1298,7 +1301,7 @@ static struct {
   { sizeof (EFI_IFR_VALUE), 1 },               // EFI_IFR_VALUE_OP\r
   { sizeof (EFI_IFR_DEFAULT), 0 },             // EFI_IFR_DEFAULT_OP\r
   { sizeof (EFI_IFR_DEFAULTSTORE), 0 },        // EFI_IFR_DEFAULTSTORE_OP - 0x5C\r
-  { 0, 0},                                     // 0x5D\r
+  { sizeof (EFI_IFR_FORM_MAP), 1},             // EFI_IFR_FORM_MAP_OP - 0x5D\r
   { sizeof (EFI_IFR_CATENATE), 0 },            // EFI_IFR_CATENATE_OP\r
   { sizeof (EFI_IFR_GUID), 0 },                // EFI_IFR_GUID_OP\r
   { sizeof (EFI_IFR_SECURITY), 0 },            // EFI_IFR_SECURITY_OP - 0x60\r
@@ -1313,9 +1316,9 @@ static struct {
   "EFI_IFR_ACTION",     "EFI_IFR_RESET_BUTTON",         "EFI_IFR_FORM_SET",      "EFI_IFR_REF",             "EFI_IFR_NO_SUBMIT_IF",  "EFI_IFR_INCONSISTENT_IF",\r
   "EFI_IFR_EQ_ID_VAL",  "EFI_IFR_EQ_ID_ID",             "EFI_IFR_EQ_ID_LIST",    "EFI_IFR_AND",             "EFI_IFR_OR",            "EFI_IFR_NOT",\r
   "EFI_IFR_RULE",       "EFI_IFR_GRAY_OUT_IF",          "EFI_IFR_DATE",          "EFI_IFR_TIME",            "EFI_IFR_STRING",        "EFI_IFR_REFRESH",\r
-  "EFI_IFR_DISABLE_IF", "EFI_IFR_INVALID",              "EFI_IFR_TO_LOWER",      "EFI_IFR_TO_UPPER",        "EFI_IFR_INVALID",       "EFI_IFR_ORDERED_LIST",\r
+  "EFI_IFR_DISABLE_IF", "EFI_IFR_INVALID",              "EFI_IFR_TO_LOWER",      "EFI_IFR_TO_UPPER",        "EFI_IFR_MAP",           "EFI_IFR_ORDERED_LIST",\r
   "EFI_IFR_VARSTORE",   "EFI_IFR_VARSTORE_NAME_VALUE",  "EFI_IFR_VARSTORE_EFI",  "EFI_IFR_VARSTORE_DEVICE", "EFI_IFR_VERSION",       "EFI_IFR_END",\r
-  "EFI_IFR_MATCH",      "EFI_IFR_INVALID",              "EFI_IFR_INVALID",       "EFI_IFR_INVALID",         "EFI_IFR_INVALID",       "EFI_IFR_EQUAL",\r
+  "EFI_IFR_MATCH",      "EFI_IFR_GET",                  "EFI_IFR_SET",           "EFI_IFR_READ",            "EFI_IFR_WRITE",         "EFI_IFR_EQUAL",\r
   "EFI_IFR_NOT_EQUAL",  "EFI_IFR_GREATER_THAN",         "EFI_IFR_GREATER_EQUAL", "EFI_IFR_LESS_THAN",       "EFI_IFR_LESS_EQUAL",    "EFI_IFR_BITWISE_AND",\r
   "EFI_IFR_BITWISE_OR", "EFI_IFR_BITWISE_NOT",          "EFI_IFR_SHIFT_LEFT",    "EFI_IFR_SHIFT_RIGHT",     "EFI_IFR_ADD",           "EFI_IFR_SUBTRACT",\r
   "EFI_IFR_MULTIPLY",   "EFI_IFR_DIVIDE",               "EFI_IFR_MODULO",        "EFI_IFR_RULE_REF",        "EFI_IFR_QUESTION_REF1", "EFI_IFR_QUESTION_REF2",\r
@@ -1323,7 +1326,7 @@ static struct {
   "EFI_IFR_TO_UINT",    "EFI_IFR_TO_STRING",            "EFI_IFR_TO_BOOLEAN",    "EFI_IFR_MID",             "EFI_IFR_FIND",          "EFI_IFR_TOKEN",\r
   "EFI_IFR_STRING_REF1","EFI_IFR_STRING_REF2",          "EFI_IFR_CONDITIONAL",   "EFI_IFR_QUESTION_REF3",   "EFI_IFR_ZERO",          "EFI_IFR_ONE",\r
   "EFI_IFR_ONES",       "EFI_IFR_UNDEFINED",            "EFI_IFR_LENGTH",        "EFI_IFR_DUP",             "EFI_IFR_THIS",          "EFI_IFR_SPAN",\r
-  "EFI_IFR_VALUE",      "EFI_IFR_DEFAULT",              "EFI_IFR_DEFAULTSTORE",  "EFI_IFR_INVALID",         "EFI_IFR_CATENATE",      "EFI_IFR_GUID",\r
+  "EFI_IFR_VALUE",      "EFI_IFR_DEFAULT",              "EFI_IFR_DEFAULTSTORE",  "EFI_IFR_FORM_MAP",        "EFI_IFR_CATENATE",      "EFI_IFR_GUID",\r
   "EFI_IFR_SECURITY",\r
 };\r
 \r
@@ -1340,7 +1343,7 @@ CIFROBJ_DEBUG_PRINT (
 \r
 #endif\r
 \r
-bool gCreateOp = TRUE;\r
+BOOLEAN gCreateOp = TRUE;\r
 \r
 CIfrObj::CIfrObj (\r
   IN  UINT8   OpCode,\r
@@ -1396,4 +1399,4 @@ CIfrOpHeader::CIfrOpHeader (
   mHeader = OpHdr.mHeader;\r
 }\r
 \r
-UINT32 CIfrForm::FormIdBitMap[EFI_FREE_FORM_ID_BITMAP_SIZE] = {0, };\r
+UINT32 CIfrFormId::FormIdBitMap[EFI_FREE_FORM_ID_BITMAP_SIZE] = {0, };\r
index 0b84896..38422e1 100644 (file)
@@ -2,7 +2,7 @@
   \r
   The definition of CFormPkg's member function\r
 \r
-Copyright (c) 2004 - 2009, Intel Corporation                                                         \r
+Copyright (c) 2004 - 2010, Intel Corporation                                                         \r
 All rights reserved. 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
@@ -81,7 +81,7 @@ struct SPendingAssign {
   CHAR8                   *mMsg;\r
   struct SPendingAssign   *mNext;\r
 \r
-  SPendingAssign (IN CHAR8 *, IN VOID *, IN UINT32, IN UINT32, IN CHAR8 *);\r
+  SPendingAssign (IN CHAR8 *, IN VOID *, IN UINT32, IN UINT32, IN CONST CHAR8 *);\r
   ~SPendingAssign ();\r
 \r
   VOID   SetAddrAndLen (IN VOID *, IN UINT32);\r
@@ -108,8 +108,8 @@ private:
 \r
   UINT32              mPkgLength;\r
 \r
-  VOID                _WRITE_PKG_LINE (IN FILE *, IN UINT32 , IN CHAR8 *, IN CHAR8 *, IN UINT32);\r
-  VOID                _WRITE_PKG_END (IN FILE *, IN UINT32 , IN CHAR8 *, IN CHAR8 *, IN UINT32);\r
+  VOID                _WRITE_PKG_LINE (IN FILE *, IN UINT32 , IN CONST CHAR8 *, IN CHAR8 *, IN UINT32);\r
+  VOID                _WRITE_PKG_END (IN FILE *, IN UINT32 , IN CONST CHAR8 *, IN CHAR8 *, IN UINT32);\r
 \r
 private:\r
   SPendingAssign      *PendingAssignList;\r
@@ -131,7 +131,7 @@ public:
   EFI_VFR_RETURN_CODE GenCFile (IN CHAR8 *, IN FILE *, IN PACKAGE_DATA *PkgData = NULL);\r
 \r
 public:\r
-  EFI_VFR_RETURN_CODE AssignPending (IN CHAR8 *, IN VOID *, IN UINT32, IN UINT32, IN CHAR8 *Msg = NULL);\r
+  EFI_VFR_RETURN_CODE AssignPending (IN CHAR8 *, IN VOID *, IN UINT32, IN UINT32, IN CONST CHAR8 *Msg = NULL);\r
   VOID                DoPendingAssign (IN CHAR8 *, IN VOID *, IN UINT32);\r
   bool                HavePendingUnassigned (VOID);\r
   VOID                PendingAssignPrintAll (VOID);\r
@@ -195,11 +195,11 @@ extern CIfrRecordInfoDB gCIfrRecordInfoDB;
 /*\r
  * The definition of CIfrObj\r
  */\r
-extern bool  gCreateOp;\r
+extern BOOLEAN  gCreateOp;\r
 \r
 class CIfrObj {\r
 private:\r
-  bool    mDelayEmit;\r
+  BOOLEAN mDelayEmit;\r
 \r
   CHAR8   *mObjBinBuf;\r
   UINT8   mObjBinLen;\r
@@ -227,7 +227,7 @@ public:
 \r
   inline bool ExpendObjBin (IN UINT8 Size) {\r
     if ((mDelayEmit == TRUE) && ((mObjBinLen + Size) > mObjBinLen)) {\r
-      mObjBinLen += Size;\r
+      mObjBinLen = mObjBinLen + Size;\r
       return TRUE;\r
     } else {\r
       return FALSE;\r
@@ -248,7 +248,7 @@ public:
 \r
   VOID IncLength (UINT8 Size) {\r
     if ((mHeader->Length + Size) > mHeader->Length) {\r
-      mHeader->Length += Size;\r
+      mHeader->Length = mHeader->Length + Size;\r
     }\r
   }\r
 \r
@@ -557,6 +557,7 @@ static CIfrMinMaxStepData *gCurrentMinMaxData = NULL;
 class CIfrFormSet : public CIfrObj, public CIfrOpHeader {\r
 private:\r
   EFI_IFR_FORM_SET *mFormSet;\r
+  EFI_GUID *mClassGuid;\r
 \r
 public:\r
   CIfrFormSet (UINT8 Size) : CIfrObj (EFI_IFR_FORM_SET_OP, (CHAR8 **)&mFormSet, Size),\r
@@ -565,6 +566,7 @@ public:
     mFormSet->FormSetTitle = EFI_STRING_ID_INVALID;\r
     mFormSet->Flags        = 0;\r
     memset (&mFormSet->Guid, 0, sizeof (EFI_GUID));\r
+    mClassGuid = (EFI_GUID *) (mFormSet + 1);\r
   }\r
 \r
   VOID SetGuid (IN EFI_GUID *Guid) {\r
@@ -580,7 +582,7 @@ public:
   }\r
 \r
   VOID SetClassGuid (IN EFI_GUID *Guid) {\r
-    memcpy (&(mFormSet->ClassGuid[mFormSet->Flags++]), Guid, sizeof (EFI_GUID));\r
+    memcpy (&(mClassGuid[mFormSet->Flags++]), Guid, sizeof (EFI_GUID));\r
   }\r
 \r
   UINT8 GetFlags() {\r
@@ -620,10 +622,8 @@ public:
 #define EFI_FORM_ID_MAX                    0xFFFF\r
 #define EFI_FREE_FORM_ID_BITMAP_SIZE     ((EFI_FORM_ID_MAX + 1) / EFI_BITS_PER_UINT32)\r
 \r
-class CIfrForm : public CIfrObj, public CIfrOpHeader {\r
-private:\r
-  EFI_IFR_FORM  *mForm;\r
-\r
+class CIfrFormId {\r
+public:\r
   STATIC UINT32 FormIdBitMap[EFI_FREE_FORM_ID_BITMAP_SIZE];\r
 \r
   STATIC BOOLEAN ChekFormIdFree (IN EFI_FORM_ID FormId) {\r
@@ -639,6 +639,11 @@ private:
 \r
     FormIdBitMap[Index] |= (0x80000000 >> Offset);\r
   }\r
+};\r
+\r
+class CIfrForm : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_FORM  *mForm;\r
 \r
 public:\r
   CIfrForm () : CIfrObj (EFI_IFR_FORM_OP, (CHAR8 **)&mForm), \r
@@ -654,11 +659,11 @@ public:
       //\r
       return VFR_RETURN_INVALID_PARAMETER;\r
     }\r
-    if (CIfrForm::ChekFormIdFree (FormId) == FALSE) {\r
+    if (CIfrFormId::ChekFormIdFree (FormId) == FALSE) {\r
       return VFR_RETURN_FORMID_REDEFINED;\r
     }\r
     mForm->FormId = FormId;\r
-    CIfrForm::MarkFormIdUsed (FormId);\r
+    CIfrFormId::MarkFormIdUsed (FormId);\r
     return VFR_RETURN_SUCCESS;\r
   }\r
 \r
@@ -667,6 +672,44 @@ public:
   }\r
 };\r
 \r
+class CIfrFormMap : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_FORM_MAP        *mFormMap;\r
+  EFI_IFR_FORM_MAP_METHOD *mMethodMap;\r
+\r
+public:\r
+  CIfrFormMap () : CIfrObj (EFI_IFR_FORM_MAP_OP, (CHAR8 **)&mFormMap, sizeof (EFI_IFR_FORM_MAP), TRUE), \r
+                   CIfrOpHeader (EFI_IFR_FORM_MAP_OP, &mFormMap->Header) {\r
+    mFormMap->FormId = 0;\r
+    mMethodMap       = (EFI_IFR_FORM_MAP_METHOD *) (mFormMap + 1);\r
+  }\r
+\r
+  EFI_VFR_RETURN_CODE SetFormId (IN EFI_FORM_ID FormId) {\r
+    if (FormId == 0) {\r
+      //\r
+      // FormId can't be 0.\r
+      //\r
+      return VFR_RETURN_INVALID_PARAMETER;\r
+    }\r
+    if (CIfrFormId::ChekFormIdFree (FormId) == FALSE) {\r
+      return VFR_RETURN_FORMID_REDEFINED;\r
+    }\r
+    mFormMap->FormId = FormId;\r
+    CIfrFormId::MarkFormIdUsed (FormId);\r
+    return VFR_RETURN_SUCCESS;\r
+  }\r
+\r
+  VOID SetFormMapMethod (IN EFI_STRING_ID MethodTitle, IN EFI_GUID *MethodGuid) {\r
+    if (ExpendObjBin (sizeof (EFI_IFR_FORM_MAP_METHOD))) {\r
+      IncLength (sizeof (EFI_IFR_FORM_MAP_METHOD));\r
+\r
+      mMethodMap->MethodTitle = MethodTitle;\r
+      memcpy (&(mMethodMap->MethodIdentifier), MethodGuid, sizeof (EFI_GUID));\r
+      mMethodMap ++;\r
+    }\r
+  }\r
+};\r
+\r
 class CIfrVarStore : public CIfrObj, public CIfrOpHeader {\r
 private:\r
   EFI_IFR_VARSTORE *mVarStore;\r
@@ -696,7 +739,7 @@ public:
     UINT8 Len;\r
 \r
     if (Name != NULL) {\r
-      Len = strlen (Name);\r
+      Len = (UINT8) strlen (Name);\r
       if (Len != 0) {\r
         if (ExpendObjBin (Len) == TRUE) {\r
           IncLength (Len);\r
@@ -832,6 +875,66 @@ public:
 \r
 };\r
 \r
+class CIfrRead : public CIfrObj, public CIfrOpHeader{\r
+private:\r
+  EFI_IFR_READ *mRead;\r
+\r
+public:\r
+  CIfrRead () : CIfrObj (EFI_IFR_READ_OP, (CHAR8 **)&mRead),\r
+                CIfrOpHeader (EFI_IFR_READ_OP, &mRead->Header) {}\r
+\r
+};\r
+\r
+class CIfrWrite : public CIfrObj, public CIfrOpHeader{\r
+private:\r
+  EFI_IFR_WRITE *mWrite;\r
+\r
+public:\r
+  CIfrWrite () : CIfrObj (EFI_IFR_WRITE_OP, (CHAR8 **)&mWrite),\r
+                CIfrOpHeader (EFI_IFR_WRITE_OP, &mWrite->Header) {}\r
+\r
+};\r
+\r
+class CIfrGet : public CIfrObj, public CIfrOpHeader{\r
+private:\r
+  EFI_IFR_GET *mGet;\r
+\r
+public:\r
+  CIfrGet (\r
+  IN UINT32 LineNo  \r
+  ) : CIfrObj (EFI_IFR_GET_OP, (CHAR8 **)&mGet),\r
+      CIfrOpHeader (EFI_IFR_GET_OP, &mGet->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+\r
+  VOID SetVarInfo (IN EFI_VARSTORE_INFO *Info) {\r
+    mGet->VarStoreId             = Info->mVarStoreId;\r
+    mGet->VarStoreInfo.VarName   = Info->mInfo.mVarName;\r
+    mGet->VarStoreInfo.VarOffset = Info->mInfo.mVarOffset;\r
+    mGet->VarStoreType           = Info->mVarType;\r
+  }\r
+};\r
+\r
+class CIfrSet : public CIfrObj, public CIfrOpHeader{\r
+private:\r
+  EFI_IFR_SET *mSet;\r
+\r
+public:\r
+  CIfrSet (\r
+  IN UINT32 LineNo\r
+  ) : CIfrObj (EFI_IFR_SET_OP, (CHAR8 **)&mSet),\r
+      CIfrOpHeader (EFI_IFR_SET_OP, &mSet->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+\r
+  VOID SetVarInfo (IN EFI_VARSTORE_INFO *Info) {\r
+    mSet->VarStoreId             = Info->mVarStoreId;\r
+    mSet->VarStoreInfo.VarName   = Info->mInfo.mVarName;\r
+    mSet->VarStoreInfo.VarOffset = Info->mInfo.mVarOffset;\r
+    mSet->VarStoreType           = Info->mVarType;\r
+  }\r
+};\r
+\r
 class CIfrSubtitle : public CIfrObj, public CIfrOpHeader, public CIfrStatementHeader {\r
 private:\r
   EFI_IFR_SUBTITLE   *mSubtitle;\r
@@ -2310,6 +2413,19 @@ public:
   }\r
 };\r
 \r
+class CIfrMap : public CIfrObj, public CIfrOpHeader{\r
+private:\r
+  EFI_IFR_MAP *mMap;\r
+\r
+public:\r
+  CIfrMap (\r
+  IN UINT32 LineNo  \r
+  ) : CIfrObj (EFI_IFR_MAP_OP, (CHAR8 **)&mMap),\r
+      CIfrOpHeader (EFI_IFR_MAP_OP, &mMap->Header) {\r
+    SetLineNo (LineNo);\r
+  }\r
+};\r
+\r
 class CIfrMatch : public CIfrObj, public CIfrOpHeader {\r
 private:\r
   EFI_IFR_MATCH *mMatch;\r
index 09ec691..2a4f7b6 100644 (file)
@@ -1,5 +1,5 @@
 /*++\r
-Copyright (c) 2004 - 2009, Intel Corporation\r
+Copyright (c) 2004 - 2010, Intel Corporation\r
 All rights reserved. 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
@@ -131,6 +131,9 @@ VfrParserStart (
 #token EndList("endlist")                       "endlist"\r
 #token EndForm("endform")                       "endform"\r
 #token Form("form")                             "form"\r
+#token FormMap("formmap")                       "formmap"\r
+#token MapTitle("maptitle")                     "maptitle"\r
+#token MapGuid("mapguid")                       "mapguid"\r
 #token Subtitle("subtitle")                     "subtitle"\r
 #token Help("help")                             "help"\r
 #token Text("text")                             "text"\r
@@ -214,6 +217,8 @@ VfrParserStart (
 #token Rule("rule")                             "rule"\r
 #token EndRule("endrule")                       "endrule"\r
 #token Value("value")                           "value"\r
+#token Read("read")                             "read"\r
+#token Write("write")                           "write"\r
 #token ResetButton("resetbutton")               "resetbutton"\r
 #token EndResetButton("endresetbutton")         "endresetbutton"\r
 #token DefaultStore("defaultstore")             "defaultstore"\r
@@ -250,7 +255,8 @@ VfrParserStart (
 \r
 vfrProgram > [UINT8 Return] :\r
   <<\r
-     mParserStatus = 0;\r
+     mParserStatus   = 0;\r
+     mCIfrOpHdrIndex = 0;\r
      mConstantOnlyInExpression = FALSE;\r
   >>\r
   (\r
@@ -335,82 +341,84 @@ vfrDataStructFields :
 \r
 dataStructField64 :\r
   << UINT32 ArrayNum = 0; >>\r
-  "UINT64"\r
+  D:"UINT64"\r
   N:StringIdentifier\r
   {\r
     OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText()); >>\r
   }\r
-  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "UINT64", ArrayNum), N); >>\r
+  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
   ;\r
 \r
 dataStructField32 :\r
   << UINT32 ArrayNum = 0; >>\r
-  "UINT32"\r
+  D:"UINT32"\r
   N:StringIdentifier\r
   {\r
     OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText()); >>\r
   }\r
-  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "UINT32", ArrayNum), N); >>\r
+  ";"                                 &nb