]> git.proxmox.com Git - mirror_edk2.git/blob - Tools/Source/GenBuild/org/tianocore/build/pcd/entity/UsageInstance.java
Change the macro for dynamicEx type PCD and modify autogen tools to auto generate...
[mirror_edk2.git] / Tools / Source / GenBuild / org / tianocore / build / pcd / entity / UsageInstance.java
1 /** @file
2 UsageInstance class.
3
4 This class indicate an usage instance for a PCD token. This instance maybe a module
5 or platform setting. When a module produce or cosume a PCD token, then this module
6 is an usage instance for this PCD token.
7
8 Copyright (c) 2006, Intel Corporation
9 All rights reserved. This program and the accompanying materials
10 are licensed and made available under the terms and conditions of the BSD License
11 which accompanies this distribution. The full text of the license may be found at
12 http://opensource.org/licenses/bsd-license.php
13
14 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
15 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
16
17 **/
18 package org.tianocore.build.pcd.entity;
19
20
21 import java.util.UUID;
22
23 import org.tianocore.build.autogen.CommonDefinition;
24 import org.tianocore.build.pcd.action.ActionMessage;
25 import org.tianocore.build.pcd.exception.EntityException;
26
27 /**
28 This class indicate an usage instance for a PCD token. This instance maybe a module
29 or platform setting. When a module produce or cosume a PCD token, then this module
30 is an usage instance for this PCD token.
31 **/
32 public class UsageInstance {
33 ///
34 /// The module type of usage instance.
35 ///
36 public enum MODULE_TYPE {SEC, PEI_CORE, PEIM, DXE_CORE, DXE_DRIVERS, OTHER_COMPONENTS}
37
38 ///
39 /// This parent that this usage instance belongs to.
40 ///
41 public Token parentToken;
42
43 ///
44 /// The name of the module who contains this PCD.
45 ///
46 public String moduleName;
47
48 ///
49 /// The GUID of the module who contains this PCD.
50 ///
51 public UUID moduleGUID;
52
53 ///
54 /// The name of the package whose module contains this PCD.
55 ///
56 public String packageName;
57
58 ///
59 /// The GUID of the package whose module contains this PCD.
60 ///
61 public UUID packageGUID;
62
63 ///
64 /// The PCD type defined for module
65 ///
66 public Token.PCD_TYPE modulePcdType;
67
68 ///
69 /// The arch string of module contains this PCD
70 ///
71 public String arch;
72
73 ///
74 /// The version of module contains this PCD
75 ///
76 public String version;
77
78 ///
79 /// The module type for this usage instance.
80 ///
81 public MODULE_TYPE moduleType;
82
83 ///
84 /// The value of the PCD in this usage instance.
85 ///
86 public String datum;
87
88 ///
89 /// The maxDatumSize could be different for same PCD in different module
90 /// But this case is allow for FeatureFlag, FixedAtBuild, PatchableInModule
91 /// type.
92 ///
93 public int maxDatumSize;
94
95 ///
96 /// Autogen string for header file.
97 ///
98 public String hAutogenStr;
99
100 ///
101 /// Auotgen string for C code file.
102 ///
103 public String cAutogenStr;
104
105 /**
106 Constructure function
107
108 @param parentToken Member variable.
109 @param moduleName Member variable.
110 @param moduleGUID Member variable.
111 @param packageName Member variable.
112 @param packageGUID Member variable.
113 @param moduleType Member variable.
114 @param modulePcdType Member variable.
115 @param arch Member variable.
116 @param version Member variable.
117 @param value Member variable.
118 @param maxDatumSize Member variable.
119 */
120 public UsageInstance (Token parentToken,
121 String moduleName,
122 UUID moduleGUID,
123 String packageName,
124 UUID packageGUID,
125 MODULE_TYPE moduleType,
126 Token.PCD_TYPE modulePcdType,
127 String arch,
128 String version,
129 String value,
130 int maxDatumSize) {
131 this.parentToken = parentToken;
132 this.moduleName = moduleName;
133 this.moduleGUID = moduleGUID;
134 this.packageName = packageName;
135 this.packageGUID = packageGUID;
136 this.moduleType = moduleType;
137 this.modulePcdType = modulePcdType;
138 this.arch = arch;
139 this.version = version;
140 this.datum = value;
141 this.maxDatumSize = maxDatumSize;
142 }
143
144 /**
145 Get the primary key for usage instance array for every token.
146
147 @param moduleName the name of module
148 @param moduleGUID the GUID name of module
149 @param packageName the name of package who contains this module
150 @param packageGUID the GUID name of package
151 @param arch the archtecture string
152 @param version the version of this module
153
154 @return String primary key
155 */
156 public static String getPrimaryKey(String moduleName,
157 UUID moduleGUID,
158 String packageName,
159 UUID packageGUID,
160 String arch,
161 String version) {
162 //
163 // Because currently transition schema not require write moduleGuid, package Name, Packge GUID in
164 // <ModuleSA> section, So currently no expect all paramter must be valid.
165 return(moduleName + "_" +
166 ((moduleGUID != null) ? moduleGUID.toString() : "NullModuleGuid") + "_" +
167 ((packageName != null) ? packageName : "NullPackageName") + "_" +
168 ((packageGUID != null) ? packageGUID.toString() : "NullPackageGuid") + "_" +
169 ((arch != null) ? arch : "NullArch") + "_" +
170 ((version != null) ? version : "NullVersion"));
171 }
172
173 /**
174 Get primary key string for this usage instance
175
176 @return String primary key string
177 **/
178 public String getPrimaryKey() {
179 return UsageInstance.getPrimaryKey(moduleName, moduleGUID, packageName, packageGUID, arch, version);
180 }
181
182 /**
183 Judget whether current module is PEI driver
184
185 @return boolean
186 */
187 public boolean isPeiPhaseComponent() {
188 if ((moduleType == MODULE_TYPE.PEI_CORE) ||
189 (moduleType == MODULE_TYPE.PEIM)) {
190 return true;
191 }
192 return false;
193 }
194
195 /**
196 Generate autogen string for header file and C code file.
197
198 @throws EntityException Fail to generate.
199
200 @param isBuildUsedLibrary whether the autogen is for library.
201 */
202 public void generateAutoGen(boolean isBuildUsedLibrary)
203 throws EntityException {
204 String guidStringArray[] = null;
205 String guidString = null;
206
207 hAutogenStr = "";
208 cAutogenStr = "";
209
210 if (this.modulePcdType == Token.PCD_TYPE.DYNAMIC_EX) {
211 hAutogenStr += String.format("#define _PCD_LOCAL_TOKEN_%s 0x%016x\r\n",
212 parentToken.cName, parentToken.tokenNumber);
213 hAutogenStr += String.format("#define _PCD_TOKEN_%s 0x%016x\r\n",
214 parentToken.cName, parentToken.dynamicExTokenNumber);
215 } else {
216 hAutogenStr += String.format("#define _PCD_TOKEN_%s 0x%016x\r\n",
217 parentToken.cName, parentToken.tokenNumber);
218 }
219
220 switch (modulePcdType) {
221 case FEATURE_FLAG:
222 if (isBuildUsedLibrary) {
223 hAutogenStr += String.format("extern const BOOLEAN _gPcd_FixedAtBuild_%s;\r\n",
224 parentToken.cName);
225 hAutogenStr += String.format("#define _PCD_MODE_%s_%s _gPcd_FixedAtBuild_%s\r\n",
226 parentToken.GetAutogenDefinedatumTypeString(parentToken.datumType),
227 parentToken.cName,
228 parentToken.cName);
229 } else {
230 hAutogenStr += String.format("#define _PCD_VALUE_%s %s\r\n",
231 parentToken.cName,
232 datum.toString());
233 hAutogenStr += String.format("extern const BOOLEAN _gPcd_FixedAtBuild_%s;\r\n",
234 parentToken.cName);
235 cAutogenStr += String.format("GLOBAL_REMOVE_IF_UNREFERENCED const BOOLEAN _gPcd_FixedAtBuild_%s = _PCD_VALUE_%s;\r\n",
236 parentToken.cName,
237 parentToken.cName);
238 hAutogenStr += String.format("#define _PCD_MODE_%s_%s _PCD_VALUE_%s\r\n",
239 Token.GetAutogenDefinedatumTypeString(parentToken.datumType),
240 parentToken.cName,
241 parentToken.cName);
242 }
243 break;
244 case FIXED_AT_BUILD:
245 if (isBuildUsedLibrary) {
246 hAutogenStr += String.format("extern const %s _gPcd_FixedAtBuild_%s;\r\n",
247 Token.getAutogendatumTypeString(parentToken.datumType),
248 parentToken.cName);
249 hAutogenStr += String.format("#define _PCD_MODE_%s_%s _gPcd_FixedAtBuild_%s\r\n",
250 Token.GetAutogenDefinedatumTypeString(parentToken.datumType),
251 parentToken.cName,
252 parentToken.cName);
253 } else {
254 hAutogenStr += String.format("#define _PCD_VALUE_%s %s\r\n",
255 parentToken.cName,
256 datum.toString());
257 hAutogenStr += String.format("extern const %s _gPcd_FixedAtBuild_%s;\r\n",
258 Token.getAutogendatumTypeString(parentToken.datumType),
259 parentToken.cName);
260 cAutogenStr += String.format("GLOBAL_REMOVE_IF_UNREFERENCED const %s _gPcd_FixedAtBuild_%s = _PCD_VALUE_%s;\r\n",
261 Token.getAutogendatumTypeString(parentToken.datumType),
262 parentToken.cName,
263 parentToken.cName);
264 hAutogenStr += String.format("#define _PCD_MODE_%s_%s _PCD_VALUE_%s\r\n",
265 Token.GetAutogenDefinedatumTypeString(parentToken.datumType),
266 parentToken.cName,
267 parentToken.cName);
268 }
269 break;
270 case PATCHABLE_IN_MODULE:
271 if (isBuildUsedLibrary) {
272 hAutogenStr += String.format("extern %s _gPcd_BinaryPatch_%s;\r\n",
273 Token.getAutogendatumTypeString(parentToken.datumType),
274 parentToken.cName);
275 hAutogenStr += String.format("#define _PCD_MODE_%s_%s _gPcd_BinaryPatch_%s\r\n",
276 Token.GetAutogenDefinedatumTypeString(parentToken.datumType),
277 parentToken.cName,
278 parentToken.cName);
279 } else {
280 hAutogenStr += String.format("#define _PCD_VALUE_%s %s\r\n",
281 parentToken.cName,
282 datum.toString());
283 hAutogenStr += String.format("extern %s _gPcd_BinaryPatch_%s;\r\n",
284 Token.getAutogendatumTypeString(parentToken.datumType),
285 parentToken.cName);
286 cAutogenStr += String.format("GLOBAL_REMOVE_IF_UNREFERENCED %s _gPcd_BinaryPatch_%s = _PCD_VALUE_%s;\r\n",
287 Token.getAutogendatumTypeString(parentToken.datumType),
288 parentToken.cName,
289 parentToken.cName);
290 hAutogenStr += String.format("#define _PCD_MODE_%s_%s _gPcd_BinaryPatch_%s\r\n",
291 Token.GetAutogenDefinedatumTypeString(parentToken.datumType),
292 parentToken.cName,
293 parentToken.cName);
294 }
295
296 break;
297 case DYNAMIC:
298 hAutogenStr += String.format("#define _PCD_MODE_%s_%s LibPcdGet%s(_PCD_TOKEN_%s)\r\n",
299 Token.GetAutogenDefinedatumTypeString(parentToken.datumType),
300 parentToken.cName,
301 Token.getAutogenLibrarydatumTypeString(parentToken.datumType),
302 parentToken.cName);
303 break;
304 case DYNAMIC_EX:
305 guidStringArray = parentToken.tokenSpaceName.toString().split("-");
306 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}}",
307 guidStringArray[0],
308 guidStringArray[1],
309 guidStringArray[2],
310 (guidStringArray[3].substring(0, 2)),
311 (guidStringArray[3].substring(2, 4)),
312 (guidStringArray[4].substring(0, 2)),
313 (guidStringArray[4].substring(2, 4)),
314 (guidStringArray[4].substring(4, 6)),
315 (guidStringArray[4].substring(6, 8)),
316 (guidStringArray[4].substring(8, 10)),
317 (guidStringArray[4].substring(10, 12)));
318
319 hAutogenStr += String.format("extern EFI_GUID _gPcd_DynamicEx_TokenSpaceGuid_%s;\r\n",
320 parentToken.cName);
321 hAutogenStr += String.format("#define _PCD_MODE_%s_%s LibPcdGet%s(_PCD_LOCAL_TOKEN_%s)\r\n",
322 Token.GetAutogenDefinedatumTypeString(parentToken.datumType),
323 parentToken.cName,
324 Token.getAutogenLibrarydatumTypeString(parentToken.datumType),
325 parentToken.cName,
326 parentToken.cName);
327
328 if (!isBuildUsedLibrary) {
329 cAutogenStr += String.format("GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID _gPcd_DynamicEx_TokenSpaceGuid_%s = %s;\r\n",
330 parentToken.cName,
331 guidString);
332 }
333 break;
334 }
335 }
336
337 /**
338 Get the autogen string for header file.
339
340 @return The string of header file.
341 **/
342 public String getHAutogenStr() {
343 return hAutogenStr;
344 }
345
346 /**
347 Get the autogen string for C code file.
348
349 @return The string of C Code file.
350 **/
351 public String getCAutogenStr() {
352 return cAutogenStr;
353 }
354 }
355