One GenFvImage can handle all archs now.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@459 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
bbahnsen 2006-06-09 21:14:37 +00:00
parent 6de5f959d6
commit 1507f64ec4
3 changed files with 7 additions and 304 deletions

View File

@ -34,10 +34,6 @@ public class GenFvImageTask extends Task implements EfiDefine{
/// The name of input inf file /// The name of input inf file
/// ///
private String infFile=""; private String infFile="";
///
/// The target architecture.
///
private String arch="";
/** /**
execute execute
@ -56,25 +52,8 @@ public class GenFvImageTask extends Task implements EfiDefine{
path = path + File.separatorChar; path = path + File.separatorChar;
} }
// FIXME arch should be passed via schema attributes.
arch=System.getenv("ARCH");
if (arch == null) {
arch = "";
}
// FIXME end
if (arch.equalsIgnoreCase("IA32")){
command = path + "GenFvImage_Ia32";
}
else if (arch.equalsIgnoreCase("X64")){
command = path + "GenFvImage_X64";
}
else if (arch.equalsIgnoreCase("IPF")){
command = path + "GenFvImage_Ipf";
}
else {
command = path + "GenFvImage"; command = path + "GenFvImage";
}
String argument = infFile; String argument = infFile;
try { try {
@ -138,24 +117,4 @@ public class GenFvImageTask extends Task implements EfiDefine{
this.infFile = "-I " + infFile; this.infFile = "-I " + infFile;
} }
/**
getArch
This function is to get class member of arch.
@return The target architecture.
**/
public String getArch() {
return arch;
}
/**
setArch
This function is to set class member of arch.
@param arch The target architecture.
**/
public void setArch(String arch) {
this.arch = arch;
}
} }

View File

