]> git.proxmox.com Git - mirror_edk2.git/blobdiff - Tools/Source/GenBuild/org/tianocore/build/pcd/action/CollectPCDAction.java
1) Change the schema type for <VariableGuid> used in PCD HiiEnable group in FPD file.
[mirror_edk2.git] / Tools / Source / GenBuild / org / tianocore / build / pcd / action / CollectPCDAction.java
index c9d905047640e9af607358cdc191bf62a69711f8..dc60cc6eb75ae1d5e29cfaf68ce43e055bacfc4c 100644 (file)
@@ -514,7 +514,7 @@ class LocalTokenNumberTable {
 \r
         str =  String.format(PcdDatabase.offsetOfStrTemplate, phase, token.hasDefaultValue() ? "Init" : "Uninit", token.getPrimaryKeyString());\r
 \r
-        if (token.isStringType()) {\r
+        if (token.isUnicodeStringType()) {\r
             str += " | PCD_TYPE_STRING";\r
         }\r
 \r
@@ -733,7 +733,7 @@ class PcdDatabase {
             return 4;\r
         }\r
 \r
-        if (token.isStringType()) {\r
+        if (token.isUnicodeStringType()) {\r
             return 2;\r
         }\r
 \r
@@ -965,7 +965,7 @@ class PcdDatabase {
                 } else if (token.getDefaultSku().type == DynamicTokenValue.VALUE_TYPE.VPD_TYPE) {\r
                     decl.add(getVpdEnableTypeDeclaration(token));\r
                     inst.add(getVpdEnableTypeInstantiation(token));\r
-                } else if (token.isStringType()) {\r
+                } else if (token.isUnicodeStringType()) {\r
                     decl.add(getStringTypeDeclaration(token));\r
                     inst.add(getStringTypeInstantiation(stringTable.add(token.getStringTypeString(), token), token));\r
                 }\r
@@ -1530,9 +1530,22 @@ public class CollectPCDAction {
                 pcdType      = Token.getpcdTypeFromString(pcdBuildData.getItemType().toString());\r
                 datumType    = Token.getdatumTypeFromString(pcdBuildData.getDatumType().toString());\r
                 tokenNumber  = Integer.decode(pcdBuildData.getToken().toString());\r
-                datum        = pcdBuildData.getValue();\r
+                if (pcdBuildData.getValue() != null) {\r
+                    datum = pcdBuildData.getValue().toString();\r
+                } else {\r
+                    datum = null;\r
+                }\r
                 maxDatumSize = pcdBuildData.getMaxDatumSize();\r
 \r
+                if ((pcdType    == Token.PCD_TYPE.FEATURE_FLAG) &&\r
+                    (datumType  != Token.DATUM_TYPE.BOOLEAN)){\r
+                    exceptionString = String.format("[FPD file error] For PCD %s in module %s, the PCD type is FEATRUE_FLAG but "+\r
+                                                    "datum type of this PCD entry is not BOOLEAN!",\r
+                                                    pcdBuildData.getCName(),\r
+                                                    moduleName);\r
+                    throw new EntityException(exceptionString);\r
+                }\r
+\r
                 //\r
                 // Check <TokenSpaceGuid> is exist? In future, because all schema verification will tools\r
                 // will check that, following checking code could be removed.\r
@@ -1725,6 +1738,7 @@ public class CollectPCDAction {
         int         value;\r
         BigInteger  value64;\r
         String      subStr;\r
+        int         index;\r
 \r
         if (moduleName == null) {\r
             moduleName = "section <DynamicPcdBuildDefinitions>";\r
@@ -1923,7 +1937,7 @@ public class CollectPCDAction {
                 if ((start > end)           || \r
                     (end   > datum.length())||\r
                     ((start == end) && (datum.length() > 0))) {\r
-                    exceptionString = String.format("The datum type of PCD %s in %s is VOID* and datum is "+\r
+                    exceptionString = String.format("[FPD file error] The datum type of PCD %s in %s is VOID* and datum is "+\r
                                                     "a UNICODE string because start with L\", but format maybe"+\r
                                                     "is not right, correct UNICODE string is L\"...\"!",\r
                                                     cName,\r
@@ -1933,7 +1947,7 @@ public class CollectPCDAction {
 \r
                 strValue    = datum.substring(start + 1, end);\r
                 if ((strValue.length() * 2) > maxDatumSize) {\r
-                    exceptionString = String.format("The datum type of PCD %s in %s is VOID*, and datum is "+\r
+                    exceptionString = String.format("[FPD file error] The datum type of PCD %s in %s is VOID*, and datum is "+\r
                                                     "a UNICODE string, but the datum size is %d exceed to <MaxDatumSize> : %d",\r
                                                     cName,\r
                                                     moduleName,\r
@@ -1947,7 +1961,7 @@ public class CollectPCDAction {
                 if ((start > end)           || \r
                     (end   > datum.length())||\r
                     ((start == end) && (datum.length() > 0))) {\r
-                    exceptionString = String.format("The datum type of PCD %s in %s is VOID* and datum is "+\r
+                    exceptionString = String.format("[FPD file error] The datum type of PCD %s in %s is VOID* and datum is "+\r
                                                     "a ANSCII string because start with \", but format maybe"+\r
                                                     "is not right, correct ANSIC string is \"...\"!",\r
                                                     cName,\r
@@ -1956,7 +1970,7 @@ public class CollectPCDAction {
                 }\r
                 strValue    = datum.substring(start + 1, end);\r
                 if ((strValue.length()) > maxDatumSize) {\r
-                    exceptionString = String.format("The datum type of PCD %s in %s is VOID*, and datum is "+\r
+                    exceptionString = String.format("[FPD file error] The datum type of PCD %s in %s is VOID*, and datum is "+\r
                                                     "a ANSCI string, but the datum size is %d which exceed to <MaxDatumSize> : %d",\r
                                                     cName,\r
                                                     moduleName,\r
@@ -1969,10 +1983,36 @@ public class CollectPCDAction {
 \r
                 start           = datum.indexOf('{');\r
                 end             = datum.lastIndexOf('}');\r
-                strValue        = datum.substring(start, end);\r
+                strValue        = datum.substring(start + 1, end);\r
+                strValue        = strValue.trim();\r
+                if (strValue.length() == 0) {\r
+                    break;\r
+                }\r
                 strValueArray   = strValue.split(",");\r
+                for (index = 0; index < strValueArray.length; index ++) {\r
+                    try{\r
+                        value = Integer.decode(strValueArray[index].trim());\r
+                    } catch (NumberFormatException nfeEx) {\r
+                        exceptionString = String.format("[FPD file error] The datum type of PCD %s in %s is VOID*, and "+\r
+                                                         "it is byte array in fact. For every byte in array should be a valid"+\r
+                                                         "byte digital, but element %s is not a valid byte digital!",\r
+                                                         cName,\r
+                                                         moduleName,\r
+                                                         strValueArray[index]);\r
+                        return exceptionString;\r
+                    }\r
+                    if (value > 0xFF) {\r
+                        exceptionString = String.format("[FPD file error] The datum type of PCD %s in %s is VOID*, "+\r
+                                                        "it is byte array in fact. But the element of %s exceed the byte range",\r
+                                                        cName,\r
+                                                        moduleName,\r
+                                                        strValueArray[index]);\r
+                        return exceptionString;\r
+                    }\r
+                }\r
+\r
                 if (strValueArray.length > maxDatumSize) {\r
-                    exceptionString = String.format("The datum type of PCD %s in %s is VOID*, and datum is byte"+\r
+                    exceptionString = String.format("[FPD file error] The datum type of PCD %s in %s is VOID*, and datum is byte"+\r
                                                     "array, but the number of bytes is %d which exceed to <MaxDatumSzie> : %d!",\r
                                                     cName,\r
                                                     moduleName,\r
@@ -1981,7 +2021,7 @@ public class CollectPCDAction {
                     return exceptionString;\r
                 }\r
             } else {\r
-                exceptionString = String.format("The datum type of PCD %s in %s is VOID*. For VOID* type, you have three format choise:\n "+\r
+                exceptionString = String.format("[FPD file error] The datum type of PCD %s in %s is VOID*. For VOID* type, you have three format choise:\n "+\r
                                                 "1) UNICODE string: like L\"xxxx\";\r\n"+\r
                                                 "2) ANSIC string: like \"xxx\";\r\n"+\r
                                                 "3) Byte array: like {0x2, 0x45, 0x23}\r\n"+\r
@@ -2090,6 +2130,10 @@ public class CollectPCDAction {
         SkuInstance         skuInstance     = null;\r
         String              temp;\r
         boolean             hasSkuId0       = false;\r
+        Token.PCD_TYPE      pcdType         = Token.PCD_TYPE.UNKNOWN;\r
+        int                 tokenNumber     = 0;\r
+        String              hiiDefaultValue = null;\r
+        String[]            variableGuidString = null;\r
 \r
         List<DynamicPcdBuildDefinitions.PcdBuildData.SkuInfo>   skuInfoList = null;\r
         DynamicPcdBuildDefinitions.PcdBuildData                 dynamicInfo = null;\r
@@ -2125,6 +2169,21 @@ public class CollectPCDAction {
                                             dynamicInfo.getMaxDatumSize());\r
             throw new EntityException(exceptionString);\r
         }\r
+        tokenNumber = Integer.decode(dynamicInfo.getToken().toString());\r
+        if (tokenNumber != token.tokenNumber) {\r
+            exceptionString = String.format("[FPD file error] For dynamic PCD %s, the token number in module %s is 0x%x, but"+\r
+                                            "in <DynamicPcdBuildDefinictions>, the token number is 0x%x, they are not match!",\r
+                                            token.cName,\r
+                                            moduleName,\r
+                                            token.tokenNumber,\r
+                                            tokenNumber);\r
+            throw new EntityException(exceptionString);\r
+        }\r
+\r
+        pcdType = Token.getpcdTypeFromString(dynamicInfo.getItemType().toString());\r
+        if (pcdType == Token.PCD_TYPE.DYNAMIC_EX) {\r
+            token.dynamicExTokenNumber = tokenNumber;\r
+        }\r
 \r
         skuInfoList = dynamicInfo.getSkuInfoList();\r
 \r
@@ -2145,10 +2204,10 @@ public class CollectPCDAction {
             // Judge whether is DefaultGroup at first, because most case is DefautlGroup.\r
             // \r
             if (skuInfoList.get(index).getValue() != null) {\r
-                skuInstance.value.setValue(skuInfoList.get(index).getValue());\r
+                skuInstance.value.setValue(skuInfoList.get(index).getValue().toString());\r
                 if ((exceptionString = verifyDatum(token.cName, \r
                                                    null, \r
-                                                   skuInfoList.get(index).getValue(), \r
+                                                   skuInfoList.get(index).getValue().toString()\r
                                                    token.datumType, \r
                                                    token.datumSize)) != null) {\r
                     throw new EntityException(exceptionString);\r
@@ -2162,7 +2221,7 @@ public class CollectPCDAction {
                 // \r
                 if (datum != null) {\r
                     if ((skuInstance.id == 0)                                   &&\r
-                        !datum.equalsIgnoreCase(skuInfoList.get(index).getValue())) {\r
+                        !datum.toString().equalsIgnoreCase(skuInfoList.get(index).getValue().toString())) {\r
                         exceptionString = "[FPD file error] For dynamic PCD " + token.cName + ", the value in module " + moduleName + " is " + datum.toString() + " but the "+\r
                                           "value of sku 0 data in <DynamicPcdBuildDefinition> is " + skuInstance.value.value + ". They are must be same!"+\r
                                           " or you could not define value for a dynamic PCD in every <ModuleSA>!"; \r
@@ -2182,7 +2241,9 @@ public class CollectPCDAction {
                                                     "file, who use HII, but there is no <VariableGuid> defined for Sku %d data!",\r
                                                     token.cName,\r
                                                     index);\r
-                                                    \r
+                    if (exceptionString != null) {\r
+                        throw new EntityException(exceptionString);\r
+                    }                                                    \r
                 }\r
 \r
                 if (skuInfoList.get(index).getVariableOffset() == null) {\r
@@ -2190,6 +2251,9 @@ public class CollectPCDAction {
                                                     "file, who use HII, but there is no <VariableOffset> defined for Sku %d data!",\r
                                                     token.cName,\r
                                                     index);\r
+                    if (exceptionString != null) {\r
+                        throw new EntityException(exceptionString);\r
+                    }\r
                 }\r
 \r
                 if (skuInfoList.get(index).getHiiDefaultValue() == null) {\r
@@ -2197,15 +2261,20 @@ public class CollectPCDAction {
                                                     "file, who use HII, but there is no <HiiDefaultValue> defined for Sku %d data!",\r
                                                     token.cName,\r
                                                     index);\r
+                    if (exceptionString != null) {\r
+                        throw new EntityException(exceptionString);\r
+                    }\r
                 }\r
 \r
-                if (exceptionString != null) {\r
-                    throw new EntityException(exceptionString);\r
+                if (skuInfoList.get(index).getHiiDefaultValue() != null) {\r
+                    hiiDefaultValue = skuInfoList.get(index).getHiiDefaultValue().toString();\r
+                } else {\r
+                    hiiDefaultValue = null;\r
                 }\r
 \r
                 if ((exceptionString = verifyDatum(token.cName, \r
                                                    null, \r
-                                                   skuInfoList.get(index).getHiiDefaultValue()\r
+                                                   hiiDefaultValue\r
                                                    token.datumType, \r
                                                    token.datumSize)) != null) {\r
                     throw new EntityException(exceptionString);\r
@@ -2219,10 +2288,20 @@ public class CollectPCDAction {
                                                             index));\r
                 }\r
 \r
+                //\r
+                // Get variable guid string according to the name of guid which will be mapped into a GUID in SPD file.\r
+                // \r
+                variableGuidString = GlobalData.getGuidInfoGuid(skuInfoList.get(index).getVariableGuid().toString());\r
+                if (variableGuidString == null) {\r
+                    throw new EntityException(String.format("[GUID Error] For dynamic PCD %s,  the variable guid %s can be found in all SPD file!",\r
+                                                            token.cName, \r
+                                                            skuInfoList.get(index).getVariableGuid().toString()));\r
+                }\r
+\r
                 skuInstance.value.setHiiData(skuInfoList.get(index).getVariableName(),\r
-                                             translateSchemaStringToUUID(skuInfoList.get(index).getVariableGuid().toString()),\r
+                                             translateSchemaStringToUUID(variableGuidString[1]),\r
                                              skuInfoList.get(index).getVariableOffset(),\r
-                                             skuInfoList.get(index).getHiiDefaultValue());\r
+                                             skuInfoList.get(index).getHiiDefaultValue().toString());\r
                 token.skuData.add(skuInstance);\r
                 continue;\r
             }\r
@@ -2286,6 +2365,9 @@ public class CollectPCDAction {
             return new UUID(0, 0);\r
         }\r
 \r
+        uuidString = uuidString.replaceAll("\\{", "");\r
+        uuidString = uuidString.replaceAll("\\}", "");\r
+\r
         //\r
         // If the UUID schema string is GuidArrayType type then need translate \r
         // to GuidNamingConvention type at first.\r
@@ -2370,11 +2452,11 @@ public class CollectPCDAction {
     **/\r
     public static void main(String argv[]) throws EntityException {\r
         CollectPCDAction ca = new CollectPCDAction();\r
-        ca.setWorkspacePath("m:/tianocore_latest/edk2");\r
-        ca.setFPDFilePath("m:/tianocore_latest/edk2/EdkNt32Pkg/Nt32.fpd");\r
+        ca.setWorkspacePath("m:/tianocore/edk2");\r
+        ca.setFPDFilePath("m:/tianocore/edk2/EdkNt32Pkg/Nt32.fpd");\r
         ca.setActionMessageLevel(ActionMessage.MAX_MESSAGE_LEVEL);\r
         GlobalData.initInfo("Tools" + File.separator + "Conf" + File.separator + "FrameworkDatabase.db",\r
-                            "m:/tianocore_latest/edk2");\r
+                            "m:/tianocore/edk2");\r
         ca.execute();\r
     }\r
 }\r