import java.io.IOException;\r
import java.math.BigInteger;\r
import java.util.ArrayList;\r
-import java.util.Collections;\r
import java.util.Comparator;\r
import java.util.HashMap;\r
import java.util.List;\r
-import java.util.Map;\r
import java.util.UUID;\r
\r
import org.apache.xmlbeans.XmlException;\r
import org.apache.xmlbeans.XmlObject;\r
-import org.tianocore.DynamicPcdBuildDefinitionsDocument;\r
import org.tianocore.DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions;\r
-import org.tianocore.DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData;\r
-import org.tianocore.DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData.SkuInfo;\r
import org.tianocore.FrameworkModulesDocument;\r
import org.tianocore.FrameworkPlatformDescriptionDocument;\r
-import org.tianocore.FrameworkPlatformDescriptionDocument.FrameworkPlatformDescription;\r
import org.tianocore.ModuleSADocument;\r
-import org.tianocore.ModuleSADocument.ModuleSA;\r
-import org.tianocore.PackageSurfaceAreaDocument;\r
import org.tianocore.PcdBuildDefinitionDocument.PcdBuildDefinition;\r
import org.tianocore.build.global.GlobalData;\r
import org.tianocore.build.global.SurfaceAreaQuery;\r
import org.tianocore.build.pcd.exception.EntityException;\r
import org.tianocore.ModuleTypeDef;\r
\r
+class CStructTypeDeclaration {\r
+ String key;\r
+ int alignmentSize;\r
+ String cCode;\r
+ boolean initTable;\r
+ \r
+ public CStructTypeDeclaration (String key, int alignmentSize, String cCode, boolean initTable) {\r
+ this.key = key;\r
+ this.alignmentSize = alignmentSize;\r
+ this.cCode = cCode;\r
+ this.initTable = initTable;\r
+ }\r
+}\r
+\r
class StringTable {\r
private ArrayList<String> al; \r
private ArrayList<String> alComments;\r
private String phase;\r
int len; \r
- int bodyStart;\r
- int bodyLineNum;\r
\r
public StringTable (String phase) {\r
this.phase = phase;\r
al = new ArrayList<String>();\r
alComments = new ArrayList<String>();\r
len = 0;\r
- bodyStart = 0;\r
- bodyLineNum = 0;\r
}\r
\r
public String getSizeMacro () {\r
public String getExistanceMacro () {\r
return String.format(PcdDatabase.StringTableExistenceMacro, phase, (al.size() == 0)? "TRUE":"FALSE");\r
}\r
+ \r
+ public void genCodeNew (ArrayList<CStructTypeDeclaration> declaList, HashMap<String, String> instTable) {\r
+ final String stringTable = "StringTable";\r
+ final String tab = "\t";\r
+ final String newLine = "\r\n";\r
+ final String commaNewLine = ",\r\n";\r
+ \r
+ CStructTypeDeclaration decl;\r
+\r
+ String cDeclCode = "";\r
+ String cInstCode = "";\r
+\r
+ //\r
+ // If we have a empty StringTable\r
+ //\r
+ if (al.size() == 0) {\r
+ cDeclCode += tab + String.format("UINT16 %s[1]; /* StringTable is Empty */", stringTable) + newLine; \r
+ decl = new CStructTypeDeclaration (\r
+ stringTable,\r
+ 2,\r
+ cDeclCode,\r
+ true\r
+ ); \r
+ declaList.add(decl);\r
+\r
+ cInstCode = tab + " { 0 } " + String.format("/* %s */", stringTable) + commaNewLine;\r
+ instTable.put(stringTable, cInstCode);\r
+ } else {\r
+\r
+ //\r
+ // If there is any String in the StringTable\r
+ //\r
+ for (int i = 0; i < al.size(); i++) {\r
+ String str = al.get(i);\r
+ String stringTableName;\r
+ \r
+ if (i == 0) {\r
+ //\r
+ // StringTable is a well-known name in the PCD DXE driver\r
+ //\r
+ stringTableName = stringTable;\r
+ \r
+ } else {\r
+ stringTableName = String.format("%s_%d", stringTable, i);\r
+ cDeclCode += tab;\r
+ }\r
+ cDeclCode += String.format("UINT16 %s[%d]; /* %s */", stringTableName, str.length() + 1, alComments.get(i)) + newLine;\r
+ \r
+ if (i == 0) {\r
+ cInstCode = "/* StringTable */" + newLine;\r
+ }\r
+ cInstCode += tab + String.format("L\"%s\" /* %s */", al.get(i), alComments.get(i));\r
+ if (i != al.size() - 1) {\r
+ cInstCode += commaNewLine;\r
+ }\r
+ }\r
+ \r
+ decl = new CStructTypeDeclaration (\r
+ stringTable,\r
+ 2,\r
+ cDeclCode,\r
+ true\r
+ ); \r
+ declaList.add(decl);\r
+ \r
+ instTable.put(stringTable, cInstCode);\r
+ }\r
+ }\r
\r
public String getTypeDeclaration () {\r
\r
return output;\r
}\r
\r
- public int add (String str, Token token) {\r
+ public int add (String inputStr, Token token) {\r
int i;\r
+ int pos;\r
+\r
+ String str = inputStr;\r
+ \r
+ //\r
+ // The input can be two types:\r
+ // "L\"Bootmode\"" or "Bootmode". \r
+ // We drop the L\" and \" for the first type. \r
+ if (str.startsWith("L\"") && str.endsWith("\"")) {\r
+ str = str.substring(2, str.length() - 1);\r
+ }\r
+ //\r
+ // Check if StringTable has this String already.\r
+ // If so, return the current pos.\r
+ //\r
+ for (i = 0, pos = 0; i < al.size(); i++) {\r
+ String s = al.get(i);;\r
\r
+ if (str.equals(s)) {\r
+ return pos;\r
+ }\r
+ pos = s.length() + 1;\r
+ \r
+ }\r
+ \r
i = len;\r
//\r
// Include the NULL character at the end of String\r
private ArrayList<String> alComments;\r
private String phase;\r
private int len;\r
- private int bodyStart;\r
- private int bodyLineNum;\r
-\r
+ \r
public SizeTable (String phase) {\r
this.phase = phase;\r
al = new ArrayList<Integer>();\r
alComments = new ArrayList<String>();\r
len = 0;\r
- bodyStart = 0;\r
- bodyLineNum = 0;\r
+ }\r
+\r
+ public void genCodeNew (ArrayList<CStructTypeDeclaration> declaList, HashMap<String, String> instTable, String phase) {\r
+ final String name = "SizeTable";\r
+ \r
+ CStructTypeDeclaration decl;\r
+ String cCode;\r
+\r
+ cCode = String.format(PcdDatabase.SizeTableDeclaration, phase); \r
+ decl = new CStructTypeDeclaration (\r
+ name,\r
+ 2,\r
+ cCode,\r
+ true\r
+ ); \r
+ declaList.add(decl);\r
+\r
+\r
+ cCode = PcdDatabase.genInstantiationStr(getInstantiation());\r
+ instTable.put(name, cCode);\r
}\r
\r
public String getTypeDeclaration () {\r
\r
Output.add("/* SizeTable */");\r
Output.add("{");\r
- bodyStart = 2;\r
-\r
if (al.size() == 0) {\r
Output.add("0");\r
} else {\r
for (int index = 0; index < al.size(); index++) {\r
Integer n = al.get(index);\r
- String str = n.toString();\r
+ String str = "\t" + n.toString();\r
\r
if (index != (al.size() - 1)) {\r
str += ",";\r
\r
str += " /* " + alComments.get(index) + " */"; \r
Output.add(str);\r
- bodyLineNum++;\r
\r
}\r
}\r
return Output;\r
}\r
\r
- public int getBodyStart() {\r
- return bodyStart;\r
- }\r
-\r
- public int getBodyLineNum () {\r
- return bodyLineNum;\r
- }\r
-\r
public int add (Token token) {\r
int index = len;\r
\r
return index;\r
}\r
\r
- private int getDatumSize(Token token) {\r
- /*\r
- switch (token.datumType) {\r
- case Token.DATUM_TYPE.UINT8:\r
- return 1;\r
- default:\r
- return 0;\r
- }\r
- */\r
- return 0;\r
- }\r
-\r
public int getTableLen () {\r
return al.size() == 0 ? 1 : al.size();\r
}\r
private ArrayList<String> alComments;\r
private String phase;\r
private int len;\r
- private int bodyStart;\r
private int bodyLineNum;\r
\r
public GuidTable (String phase) {\r
al = new ArrayList<UUID>();\r
alComments = new ArrayList<String>();\r
len = 0;\r
- bodyStart = 0;\r
bodyLineNum = 0;\r
}\r
\r
return String.format(PcdDatabase.GuidTableExistenceMacro, phase, (al.size() == 0)? "TRUE":"FALSE");\r
}\r
\r
+ public void genCodeNew (ArrayList<CStructTypeDeclaration> declaList, HashMap<String, String> instTable, String phase) {\r
+ final String name = "GuidTable";\r
+ \r
+ CStructTypeDeclaration decl;\r
+ String cCode = "";\r
+\r
+ cCode += String.format(PcdDatabase.GuidTableDeclaration, phase); \r
+ decl = new CStructTypeDeclaration (\r
+ name,\r
+ 8,\r
+ cCode,\r
+ true\r
+ ); \r
+ declaList.add(decl);\r
+\r
+\r
+ cCode = PcdDatabase.genInstantiationStr(getInstantiation());\r
+ instTable.put(name, cCode);\r
+ }\r
+\r
public String getTypeDeclaration () {\r
return String.format(PcdDatabase.GuidTableDeclaration, phase);\r
}\r
\r
Output.add("/* GuidTable */");\r
Output.add("{");\r
- bodyStart = 2;\r
-\r
if (al.size() == 0) {\r
Output.add(getUuidCString(new UUID(0, 0)));\r
}\r
\r
- for (Object u : al) {\r
- UUID uuid = (UUID)u;\r
- String str = getUuidCString(uuid);\r
+ for (int i = 0; i < al.size(); i++) {\r
+ String str = "\t" + getUuidCString(al.get(i));\r
\r
- if (al.indexOf(u) != (al.size() - 1)) {\r
+ str += "/* " + alComments.get(i) + " */";\r
+ if (i != (al.size() - 1)) {\r
str += ",";\r
}\r
Output.add(str);\r
return Output;\r
}\r
\r
- public int getBodyStart() {\r
- return bodyStart;\r
- }\r
-\r
- public int getBodyLineNum () {\r
- return bodyLineNum;\r
- }\r
-\r
public int add (UUID uuid, String name) {\r
- int index = len;\r
//\r
- // Include the NULL character at the end of String\r
+ // Check if GuidTable has this entry already.\r
+ // If so, return the GuidTable index.\r
//\r
+ for (int i = 0; i < al.size(); i++) {\r
+ if (al.get(i).equals(uuid)) {\r
+ return i;\r
+ }\r
+ }\r
+ \r
len++; \r
al.add(uuid);\r
+ alComments.add(name);\r
\r
- return index;\r
+ //\r
+ // Return the previous Table Index\r
+ //\r
+ return len - 1;\r
}\r
\r
public int getTableLen () {\r
private ArrayList<String> alComment;\r
private String phase;\r
private int len;\r
- private int bodyStart;\r
- private int bodyLineNum;\r
\r
public SkuIdTable (String phase) {\r
this.phase = phase;\r
al = new ArrayList<Integer[]>();\r
alComment = new ArrayList<String>();\r
- bodyStart = 0;\r
- bodyLineNum = 0;\r
len = 0;\r
}\r
\r
}\r
\r
private int getSize () {\r
- return (al.size() == 0)? 1 : al.size();\r
+ return (len == 0)? 1 : len;\r
}\r
\r
public String getExistanceMacro () {\r
return String.format(PcdDatabase.SkuTableExistenceMacro, phase, (al.size() == 0)? "TRUE":"FALSE");\r
}\r
\r
+ public void genCodeNew (ArrayList<CStructTypeDeclaration> declaList, HashMap<String, String> instTable, String phase) {\r
+ final String name = "SkuIdTable";\r
+ \r
+ CStructTypeDeclaration decl;\r
+ String cCode = "";\r
+\r
+ cCode += String.format(PcdDatabase.SkuIdTableDeclaration, phase); \r
+ decl = new CStructTypeDeclaration (\r
+ name,\r
+ 1,\r
+ cCode,\r
+ true\r
+ ); \r
+ declaList.add(decl);\r
+\r
+\r
+ cCode = PcdDatabase.genInstantiationStr(getInstantiation());\r
+ instTable.put(name, cCode);\r
+\r
+ //\r
+ // SystemSkuId is in PEI phase PCD Database\r
+ //\r
+ if (phase.equalsIgnoreCase("PEI")) {\r
+ decl = new CStructTypeDeclaration (\r
+ "SystemSkuId",\r
+ 1,\r
+ "SKU_ID SystemSkuId;\r\n",\r
+ true\r
+ );\r
+ declaList.add(decl);\r
+ \r
+ instTable.put("SystemSkuId", "0");\r
+ }\r
+\r
+ }\r
+\r
public String getTypeDeclaration () {\r
return String.format(PcdDatabase.SkuIdTableDeclaration, phase);\r
}\r
\r
Output.add("/* SkuIdTable */");\r
Output.add("{");\r
- bodyStart = 2;\r
\r
if (al.size() == 0) {\r
- Output.add("0");\r
+ Output.add("\t0");\r
}\r
\r
for (int index = 0; index < al.size(); index++) {\r
\r
Integer[] ia = al.get(index);\r
\r
- str += ia[0].toString() + ", ";\r
+ str += "\t" + ia[0].toString() + ", ";\r
for (int index2 = 1; index2 < ia.length; index2++) {\r
str += ia[index2].toString();\r
- if (index != al.size() - 1) {\r
+ if (!((index2 == ia.length - 1) && (index == al.size() - 1))) {\r
str += ", ";\r
}\r
}\r
\r
Output.add(str);\r
- bodyLineNum++;\r
\r
}\r
\r
public int add (Token token) {\r
\r
int index;\r
+ int pos;\r
+ \r
+ //\r
+ // Check if this SKU_ID Array is already in the table\r
+ //\r
+ pos = 0;\r
+ for (Object o: al) {\r
+ Integer [] s = (Integer[]) o;\r
+ boolean different = false;\r
+ if (s[0] == token.getSkuIdCount()) {\r
+ for (index = 1; index < s.length; index++) {\r
+ if (s[index] != token.skuData.get(index-1).id) {\r
+ different = true;\r
+ break;\r
+ }\r
+ }\r
+ } else {\r
+ different = true;\r
+ }\r
+ if (different) {\r
+ pos += s[0] + 1;\r
+ } else {\r
+ return pos;\r
+ }\r
+ }\r
\r
Integer [] skuIds = new Integer[token.skuData.size() + 1];\r
skuIds[0] = new Integer(token.skuData.size());\r
return String.format(PcdDatabase.DatabaseExistenceMacro, phase, (al.size() == 0)? "TRUE":"FALSE");\r
}\r
\r
+ public void genCodeNew (ArrayList<CStructTypeDeclaration> declaList, HashMap<String, String> instTable, String phase) {\r
+ final String name = "LocalTokenNumberTable";\r
+ \r
+ CStructTypeDeclaration decl;\r
+ String cCode = "";\r
+\r
+ cCode += String.format(PcdDatabase.LocalTokenNumberTableDeclaration, phase); \r
+ decl = new CStructTypeDeclaration (\r
+ name,\r
+ 4,\r
+ cCode,\r
+ true\r
+ ); \r
+ declaList.add(decl);\r
+\r
+ cCode = PcdDatabase.genInstantiationStr(getInstantiation());\r
+ instTable.put(name, cCode);\r
+ }\r
+\r
public String getTypeDeclaration () {\r
return String.format(PcdDatabase.LocalTokenNumberTableDeclaration, phase);\r
}\r
for (int index = 0; index < al.size(); index++) {\r
String str;\r
\r
- str = (String)al.get(index);\r
+ str = "\t" + (String)al.get(index);\r
\r
str += " /* " + alComment.get(index) + " */ ";\r
\r
private ArrayList<String> alComment;\r
private String phase;\r
private int len;\r
- private int bodyStart;\r
private int bodyLineNum;\r
- private int base;\r
-\r
+ \r
public ExMapTable (String phase) {\r
this.phase = phase;\r
al = new ArrayList<ExTriplet>();\r
alComment = new ArrayList<String>();\r
- bodyStart = 0;\r
bodyLineNum = 0;\r
len = 0;\r
}\r
+ String.format(PcdDatabase.ExTokenNumber, phase, al.size());\r
}\r
\r
- private int getSize () {\r
- return (al.size() == 0)? 1 : al.size();\r
- }\r
-\r
public String getExistanceMacro () {\r
return String.format(PcdDatabase.ExMapTableExistenceMacro, phase, (al.size() == 0)? "TRUE":"FALSE");\r
}\r
\r
+ public void genCodeNew (ArrayList<CStructTypeDeclaration> declaList, HashMap<String, String> instTable, String phase) {\r
+ final String exMapTableName = "ExMapTable";\r
+ \r
+ sortTable();\r
+ \r
+ CStructTypeDeclaration decl;\r
+ String cCode = "";\r
+\r
+ cCode += String.format(PcdDatabase.ExMapTableDeclaration, phase); \r
+ decl = new CStructTypeDeclaration (\r
+ exMapTableName,\r
+ 4,\r
+ cCode,\r
+ true\r
+ ); \r
+ declaList.add(decl);\r
+\r
+\r
+ cCode = PcdDatabase.genInstantiationStr(getInstantiation());\r
+ instTable.put(exMapTableName, cCode);\r
+ }\r
+ \r
public String getTypeDeclaration () {\r
return String.format(PcdDatabase.ExMapTableDeclaration, phase);\r
}\r
\r
Output.add("/* ExMapTable */");\r
Output.add("{");\r
- bodyStart = 2;\r
-\r
if (al.size() == 0) {\r
- Output.add("{0, 0, 0}");\r
+ Output.add("\t{0, 0, 0}");\r
}\r
\r
int index;\r
\r
ExTriplet e = (ExTriplet)al.get(index);\r
\r
- str = "{ " + e.exTokenNumber.toString() + ", ";\r
+ str = "\t" + "{ " + String.format("0x%08X", e.exTokenNumber) + ", ";\r
str += e.localTokenIdx.toString() + ", ";\r
str += e.guidTableIdx.toString();\r
\r
- str += " /* " + alComment.get(index) + " */";\r
+ str += "}" + " /* " + alComment.get(index) + " */" ;\r
\r
if (index != al.size() - 1) {\r
str += ",";\r
return al.size() == 0 ? 1 : al.size();\r
}\r
\r
+ //\r
+ // To simplify the algorithm for GetNextToken and GetNextTokenSpace in\r
+ // PCD PEIM/Driver, we need to sort the ExMapTable according to the\r
+ // following order:\r
+ // 1) ExGuid\r
+ // 2) ExTokenNumber\r
+ // \r
+ class ExTripletComp implements Comparator<ExTriplet> {\r
+ public int compare (ExTriplet a, ExTriplet b) {\r
+ if (a.guidTableIdx == b.guidTableIdx ) {\r
+ if (a.exTokenNumber > b.exTokenNumber) {\r
+ return 1;\r
+ } else if (a.exTokenNumber > b.exTokenNumber) {\r
+ return 1;\r
+ } else {\r
+ return 0;\r
+ }\r
+ }\r
+ \r
+ return a.guidTableIdx - b.guidTableIdx;\r
+ }\r
+ }\r
+\r
+ private void sortTable () {\r
+ java.util.Comparator<ExTriplet> comparator = new ExTripletComp();\r
+ java.util.Collections.sort(al, comparator);\r
+ }\r
}\r
\r
class PcdDatabase {\r
\r
+ private final static int SkuHeadAlignmentSize = 4;\r
+ private final String newLine = "\r\n";\r
+ private final String commaNewLine = ",\r\n";\r
+ private final String tab = "\t";\r
public final static String ExMapTableDeclaration = "DYNAMICEX_MAPPING ExMapTable[%s_EXMAPPING_TABLE_SIZE];\r\n";\r
public final static String GuidTableDeclaration = "EFI_GUID GuidTable[%s_GUID_TABLE_SIZE];\r\n";\r
public final static String LocalTokenNumberTableDeclaration = "UINT32 LocalTokenNumberTable[%s_LOCAL_TOKEN_NUMBER_TABLE_SIZE];\r\n";\r
public final static String StringTableDeclaration = "UINT16 StringTable[%s_STRING_TABLE_SIZE];\r\n";\r
public final static String SizeTableDeclaration = "UINT16 SizeTable[%s_LOCAL_TOKEN_NUMBER_TABLE_SIZE];\r\n";\r
- public final static String SkuIdTableDeclaration = "UINT8 SkuIdTable[%s_SKUID_TABLE_SIZE];\r\n";\r
+ public final static String SkuIdTableDeclaration = "UINT8 SkuIdTable[%s_SKUID_TABLE_SIZE];\r\n";\r
\r
\r
public final static String ExMapTableSizeMacro = "#define %s_EXMAPPING_TABLE_SIZE %d\r\n";\r
public final static String ExTokenNumber = "#define %s_EX_TOKEN_NUMBER %d\r\n";\r
- public final static String GuidTableSizeMacro = "#define %s_GUID_TABLE_SIZE %d\r\n";\r
+ public final static String GuidTableSizeMacro = "#define %s_GUID_TABLE_SIZE %d\r\n"; \r
public final static String LocalTokenNumberTableSizeMacro = "#define %s_LOCAL_TOKEN_NUMBER_TABLE_SIZE %d\r\n";\r
public final static String LocalTokenNumberSizeMacro = "#define %s_LOCAL_TOKEN_NUMBER %d\r\n";\r
public final static String StringTableSizeMacro = "#define %s_STRING_TABLE_SIZE %d\r\n";\r
public final static String SkuTableExistenceMacro = "#define %s_SKUID_TABLE_EMPTY %s\r\n";\r
\r
public final static String offsetOfSkuHeadStrTemplate = "offsetof(%s_PCD_DATABASE, %s.%s_SkuDataTable)";\r
+ public final static String offsetOfVariableEnabledDefault = "offsetof(%s_PCD_DATABASE, %s.%s_VariableDefault_%d)";\r
public final static String offsetOfStrTemplate = "offsetof(%s_PCD_DATABASE, %s.%s)";\r
+ \r
+ private final static String skuDataTableTemplate = "SkuDataTable";\r
+\r
\r
private StringTable stringTable;\r
private GuidTable guidTable;\r
private String phase;\r
private int assignedTokenNumber;\r
\r
+ //\r
+ // Use two class global variable to store\r
+ // temperary \r
+ //\r
+ private String privateGlobalName;\r
+ private String privateGlobalCCode;\r
//\r
// After Major changes done to the PCD\r
// database generation class PcdDatabase\r
// also update the version number in PCD\r
// service PEIM and DXE driver accordingly.\r
//\r
- private final int version = 1;\r
+ private final int version = 2;\r
\r
private String hString;\r
private String cString;\r
- getAlignmentSize(a);\r
}\r
}\r
-\r
+ \r
public PcdDatabase (ArrayList<Token> alTokens, String exePhase, int startLen) {\r
phase = exePhase;\r
\r
sizeTable = new SizeTable(phase);\r
exMapTable = new ExMapTable(phase); \r
\r
- assignedTokenNumber = startLen;\r
+ assignedTokenNumber = startLen + 1;\r
this.alTokens = alTokens;\r
}\r
\r
+ private void getNonExAndExTokens (ArrayList<Token> alTokens, List<Token> nexTokens, List<Token> exTokens) {\r
+ for (int i = 0; i < alTokens.size(); i++) {\r
+ Token t = (Token)alTokens.get(i);\r
+ if (t.isDynamicEx()) {\r
+ exTokens.add(t);\r
+ } else {\r
+ nexTokens.add(t);\r
+ }\r
+ }\r
+\r
+ return;\r
+ }\r
+\r
private void getTwoGroupsOfTokens (ArrayList<Token> alTokens, List<Token> initTokens, List<Token> uninitTokens) {\r
for (int i = 0; i < alTokens.size(); i++) {\r
Token t = (Token)alTokens.get(i);\r
return;\r
}\r
\r
+ private int getDataTypeAlignmentSize (Token token) {\r
+ switch (token.datumType) {\r
+ case UINT8:\r
+ return 1;\r
+ case UINT16:\r
+ return 2;\r
+ case UINT32:\r
+ return 4;\r
+ case UINT64:\r
+ return 8;\r
+ case POINTER:\r
+ return 1;\r
+ case BOOLEAN:\r
+ return 1;\r
+ default:\r
+ return 1;\r
+ }\r
+ }\r
+ \r
private int getAlignmentSize (Token token) {\r
if (token.getDefaultSku().type == DynamicTokenValue.VALUE_TYPE.HII_TYPE) {\r
return 2;\r
if (token.isUnicodeStringType()) {\r
return 2;\r
}\r
-\r
- switch (token.datumType) {\r
- case UINT8:\r
- return 1;\r
- case UINT16:\r
- return 2;\r
- case UINT32:\r
- return 4;\r
- case UINT64:\r
- return 8;\r
- case POINTER:\r
- return 1;\r
- case BOOLEAN:\r
- return 1;\r
- }\r
- return 1;\r
+ \r
+ return getDataTypeAlignmentSize(token);\r
}\r
\r
public String getCString () {\r
public String getHString () {\r
return hString;\r
}\r
+ \r
+ private void genCodeWorker(Token t,\r
+ ArrayList<CStructTypeDeclaration> declaList,\r
+ HashMap<String, String> instTable, String phase)\r
+ throws EntityException {\r
+\r
+ CStructTypeDeclaration decl;\r
+\r
+ //\r
+ // Insert SKU_HEAD if isSkuEnable is true\r
+ //\r
+ if (t.isSkuEnable()) {\r
+ int tableIdx;\r
+ tableIdx = skuIdTable.add(t);\r
+ decl = new CStructTypeDeclaration(t.getPrimaryKeyString(),\r
+ SkuHeadAlignmentSize, getSkuEnabledTypeDeclaration(t), true);\r
+ declaList.add(decl);\r
+ instTable.put(t.getPrimaryKeyString(),\r
+ getSkuEnabledTypeInstantiaion(t, tableIdx));\r
+ }\r
+\r
+ //\r
+ // Insert PCD_ENTRY declaration and instantiation\r
+ //\r
+ getCDeclarationString(t);\r
+\r
+ decl = new CStructTypeDeclaration(privateGlobalName,\r
+ getAlignmentSize(t), privateGlobalCCode, t.hasDefaultValue());\r
+ declaList.add(decl);\r
+\r
+ if (t.hasDefaultValue()) {\r
+ instTable.put(privateGlobalName, \r
+ getTypeInstantiation(t, declaList, instTable, phase)\r
+ );\r
+ }\r
+\r
+ }\r
+\r
+ private void ProcessTokensNew (List<Token> tokens, \r
+ ArrayList<CStructTypeDeclaration> cStructDeclList,\r
+ HashMap<String, String> cStructInstTable,\r
+ String phase\r
+ ) \r
+ throws EntityException {\r
+ \r
+ for (int idx = 0; idx < tokens.size(); idx++) {\r
+ Token t = tokens.get(idx);\r
+ \r
+ genCodeWorker (t, cStructDeclList, cStructInstTable, phase);\r
+ \r
+ sizeTable.add(t);\r
+ localTokenNumberTable.add(t);\r
+ t.tokenNumber = assignedTokenNumber++;\r
+ \r
+ //\r
+ // Add a mapping if this dynamic PCD entry is a EX type\r
+ //\r
+ if (t.isDynamicEx()) {\r
+ exMapTable.add(t.tokenNumber, \r
+ t.dynamicExTokenNumber, \r
+ guidTable.add(t.tokenSpaceName, t.getPrimaryKeyString()), \r
+ t.getPrimaryKeyString()\r
+ );\r
+ }\r
+ }\r
+\r
+ }\r
+ \r
+ public void genCodeNew () throws EntityException {\r
+ \r
+ ArrayList<CStructTypeDeclaration> cStructDeclList = new ArrayList<CStructTypeDeclaration>();\r
+ HashMap<String, String> cStructInstTable = new HashMap<String, String>();\r
+ \r
+ List<Token> nexTokens = new ArrayList<Token> ();\r
+ List<Token> exTokens = new ArrayList<Token> ();\r
+\r
+ getNonExAndExTokens (alTokens, nexTokens, exTokens);\r
+\r
+ //\r
+ // We have to process Non-Ex type PCD entry first. The reason is\r
+ // that our optimization assumes that the Token Number of Non-Ex \r
+ // PCD entry start from 1 (for PEI phase) and grows continously upwards.\r
+ // \r
+ // EX type token number starts from the last Non-EX PCD entry and\r
+ // grows continously upwards.\r
+ //\r
+ ProcessTokensNew (nexTokens, cStructDeclList, cStructInstTable, phase);\r
+ ProcessTokensNew (exTokens, cStructDeclList, cStructInstTable, phase);\r
+ \r
+ stringTable.genCodeNew(cStructDeclList, cStructInstTable);\r
+ skuIdTable.genCodeNew(cStructDeclList, cStructInstTable, phase);\r
+ exMapTable.genCodeNew(cStructDeclList, cStructInstTable, phase);\r
+ localTokenNumberTable.genCodeNew(cStructDeclList, cStructInstTable, phase);\r
+ sizeTable.genCodeNew(cStructDeclList, cStructInstTable, phase);\r
+ guidTable.genCodeNew(cStructDeclList, cStructInstTable, phase);\r
+ \r
+ hString = genCMacroCode ();\r
+ \r
+ HashMap <String, String> result;\r
+ \r
+ result = genCStructCode(cStructDeclList, \r
+ cStructInstTable, \r
+ phase\r
+ );\r
+ \r
+ hString += result.get("initDeclStr");\r
+ hString += result.get("uninitDeclStr");\r
+ \r
+ hString += String.format("#define PCD_%s_SERVICE_DRIVER_VERSION %d", phase, version);\r
+ \r
+ cString = newLine + newLine + result.get("initInstStr");\r
+ \r
+ }\r
+ \r
+ private String genCMacroCode () {\r
+ String macroStr = "";\r
+\r
+ //\r
+ // Generate size info Macro for all Tables\r
+ //\r
+ macroStr += guidTable.getSizeMacro();\r
+ macroStr += stringTable.getSizeMacro();\r
+ macroStr += skuIdTable.getSizeMacro();\r
+ macroStr += localTokenNumberTable.getSizeMacro();\r
+ macroStr += exMapTable.getSizeMacro();\r
+\r
+ //\r
+ // Generate existance info Macro for all Tables\r
+ //\r
+ macroStr += guidTable.getExistanceMacro();\r
+ macroStr += stringTable.getExistanceMacro();\r
+ macroStr += skuIdTable.getExistanceMacro();\r
+ macroStr += localTokenNumberTable.getExistanceMacro();\r
+ macroStr += exMapTable.getExistanceMacro();\r
+\r
+ macroStr += newLine;\r
+ \r
+ return macroStr;\r
+ }\r
+ \r
+ private HashMap <String, String> genCStructCode(\r
+ ArrayList<CStructTypeDeclaration> declaList, \r
+ HashMap<String, String> instTable, \r
+ String phase\r
+ ) {\r
+ \r
+ int i;\r
+ HashMap <String, String> result = new HashMap<String, String>();\r
+ HashMap <Integer, ArrayList<String>> alignmentInitDecl = new HashMap<Integer, ArrayList<String>>();\r
+ HashMap <Integer, ArrayList<String>> alignmentUninitDecl = new HashMap<Integer, ArrayList<String>>();\r
+ HashMap <Integer, ArrayList<String>> alignmentInitInst = new HashMap<Integer, ArrayList<String>>();\r
+ \r
+ //\r
+ // Initialize the storage for each alignment\r
+ //\r
+ for (i = 8; i > 0; i>>=1) {\r
+ alignmentInitDecl.put(new Integer(i), new ArrayList<String>());\r
+ alignmentInitInst.put(new Integer(i), new ArrayList<String>());\r
+ alignmentUninitDecl.put(new Integer(i), new ArrayList<String>());\r
+ }\r
+ \r
+ String initDeclStr = "typedef struct {" + newLine;\r
+ String initInstStr = String.format("%s_PCD_DATABASE_INIT g%sPcdDbInit = { ", phase.toUpperCase(), phase.toUpperCase()) + newLine;\r
+ String uninitDeclStr = "typedef struct {" + newLine;\r
+\r
+ //\r
+ // Sort all C declaration and instantiation base on Alignment Size \r
+ //\r
+ for (Object d : declaList) {\r
+ CStructTypeDeclaration decl = (CStructTypeDeclaration) d;\r
+ \r
+ if (decl.initTable) {\r
+ alignmentInitDecl.get(new Integer(decl.alignmentSize)).add(decl.cCode);\r
+ alignmentInitInst.get(new Integer(decl.alignmentSize)).add(instTable.get(decl.key));\r
+ } else {\r
+ alignmentUninitDecl.get(new Integer(decl.alignmentSize)).add(decl.cCode);\r
+ }\r
+ }\r
+\r
+ //\r
+ // Generate code for every alignment size\r
+ //\r
+ for (int align = 8; align > 0; align >>= 1) {\r
+ ArrayList<String> declaListBasedOnAlignment = alignmentInitDecl.get(new Integer(align));\r
+ ArrayList<String> instListBasedOnAlignment = alignmentInitInst.get(new Integer(align));\r
+ for (i = 0; i < declaListBasedOnAlignment.size(); i++) {\r
+ initDeclStr += tab + declaListBasedOnAlignment.get(i);\r
+ initInstStr += tab + instListBasedOnAlignment.get(i);\r
+ \r
+ //\r
+ // We made a assumption that both PEI_PCD_DATABASE and DXE_PCD_DATABASE\r
+ // has a least one data memember with alignment size of 1. So we can\r
+ // remove the last "," in the C structure instantiation string.\r
+ //\r
+ if ((align == 1) && (i == declaListBasedOnAlignment.size() - 1)) {\r
+ initInstStr += newLine;\r
+ } else {\r
+ initInstStr += commaNewLine;\r
+ }\r
+ }\r
+ \r
+ declaListBasedOnAlignment = alignmentUninitDecl.get(new Integer(align));\r
+ for (Object d : declaListBasedOnAlignment) {\r
+ String s = (String)d;\r
+ uninitDeclStr += tab + s;\r
+ }\r
+ }\r
+ \r
+ initDeclStr += String.format("} %s_PCD_DATABASE_INIT;", phase) + newLine + newLine;\r
+ initInstStr += "};";\r
+ uninitDeclStr += String.format("} %s_PCD_DATABASE_UNINIT;", phase) + newLine + newLine;\r
+ \r
+ result.put("initDeclStr", initDeclStr);\r
+ result.put("initInstStr", initInstStr);\r
+ result.put("uninitDeclStr", uninitDeclStr);\r
+\r
+ return result;\r
+ }\r
\r
public void genCode () \r
throws EntityException {\r
\r
}\r
\r
- private String genInstantiationStr (ArrayList<String> alStr) {\r
+ public static String genInstantiationStr (ArrayList<String> alStr) {\r
String str = "";\r
for (int i = 0; i< alStr.size(); i++) {\r
- str += "\t" + alStr.get(i);\r
+ if (i != 0) {\r
+ str += "\t";\r
+ }\r
+ str += alStr.get(i);\r
if (i != alStr.size() - 1) {\r
str += "\r\n";\r
}\r
private String getSkuEnabledTypeInstantiaion (Token token, int SkuTableIdx) {\r
\r
String offsetof = String.format(PcdDatabase.offsetOfSkuHeadStrTemplate, phase, token.hasDefaultValue()? "Init" : "Uninit", token.getPrimaryKeyString());\r
- return String.format("{ %s, %d }", offsetof, SkuTableIdx);\r
+ return String.format("{ %s, %d } /* SKU_ENABLED: %s */", offsetof, SkuTableIdx, token.getPrimaryKeyString());\r
}\r
\r
private String getDataTypeDeclarationForSkuEnabled (Token token) {\r
\r
}\r
\r
+ private String getDataTypeInstantiationForVariableDefault_new (Token token, String cName, int skuId) {\r
+ return String.format("%s /* %s */", token.skuData.get(skuId).value.hiiDefaultValue, cName);\r
+ }\r
+\r
private String getDataTypeInstantiation (Token token) {\r
\r
if (token.datumType == Token.DATUM_TYPE.POINTER) {\r
}\r
}\r
\r
+ private String getCType (Token t) \r
+ throws EntityException {\r
+ \r
+ if (t.isHiiEnable()) {\r
+ return "VARIABLE_HEAD";\r
+ }\r
+ \r
+ if (t.isVpdEnable()) {\r
+ return "VPD_HEAD";\r
+ }\r
+ \r
+ if (t.isUnicodeStringType()) {\r
+ return "STRING_HEAD";\r
+ }\r
+ \r
+ switch (t.datumType) {\r
+ case UINT64:\r
+ return "UINT64";\r
+ case UINT32:\r
+ return "UINT32";\r
+ case UINT16:\r
+ return "UINT16";\r
+ case UINT8:\r
+ return "UINT8";\r
+ case BOOLEAN:\r
+ return "BOOLEAN";\r
+ case POINTER:\r
+ return "UINT8";\r
+ default:\r
+ throw new EntityException("Unknown type in getDataTypeCDeclaration");\r
+ }\r
+ }\r
+ \r
+ private void getCDeclarationString(Token t) \r
+ throws EntityException {\r
+ \r
+ if (t.isSkuEnable()) {\r
+ privateGlobalName = String.format("%s_%s", t.getPrimaryKeyString(), skuDataTableTemplate);\r
+ } else {\r
+ privateGlobalName = t.getPrimaryKeyString();\r
+ }\r
+\r
+ if (t.isUnicodeStringType()) {\r
+ privateGlobalCCode = String.format("STRING_HEAD %s[%d];\r\n", t.getPrimaryKeyString(), t.getSkuIdCount());\r
+ } else {\r
+ String type = getCType(t);\r
+ if (t.datumType == Token.DATUM_TYPE.POINTER) {\r
+ privateGlobalCCode = String.format("%s %s[%d][%d];\r\n", type, privateGlobalName, t.getSkuIdCount(), t.datumSize);\r
+ } else {\r
+ privateGlobalCCode = String.format("%s %s[%d];\r\n", type, privateGlobalName, t.getSkuIdCount());\r
+ }\r
+ }\r
+ }\r
+ \r
+ private String getDataTypeDeclarationForVariableDefault_new (Token token, String cName, int skuId) {\r
+\r
+ String typeStr = "";\r
+\r
+ if (token.datumType == Token.DATUM_TYPE.UINT8) {\r
+ typeStr = "UINT8";\r
+ } else if (token.datumType == Token.DATUM_TYPE.UINT16) {\r
+ typeStr = "UINT16";\r
+ } else if (token.datumType == Token.DATUM_TYPE.UINT32) {\r
+ typeStr = "UINT32";\r
+ } else if (token.datumType == Token.DATUM_TYPE.UINT64) {\r
+ typeStr = "UINT64";\r
+ } else if (token.datumType == Token.DATUM_TYPE.BOOLEAN) {\r
+ typeStr = "BOOLEAN";\r
+ } else if (token.datumType == Token.DATUM_TYPE.POINTER) {\r
+ return String.format("UINT8 %s[%d]", cName, token.datumSize);\r
+ } else {\r
+ }\r
\r
+ return String.format("%s %s;\r\n", typeStr, cName);\r
+ }\r
+ \r
private String getDataTypeDeclaration (Token token) {\r
\r
String typeStr = "";\r
private String getVpdEnableTypeDeclaration (Token token) {\r
return String.format("VPD_HEAD %s", token.getPrimaryKeyString());\r
}\r
+ \r
+ private String getTypeInstantiation (Token t, ArrayList<CStructTypeDeclaration> declaList, HashMap<String, String> instTable, String phase) throws EntityException {\r
+ \r
+ int i;\r
+\r
+ String s;\r
+ s = String.format("/* %s */", t.getPrimaryKeyString()) + newLine;\r
+ s += tab + "{" + newLine;\r
+\r
+ for (i = 0; i < t.skuData.size(); i++) {\r
+ if (t.isUnicodeStringType() && !t.isHiiEnable()) {\r
+ s += tab + tab + String.format("{ %d }", stringTable.add(t.skuData.get(i).value.value, t));\r
+ } else if (t.isHiiEnable()) {\r
+ /* VPD_HEAD definition\r
+ typedef struct {\r
+ UINT16 GuidTableIndex; // Offset in Guid Table in units of GUID.\r
+ UINT16 StringIndex; // Offset in String Table in units of UINT16.\r
+ UINT16 Offset; // Offset in Variable\r
+ } VARIABLE_HEAD ;\r
+ */\r
+ String variableDefaultName = String.format("%s_VariableDefault_%d", t.getPrimaryKeyString(), i); \r
+ \r
+ s += tab + tab + String.format("{ %d, %d, %s, %s }", guidTable.add(t.skuData.get(i).value.variableGuid, t.getPrimaryKeyString()),\r
+ stringTable.add(t.skuData.get(i).value.getStringOfVariableName(), t),\r
+ t.skuData.get(i).value.variableOffset,\r
+ String.format("offsetof(%s_PCD_DATABASE, Init.%s)", phase, variableDefaultName)\r
+ );\r
+ //\r
+ // We need to support the default value, so we add the declaration and\r
+ // the instantiation for the default value.\r
+ //\r
+ CStructTypeDeclaration decl = new CStructTypeDeclaration (variableDefaultName,\r
+ getDataTypeAlignmentSize(t),\r
+ getDataTypeDeclarationForVariableDefault_new(t, variableDefaultName, i),\r
+ true\r
+ ); \r
+ declaList.add(decl);\r
+ instTable.put(variableDefaultName, getDataTypeInstantiationForVariableDefault_new (t, variableDefaultName, i));\r
+ } else if (t.isVpdEnable()) {\r
+ /* typedef struct {\r
+ UINT32 Offset;\r
+ } VPD_HEAD;\r
+ */\r
+ s += tab + tab + String.format("{ %s }", t.skuData.get(i).value.vpdOffset);\r
+ } else {\r
+ s += tab + tab + String.format("{ %s }", t.skuData.get(i).value.value);\r
+ }\r
+ \r
+ if (i != t.skuData.size() - 1) {\r
+ s += commaNewLine;\r
+ } else {\r
+ s += newLine;\r
+ }\r
\r
+ }\r
+ \r
+ s += tab + "}";\r
+ \r
+ return s;\r
+ }\r
+ \r
private String getVpdEnableTypeInstantiation (Token token) {\r
return String.format("{ %s } /* %s */", token.getDefaultSku().vpdOffset,\r
token.getPrimaryKeyString());\r
\r
dbManager.getTwoPhaseDynamicRecordArray(alPei, alDxe);\r
PcdDatabase pcdPeiDatabase = new PcdDatabase (alPei, "PEI", 0);\r
- pcdPeiDatabase.genCode();\r
- dbManager.PcdPeimHString = PcdCommonHeaderString + pcdPeiDatabase.getHString()\r
+ pcdPeiDatabase.genCodeNew();\r
+ MemoryDatabaseManager.PcdPeimHString = PcdCommonHeaderString + pcdPeiDatabase.getHString()\r
+ PcdDatabase.getPcdPeiDatabaseDefinitions();\r
- dbManager.PcdPeimCString = pcdPeiDatabase.getCString();\r
+ MemoryDatabaseManager.PcdPeimCString = pcdPeiDatabase.getCString();\r
\r
PcdDatabase pcdDxeDatabase = new PcdDatabase (alDxe, \r
"DXE",\r
alPei.size()\r
);\r
- pcdDxeDatabase.genCode();\r
- dbManager.PcdDxeHString = dbManager.PcdPeimHString + pcdDxeDatabase.getHString()\r
+ pcdDxeDatabase.genCodeNew();\r
+ MemoryDatabaseManager.PcdDxeHString = MemoryDatabaseManager.PcdPeimHString + pcdDxeDatabase.getHString()\r
+ PcdDatabase.getPcdDxeDatabaseDefinitions();\r
- dbManager.PcdDxeCString = pcdDxeDatabase.getCString();\r
+ MemoryDatabaseManager.PcdDxeCString = pcdDxeDatabase.getCString();\r
}\r
\r
/**\r