@ -1306,168 +1306,6 @@ Returns:
return EFI_SUCCESS; return EFI_SUCCESS;
} }
EFI_STATUS
RebaseFfsFile (
IN OUT EFI_FFS_FILE_HEADER *FfsFile,
IN EFI_PHYSICAL_ADDRESS BaseAddress
)
/*++
Routine Description:
This function determines if a file is XIP and should be rebased. It will
rebase any PE32 sections found in the file using the base address.
Arguments:
FfsFile A pointer to Ffs file image.
BaseAddress The base address to use for rebasing the file image.
Returns:
EFI_SUCCESS The image was properly rebased.
EFI_INVALID_PARAMETER An input parameter is invalid.
EFI_ABORTED An error occurred while rebasing the input file image.
EFI_OUT_OF_RESOURCES Could not allocate a required resource.
--*/
{
EFI_STATUS Status;
PE_COFF_LOADER_IMAGE_CONTEXT ImageContext;
UINTN MemoryImagePointer;
UINTN MemoryImagePointerAligned;
EFI_PHYSICAL_ADDRESS ImageAddress;
UINT64 ImageSize;
EFI_PHYSICAL_ADDRESS EntryPoint;
UINT32 Pe32FileSize;
UINT32 NewPe32BaseAddress;
UINTN Index;
EFI_FILE_SECTION_POINTER CurrentPe32Section;
UINT8 FileGuidString[80];
//
// Verify input parameters
//
if (FfsFile == NULL) {
return EFI_INVALID_PARAMETER;
}
//
// Convert the GUID to a string so we can at least report which file
// if we find an error.
//
PrintGuidToBuffer (&FfsFile->Name, FileGuidString, sizeof (FileGuidString), TRUE);
//
// Do some nominal checks on the file, then check for XIP.
//
Status = VerifyFfsFile (FfsFile);
if (EFI_ERROR (Status)) {
Error (NULL, 0, 0, "invalid FFS file", FileGuidString);
return EFI_INVALID_PARAMETER;
}
if (FfsFile->Type != EFI_FV_FILETYPE_SECURITY_CORE &&
FfsFile->Type != EFI_FV_FILETYPE_PEI_CORE &&
FfsFile->Type != EFI_FV_FILETYPE_PEIM
) {
//
// File is not XIP, so don't rebase
//
return EFI_SUCCESS;
}
//
// Rebase each PE32 section
//
for (Index = 1;; Index++) {
Status = GetSectionByType (FfsFile, EFI_SECTION_PE32, Index, &CurrentPe32Section);
if (EFI_ERROR (Status)) {
break;
}
//
// Calculate the PE32 base address, the FFS file base plus the offset of the PE32 section
//
NewPe32BaseAddress = ((UINT32) BaseAddress) + ((UINTN) CurrentPe32Section.Pe32Section - (UINTN) FfsFile);
//
// Initialize context
//
memset (&ImageContext, 0, sizeof (ImageContext));
ImageContext.Handle = (VOID *) ((UINTN) CurrentPe32Section.Pe32Section + sizeof (EFI_PE32_SECTION));
ImageContext.ImageRead = (PE_COFF_LOADER_READ_FILE) FfsRebaseImageRead;
Status = PeCoffLoaderGetImageInfo (&ImageContext);
if (EFI_ERROR (Status)) {
Error (NULL, 0, 0, "GetImageInfo() failed", FileGuidString);
return Status;
}
//
// Allocate a buffer for the image to be loaded into.
//
Pe32FileSize = GetLength (CurrentPe32Section.Pe32Section->CommonHeader.Size);
MemoryImagePointer = (UINTN) (malloc (Pe32FileSize + 0x1000));
MemoryImagePointerAligned = (MemoryImagePointer + 0x0FFF) & (-1 << 12);
if (MemoryImagePointerAligned == 0) {
Error (NULL, 0, 0, "memory allocation failure", NULL);
return EFI_OUT_OF_RESOURCES;
}
//
// bugbug
//
ImageContext.ImageAddress = MemoryImagePointerAligned;
Status = PeCoffLoaderLoadImage (&ImageContext);
if (EFI_ERROR (Status)) {
Error (NULL, 0, 0, "LoadImage() failure", FileGuidString);
free ((VOID *) MemoryImagePointer);
return Status;
}
Status = PeCoffLoaderRelocateImage (&ImageContext);
if (EFI_ERROR (Status)) {
Error (NULL, 0, 0, "RelocateImage() failure", FileGuidString);
free ((VOID *) MemoryImagePointer);
return Status;
}
ImageAddress = ImageContext.ImageAddress;
ImageSize = ImageContext.ImageSize;
EntryPoint = ImageContext.EntryPoint;
if (ImageSize > Pe32FileSize) {
Error (
NULL,
0,
0,
"rebased PE32 is larger than original PE32 image",
"0x%X > 0x%X on file %s",
ImageSize,
Pe32FileSize,
FileGuidString
);
free ((VOID *) MemoryImagePointer);
return EFI_ABORTED;
}
memcpy (CurrentPe32Section.Pe32Section, (VOID *) MemoryImagePointerAligned, Pe32FileSize);
free ((VOID *) MemoryImagePointer);
}
//
// the above for loop will always exit with EFI_NOT_FOUND if it completes
// normally. If Index == 1 at exit, then no PE32 sections were found. If it
// exits with any other error code, then something broke...
//
if (Status != EFI_NOT_FOUND) {
Error (NULL, 0, 0, "failed to parse PE32 section", FileGuidString);
return Status;
}
return EFI_SUCCESS;
}
EFI_STATUS EFI_STATUS
AddSymFile ( AddSymFile (

View File

@ -24,9 +24,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
<property environment="env"/> <property environment="env"/>
<property name="LINK_OUTPUT_TYPE" value="static"/> <property name="LINK_OUTPUT_TYPE" value="static"/>
<property name="BUILD_DIR_IA32" value="${PACKAGE_DIR}/${ToolName}/tmp/Ia32"/> <property name="BUILD_DIR" value="${PACKAGE_DIR}/${ToolName}/tmp"/>
<property name="BUILD_DIR_X64" value="${PACKAGE_DIR}/${ToolName}/tmp/X64"/>
<property name="BUILD_DIR_IPF" value="${PACKAGE_DIR}/${ToolName}/tmp/Ipf"/>
<target name="GenTool" depends="init, Tool"> <target name="GenTool" depends="init, Tool">
<echo message="Building the EDK Tool: ${ToolName}"/> <echo message="Building the EDK Tool: ${ToolName}"/>
@ -34,9 +32,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
<target name="init"> <target name="init">
<echo message="The EDK Tool: ${ToolName}"/> <echo message="The EDK Tool: ${ToolName}"/>
<mkdir dir="${BUILD_DIR_IA32}"/> <mkdir dir="${BUILD_DIR}"/>
<mkdir dir="${BUILD_DIR_X64}"/>
<mkdir dir="${BUILD_DIR_IPF}"/>
<if> <if>
<equals arg1="${GCC}" arg2="cygwin"/> <equals arg1="${GCC}" arg2="cygwin"/>
<then> <then>
@ -109,10 +105,10 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
</target> </target>
<target name="Tool" depends="init, GenFvImage, GenFvImage_Ia32, GenFvImage_X64, GenFvImage_Ipf"/> <target name="Tool" depends="init, GenFvImage"/>
<target name="GenFvImage" > <target name="GenFvImage" >
<cc name="${ToolChain}" objdir="${BUILD_DIR_IA32}" <cc name="${ToolChain}" objdir="${BUILD_DIR}"
outfile="${BIN_DIR}/${ToolName}" outfile="${BIN_DIR}/${ToolName}"
outtype="executable" outtype="executable"
optimize="speed"> optimize="speed">
@ -134,95 +130,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
<includepath path="${env.WORKSPACE}/MdePkg/Include/Library"/> <includepath path="${env.WORKSPACE}/MdePkg/Include/Library"/>
<includepath path="${env.WORKSPACE}/MdePkg/Include/ToBeRemoved"/> <includepath path="${env.WORKSPACE}/MdePkg/Include/ToBeRemoved"/>
<includepath path="${PACKAGE_DIR}/Common"/> <includepath path="${PACKAGE_DIR}/Common"/>
<libset dir="${LIB_DIR}" libs="CommonTools CustomizedCompress PeCoffLoader_Ia32"/> <libset dir="${LIB_DIR}" libs="CommonTools CustomizedCompress"/>
<linkerarg value="/nodefaultlib:libc.lib" unless="gcc"/>
<syslibset dir="${syslibdirs}" libs="${syslibs}" if="gcc"/>
<syslibset libs="RpcRT4" unless="gcc"/>
</cc>
</target>
<target name="GenFvImage_Ia32">
<cc name="${ToolChain}" objdir="${BUILD_DIR_IA32}"
outfile="${BIN_DIR}/${ToolName}_Ia32"
outtype="executable"
optimize="speed">
<defineset>
<define name="BUILDING_TOOLS"/>
<define name="TOOL_BUILD_IA32_TARGET"/>
</defineset>
<fileset dir="${basedir}/${ToolName}"
includes="${FileSet}"/>
<includepath path="${PACKAGE_DIR}/${ToolName}"/>
<includepath path="${env.WORKSPACE}/MdePkg/Include"/>
<includepath path="${env.WORKSPACE}/MdePkg/Include"/>
<includepath path="${env.WORKSPACE}/MdePkg/Include/Ia32"/>
<includepath path="${env.WORKSPACE}/MdePkg/Include/Common"/>
<includepath path="${env.WORKSPACE}/MdePkg/Include/Protocol"/>
<includepath path="${env.WORKSPACE}/MdePkg/Include/Library"/>
<includepath path="${env.WORKSPACE}/MdePkg/Include/ToBeRemoved"/>
<includepath path="${PACKAGE_DIR}/Common"/>
<libset dir="${LIB_DIR}" libs="CommonTools CustomizedCompress PeCoffLoader_Ia32"/>
<linkerarg value="/nodefaultlib:libc.lib" unless="gcc"/>
<syslibset dir="${syslibdirs}" libs="${syslibs}" if="gcc"/>
<syslibset libs="RpcRT4" unless="gcc"/>
</cc>
</target>
<target name="GenFvImage_X64">
<cc name="${ToolChain}" objdir="${BUILD_DIR_X64}"
outfile="${BIN_DIR}/${ToolName}_X64"
outtype="executable"
optimize="speed">
<defineset>
<define name="BUILDING_TOOLS"/>
<define name="TOOL_BUILD_X64_TARGET"/>
</defineset>
<fileset dir="${basedir}/${ToolName}"
includes="${FileSet}"/>
<includepath path="${PACKAGE_DIR}/${ToolName}"/>
<includepath path="${env.WORKSPACE}/MdePkg/Include"/>
<includepath path="${env.WORKSPACE}/MdePkg/Include/Ia32"/>
<includepath path="${env.WORKSPACE}/MdePkg/Include/Common"/>
<includepath path="${env.WORKSPACE}/MdePkg/Include/Protocol"/>
<includepath path="${env.WORKSPACE}/MdePkg/Include/Library"/>
<includepath path="${env.WORKSPACE}/MdePkg/Include/ToBeRemoved"/>
<includepath path="${PACKAGE_DIR}/Common"/>
<libset dir="${LIB_DIR}" libs="CommonTools CustomizedCompress PeCoffLoader_X64"/>
<linkerarg value="/nodefaultlib:libc.lib" unless="gcc"/>
<syslibset dir="${syslibdirs}" libs="${syslibs}" if="gcc"/>
<syslibset libs="RpcRT4" unless="gcc"/>
</cc>
</target>
<target name="GenFvImage_Ipf">
<cc name="${ToolChain}" objdir="${BUILD_DIR_IPF}"
outfile="${BIN_DIR}/${ToolName}_Ipf"
outtype="executable"
optimize="speed">
<defineset>
<define name="BUILDING_TOOLS"/>
<define name="TOOL_BUILD_IPF_TARGET"/>
</defineset>
<fileset dir="${basedir}/${ToolName}"
includes="${FileSet}"/>
<includepath path="${PACKAGE_DIR}/${ToolName}"/>
<includepath path="${env.WORKSPACE}/MdePkg/Include"/>
<includepath path="${env.WORKSPACE}/MdePkg/Include/Ia32"/>
<includepath path="${env.WORKSPACE}/MdePkg/Include/Common"/>
<includepath path="${env.WORKSPACE}/MdePkg/Include/Protocol"/>
<includepath path="${env.WORKSPACE}/MdePkg/Include/Library"/>
<includepath path="${env.WORKSPACE}/MdePkg/Include/ToBeRemoved"/>
<includepath path="${PACKAGE_DIR}/Common"/>
<libset dir="${LIB_DIR}" libs="CommonTools CustomizedCompress PeCoffLoader_Ipf"/>
<linkerarg value="/nodefaultlib:libc.lib" unless="gcc"/> <linkerarg value="/nodefaultlib:libc.lib" unless="gcc"/>
<syslibset dir="${syslibdirs}" libs="${syslibs}" if="gcc"/> <syslibset dir="${syslibdirs}" libs="${syslibs}" if="gcc"/>
<syslibset libs="RpcRT4" unless="gcc"/> <syslibset libs="RpcRT4" unless="gcc"/>
@ -232,9 +140,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
<target name="clean" depends="init"> <target name="clean" depends="init">
<echo message="Removing Intermediate Files Only"/> <echo message="Removing Intermediate Files Only"/>
<delete> <delete>
<fileset dir="${BUILD_DIR_IA32}" includes="*.obj"/> <fileset dir="${BUILD_DIR}" includes="*.obj"/>
<fileset dir="${BUILD_DIR_X64}" includes="*.obj"/>
<fileset dir="${BUILD_DIR_IPF}" includes="*.obj"/>
</delete> </delete>
</target> </target>