mirror of https://github.com/acidanthera/audk.git
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:
parent
6de5f959d6
commit
1507f64ec4
|
@ -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.
|
command = path + "GenFvImage";
|
||||||
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";
|
|
||||||
}
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 (
|
||||||
|
|
|
@ -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>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue