]> git.proxmox.com Git - mirror_edk2.git/blobdiff - Tools/Source/FrameworkTasks/org/tianocore/framework/tasks/GenFfsFileTask.java
Added stringToInt method to handle hex integer for FFS_ATTRIB_DATA_ALIGNMENT
[mirror_edk2.git] / Tools / Source / FrameworkTasks / org / tianocore / framework / tasks / GenFfsFileTask.java
index 00712d8bb6875459c9a079a6cebb0cae0a4c861c..2c46f09d659d7a449a91775043a48d9843c00bba 100644 (file)
@@ -58,6 +58,10 @@ public class GenFfsFileTask extends Task implements EfiDefine, FfsTypes {
     ///\r
     String  baseName        = "";\r
     ///\r
+    /// \r
+    /// \r
+    String moduleType;\r
+    ///\r
     /// module Guid\r
     ///\r
     String  ffsFileGuid        = "";\r
@@ -81,11 +85,11 @@ public class GenFfsFileTask extends Task implements EfiDefine, FfsTypes {
     ///\r
     boolean ffsAttribRecovery        = false;\r
     ///\r
-    /// ffsAligenment value is used to set the corresponding bit in the output \r
+    /// ffsAttribDataAlignment value is used to set the corresponding bit in the output \r
     /// FFS file header.The specified FFS alignment must be a value between 0 \r
     /// and 7 inclusive\r
     ///\r
-    int     ffsAlignment       = 0;\r
+    int     ffsAttribDataAlignment       = 0;\r
     ///\r
     /// ffsAttribChecksum value is used to set the corresponding bit in the \r
     /// output FFS file header\r
@@ -114,13 +118,17 @@ public class GenFfsFileTask extends Task implements EfiDefine, FfsTypes {
       \r
       GenFfsFileTask execute is to generate ffs file according to input section \r
       dscriptive information.\r
-     */\r
+    **/\r
     public void execute() throws BuildException {\r
         Section           sect;\r
         int               fileSize;\r
+        int               orgFileSize;\r
         int               fileDataSize;\r
+        int               orgFileDataSize;\r
         File              ffsFile;\r
+        File              ffsOrgFile;\r
         FfsHeader         ffsHeader = new FfsHeader();  \r
+        FfsHeader         orgFfsHeader = new FfsHeader();\r
         String            ffsSuffix = "";\r
         String            outputPath = "";\r
 \r
@@ -128,7 +136,7 @@ public class GenFfsFileTask extends Task implements EfiDefine, FfsTypes {
         //  Get Fraemwork_Tools_Path\r
         //\r
         Project pj = this.getOwningTarget().getProject();\r
-        path       = pj.getProperty("env.Framework_Tools_Path");\r
+        path       = pj.getProperty("env.FRAMEWORK_TOOLS_PATH");\r
 \r
         //\r
         //  Check does the BaseName, Guid, FileType set value.\r
@@ -149,7 +157,7 @@ public class GenFfsFileTask extends Task implements EfiDefine, FfsTypes {
         //  Create ffs file. File name = FfsFileGuid + BaseName + ffsSuffix.\r
         //  If outputDir's value was set,  file will output to the outputDir.\r
         //\r
-        ffsSuffix = TypeToSuffix (this.ffsFileType);\r
+        ffsSuffix = TypeToSuffix (this.moduleType);\r
         if (!this.outputDir.equals("")) {\r
             String temp;\r
             outputPath = this.outputDir;\r
@@ -161,18 +169,29 @@ public class GenFfsFileTask extends Task implements EfiDefine, FfsTypes {
 \r
         }\r
 \r
-        ffsFile = new File (outputPath + this.ffsFileGuid + '-' + this.baseName + ffsSuffix);  \r
-        System.out.print("General Ffs file: file name is:\n");\r
-        System.out.print(outputPath + this.ffsFileGuid + '-' + this.baseName + ffsSuffix);\r
-        System.out.print("\n");\r
-\r
+        String ffsFilePath = outputPath + this.ffsFileGuid + '-' + this.baseName + ffsSuffix;\r
+        ffsFile = new File (ffsFilePath);  \r
+        //\r
+        // Create ffs ORG file. fileName = FfsFileGuid + BaseName + ffsSuffix +\r
+        // ".org".\r
         //\r
-        //  Create file output stream -- dataBuffer.\r
-        //   \r
+        ffsOrgFile = new File(ffsFilePath + ".org");\r
+           \r
+        log(ffsFile.getName());\r
+        log(ffsOrgFile.getName());\r
         try {\r
+            //\r
+            //  Create file output stream -- dataBuffer.\r
+            //\r
             FileOutputStream dataFs     = new FileOutputStream (ffsFile.getAbsolutePath());\r
             DataOutputStream dataBuffer = new DataOutputStream (dataFs);\r
-\r
+            \r
+            //\r
+            // Create org file output stream -- orgDataBuffer\r
+            //\r
+            FileOutputStream orgDataFs     = new FileOutputStream (ffsOrgFile.getAbsolutePath());\r
+            DataOutputStream orgDataBuffer = new DataOutputStream (orgDataFs);\r
+            \r
             //\r
             //  Search SectionList find earch section and call it's \r
             //  ToBuffer function.\r
@@ -185,12 +204,13 @@ public class GenFfsFileTask extends Task implements EfiDefine, FfsTypes {
                     //\r
                     //  The last section don't need 4 byte ffsAligment.\r
                     //\r
-                    sect.toBuffer((DataOutputStream)dataBuffer);\r
+                    sect.toBuffer((DataOutputStream)dataBuffer, (DataOutputStream) orgDataBuffer);\r
                 } catch (Exception e) {\r
                     throw new BuildException (e.getMessage());\r
                 }\r
             }\r
             dataBuffer.close();\r
+            orgDataBuffer.close();\r
         } catch (Exception e) {\r
             throw new BuildException (e.getMessage());\r
         }\r
@@ -207,22 +227,40 @@ public class GenFfsFileTask extends Task implements EfiDefine, FfsTypes {
             FileInputStream fi = new FileInputStream (ffsFile.getAbsolutePath());\r
             DataInputStream di = new DataInputStream (fi);\r
             di.read(fileBuffer);\r
-            di.close(); \r
-\r
+            di.close();\r
+            \r
+            //\r
+            // create input org stream to read file data\r
+            //\r
+            byte[] orgFileBuffer = new byte[(int)ffsOrgFile.length()];\r
+            FileInputStream ofi  = new FileInputStream (ffsOrgFile.getAbsolutePath());\r
+            DataInputStream odi  = new DataInputStream (ofi);\r
+            odi.read(orgFileBuffer);\r
+            odi.close();\r
 \r
             //\r
             //  Add GUID to header struct\r
             //\r
             if (this.ffsFileGuid != null) {\r
                 stringToGuid (this.ffsFileGuid, ffsHeader.name);\r
+                //\r
+                // Add Guid to org header struct\r
+                //\r
+                stringToGuid (this.ffsFileGuid, orgFfsHeader.name);\r
             }\r
 \r
             ffsHeader.ffsAttributes = this.attributes;\r
             if ((ffsHeader.fileType = stringToType(this.ffsFileType))== -1) {\r
                 throw new BuildException ("FFS_FILE_TYPE unknow!\n");\r
             }\r
-\r
-\r
+            \r
+            //\r
+            // Copy ffsHeader.ffsAttribute and fileType to orgFfsHeader.ffsAttribute\r
+            // and fileType\r
+            //            \r
+            orgFfsHeader.ffsAttributes = ffsHeader.ffsAttributes;\r
+            orgFfsHeader.fileType      = ffsHeader.fileType;\r
+            \r
             //\r
             //  Adjust file size. The function is used to tripe the last \r
             //  section padding of 4 binary boundary. \r
@@ -231,15 +269,21 @@ public class GenFfsFileTask extends Task implements EfiDefine, FfsTypes {
             if (ffsHeader.fileType != EFI_FV_FILETYPE_RAW) {\r
 \r
                 fileDataSize = adjustFileSize (fileBuffer);\r
+                orgFileDataSize = adjustFileSize (orgFileBuffer);\r
 \r
             } else {\r
                 fileDataSize = fileBuffer.length;\r
+                orgFileDataSize = orgFileBuffer.length;\r
             }\r
 \r
             //\r
             //  1. add header size to file size\r
             //\r
             fileSize = fileDataSize + ffsHeader.getSize();\r
+            //\r
+            //     add header size to org file size\r
+            //\r
+            orgFileSize = orgFileDataSize + ffsHeader.getSize();\r
 \r
             if ((ffsHeader.ffsAttributes & FFS_ATTRIB_TAIL_PRESENT) != 0) {\r
                 if (ffsHeader.fileType == EFI_FV_FILETYPE_FFS_PAD) {\r
@@ -256,6 +300,7 @@ public class GenFfsFileTask extends Task implements EfiDefine, FfsTypes {
                                              );            \r
                 }\r
                 fileSize = fileSize + 2;\r
+                orgFileSize = orgFileSize + 2;\r
             }\r
 \r
             //\r
@@ -264,7 +309,14 @@ public class GenFfsFileTask extends Task implements EfiDefine, FfsTypes {
             ffsHeader.ffsFileSize[0] = (byte)(fileSize & 0x00FF);\r
             ffsHeader.ffsFileSize[1] = (byte)((fileSize & 0x00FF00)>>8);\r
             ffsHeader.ffsFileSize[2] = (byte)(((int)fileSize & 0xFF0000)>>16);\r
-\r
+            \r
+            //\r
+            //     set file size to org header struct\r
+            //\r
+            orgFfsHeader.ffsFileSize[0] = (byte)(orgFileSize & 0x00FF);\r
+            orgFfsHeader.ffsFileSize[1] = (byte)((orgFileSize & 0x00FF00)>>8);\r
+            orgFfsHeader.ffsFileSize[2] = (byte)(((int)orgFileSize & 0xFF0000)>>16);\r
+            \r
             //\r
             //  Fill in checksums and state, these must be zero for checksumming\r
             //\r
@@ -272,21 +324,43 @@ public class GenFfsFileTask extends Task implements EfiDefine, FfsTypes {
                                                                  ffsHeader.structToBuffer(),\r
                                                                  ffsHeader.getSize()\r
                                                                  );\r
-\r
+            //\r
+            // Fill in org file's header check sum and state\r
+            //\r
+            orgFfsHeader.integrityCheck.header = calculateChecksum8 (\r
+                                                                    orgFfsHeader.structToBuffer(),\r
+                                                                    orgFfsHeader.getSize()\r
+                                                                    );\r
+            \r
             if ((this.attributes & FFS_ATTRIB_CHECKSUM) != 0) {\r
                 if ((this.attributes & FFS_ATTRIB_TAIL_PRESENT) != 0) {\r
                     ffsHeader.integrityCheck.file = calculateChecksum8 (\r
                                                                        fileBuffer, \r
                                                                        fileDataSize\r
                                                                        );\r
+                    //\r
+                    // Add org file header\r
+                    //\r
+                    orgFfsHeader.integrityCheck.file = calculateChecksum8 (\r
+                                                                           orgFileBuffer,\r
+                                                                           orgFileDataSize\r
+                                                                           );\r
                 } else {\r
                     ffsHeader.integrityCheck.file = calculateChecksum8 (\r
                                                                        fileBuffer,\r
                                                                        fileDataSize\r
                                                                        );\r
+                    //\r
+                    // Add org file header\r
+                    //\r
+                    orgFfsHeader.integrityCheck.file = calculateChecksum8 (\r
+                                                                          orgFileBuffer,\r
+                                                                          orgFileDataSize\r
+                                                                          );\r
                 }\r
             } else {\r
                 ffsHeader.integrityCheck.file = FFS_FIXED_CHECKSUM;\r
+                orgFfsHeader.integrityCheck.file = FFS_FIXED_CHECKSUM;\r
             }\r
 \r
             //\r
@@ -295,21 +369,30 @@ public class GenFfsFileTask extends Task implements EfiDefine, FfsTypes {
             ffsHeader.ffsState = EFI_FILE_HEADER_CONSTRUCTION | \r
                                  EFI_FILE_HEADER_VALID | \r
                                  EFI_FILE_DATA_VALID;\r
-\r
-\r
+            orgFfsHeader.ffsState = ffsHeader.ffsState;\r
+            \r
             //\r
             // create output stream to first write header data in file, then write sect data in file.\r
             //\r
             FileOutputStream headerFfs = new FileOutputStream (ffsFile.getAbsolutePath());\r
             DataOutputStream ffsBuffer = new DataOutputStream (headerFfs);\r
-\r
+            \r
+            FileOutputStream orgHeaderFfs = new FileOutputStream (ffsOrgFile.getAbsolutePath());\r
+            DataOutputStream orgFfsBuffer = new DataOutputStream (orgHeaderFfs);\r
+            \r
             //\r
             //  Add header struct and file data to FFS file\r
             //\r
             ffsBuffer.write(ffsHeader.structToBuffer());\r
+            orgFfsBuffer.write(orgFfsHeader.structToBuffer());\r
+            \r
             for (int i = 0; i< fileDataSize; i++) {\r
                 ffsBuffer.write(fileBuffer[i]);\r
             }\r
+            \r
+            for (int i = 0; i < orgFileDataSize; i++){\r
+                orgFfsBuffer.write(orgFileBuffer[i]);\r
+            }\r
 \r
             //\r
             //  If there is a tail, then set it\r
@@ -333,6 +416,9 @@ public class GenFfsFileTask extends Task implements EfiDefine, FfsTypes {
                 tailByte[1] = (byte)((tailValue & 0xff00)>>8);  \r
                 ffsBuffer.write(tailByte[0]);\r
                 ffsBuffer.write(tailByte[1]);\r
+                \r
+                orgFfsBuffer.write(tailByte[0]);\r
+                orgFfsBuffer.write(tailByte[1]);\r
             }\r
 \r
             //\r
@@ -340,8 +426,9 @@ public class GenFfsFileTask extends Task implements EfiDefine, FfsTypes {
             //  the buffer can't be rewritten to file. \r
             //\r
             ffsBuffer.close();\r
-            System.out.print ("Successful create ffs file!\n");\r
+            orgFfsBuffer.close();\r
         } catch (Exception e) {\r
+            log("genffsfile failed!");\r
             throw new BuildException (e.getMessage());\r
         }\r
     }   \r
@@ -403,8 +490,8 @@ public class GenFfsFileTask extends Task implements EfiDefine, FfsTypes {
       This function is to get the ffsAligment\r
       @return  The value of ffsAligment.\r
     **/\r
-    public int getFfsAligment() {\r
-        return this.ffsAlignment;\r
+    public int getFfsAttribDataAlignment() {\r
+        return this.ffsAttribDataAlignment;\r
     }\r
 \r
     /**\r
@@ -413,12 +500,12 @@ public class GenFfsFileTask extends Task implements EfiDefine, FfsTypes {
       This function is to set ffsAligment \r
       @param  ffsAligment     The value of ffsAligment.\r
     **/\r
-    public void setFfsAligment(int ffsAligment) {\r
-        this.ffsAlignment = ffsAligment;\r
-        if (this.ffsAlignment > 7) {\r
-            throw new BuildException ("FFS_ALIGMENT Scope is 0-7");\r
+    public void setFfsAttribDataAlignment(String ffsAligment) {\r
+        this.ffsAttribDataAlignment = stringToInt(ffsAligment.replaceAll(" ", "").toLowerCase());\r
+        if (this.ffsAttribDataAlignment < 0 || this.ffsAttribDataAlignment > 7) {\r
+            throw new BuildException ("FFS_ATTRIB_DATA_ALIGMENT must be 0-7");\r
         } else {\r
-            attributes |= (((byte)this.ffsAlignment) << 3);\r
+            attributes |= (((byte)this.ffsAttribDataAlignment) << 3);\r
         }\r
     }\r
 \r
@@ -614,43 +701,21 @@ public class GenFfsFileTask extends Task implements EfiDefine, FfsTypes {
       @return                The suffix of ffs file\r
     **/\r
     private String TypeToSuffix (String ffsFileType){\r
-        if (ffsFileType.equals("EFI_FV_FILETYPE_ALL")) {\r
-            return "";\r
-        }\r
-        if (ffsFileType.equals("EFI_FV_FILETYPE_RAW")) {\r
-            return EFI_FV_FFS_FILETYPE_STR;\r
-        }\r
-        if (ffsFileType.equals("EFI_FV_FILETYPE_FREEFORM")) {\r
-            return EFI_FV_FFS_FILETYPE_STR;\r
-        }\r
-        if (ffsFileType.equals("EFI_FV_FILETYPE_SECURITY_CORE")) {\r
-            return EFI_FV_SEC_FILETYPE_STR;\r
-        }\r
-        if (ffsFileType.equals("EFI_FV_FILETYPE_PEI_CORE")) {\r
-            return EFI_FV_PEI_FILETYPE_STR;\r
-        }\r
-        if (ffsFileType.equals("EFI_FV_FILETYPE_DXE_CORE")) {\r
-            return EFI_FV_DXE_FILETYPE_STR;\r
-        }\r
-        if (ffsFileType.equals("EFI_FV_FILETYPE_PEIM")) {\r
-            return EFI_FV_PEI_FILETYPE_STR;\r
-        }\r
-        if (ffsFileType.equals("EFI_FV_FILETYPE_DRIVER")) {\r
-            return  EFI_FV_DXE_FILETYPE_STR;\r
-        }\r
-        if (ffsFileType.equals("EFI_FV_FILETYPE_COMBINED_PEIM_DRIVER")) {\r
-            return EFI_FV_PEI_FILETYPE_STR;\r
-        }\r
-        if (ffsFileType.equals("EFI_FV_FILETYPE_APPLICATION")) {\r
-            return EFI_FV_APP_FILETYPE_STR;\r
-        }\r
-        if (ffsFileType.equals("EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE")) {\r
-            return EFI_FV_FVI_FILETYPE_STR;\r
-        }\r
-        if (ffsFileType.equals("EFI_FV_FILETYPE_FFS_PAD")) {\r
-            return EFI_FV_FFS_FILETYPE_STR;\r
+        String[][] suffix = { { "BASE", ".FFS"},\r
+                              { "SEC", ".SEC" }, { "PEI_CORE", ".PEI" }, \r
+                              { "PEIM", ".PEI" }, { "DXE_CORE", ".DXE" },\r
+                              { "DXE_DRIVER", ".DXE" }, { "DXE_RUNTIME_DRIVER", ".DXE" }, \r
+                              { "DXE_SAL_DRIVER", ".DXE" }, { "DXE_SMM_DRIVER", ".DXE" }, \r
+                              { "TOOL", ".FFS" }, { "UEFI_DRIVER", ".DXE" },\r
+                              { "UEFI_APPLICATION", ".APP" }, { "USER_DEFINED", ".FFS" } };\r
+\r
+        for (int i = 0; i < suffix.length; i++) {\r
+            if (suffix[i][0].equalsIgnoreCase(moduleType)) {\r
+                return suffix[i][1];\r
+            }\r
         }\r
-        return "";\r
+\r
+        return ".FFS";\r
     }\r
 \r
 \r
@@ -672,7 +737,7 @@ public class GenFfsFileTask extends Task implements EfiDefine, FfsTypes {
         }\r
 \r
         if (ffsFileType.equals("EFI_FV_FILETYPE_FREEFORM")) {\r
-            return(byte)EFI_FV_FILETYPE_SECURITY_CORE;\r
+            return(byte)EFI_FV_FILETYPE_FREEFORM;\r
         }\r
 \r
         if (ffsFileType.equals("EFI_FV_FILETYPE_SECURITY_CORE")) {\r
@@ -875,4 +940,44 @@ public class GenFfsFileTask extends Task implements EfiDefine, FfsTypes {
     public void setOutputDir(String outputDir) {\r
         this.outputDir = outputDir;\r
     }\r
+\r
+    public String getModuleType() {\r
+        return this.moduleType;\r
+    }\r
+\r
+    public void setModuleType(String moduleType) {\r
+        this.moduleType = moduleType;\r
+    }\r
+\r
+    /**\r
+     Convert a string to a integer.\r
+     \r
+     @param     intString   The string representing a integer\r
+     \r
+     @retval    int     The value of integer represented by the\r
+                        given string; -1 is returned if the format\r
+                        of the string is wrong.\r
+     **/\r
+    private int stringToInt(String intString) {\r
+        int value;\r
+        int hexPrefixPos = intString.indexOf("0x");\r
+        int radix = 10;\r
+        String intStringNoPrefix;\r
+\r
+        if (hexPrefixPos >= 0) {\r
+            radix = 16;\r
+            intStringNoPrefix = intString.substring(hexPrefixPos + 2, intString.length());\r
+        } else {\r
+            intStringNoPrefix = intString;\r
+        }\r
+\r
+        try {\r
+            value = Integer.parseInt(intStringNoPrefix, radix);\r
+        } catch (NumberFormatException e) {\r
+            log("Incorrect format of int (" + intString + "). -1 is assumed");\r
+            return -1;\r
+        }\r
+\r
+        return value;\r
+    }\r
 }\r