"$(CC)" $(CC_FLAGS) -o ${dst} $(INC) ${src}\r
"$(SYMRENAME)" $(SYMRENAME_FLAGS) ${dst}\r
\r
+ <Command.ARMGCC>\r
+ "$(CC)" $(CC_FLAGS) -o ${dst} $(INC) ${src}\r
+\r
+\r
[C-Header-File]\r
<InputFile>\r
*.h, *.H\r
<Command.RVCT>\r
"$(SLINK)" $(SLINK_FLAGS) ${dst} --via $(OBJECT_FILES_LIST)\r
\r
- <Command.RVCTCYGWIN>\r
+ <Command.RVCTCYGWIN, Command.ARMGCC>\r
# $(OBJECT_FILES_LIST) has wrong paths for cygwin\r
"$(SLINK)" $(SLINK_FLAGS) ${dst} $(OBJECT_FILES)\r
\r
"$(DLINK)" -o ${dst} $(DLINK_FLAGS) -\( $(DLINK_SPATH) @$(STATIC_LIBRARY_FILES_LIST) -\) $(DLINK2_FLAGS)\r
"$(OBJCOPY)" $(OBJCOPY_FLAGS) ${dst}\r
\r
+ <Command.ARMGCC>\r
+ "$(DLINK)" -o ${dst} $(DLINK_FLAGS) -( $(DLINK_SPATH) $(STATIC_LIBRARY_FILES) -) $(DLINK2_FLAGS)\r
+\r
<Command.RVCT>\r
"$(DLINK)" $(DLINK_FLAGS) -o ${dst} $(DLINK_SPATH) --via $(STATIC_LIBRARY_FILES_LIST) $(DLINK2_FLAGS)\r
\r
<Command.GCC>\r
"$(DLINK)" $(DLINK_FLAGS) -\( $(DLINK_SPATH) @$(STATIC_LIBRARY_FILES_LIST) -\) $(DLINK2_FLAGS)\r
\r
+ <Command.ARMGCC>\r
+ "$(DLINK)" $(DLINK_FLAGS) -( $(DLINK_SPATH) $(STATIC_LIBRARY_FILES) -) $(DLINK2_FLAGS)\r
+\r
<Command.RVCT>\r
"$(DLINK)" $(DLINK_FLAGS) -o ${dst} $(DLINK_SPATH) --via $(STATIC_LIBRARY_FILES_LIST) $(DLINK2_FLAGS)\r
\r
<OutputFile>\r
$(DEBUG_DIR)(+)$(MODULE_NAME).efi\r
\r
- <Command.MSFT, Command.INTEL, Command.RVCT> \r
+ <Command.MSFT, Command.INTEL, Command.RVCT, Command.ARMGCC> \r
GenFw -e $(MODULE_TYPE) -o ${dst} ${src}\r
$(CP) ${dst} $(OUTPUT_DIR)\r
$(CP) ${dst} $(BIN_DIR)\r
DEFINE RVCT31_TOOLS_PATH = c:/Program Files/ARM/RVCT/Programs/3.1/761/win_32-pentium\r
DEFINE RVCT31CYGWIN_TOOLS_PATH = /cygdrive/c/Program Files/ARM/RVCT/Programs/3.1/761/win_32-pentium\r
\r
-# Update to the location of the gcc executables\r
-DEFINE ARMGCC_BIN = /\r
+DEFINE SOURCERY_TOOLS = c:/Program Files/CodeSourcery/Sourcery G++ Lite/bin\r
+DEFINE SOURCERY_CYGWIN_TOOLS = /cygdrive/c/Program Files/CodeSourcery/Sourcery G++ Lite/bin\r
\r
####################################################################################\r
#\r
*_UNIXGCC_*_MAKE_PATH = make\r
*_UNIXGCC_*_ASL_PATH = DEF(UNIX_IASL_BIN)\r
\r
-*_UNIXGCC_IA32_DLINK_FLAGS = DEF(GCC_IA32_X64_DLINK_FLAGS)\r
-*_UNIXGCC_X64_DLINK_FLAGS = DEF(GCC_IA32_X64_DLINK_FLAGS)\r
+*_UNIXGCC_IA32_DLINK_FLAGS = DEF(GCC_IA32_X64_DLINK_FLAGS) --image-base=0\r
+*_UNIXGCC_X64_DLINK_FLAGS = DEF(GCC_IA32_X64_DLINK_FLAGS) --image-base=0\r
*_UNIXGCC_IA32_ASLDLINK_FLAGS = DEF(GCC_IA32_X64_ASLDLINK_FLAGS)\r
*_UNIXGCC_X64_ASLDLINK_FLAGS = DEF(GCC_IA32_X64_ASLDLINK_FLAGS)\r
*_UNIXGCC_*_ASM_FLAGS = DEF(GCC_ASM_FLAGS)\r
*_CYGGCC_*_MAKE_PATH = DEF(MS_VS_BIN)\nmake.exe\r
*_CYGGCC_*_ASL_PATH = DEF(DEFAULT_WIN_ASL_BIN)\r
\r
-*_CYGGCC_IA32_DLINK_FLAGS = DEF(GCC_IA32_X64_DLINK_FLAGS)\r
-*_CYGGCC_X64_DLINK_FLAGS = DEF(GCC_IA32_X64_DLINK_FLAGS)\r
+*_CYGGCC_IA32_DLINK_FLAGS = DEF(GCC_IA32_X64_DLINK_FLAGS) --image-base=0\r
+*_CYGGCC_X64_DLINK_FLAGS = DEF(GCC_IA32_X64_DLINK_FLAGS) --image-base=0\r
*_CYGGCC_IA32_ASLDLINK_FLAGS = DEF(GCC_IA32_X64_ASLDLINK_FLAGS)\r
*_CYGGCC_X64_ASLDLINK_FLAGS = DEF(GCC_IA32_X64_ASLDLINK_FLAGS)\r
*_CYGGCC_*_MAKE_FLAGS = /nologo\r
*_CYGGCC_IA32_ASLPP_PATH = DEF(CYGWIN_BINIA32)gcc\r
*_CYGGCC_IA32_ASLDLINK_PATH = DEF(CYGWIN_BINIA32)ld\r
*_CYGGCC_IA32_RC_PATH = DEF(CYGWIN_BINIA32)objcopy\r
-*_CYGGCC_IA32_OBJECT_PATH = DEF(CYGWIN_BINIA32)objcopy\r
+*_CYGGCC_IA32_OBJCOPY_PATH = DEF(CYGWIN_BINIA32)objcopy\r
\r
*_CYGGCC_IA32_CC_FLAGS = DEF(GCC_IA32_CC_FLAGS)\r
*_CYGGCC_IA32_RC_FLAGS = DEF(GCC_IA32_RC_FLAGS)\r
+*_CYGGCC_IA32_OBJCOPY_FLAGS =\r
\r
##################\r
# X64 definitions\r
*_CYGGCC_X64_ASLPP_PATH = DEF(CYGWIN_BINX64)gcc\r
*_CYGGCC_X64_ASLDLINK_PATH = DEF(CYGWIN_BINX64)ld\r
*_CYGGCC_X64_RC_PATH = DEF(CYGWIN_BINX64)objcopy\r
-*_CYGGCC_X64_OBJECT_PATH = DEF(CYGWIN_BINX64)objcopy\r
+*_CYGGCC_X64_OBJCOPY_PATH = DEF(CYGWIN_BINX64)objcopy\r
\r
*_CYGGCC_X64_CC_FLAGS = DEF(GCC_X64_CC_FLAGS)\r
*_CYGGCC_X64_RC_FLAGS = DEF(GCC_X64_RC_FLAGS)\r
+*_CYGGCC_X64_OBJCOPY_FLAGS =\r
\r
##################\r
# IPF definitions\r
*_CYGGCC_IPF_OBJCOPY_PATH = DEF(CYGWIN_BINIPF)objcopy\r
*_CYGGCC_IPF_SYMRENAME_PATH = DEF(CYGWIN_BINIPF)objcopy\r
*_CYGGCC_IPF_RC_PATH = DEF(CYGWIN_BINIPF)objcopy\r
-*_CYGGCC_IPF_OBJECT_PATH = DEF(CYGWIN_BINIPF)objcopy\r
\r
*_CYGGCC_IPF_CC_FLAGS = DEF(GCC_IPF_CC_FLAGS)\r
*_CYGGCC_IPF_DLINK_FLAGS = DEF(GCC_IPF_DLINK_FLAGS)\r
\r
####################################################################################\r
#\r
-# ARM GCC (GCC 4.1.1, etc.)\r
+# ARM GCC (www.codesourcery.com)\r
#\r
####################################################################################\r
# ARMGCC - ARM version of the GCC cross compiler\r
\r
*_ARMGCC_*_*_FAMILY = GCC\r
-*_ARMGCC_*_MAKE_PATH = make\r
+*_ARMGCC_*_*_BUILDRULEFAMILY = ARMGCC\r
+\r
+*_ARMGCC_*_MAKE_PATH = DEF(SOURCERY_TOOLS)/cs-make\r
+*_ARMGCC_*_MAKE_FLAGS = --no-print-directory\r
\r
##################\r
# ASL definitions\r
# ARM definitions\r
##################\r
\r
-*_ARMGCC_ARM_ASLCC_PATH = DEF(ARMGCC_BIN)/arm-elf-gcc\r
-*_ARMGCC_ARM_ASLDLINK_PATH = DEF(ARMGCC_BIN)/arm-elf-ld\r
-*_ARMGCC_ARM_ASLPP_PATH = DEF(ARMGCC_BIN)/arm-elf-gcc\r
+*_ARMGCC_ARM_ASLCC_PATH = DEF(SOURCERY_TOOLS)/arm-none-eabi-gcc\r
+*_ARMGCC_ARM_ASLDLINK_PATH = DEF(SOURCERY_TOOLS)/arm-none-eabi-ld\r
+*_ARMGCC_ARM_ASLPP_PATH = DEF(SOURCERY_TOOLS)/arm-none-eabi-gcc\r
\r
-*_ARMGCC_ARM_CC_PATH = DEF(ARMGCC_BIN)/arm-elf-gcc\r
-*_ARMGCC_ARM_SLINK_PATH = DEF(ARMGCC_BIN)/arm-elf-ar\r
-*_ARMGCC_ARM_DLINK_PATH = DEF(ARMGCC_BIN)/arm-elf-ld\r
-*_ARMGCC_ARM_ASM_PATH = DEF(ARMGCC_BIN)/arm-elf-as\r
-*_ARMGCC_ARM_PP_PATH = DEF(ARMGCC_BIN)/arm-elf-gcc\r
-*_ARMGCC_ARM_VFRPP_PATH = DEF(ARMGCC_BIN)/arm-elf-gcc\r
+*_ARMGCC_ARM_CC_PATH = DEF(SOURCERY_TOOLS)/arm-none-eabi-gcc\r
+*_ARMGCC_ARM_SLINK_PATH = DEF(SOURCERY_TOOLS)/arm-none-eabi-ar\r
+*_ARMGCC_ARM_DLINK_PATH = DEF(SOURCERY_TOOLS)/arm-none-eabi-ld\r
+*_ARMGCC_ARM_ASM_PATH = DEF(SOURCERY_TOOLS)/arm-none-eabi-as\r
+*_ARMGCC_ARM_PP_PATH = DEF(SOURCERY_TOOLS)/arm-none-eabi-gcc\r
+*_ARMGCC_ARM_VFRPP_PATH = DEF(SOURCERY_TOOLS)/arm-none-eabi-gcc\r
\r
#\r
# Use default values, or override in DSC file\r
#\r
-*_ARMGCC_ARM_ARCHCC_FLAGS = \r
-*_ARMGCC_ARM_ARCHASM_FLAGS = \r
+*_ARMGCC_ARM_ARCHCC_FLAGS = -march=armv7-a -mthumb \r
+*_ARMGCC_ARM_ARCHASM_FLAGS = -march=armv7-a\r
*_ARMGCC_ARM_ARCHDLINK_FLAGS = \r
-*_ARMGCC_ARM_PLATFORM_FLAGS =\r
+*_ARMGCC_ARM_PLATFORM_FLAGS = -march=armv7-a\r
\r
DEBUG_ARMGCC_ARM_ASM_FLAGS = $(ARCHASM_FLAGS) -mlittle-endian -g\r
RELEASE_ARMGCC_ARM_ASM_FLAGS = $(ARCHASM_FLAGS) -mlittle-endian\r
*_ARMGCC_ARM_PP_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) -E -x assembler-with-cpp -include $(DEST_DIR_DEBUG)/AutoGen.h\r
*_ARMGCC_ARM_VFRPP_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) -x c -E -P -DVFRCOMPILE --include $(DEST_DIR_DEBUG)/$(MODULE_NAME)StrDefs.h\r
\r
-*_ARMGCC_ARM_MAKE_PATH = make\r
-\r
-*_ARMGCC_ARM_SLINK_FLAGS = -r\r
-*_ARMGCC_ARM_DLINK_FLAGS = $(ARCHDLINK_FLAGS) --emit-relocs --oformat=elf32-littlearm -nostdlib -u $(IMAGE_ENTRY_POINT) -e $(IMAGE_ENTRY_POINT) -Map $(DEST_DIR_DEBUG)/$(BASE_NAME).map\r
-# --gc-sections\r
+*_ARMGCC_ARM_SLINK_FLAGS = -rc\r
+*_ARMGCC_ARM_DLINK_FLAGS = $(ARCHDLINK_FLAGS) --oformat=elf32-littlearm -nostdlib -u $(IMAGE_ENTRY_POINT) -e $(IMAGE_ENTRY_POINT) -Map $(DEST_DIR_DEBUG)/$(BASE_NAME).map\r
+#\r
+# Had to remove --emit-relocs to get compile working. Images don't work correctly (linked at 0, no relocations)\r
+# --emit-relocs\r
+#\r
\r
DEBUG_ARMGCC_ARM_CC_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) -mfpu=fpa -mlittle-endian -g -O2 -mabi=aapcs -mapcs -fno-short-enums -save-temps -combine -fsigned-char -fshort-wchar -fno-strict-aliasing -ffunction-sections -fdata-sections -Wall -Werror -Wno-missing-braces -fomit-frame-pointer -c -include AutoGen.h\r
RELEASE_ARMGCC_ARM_CC_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) -mfpu=fpa -mlittle-endian -O2 -mabi=aapcs -mapcs -fno-short-enums -save-temps -combine -fsigned-char -fshort-wchar -fno-strict-aliasing -ffunction-sections -fdata-sections -Wall -Werror -Wno-missing-braces -fomit-frame-pointer -c -include AutoGen.h\r
#ifndef __GNUC__\r
#include <windows.h>\r
#include <io.h>\r
+#include <sys/types.h>\r
+#include <sys/stat.h>\r
#endif\r
#include <stdio.h>\r
#include <stdlib.h>\r
- (SecOffset - SecShdr->sh_addr);\r
break;\r
default:\r
- Error (NULL, 0, 3000, "Invalid", "%s unhandled section type %x.", mInImageName, (unsigned) ELF_R_TYPE(Rel->r_info));\r
+ Error (NULL, 0, 3000, "Invalid", "%s unsupported ELF EM_386 relocation 0x%x.", mInImageName, (unsigned) ELF_R_TYPE(Rel->r_info));\r
}\r
} else if (Ehdr->e_machine == EM_ARM) {\r
switch (ELF32_R_TYPE(Rel->r_info)) {\r
case R_ARM_RBASE: // No relocation - no action required\r
- case R_ARM_PC24: // PC-relative relocations don't require modification\r
- case R_ARM_XPC25: // PC-relative relocations don't require modification\r
+ \r
+ // Thease are all PC-relative relocations and don't require modification\r
+ case R_ARM_PC24: \r
+ case R_ARM_XPC25: \r
+ case R_ARM_THM_PC22:\r
+ case R_ARM_THM_JUMP19:\r
+ case R_ARM_CALL:\r
break;\r
+\r
case R_ARM_ABS32:\r
case R_ARM_RABS32:\r
//\r
*(UINT32 *)Targ = *(UINT32 *)Targ - SymShdr->sh_addr + CoffSectionsOffset[Sym->st_shndx];\r
break;\r
default:\r
- Error (NULL, 0, 3000, "Invalid", "%s unhandled section type %x.", mInImageName, (unsigned) ELF32_R_TYPE(Rel->r_info));\r
+ Error (NULL, 0, 3000, "Invalid", "WriteSections (): %s unsupported ELF EM_ARM relocation 0x%x.", mInImageName, (unsigned) ELF32_R_TYPE(Rel->r_info));\r
}\r
}\r
}\r
\r
\r
VOID\r
-WriteRelocations(\r
+WriteRelocations (\r
VOID\r
)\r
{\r
EFI_IMAGE_REL_BASED_HIGHLOW);\r
break;\r
default:\r
- Error (NULL, 0, 3000, "Invalid", "%s unhandled section type %x.", mInImageName, (unsigned) ELF_R_TYPE(Rel->r_info));\r
+ Error (NULL, 0, 3000, "Invalid", "%s unsupported ELF EM_386 relocation 0x%x.", mInImageName, (unsigned) ELF_R_TYPE(Rel->r_info));\r
}\r
} else if (Ehdr->e_machine == EM_ARM) {\r
switch (ELF32_R_TYPE(Rel->r_info)) {\r
- case R_ARM_RBASE:\r
+ case R_ARM_RBASE: // No relocation - no action required\r
+ \r
+ // Thease are all PC-relative relocations and don't require modification\r
case R_ARM_PC24:\r
case R_ARM_XPC25:\r
+ case R_ARM_THM_PC22:\r
+ case R_ARM_THM_JUMP19:\r
+ case R_ARM_CALL:\r
break;\r
case R_ARM_ABS32:\r
case R_ARM_RABS32:\r
EFI_IMAGE_REL_BASED_HIGHLOW\r
);\r
break;\r
- default:\r
- Error (NULL, 0, 3000, "Invalid", "%s unhandled section type %x.", mInImageName, (unsigned) ELF32_R_TYPE(Rel->r_info));\r
+\r
+ default:\r
+ Error (NULL, 0, 3000, "Invalid", "WriteRelocations(): %s unsupported ELF EM_ARM relocation 0x%x.", mInImageName, (unsigned) ELF32_R_TYPE(Rel->r_info));\r
}\r
} else {\r
Error (NULL, 0, 3000, "Not Supported", "This tool does not support relocations for ELF with e_machine %u (processor type).", (unsigned) Ehdr->e_machine);\r
case DT_RELENT:\r
RelElementSize = Dyn->d_un.d_val;\r
break;\r
+\r
+ default:\r
+ break;\r
}\r
Dyn++;\r
}\r
\r
for (K = 0; K < RelSize; K += RelElementSize) {\r
\r
- Rel = (Elf32_Rel *) ((UINT8 *) Ehdr + DynamicSegment->p_offset + RelOffset + K);\r
+ if (DynamicSegment->p_paddr == 0) {\r
+ // This seems to be how it works on armcc???? Have the email in to find out?\r
+ Rel = (Elf32_Rel *) ((UINT8 *) Ehdr + DynamicSegment->p_offset + RelOffset + K);\r
+ } else {\r
+ // This is how it reads in the ELF specification\r
+ Rel = (Elf32_Rel *) ((UINT8 *) Ehdr + RelOffset + K);\r
+ }\r
\r
switch (ELF32_R_TYPE (Rel->r_info)) {\r
case R_ARM_RBASE:\r
CoffAddFixup (CoffSectionsOffset[ELF32_R_SYM (Rel->r_info)] + (Rel->r_offset - TargetSegment->p_vaddr), EFI_IMAGE_REL_BASED_HIGHLOW);\r
break;\r
default:\r
- Error (NULL, 0, 3000, "Invalid", "%s bad ARM dynamic relocations, unkown type.", mInImageName);\r
+ Error (NULL, 0, 3000, "Invalid", "%s bad ARM dynamic relocations, unkown type %d.", mInImageName, ELF32_R_TYPE (Rel->r_info));\r
+ break;\r
}\r
}\r
break;\r
FILE *ReportFile;\r
CHAR8 *ReportFileName;\r
UINTN FileLen;\r
+ time_t InputFileTime;\r
+ time_t OutputFileTime;\r
+ struct stat Stat_Buf;\r
\r
SetUtilityName (UTILITY_NAME);\r
\r
HiiSectionHeader = NULL;\r
NewBaseAddress = 0;\r
NegativeAddr = FALSE;\r
+ InputFileTime = 0;\r
+ OutputFileTime = 0;\r
\r
if (argc == 1) {\r
Error (NULL, 0, 1001, "Missing options", "No input options.");\r
if (OutImageName != NULL) {\r
fpOut = fopen (OutImageName, "rb");\r
if (fpOut != NULL) {\r
+ //\r
+ // Get Output file time stamp\r
+ //\r
+ fstat(fileno (fpOut), &Stat_Buf);\r
+ OutputFileTime = Stat_Buf.st_mtime;\r
+ //\r
+ // Get Output file data\r
+ //\r
OutputFileLength = _filelength (fileno (fpOut));\r
OutputFileBuffer = malloc (OutputFileLength);\r
if (OutputFileBuffer == NULL) {\r
Error (NULL, 0, 0001, "Error opening file", mInImageName);\r
goto Finish;\r
}\r
+ //\r
+ // Get Iutput file time stamp\r
+ //\r
+ fstat(fileno (fpIn), &Stat_Buf);\r
+ InputFileTime = Stat_Buf.st_mtime;\r
+ //\r
+ // Get Input file data\r
+ //\r
InputFileLength = _filelength (fileno (fpIn));\r
InputFileBuffer = malloc (InputFileLength);\r
if (InputFileBuffer == NULL) {\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
+ } else {\r
+\r
+ //\r
+ // Following codes are to fix the objcopy's issue:\r
+ // objcopy in binutil 2.50.18 will set PE image's charactices to "RELOC_STRIPPED" if image has no ".reloc" section\r
+ // It cause issue for EFI image which has no ".reloc" sections.\r
+ // Following codes will be removed when objcopy in binutil fix this problem for PE image.\r
+ //\r
+ if ((PeHdr->Pe32.FileHeader.Characteristics & EFI_IMAGE_FILE_RELOCS_STRIPPED) != 0) {\r
+ if (PeHdr->Pe32.OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
+ Optional32 = (EFI_IMAGE_OPTIONAL_HEADER32 *)&PeHdr->Pe32.OptionalHeader;\r
+ if (Optional32->ImageBase == 0) {\r
+ PeHdr->Pe32.FileHeader.Characteristics &= ~EFI_IMAGE_FILE_RELOCS_STRIPPED;\r
+ }\r
+ } else if (PeHdr->Pe32.OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC) {\r
+ Optional64 = (EFI_IMAGE_OPTIONAL_HEADER64 *)&PeHdr->Pe32.OptionalHeader;\r
+ if (Optional64->ImageBase == 0) {\r
+ PeHdr->Pe32.FileHeader.Characteristics &= ~EFI_IMAGE_FILE_RELOCS_STRIPPED;\r
+ }\r
+ }\r
+ }\r
}\r
\r
WriteFile:\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
+ if ((OutputFileTime < InputFileTime) || (FileLength != OutputFileLength) || (memcmp (FileBuffer, OutputFileBuffer, FileLength) != 0)) {\r
+ //\r
+ // Update File when File is changed or File is old.\r
+ //\r
fpOut = fopen (OutImageName, "wb");\r
if (fpOut == NULL) {\r
Error (NULL, 0, 0001, "Error opening output file", OutImageName);\r
#define R_ARM_GOTPC 25 /* Add PC-relative GOT table address. */
#define R_ARM_GOT32 26 /* Add PC-relative GOT offset. */
#define R_ARM_PLT32 27 /* Add PC-relative PLT offset. */
+#define R_ARM_CALL 28
+#define R_ARM_THM_JUMP19 51
#define R_ARM_GNU_VTENTRY 100
#define R_ARM_GNU_VTINHERIT 101
#define R_ARM_RSBREL32 250
## @file
# Create makefile for MS nmake and GNU make
#
-# Copyright (c) 2007, Intel Corporation
+# Copyright (c) 2007 - 2010, Intel Corporation
# 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
import Common.GlobalData as GlobalData
## Regular expression for finding header file inclusions
-gIncludePattern = re.compile(r"^[ \t]*#[ \t]*include(?:[ \t]*(?:\\(?:\r\n|\r|\n))*[ \t]*)*(?:[\"<][ \t]*)([\w.\\/]+)(?:[ \t]*[\">])", re.MULTILINE|re.UNICODE)
+gIncludePattern = re.compile(r"^[ \t]*#?[ \t]*include(?:[ \t]*(?:\\(?:\r\n|\r|\n))*[ \t]*)*(?:[\"<]?[ \t]*)([\w.\\/]+)(?:[ \t]*[\">]?)", re.MULTILINE|re.UNICODE)
## Regular expression for matching macro used in header file inclusion
gMacroPattern = re.compile("([_A-Z][_A-Z0-9]*)[ \t]*\((.+)\)", re.UNICODE)
## @file\r
# This file is used to define each component of DSC 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
#\r
elif PreviousIf[2] in (MODEL_META_DATA_CONDITIONAL_STATEMENT_IF, Model):\r
List = PreviousIf[0].split(' ')\r
- Value1 = List[0]\r
- Value2 = List[1]\r
- Value3 = List[2]\r
- Value3 = SplitString(Value3)\r
+ Value1, Value2, Value3 = '', '==', '0'\r
+ if len(List) == 3:\r
+ Value1 = List[0]\r
+ Value2 = List[1]\r
+ Value3 = List[2]\r
+ Value3 = SplitString(Value3)\r
+ if len(List) == 1:\r
+ Value1 = List[0]\r
Model = PreviousIf[2]\r
self.TblDsc.Insert(Model, Value1, Value2, Value3, ArchList, BelongsToItem, self.FileID, PreviousIf[1], StartColumn, EndLine, EndColumn, Enabled)\r
#\r
if not self.__GetNextHexNumber():\r
raise Warning("expected Hex byte At Line ", self.FileName, self.CurrentLineNumber)\r
\r
- if len(self.__Token) > 4:\r
- raise Warning("Hex byte(must be 2 digits) too long At Line ", self.FileName, self.CurrentLineNumber)\r
+ if len(self.__Token) > 18:\r
+ raise Warning("Hex string can't be converted to a valid UINT64 value", self.FileName, self.CurrentLineNumber)\r
\r
DataString = self.__Token\r
DataString += ","\r
if not self.__GetNextHexNumber():\r
raise Warning("expected Hex byte At Line ", self.FileName, self.CurrentLineNumber)\r
\r
- if len(self.__Token) > 4:\r
- raise Warning("Hex byte(must be 2 digits) too long At Line ", self.FileName, self.CurrentLineNumber)\r
+ if len(self.__Token) > 18:\r
+ raise Warning("Hex string can't be converted to a valid UINT64 value", self.FileName, self.CurrentLineNumber)\r
\r
DataString = self.__Token\r
DataString += ","\r
# @retval truple() A truple structure as (Family, ToolChain, Flag)\r
#\r
def GetBuildOption(String, File, LineNo = -1):\r
+ (Family, ToolChain, Flag) = ('', '', '')\r
if String.find(TAB_EQUAL_SPLIT) < 0:\r
RaiseParserError(String, 'BuildOptions', File, '[<Family>:]<ToolFlag>=Flag', LineNo)\r
- (Family, ToolChain, Flag) = ('', '', '')\r
- List = GetSplitValueList(String, TAB_EQUAL_SPLIT, MaxSplit = 1)\r
- if List[0].find(':') > -1:\r
- Family = List[0][ : List[0].find(':')].strip()\r
- ToolChain = List[0][List[0].find(':') + 1 : ].strip()\r
else:\r
- ToolChain = List[0].strip()\r
- Flag = List[1].strip()\r
-\r
+ List = GetSplitValueList(String, TAB_EQUAL_SPLIT, MaxSplit = 1)\r
+ if List[0].find(':') > -1:\r
+ Family = List[0][ : List[0].find(':')].strip()\r
+ ToolChain = List[0][List[0].find(':') + 1 : ].strip()\r
+ else:\r
+ ToolChain = List[0].strip()\r
+ Flag = List[1].strip()\r
return (Family, ToolChain, Flag)\r
\r
## Get Library Class\r
if not self.__GetNextHexNumber():\r
raise Warning("expected Hex byte", self.FileName, self.CurrentLineNumber)\r
\r
- if len(self.__Token) > 4:\r
- raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber)\r
-\r
- DataString = self.__Token\r
- DataString += ","\r
-\r
- while self.__IsToken(","):\r
- if not self.__GetNextHexNumber():\r
- raise Warning("Invalid Hex number", self.FileName, self.CurrentLineNumber)\r
- if len(self.__Token) > 4:\r
- raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber)\r
- DataString += self.__Token\r
- DataString += ","\r
+ if len(self.__Token) > 18:\r
+ raise Warning("Hex string can't be converted to a valid UINT64 value", self.FileName, self.CurrentLineNumber)\r
+\r
+ # convert hex string value to byte hex string array\r
+ AllString = self.__Token\r
+ AllStrLen = len (AllString)\r
+ DataString = ""\r
+ while AllStrLen > 4:\r
+ DataString = DataString + "0x" + AllString[AllStrLen - 2: AllStrLen] + ","\r
+ AllStrLen = AllStrLen - 2\r
+ DataString = DataString + AllString[:AllStrLen] + ","\r
+\r
+ # byte value array\r
+ if len (self.__Token) <= 4:\r
+ while self.__IsToken(","):\r
+ if not self.__GetNextHexNumber():\r
+ raise Warning("Invalid Hex number", self.FileName, self.CurrentLineNumber)\r
+ if len(self.__Token) > 4:\r
+ raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber)\r
+ DataString += self.__Token\r
+ DataString += ","\r
\r
if not self.__IsToken( "}"):\r
raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
if not self.__GetNextHexNumber():\r
raise Warning("expected Hex byte", self.FileName, self.CurrentLineNumber)\r
\r
- if len(self.__Token) > 4:\r
- raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber)\r
+ if len(self.__Token) > 18:\r
+ raise Warning("Hex string can't be converted to a valid UINT64 value", self.FileName, self.CurrentLineNumber)\r
\r
- DataString = self.__Token\r
- DataString += ","\r
+ # convert hex string value to byte hex string array\r
+ AllString = self.__Token\r
+ AllStrLen = len (AllString)\r
+ DataString = ""\r
+ while AllStrLen > 4:\r
+ DataString = DataString + "0x" + AllString[AllStrLen - 2: AllStrLen] + ","\r
+ AllStrLen = AllStrLen - 2\r
+ DataString = DataString + AllString[:AllStrLen] + ","\r
\r
- while self.__IsToken(","):\r
- self.__GetNextHexNumber()\r
- if len(self.__Token) > 4:\r
- raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber)\r
- DataString += self.__Token\r
- DataString += ","\r
+ # byte value array\r
+ if len (self.__Token) <= 4:\r
+ while self.__IsToken(","):\r
+ if not self.__GetNextHexNumber():\r
+ raise Warning("Invalid Hex number", self.FileName, self.CurrentLineNumber)\r
+ if len(self.__Token) > 4:\r
+ raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber)\r
+ DataString += self.__Token\r
+ DataString += ","\r
\r
if not self.__IsToken( "}"):\r
raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
EdkIILibInfo += " C = " + LibConstructor\r
LibDestructor = " ".join(LibraryItem[3])\r
if LibDestructor:\r
- EdkIILibInfo += " D = " + LibConstructor\r
+ EdkIILibInfo += " D = " + LibDestructor\r
LibDepex = " ".join(LibraryItem[4])\r
if LibDepex:\r
EdkIILibInfo += " Depex = " + LibDepex\r
ModuleType = M.ModuleType\r
if not ModuleType:\r
ModuleType = gComponentType2ModuleType.get(M.ComponentType, "")\r
- if ModuleType in ["SEC", "PEI_CORE", "DXE_CORE"]:\r
+\r
+ if ModuleType in ["SEC", "PEI_CORE", "DXE_CORE", "SMM_CORE", "UEFI_APPLICATION"]:\r
return\r
\r
for Source in M.SourceFileList:\r
self.Size = 0\r
self.BuildTimeStamp = None\r
self.DriverType = ""\r
- ModuleType = M.ModuleType\r
- if not ModuleType:\r
- ModuleType = gComponentType2ModuleType.get(M.ComponentType, "")\r
- #\r
- # If a module complies to PI 1.1, promote Module type to "SMM_DRIVER"\r
- #\r
- if ModuleType == "DXE_SMM_DRIVER":\r
- PiSpec = M.Module.Specification.get("PI_SPECIFICATION_VERSION", "0x00010000")\r
- if int(PiSpec, 0) >= 0x0001000A:\r
- ModuleType = "SMM_DRIVER"\r
- self.DriverType = gDriverTypeMap.get(ModuleType, "")\r
+ if not M.IsLibrary:\r
+ ModuleType = M.ModuleType\r
+ if not ModuleType:\r
+ ModuleType = gComponentType2ModuleType.get(M.ComponentType, "")\r
+ #\r
+ # If a module complies to PI 1.1, promote Module type to "SMM_DRIVER"\r
+ #\r
+ if ModuleType == "DXE_SMM_DRIVER":\r
+ PiSpec = M.Module.Specification.get("PI_SPECIFICATION_VERSION", "0x00010000")\r
+ if int(PiSpec, 0) >= 0x0001000A:\r
+ ModuleType = "SMM_DRIVER"\r
+ self.DriverType = gDriverTypeMap.get(ModuleType, "0x2 (FREE_FORM)")\r
self.UefiSpecVersion = M.Module.Specification.get("UEFI_SPECIFICATION_VERSION", "")\r
self.PiSpecVersion = M.Module.Specification.get("PI_SPECIFICATION_VERSION", "")\r
self.PciDeviceId = M.Module.Defines.get("PCI_DEVICE_ID", "")\r
\r
self.ModuleReportList = []\r
if MaList != None:\r
+ self._IsModuleBuild = True\r
for Ma in MaList:\r
self.ModuleReportList.append(ModuleReport(Ma, ReportType))\r
else:\r
+ self._IsModuleBuild = False\r
for Pa in Wa.AutoGenObjectList:\r
for ModuleKey in Pa.Platform.Modules:\r
self.ModuleReportList.append(ModuleReport(Pa.Platform.Modules[ModuleKey].M, ReportType))\r
FileWrite(File, "Build Duration: %s" % BuildDuration)\r
FileWrite(File, "Report Content: %s" % ", ".join(ReportType))\r
\r
- if "PCD" in ReportType:\r
- self.PcdReport.GenerateReport(File, None)\r
-\r
- if "FLASH" in ReportType:\r
- for FdReportListItem in self.FdReportList:\r
- FdReportListItem.GenerateReport(File)\r
+ if not self._IsModuleBuild:\r
+ if "PCD" in ReportType:\r
+ self.PcdReport.GenerateReport(File, None)\r
+ \r
+ if "FLASH" in ReportType:\r
+ for FdReportListItem in self.FdReportList:\r
+ FdReportListItem.GenerateReport(File)\r
\r
for ModuleReportItem in self.ModuleReportList:\r
ModuleReportItem.GenerateReport(File, self.PcdReport, self.PredictionReport, ReportType)\r
\r
- if "EXECUTION_ORDER" in ReportType:\r
- self.PredictionReport.GenerateReport(File, None)\r
+ if not self._IsModuleBuild:\r
+ if "EXECUTION_ORDER" in ReportType:\r
+ self.PredictionReport.GenerateReport(File, None)\r
\r
## BuildReport class\r
#\r
EdkLogger.error("BuildReport", CODE_ERROR, "Unknown fatal error when generating build report", ExtraData=self.ReportFile, RaiseError=False)\r
EdkLogger.quiet("(Python %s on %s\n%s)" % (platform.python_version(), sys.platform, traceback.format_exc()))\r
File.close()\r
-\r
+ \r
# This acts like the main() function for the script, unless it is 'import'ed into another script.\r
if __name__ == '__main__':\r
pass\r
\r
## Collect MAP information of all FVs\r
#\r
- def _CollectFvMapBuffer (self, MapBuffer, Wa):\r
+ def _CollectFvMapBuffer (self, MapBuffer, Wa, ModuleList):\r
if self.Fdf != '':\r
# First get the XIP base address for FV map file.\r
+ GuidPattern = re.compile("[-a-fA-F0-9]+")\r
for FvName in Wa.FdfProfile.FvDict.keys():\r
FvMapBuffer = os.path.join(Wa.FvDir, FvName + '.Fv.map')\r
if not os.path.exists(FvMapBuffer):\r
FvMap.readline()\r
FvMap.readline()\r
FvMap.readline()\r
- MapBuffer.write(FvMap.read())\r
+ for Line in FvMap:\r
+ MatchGuid = GuidPattern.match(Line)\r
+ if MatchGuid != None:\r
+ #\r
+ # Replace GUID with module name\r
+ #\r
+ GuidString = MatchGuid.group()\r
+ if GuidString.upper() in ModuleList:\r
+ Line = Line.replace(GuidString, ModuleList[GuidString.upper()].Name)\r
+ MapBuffer.write('%s' % (Line))\r
FvMap.close()\r
\r
## Collect MAP information of all modules\r
IsIpfPlatform = False\r
if 'IPF' in self.ArchList:\r
IsIpfPlatform = True\r
- for Module in ModuleList:\r
+ for ModuleGuid in ModuleList:\r
+ Module = ModuleList[ModuleGuid]\r
GlobalData.gProcessingFile = "%s [%s, %s, %s]" % (Module.MetaFile, Module.Arch, Module.ToolChain, Module.BuildTarget)\r
\r
OutputImageFile = ''\r
#\r
SaveFileOnChange(MapFilePath, MapBuffer.getvalue(), False)\r
MapBuffer.close()\r
- sys.stdout.write ("\nLoad Module At Fix Address Map file saved to %s\n" %(MapFilePath))
+ if self.LoadFixAddress != 0:
+ sys.stdout.write ("\nLoad Module At Fix Address Map file saved to %s\n" %(MapFilePath))
sys.stdout.flush()
\r
## Build active platform for different build targets and different tool chains\r
self._Build(self.Target, Wa)\r
\r
# Create MAP file when Load Fix Address is enabled.\r
- if self.Target in ["", "all", "fds"] and self.LoadFixAddress != 0:\r
+ if self.Target in ["", "all", "fds"]:\r
for Arch in self.ArchList:\r
#\r
# Check whether the set fix address is above 4G for 32bit image.\r
#\r
# Get Module List\r
#\r
- ModuleList = []\r
+ ModuleList = {}\r
for Pa in Wa.AutoGenObjectList:\r
for Ma in Pa.ModuleAutoGenList:\r
if Ma == None:\r
continue\r
if not Ma.IsLibrary:\r
- ModuleList.append (Ma)\r
+ ModuleList[Ma.Guid.upper()] = Ma\r
\r
MapBuffer = StringIO('')\r
- #\r
- # Rebase module to the preferred memory address before GenFds\r
- #\r
- self._CollectModuleMapBuffer(MapBuffer, ModuleList)\r
+ if self.LoadFixAddress != 0:\r
+ #\r
+ # Rebase module to the preferred memory address before GenFds\r
+ #\r
+ self._CollectModuleMapBuffer(MapBuffer, ModuleList)\r
if self.Fdf != '':\r
#\r
# create FDS again for the updated EFI image\r
#\r
# Create MAP file for all platform FVs after GenFds.\r
#\r
- self._CollectFvMapBuffer(MapBuffer, Wa)\r
+ self._CollectFvMapBuffer(MapBuffer, Wa, ModuleList)\r
#\r
# Save MAP buffer into MAP file.\r
#\r
ExtraData=self.ModuleFile\r
)\r
# Create MAP file when Load Fix Address is enabled.\r
- if self.LoadFixAddress != 0 and self.Target == "fds" and self.Fdf != '':\r
+ if self.Target == "fds" and self.Fdf != '':\r
for Arch in self.ArchList:\r
#\r
# Check whether the set fix address is above 4G for 32bit image.\r
#\r
# Get Module List\r
#\r
- ModuleList = []\r
+ ModuleList = {}\r
for Pa in Wa.AutoGenObjectList:\r
for Ma in Pa.ModuleAutoGenList:\r
if Ma == None:\r
continue\r
if not Ma.IsLibrary:\r
- ModuleList.append (Ma)\r
+ ModuleList[Ma.Guid.upper()] = Ma\r
\r
MapBuffer = StringIO('')\r
- #\r
- # Rebase module to the preferred memory address before GenFds\r
- #\r
- self._CollectModuleMapBuffer(MapBuffer, ModuleList)\r
- #\r
- # create FDS again for the updated EFI image\r
- #\r
- self._Build("fds", Wa)\r
+ if self.LoadFixAddress != 0:\r
+ #\r
+ # Rebase module to the preferred memory address before GenFds\r
+ #\r
+ self._CollectModuleMapBuffer(MapBuffer, ModuleList)\r
+ #\r
+ # create FDS again for the updated EFI image\r
+ #\r
+ self._Build("fds", Wa)\r
#\r
# Create MAP file for all platform FVs after GenFds.\r
#\r
- self._CollectFvMapBuffer(MapBuffer, Wa)\r
+ self._CollectFvMapBuffer(MapBuffer, Wa, ModuleList)\r
#\r
# Save MAP buffer into MAP file.\r
#\r
EdkLogger.error("build", BUILD_ERROR, "Failed to build module", ExtraData=GlobalData.gBuildingModule)\r
\r
# Create MAP file when Load Fix Address is enabled.\r
- if self.Target in ["", "all", "fds"] and self.LoadFixAddress != 0:\r
+ if self.Target in ["", "all", "fds"]:\r
for Arch in self.ArchList:\r
#\r
# Check whether the set fix address is above 4G for 32bit image.\r
#\r
# Get Module List\r
#\r
- ModuleList = []\r
+ ModuleList = {}\r
for Pa in Wa.AutoGenObjectList:\r
for Ma in Pa.ModuleAutoGenList:\r
if Ma == None:\r
continue\r
if not Ma.IsLibrary:\r
- ModuleList.append (Ma)\r
+ ModuleList[Ma.Guid.upper()] = Ma\r
#\r
# Rebase module to the preferred memory address before GenFds\r
#\r
MapBuffer = StringIO('')\r
- self._CollectModuleMapBuffer(MapBuffer, ModuleList)\r
+ if self.LoadFixAddress != 0:\r
+ self._CollectModuleMapBuffer(MapBuffer, ModuleList)\r
\r
# Generate FD image if there's a FDF file found\r
if self.Fdf != '' and self.Target in ["", "all", "fds"]:\r
LaunchCommand(Wa.BuildCommand + ["fds"], Wa.MakeFileDir)\r
\r
# Create MAP file for all platform FV after GenFds\r
- if self.Target in ["", "all", "fds"] and self.LoadFixAddress != 0:\r
+ if self.Target in ["", "all", "fds"]:\r
if self.Fdf != '':\r
#\r
# Create MAP file for all platform FVs after GenFds.\r
#\r
- self._CollectFvMapBuffer(MapBuffer, Wa)\r
+ self._CollectFvMapBuffer(MapBuffer, Wa, ModuleList)\r
#\r
# Save MAP buffer into MAP file.\r
#\r