//\r
// Dynamic Ex is to support binary distribution\r
//\r
-#define PcdGetEx8(TokenName) LibPcdGetEx8 (&_gPcd_DynamicEx_TokenSpaceGuid_##TokenName, _PCD_TOKEN_##TokenName)\r
-#define PcdGetEx16(TokenName) LibPcdGetEx16 (&_gPcd_DynamicEx_TokenSpaceGuid_##TokenName, _PCD_TOKEN_##TokenName)\r
-#define PcdGetEx32(TokenName) LibPcdGetEx32 (&_gPcd_DynamicEx_TokenSpaceGuid_##TokenName, _PCD_TOKEN_##TokenName)\r
-#define PcdGetEx64(TokenName) LibPcdGetEx64 (&_gPcd_DynamicEx_TokenSpaceGuid_##TokenName, _PCD_TOKEN_##TokenName)\r
-#define PcdGetExPtr(TokenName) LibPcdGetExPtr (&_gPcd_DynamicEx_TokenSpaceGuid_##TokenName, _PCD_TOKEN_##TokenName)\r
-#define PcdGetExBool(TokenName) LibPcdGetExBool (&_gPcd_DynamicEx_TokenSpaceGuid_##TokenName, _PCD_TOKEN_##TokenName)\r
+#define PcdGetEx8(Guid, TokenName) LibPcdGetEx8 (Guid, _PCD_TOKEN_##TokenName)\r
+#define PcdGetEx16(Guid, TokenName) LibPcdGetEx16 (Guid, _PCD_TOKEN_##TokenName)\r
+#define PcdGetEx32(Guid, TokenName) LibPcdGetEx32 (Guid, _PCD_TOKEN_##TokenName)\r
+#define PcdGetEx64(Guid, TokenName) LibPcdGetEx64 (Guid, _PCD_TOKEN_##TokenName)\r
+#define PcdGetExPtr(Guid, TokenName) LibPcdGetExPtr (Guid, _PCD_TOKEN_##TokenName)\r
+#define PcdGetExBool(Guid, TokenName) LibPcdGetExBool (Guid, _PCD_TOKEN_##TokenName)\r
\r
\r
//\r
//\r
// Dynamic Set Ex\r
//\r
-#define PcdSetEx8(TokenName, Value) LibPcdSetEx8 (&_gPcd_DynamicEx_TokenSpaceGuid_##TokenName, _PCD_TOKEN_##TokenName, Value)\r
-#define PcdSetEx16(TokenName, Value) LibPcdSetEx16 (&_gPcd_DynamicEx_TokenSpaceGuid_##TokenName, _PCD_TOKEN_##TokenName, Value)\r
-#define PcdSetEx32(TokenName, Value) LibPcdSetEx32 (&_gPcd_DynamicEx_TokenSpaceGuid_##TokenName, _PCD_TOKEN_##TokenName, Value)\r
-#define PcdSetEx64(TokenName, Value) LibPcdSetEx64 (&_gPcd_DynamicEx_TokenSpaceGuid_##TokenName, _PCD_TOKEN_##TokenName, Value)\r
-#define PcdSetExPtr(TokenName, SizeOfBuffer, Buffer) LibPcdSetExPtr (&_gPcd_DynamicEx_TokenSpaceGuid_##TokenName, _PCD_TOKEN_##TokenName, SizeOfBuffer, Buffer)\r
-#define PcdSetExBool(TokenName, Value) LibPcdSetExBool(&_gPcd_DynamicEx_TokenSpaceGuid_##TokenName, _PCD_TOKEN_##TokenName, Value)\r
+#define PcdSetEx8(Guid, TokenName, Value) LibPcdSetEx8 (Guid, _PCD_TOKEN_##TokenName, Value)\r
+#define PcdSetEx16(Guid, TokenName, Value) LibPcdSetEx16 (Guid, _PCD_TOKEN_##TokenName, Value)\r
+#define PcdSetEx32(Guid, TokenName, Value) LibPcdSetEx32 (Guid, _PCD_TOKEN_##TokenName, Value)\r
+#define PcdSetEx64(Guid, TokenName, Value) LibPcdSetEx64 (Guid, _PCD_TOKEN_##TokenName, Value)\r
+#define PcdSetExPtr(Guid, TokenName, SizeOfBuffer, Buffer) LibPcdSetExPtr (Guid, _PCD_TOKEN_##TokenName, SizeOfBuffer, Buffer)\r
+#define PcdSetExBool(Guid, TokenName, Value) LibPcdSetExBool(Guid, _PCD_TOKEN_##TokenName, Value)\r
\r
\r
/**\r
package org.tianocore.build.pcd.action;\r
\r
import java.io.File;\r
+import java.util.ArrayList;\r
import java.util.List;\r
import java.util.Map;\r
import java.util.Set;\r
import java.util.UUID;\r
-import java.util.ArrayList;\r
+import java.util.regex.Matcher;\r
+import java.util.regex.Pattern;\r
\r
import org.apache.xmlbeans.XmlObject;\r
import org.tianocore.build.global.GlobalData;\r
{\r
int index, index2;\r
List<UsageInstance> usageInstanceArray, usageContext;\r
+ String[] guidStringArray = null;\r
+ String guidStringCName = null;\r
+ String guidString = null;\r
+ UsageInstance usageInstance = null;\r
\r
if (!isBuildUsedLibrary) {\r
usageInstanceArray = dbManager.getUsageInstanceArrayByModuleName(moduleName,\r
}\r
}\r
\r
-\r
if(usageInstanceArray.size() != 0) {\r
//\r
// Add "#include 'PcdLib.h'" for Header file\r
hAutoGenString = "#include <MdePkg/Include/Library/PcdLib.h>\r\n";\r
}\r
\r
+ //\r
+ // Generate all PCD entry for a module.\r
+ // \r
for(index = 0; index < usageInstanceArray.size(); index ++) {\r
ActionMessage.debug(this,\r
"Module " + moduleName + "'s PCD [" + Integer.toHexString(index) + \r
"]: " + usageInstanceArray.get(index).parentToken.cName);\r
try {\r
- usageInstanceArray.get(index).generateAutoGen(isBuildUsedLibrary);\r
- hAutoGenString += usageInstanceArray.get(index).getHAutogenStr() + "\r\n";\r
- cAutoGenString += usageInstanceArray.get(index).getCAutogenStr() + "\r\n";\r
+ usageInstance = usageInstanceArray.get(index);\r
+ //\r
+ // Before generate any PCD information into autogen.h/autogen.c for a module,\r
+ // generate TokenSpaceGuid array variable firstly. For every dynamicEx type\r
+ // PCD in this module the token, they are all reference to TokenSpaceGuid \r
+ // array.\r
+ // \r
+ if (usageInstanceArray.get(index).modulePcdType == Token.PCD_TYPE.DYNAMIC_EX) {\r
+ guidStringArray = usageInstance.parentToken.tokenSpaceName.toString().split("-");\r
+ guidStringCName = "_gPcd_TokenSpaceGuid_" + \r
+ usageInstance.parentToken.tokenSpaceName.toString().replaceAll("-", "_");\r
+ guidString = String.format("{ 0x%s, 0x%s, 0x%s, {0x%s, 0x%s, 0x%s, 0x%s, 0x%s, 0x%s, 0x%s, 0x%s}}",\r
+ guidStringArray[0],\r
+ guidStringArray[1],\r
+ guidStringArray[2],\r
+ (guidStringArray[3].substring(0, 2)),\r
+ (guidStringArray[3].substring(2, 4)),\r
+ (guidStringArray[4].substring(0, 2)),\r
+ (guidStringArray[4].substring(2, 4)),\r
+ (guidStringArray[4].substring(4, 6)),\r
+ (guidStringArray[4].substring(6, 8)),\r
+ (guidStringArray[4].substring(8, 10)),\r
+ (guidStringArray[4].substring(10, 12)));\r
+ if (!isBuildUsedLibrary) {\r
+ Pattern pattern = Pattern.compile("(" + guidStringCName + ")+?");\r
+ Matcher matcher = pattern.matcher(cAutoGenString + " ");\r
+ //\r
+ // Find whether this guid array variable has been generated into autogen.c\r
+ // For different DyanmicEx pcd token who use same token space guid, the token space\r
+ // guid array should be only generated once.\r
+ // \r
+ if (!matcher.find()) {\r
+ cAutoGenString += String.format("GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID %s = %s;\r\n",\r
+ guidStringCName,\r
+ guidString);\r
+ }\r
+ }\r
+ }\r
+\r
+ usageInstance.generateAutoGen(isBuildUsedLibrary);\r
+ //\r
+ // For every PCD entry for this module(usage instance), autogen string would\r
+ // be appand.\r
+ // \r
+ hAutoGenString += usageInstance.getHAutogenStr() + "\r\n";\r
+ cAutoGenString += usageInstance.getCAutogenStr();\r
+\r
} catch(EntityException exp) {\r
- throw new BuildActionException(exp.getMessage());\r
+ throw new BuildActionException("[PCD Autogen Error]: " + exp.getMessage());\r
}\r
}\r
\r
**/\r
public static void main(String argv[]) {\r
\r
- String WorkSpace = "M:/ForPcd/edk2";\r
- String logFilePath = WorkSpace + "/MdePkg/MdePkg.fpd";\r
+ String WorkSpace = "M:/tianocore/edk2";\r
+ String logFilePath = WorkSpace + "/EdkNt32Pkg/Nt32.fpd";\r
String[] nameArray = null;\r
\r
//\r
//\r
// Then execute the PCDAuotoGenAction to get generated Autogen.h and Autogen.c\r
//\r
- PCDAutoGenAction autogenAction = new PCDAutoGenAction("BaseLib",\r
- null,\r
+ PCDAutoGenAction autogenAction = new PCDAutoGenAction("MonoStatusCode",\r
null,\r
null,\r
null,\r
+ "IA32",\r
null,\r
false,\r
nameArray);\r
System.out.println(autogenAction.OutputH());\r
System.out.println("WQWQWQWQWQ");\r
System.out.println(autogenAction.OutputC());\r
-\r
-\r
- System.out.println (autogenAction.hAutoGenString);\r
- System.out.println (autogenAction.cAutoGenString);\r
-\r
}\r
}\r
*/\r
public void generateAutoGen(boolean isBuildUsedLibrary) \r
throws EntityException {\r
- String guidStringArray[] = null;\r
- String guidString = null;\r
+ String guidStringCName = null;\r
boolean isByteArray = false;\r
String printDatum = null;\r
\r
cAutogenStr = "";\r
\r
if (this.modulePcdType == Token.PCD_TYPE.DYNAMIC_EX) {\r
- hAutogenStr += String.format("#define _PCD_LOCAL_TOKEN_%s 0x%016x\r\n", \r
- parentToken.cName, parentToken.tokenNumber);\r
hAutogenStr += String.format("#define _PCD_TOKEN_%s 0x%016x\r\n", \r
parentToken.cName, parentToken.dynamicExTokenNumber);\r
} else {\r
parentToken.cName);\r
break;\r
case DYNAMIC_EX:\r
- guidStringArray = parentToken.tokenSpaceName.toString().split("-");\r
- guidString = String.format("{ 0x%s, 0x%s, 0x%s, {0x%s, 0x%s, 0x%s, 0x%s, 0x%s, 0x%s, 0x%s, 0x%s}}",\r
- guidStringArray[0],\r
- guidStringArray[1],\r
- guidStringArray[2],\r
- (guidStringArray[3].substring(0, 2)),\r
- (guidStringArray[3].substring(2, 4)),\r
- (guidStringArray[4].substring(0, 2)),\r
- (guidStringArray[4].substring(2, 4)),\r
- (guidStringArray[4].substring(4, 6)),\r
- (guidStringArray[4].substring(6, 8)),\r
- (guidStringArray[4].substring(8, 10)),\r
- (guidStringArray[4].substring(10, 12)));\r
+ guidStringCName = "_gPcd_TokenSpaceGuid_" +\r
+ parentToken.tokenSpaceName.toString().replaceAll("-", "_");\r
\r
- hAutogenStr += String.format("extern EFI_GUID _gPcd_DynamicEx_TokenSpaceGuid_%s;\r\n",\r
+ hAutogenStr += String.format("extern const EFI_GUID *_gPcd_DynamicEx_TokenSpaceGuid_%s;\r\n",\r
parentToken.cName);\r
- hAutogenStr += String.format("#define _PCD_MODE_%s_%s LibPcdGet%s(_PCD_LOCAL_TOKEN_%s)\r\n",\r
+ hAutogenStr += String.format("#define _PCD_MODE_%s_%s LibPcdGetEx%s(_gPcd_DynamicEx_TokenSpaceGuid_%s, _PCD_TOKEN_%s)\r\n",\r
Token.GetAutogenDefinedatumTypeString(parentToken.datumType),\r
parentToken.cName,\r
Token.getAutogenLibrarydatumTypeString(parentToken.datumType),\r
parentToken.cName);\r
\r
if (!isBuildUsedLibrary) {\r
- cAutogenStr += String.format("GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID _gPcd_DynamicEx_TokenSpaceGuid_%s = %s;\r\n",\r
+ cAutogenStr += String.format("GLOBAL_REMOVE_IF_UNREFERENCED const EFI_GUID *_gPcd_DynamicEx_TokenSpaceGuid_%s = &%s;\r\n",\r
parentToken.cName,\r
- guidString);\r
+ guidStringCName);\r
}\r
break;\r
}\r