- Fixed EDKT240. Now the Blank.pad file for alignment purpose will no longer be needed.

- Fixed EDKT366. For NT32, using "build run" to launch the NT32 emulator. The run.cmd is still be generated in the ${TARGET_DIR}

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2305 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
jwang36
2007-01-25 01:25:02 +00:00
parent 822d4f3a53
commit e3cc406130
15 changed files with 263 additions and 57 deletions

View File

@ -33,6 +33,7 @@ import org.apache.tools.ant.BuildException;
**/
public class CompressSection implements Section, FfsTypes {
private int alignment = 0;
//
// The attribute of compressName.
//
@ -197,4 +198,16 @@ public class CompressSection implements Section, FfsTypes {
public void addTool (Tool tool) {
sectList.add(tool);
}
public int getAlignment() {
return alignment;
}
public void setAlignment(int alignment) {
if (alignment > 7) {
this.alignment = 7;
} else {
this.alignment = alignment;
}
}
}

View File

@ -741,15 +741,53 @@ public class GenFfsFileTask extends Task implements EfiDefine, FfsTypes {
return value;
}
/**
genFfs
This function is to generate FFS file.
@param ffsFile Name of FFS file.
@param isOrg Flag to indicate generate ORG ffs file or not.
**/
private void alignSection(DataOutputStream dataBuffer, int dataSize, int alignment) throws BuildException {
if (alignment == 0) {
return;
}
dataSize += 4; // take the section header into account
int[] alignedBytes = {0, 16, 128, 512, 1024, 4096, 32768, 65536};
int padSize = (alignedBytes[alignment] - dataSize) & (alignedBytes[alignment] - 1);
if (padSize == 0) {
//
// already aligned
//
return;
}
//
// if the pad size is not times of 4, there must be something wrong in previous sections
//
if (((4 - padSize) & (4 - 1)) != 0) {
EdkLog.log(this, EdkLog.EDK_ERROR, "PAD section size must be 4-byte aligned (" + padSize + ")!");
throw new BuildException ("Alignment can't be satisfied!");
}
byte[] pad = new byte[padSize];
//
// first three byte stores the section size
//
pad[0] = (byte)(padSize & 0xff);
pad[1] = (byte)((padSize >> 8) & 0xff);
pad[2] = (byte)((padSize >> 16) & 0xff);
//
// the fourth byte are section type. use raw type (0x19)
//
pad[3] = 0x19;
try {
dataBuffer.write(pad);
} catch (Exception e) {
throw new BuildException(e.getMessage());
}
}
/**
genFfs
This function is to generate FFS file.
@param ffsFile Name of FFS file.
@param isOrg Flag to indicate generate ORG ffs file or not.
**/
private void genFfs(File ffsFile) throws BuildException {
Section sect;
int fileSize;
@ -775,6 +813,11 @@ public class GenFfsFileTask extends Task implements EfiDefine, FfsTypes {
sect = (Section)sectionIter.next();
try {
int alignment = sect.getAlignment();
if (this.ffsAttribDataAlignment < alignment) {
this.ffsAttribDataAlignment = alignment;
}
alignSection(dataBuffer, dataBuffer.size(), alignment);
//
// The last section don't need 4 byte ffsAligment.
//
@ -812,6 +855,12 @@ public class GenFfsFileTask extends Task implements EfiDefine, FfsTypes {
stringToGuid (this.ffsFileGuid, ffsHeader.name);
}
//
// because we may have changed the ffsAttribDataAlignment, we need to refresh attributes
//
this.attributes &= ~(((byte)7) << 3);
this.attributes |= (((byte)this.ffsAttribDataAlignment) << 3);
ffsHeader.ffsAttributes = this.attributes;
if ((ffsHeader.fileType = stringToType(this.ffsFileType))== -1) {
throw new BuildException ("FFS_FILE_TYPE unknow!\n");

View File

@ -32,6 +32,7 @@ import org.apache.tools.ant.types.Commandline;
import org.tianocore.common.logger.EdkLog;
public class GenSectionTask extends Task implements EfiDefine, Section, FfsTypes {
private int alignment = 0;
//
// Tool name
//
@ -269,6 +270,18 @@ public class GenSectionTask extends Task implements EfiDefine, Section, FfsTypes
this.sectFileList.add(task);
}
public int getAlignment() {
return alignment;
}
public void setAlignment(int alignment) {
if (alignment > 7) {
this.alignment = 7;
} else {
this.alignment = alignment;
}
}
public void toBuffer(DataOutputStream buffer){
//
// Search SectionList find earch section and call it's

View File

@ -25,6 +25,7 @@ import org.apache.tools.ant.BuildException;
**/
public class SectFile implements Section {
private String fileName = ""; /// section file name
private int alignment = 0;
/**
Get method of ANT task/datatype for "FileName" attribute
@ -44,6 +45,18 @@ public class SectFile implements Section {
this.fileName = fileName;
}
public int getAlignment() {
return alignment;
}
public void setAlignment(int alignment) {
if (alignment > 7) {
this.alignment = 7;
} else {
this.alignment = alignment;
}
}
public SectFile (){
}

View File

@ -19,5 +19,8 @@ import java.io.DataOutputStream;
Section interface is for geting the contain buffer form compress, tool, and sectFile
**/
public interface Section {
int alignment = 0;
public void toBuffer (DataOutputStream buffer);
public void setAlignment(int alignment);
public int getAlignment();
}

View File

@ -32,6 +32,7 @@ import org.tianocore.common.logger.EdkLog;
**/
public class Tool implements EfiDefine, Section {
private int alignment = 0;
private String toolName = "";
private ToolArg toolArgList = new ToolArg();
private Input inputFiles = new Input();
@ -247,6 +248,19 @@ public class Tool implements EfiDefine, Section {
public synchronized int getRand() {
return ran.nextInt();
}
public int getAlignment() {
return alignment;
}
public void setAlignment(int alignment) {
if (alignment > 7) {
this.alignment = 7;
} else {
this.alignment = alignment;
}
}
}

View File

@ -347,6 +347,7 @@ public class FfsProcess {
**/
private void dealSection(int mode, Document doc, Element root, XmlCursor cursor, Vector<String> list) {
String type = cursor.getAttributeText(new QName("SectionType"));
String alignment = cursor.getAttributeText(new QName("Alignment"));
//
// Judge if file is specified? Yes, just use the file, else call Build Macro
@ -399,6 +400,9 @@ public class FfsProcess {
} else {
ele.setAttribute("fileName", fileName);
}
if (alignment != null) {
ele.setAttribute("Alignment", alignment);
}
root.appendChild(ele);
}
}

View File

@ -323,11 +323,7 @@ public class FrameworkBuildTask extends Task{
}
public void setType(String type) {
if (type.equalsIgnoreCase("clean") || type.equalsIgnoreCase("cleanall")) {
this.type = type.toLowerCase();
} else {
this.type = "all";
}
this.type = type.toLowerCase();
}
private void readTargetFile() throws EdkException{

View File

@ -327,10 +327,8 @@ public class GenBuildTask extends Ant {
if (type.equalsIgnoreCase("all") || type.equalsIgnoreCase("build")) {
applyBuild(targetList[i], toolchainList[j], fpdModuleId);
} else if (type.equalsIgnoreCase("clean")) {
applyClean(fpdModuleId);
} else if (type.equalsIgnoreCase("cleanall")) {
applyCleanall(fpdModuleId);
} else {
applyNonBuildTarget(fpdModuleId);
}
}
}
@ -675,6 +673,24 @@ public class GenBuildTask extends Ant {
antCall(antFilename, null);
}
private void applyNonBuildTarget(FpdModuleIdentification fpdModuleId){
//
// if it is CUSTOM_BUILD
// then call the exist BaseName_build.xml directly.
//
if (moduleId.getModuleType().equalsIgnoreCase("USER_DEFINED")) {
EdkLog.log(this, "Calling user-defined " + moduleId.getName() + "_build.xml");
String antFilename = getProject().getProperty("MODULE_DIR") + File.separatorChar + moduleId.getName() + "_build.xml";
antCall(antFilename, this.type);
return ;
}
String antFilename = getProject().getProperty("DEST_DIR_OUTPUT") + File.separatorChar + moduleId.getName() + "_build.xml";
antCall(antFilename, this.type);
}
private void applyClean(FpdModuleIdentification fpdModuleId){
//
// if it is CUSTOM_BUILD

View File

@ -159,7 +159,8 @@ public class PlatformBuildFileGenerator {
// User Extension Post build
//
applyUserExtensionsPostBuild(document, root);
applyUserExtensions(document, root);
document.appendChild(rootComment);
document.appendChild(root);
//
@ -630,7 +631,59 @@ public class PlatformBuildFileGenerator {
root.appendChild(ele);
}
private void applyUserExtensions(Document document, Node root) {
Node[] nodeList = saq.getFpdUserExtensions();
for (int nodeIndex = 0; nodeIndex < nodeList.length; ++nodeIndex) {
Node node = nodeList[nodeIndex];
//
// User Extensions
//
root.appendChild(document.createComment("User Defined Target"));
Element ele = document.createElement("target");
ele.setAttribute("name", node.getAttributes().getNamedItem("Identifier").getNodeValue());
if (node != null) {
//
// For every Target and ToolChain
//
String[] targetList = GlobalData.getToolChainInfo().getTargets();
for (int i = 0; i < targetList.length; i++){
String[] toolchainList = GlobalData.getToolChainInfo().getTagnames();
for(int j = 0; j < toolchainList.length; j++){
//
// Prepare FV_DIR
//
String ffsCommonDir = project.getProperty("BUILD_DIR") + File.separatorChar
+ targetList[i] + "_"
+ toolchainList[j];
File fvDir = new File(ffsCommonDir + File.separatorChar + "FV");
Element fvEle = document.createElement("var");
fvEle.setAttribute("name", "FV_DIR");
fvEle.setAttribute("value", fvDir.getPath().replaceAll("(\\\\)", "/"));
ele.appendChild(fvEle);
Element targetDirEle = document.createElement("var");
targetDirEle.setAttribute("name", "TARGET_DIR");
targetDirEle.setAttribute("value", ffsCommonDir.replaceAll("(\\\\)", "/"));
ele.appendChild(targetDirEle);
NodeList childNodes = node.getChildNodes();
for (int k = 0; k < childNodes.getLength(); k++) {
Node childItem = childNodes.item(k);
if (childItem.getNodeType() == Node.ELEMENT_NODE) {
ele.appendChild(recursiveNode(childItem, document));
}
}
}
}
}
root.appendChild(ele);
}
}
private Element recursiveNode(Node node, Document document) {
Element root = document.createElement(node.getNodeName());
NamedNodeMap attr = node.getAttributes();

View File

@ -1492,6 +1492,22 @@ public class SurfaceAreaQuery {
return a.getDomNode();
}
public Node[] getFpdUserExtensions() {
String[] xPath = new String[] { "/UserExtensions[@UserID='TianoCore' and not(@Identifier='1') and not(@Identifier='0')]" };
Object[] queryResult = get("PlatformSurfaceArea", xPath);
if (queryResult == null || queryResult.length == 0) {
return new Node[0];
}
Node[] nodeList = new Node[queryResult.length];
for (int i = 0; i < queryResult.length; ++i) {
UserExtensionsDocument.UserExtensions a = (UserExtensionsDocument.UserExtensions)queryResult[i];
nodeList[i] = a.getDomNode();
}
return nodeList;
}
/**
* Retrieve FV image option information
*