Corrected the regular expression because it will skip many includes.
[mirror_edk2.git] / Tools / Java / Source / GenBuild / org / tianocore / build / autogen / AutoGen.java
CommitLineData
878ddf1f 1/** @file\r
2 AutoGen class.\r
3\r
4 This class is to generate Autogen.h and Autogen.c according to module surface area\r
5 or library surface area.\r
ff225cbb 6\r
878ddf1f 7 Copyright (c) 2006, Intel Corporation\r
8 All rights reserved. This program and the accompanying materials\r
9 are licensed and made available under the terms and conditions of the BSD License\r
10 which accompanies this distribution. The full text of the license may be found at\r
11 http://opensource.org/licenses/bsd-license.php\r
ff225cbb 12\r
878ddf1f 13 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
14 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
15\r
16 **/\r
17\r
18package org.tianocore.build.autogen;\r
19\r
878ddf1f 20import java.io.File;\r
73b4e31a 21import java.io.FileInputStream;\r
22import java.io.FileOutputStream;\r
878ddf1f 23import java.io.FileReader;\r
24import java.io.FileWriter;\r
cb4d97bd 25import java.io.IOException;\r
878ddf1f 26import java.util.ArrayList;\r
a29c47e0 27import java.util.HashSet;\r
28import java.util.Iterator;\r
893cea14 29import java.util.LinkedHashSet;\r
136adffc 30import java.util.LinkedList;\r
878ddf1f 31import java.util.List;\r
32import java.util.Map;\r
a29c47e0 33import java.util.Set;\r
878ddf1f 34\r
73b4e31a 35import org.apache.tools.ant.BuildException;\r
36import org.apache.xmlbeans.XmlObject;\r
d3945b9d 37import org.tianocore.build.exception.AutoGenException;\r
73b4e31a 38import org.tianocore.build.global.GlobalData;\r
73b4e31a 39import org.tianocore.build.global.SurfaceAreaQuery;\r
40import org.tianocore.build.id.ModuleIdentification;\r
41import org.tianocore.build.id.PackageIdentification;\r
42import org.tianocore.build.pcd.action.PCDAutoGenAction;\r
cb4d97bd 43import org.tianocore.common.definitions.ToolDefinitions;\r
4353d8e1 44import org.tianocore.common.definitions.EdkDefinitions;\r
892b0e7a 45import org.tianocore.common.exception.EdkException;\r
d3945b9d 46import org.tianocore.common.logger.EdkLog;\r
73b4e31a 47\r
878ddf1f 48/**\r
cb4d97bd 49 This class is to generate Autogen.h and Autogen.c according to module surface\r
50 area or library surface area.\r
51**/\r
878ddf1f 52public class AutoGen {\r
5f907e4a 53 ///\r
54 /// The output path of Autogen.h and Autogen.c\r
55 ///\r
56 private String outputPath;\r
57\r
ff225cbb 58 ///\r
59 /// The name of FV directory\r
60 ///\r
73b4e31a 61 private String fvDir;\r
5f907e4a 62\r
63 ///\r
64 /// The base name of module or library.\r
65 ///\r
66 private ModuleIdentification moduleId;\r
67\r
68 ///\r
69 /// The build architecture\r
70 ///\r
71 private String arch;\r
72\r
73 ///\r
74 /// PcdAutogen instance which is used to manage how to generate the PCD\r
75 /// information.\r
76 ///\r
77 private PCDAutoGenAction myPcdAutogen;\r
78\r
79 ///\r
80 /// the one of type : NOT_PCD_DRIVER, PEI_PCD_DRIVER, DXE_PCD_DRIVER\r
81 /// \r
82 private CommonDefinition.PCD_DRIVER_TYPE pcdDriverType;\r
83\r
84 ///\r
85 /// The protocl list which records in module or library surface area and\r
86 /// it's dependence on library instance surface area.\r
87 ///\r
88 private Set<String> mProtocolList = new HashSet<String>();\r
89\r
90 ///\r
91 /// The Ppi list which recorded in module or library surface area and its\r
92 /// dependency on library instance surface area.\r
93 ///\r
94 private Set<String> mPpiList = new HashSet<String>();\r
95\r
96 ///\r
97 /// The Guid list which recoreded in module or library surface area and it's\r
98 /// dependence on library instance surface area.\r
99 ///\r
100 private Set<String> mGuidList = new HashSet<String>();\r
ff225cbb 101\r
cb4d97bd 102 ///\r
103 /// The dependence package list which recoreded in module or library surface\r
104 /// area and it's dependence on library instance surface area.\r
105 ///\r
136adffc 106 private List<PackageIdentification> mDepPkgList = new LinkedList<PackageIdentification>();\r
2336382f 107\r
cb4d97bd 108 ///\r
109 /// For non library module, add its library instance's construct and destructor to\r
4353d8e1 110 /// list. String[0] recode LibConstructor name, String[1] recode Lib instance \r
e425f073 111 /// module type.\r
cb4d97bd 112 ///\r
4353d8e1 113 private List<String[]> libConstructList = new ArrayList<String[]>();\r
114 private List<String[]> libDestructList = new ArrayList<String[]>();\r
5f907e4a 115\r
cb4d97bd 116 ///\r
117 /// List to store SetVirtalAddressMapCallBack, ExitBootServiceCallBack\r
118 ///\r
5f907e4a 119 private List<String> setVirtalAddList = new ArrayList<String>();\r
120 private List<String> exitBootServiceList = new ArrayList<String>();\r
121\r
e425f073 122 //\r
123 // flag of PcdComponentNameDisable, PcdDriverDiagnosticDisable \r
124 //\r
125 private boolean componentNamePcd = false;\r
126 private boolean driverDiagnostPcd = false;\r
a387de3b 127\r
e425f073 128 //\r
129 // Instance of SurfaceAreaQuery\r
130 //\r
83fba802 131 private SurfaceAreaQuery saq = null;\r
a387de3b 132\r
2eb7d78d 133 private ModuleIdentification parentId = null;\r
5f907e4a 134\r
135 /**\r
cb4d97bd 136 Construct function\r
137 \r
138 This function mainly initialize some member variable.\r
139 \r
140 @param fvDir\r
141 Absolute path of FV directory.\r
142 @param outputPath\r
143 Output path of AutoGen file.\r
144 @param moduleId\r
145 Module identification.\r
146 @param arch\r
147 Target architecture.\r
148 **/\r
2eb7d78d 149 public AutoGen(String fvDir, String outputPath, ModuleIdentification moduleId, String arch, SurfaceAreaQuery saq, ModuleIdentification parentId) {\r
5f907e4a 150 this.outputPath = outputPath;\r
151 this.moduleId = moduleId;\r
152 this.arch = arch;\r
73b4e31a 153 this.fvDir = fvDir;\r
83fba802 154 this.saq = saq;\r
2eb7d78d 155 this.parentId = parentId;\r
5f907e4a 156 }\r
157\r
158 /**\r
cb4d97bd 159 saveFile function\r
160 \r
161 This function save the content in stringBuffer to file.\r
162 \r
163 @param fileName\r
164 The name of file.\r
165 @param fileBuffer\r
166 The content of AutoGen file in buffer.\r
167 @return boolean \r
168 "true" successful\r
169 "false" failed\r
170 **/\r
5f907e4a 171 private boolean saveFile(String fileName, StringBuffer fileBuffer) {\r
a387de3b 172\r
cb4d97bd 173 File autoGenH = new File(fileName);\r
5f907e4a 174\r
e425f073 175 //\r
176 // if the file exists, compare their content\r
177 //\r
cb4d97bd 178 if (autoGenH.exists()) {\r
179 char[] oldFileBuffer = new char[(int) autoGenH.length()];\r
e425f073 180 try {\r
181 FileReader fIn = new FileReader(autoGenH);\r
182 fIn.read(oldFileBuffer, 0, (int) autoGenH.length());\r
5f907e4a 183 fIn.close();\r
e425f073 184 } catch (IOException e) {\r
185 EdkLog.log(EdkLog.EDK_INFO, this.moduleId.getName() \r
a387de3b 186 + "'s " \r
187 + fileName \r
188 + " is exist, but can't be open!!");\r
e425f073 189 return false;\r
190 }\r
5f907e4a 191\r
cb4d97bd 192 //\r
193 // if we got the same file, don't re-generate it to prevent\r
194 // sources depending on it from re-building\r
195 //\r
196 if (fileBuffer.toString().compareTo(new String(oldFileBuffer)) == 0) {\r
197 return true;\r
5f907e4a 198 }\r
cb4d97bd 199 }\r
a387de3b 200\r
e425f073 201 try {\r
202 FileWriter fOut = new FileWriter(autoGenH);\r
5f907e4a 203 fOut.write(fileBuffer.toString());\r
e425f073 204 fOut.flush();\r
5f907e4a 205 fOut.close();\r
e425f073 206 } catch (IOException e) {\r
207 EdkLog.log(EdkLog.EDK_INFO, this.moduleId.getName() \r
a387de3b 208 + "'s " \r
209 + fileName \r
210 + " can't be create!!");\r
e425f073 211 return false;\r
a387de3b 212 }\r
5f907e4a 213 return true;\r
214 }\r
215\r
216 /**\r
cb4d97bd 217 genAutogen function\r
218 \r
219 This function call libGenAutoGen or moduleGenAutogen function, which\r
220 dependence on generate library autogen or module autogen.\r
221 \r
222 @throws BuildException\r
223 Failed to creat AutoGen.c & AutoGen.h.\r
224 **/\r
61528a1b 225 public void genAutogen() throws EdkException {\r
192a42b4 226 //\r
227 // If outputPath do not exist, create it.\r
228 //\r
229 File path = new File(outputPath);\r
230 path.mkdirs();\r
a387de3b 231\r
e425f073 232 //\r
233 // Check current is library or not, then call the corresponding\r
234 // function.\r
235 //\r
236 if (this.moduleId.isLibrary()) {\r
237 libGenAutogen();\r
238 } else {\r
239 moduleGenAutogen();\r
240 }\r
5f907e4a 241 }\r
242\r
243 /**\r
cb4d97bd 244 moduleGenAutogen function\r
245 \r
246 This function generates AutoGen.c & AutoGen.h for module.\r
247 \r
248 @throws BuildException\r
249 Faile to create module AutoGen.c & AutoGen.h.\r
250 **/\r
61528a1b 251 void moduleGenAutogen() throws EdkException {\r
a387de3b 252 setPcdComponentName();\r
253 setPcdDriverDiagnostic();\r
e425f073 254 collectLibInstanceInfo();\r
255 moduleGenAutogenC();\r
256 moduleGenAutogenH();\r
5f907e4a 257 }\r
258\r
259 /**\r
cb4d97bd 260 libGenAutogen function\r
261 \r
262 This function generates AutoGen.c & AutoGen.h for library.\r
263 \r
264 @throws BuildException\r
265 Faile to create library AutoGen.c & AutoGen.h\r
266 **/\r
61528a1b 267 void libGenAutogen() throws EdkException {\r
e425f073 268 libGenAutogenC();\r
269 libGenAutogenH();\r
5f907e4a 270 }\r
271\r
272 /**\r
cb4d97bd 273 moduleGenAutogenH\r
274 \r
275 This function generates AutoGen.h for module.\r
276 \r
277 @throws BuildException\r
278 Failed to generate AutoGen.h.\r
279 **/\r
61528a1b 280 void moduleGenAutogenH() throws EdkException {\r
5f907e4a 281\r
282 Set<String> libClassIncludeH;\r
283 String moduleType;\r
284 // List<String> headerFileList;\r
285 List<String> headerFileList;\r
286 Iterator item;\r
287 StringBuffer fileBuffer = new StringBuffer(8192);\r
288\r
289 //\r
290 // Write Autogen.h header notation\r
291 //\r
cb4d97bd 292 fileBuffer.append(CommonDefinition.AUTOGENHNOTATION);\r
5f907e4a 293\r
294 //\r
295 // Add #ifndef ${BaseName}_AUTOGENH\r
296 // #def ${BseeName}_AUTOGENH\r
297 //\r
cb4d97bd 298 fileBuffer.append(CommonDefinition.IFNDEF \r
a387de3b 299 + CommonDefinition.AUTOGENH\r
300 + this.moduleId.getGuid().replaceAll("-", "_") \r
301 + ToolDefinitions.LINE_SEPARATOR);\r
cb4d97bd 302 fileBuffer.append(CommonDefinition.DEFINE \r
a387de3b 303 + CommonDefinition.AUTOGENH\r
304 + this.moduleId.getGuid().replaceAll("-", "_") \r
305 + ToolDefinitions.LINE_SEPARATOR \r
306 + ToolDefinitions.LINE_SEPARATOR);\r
5f907e4a 307\r
308 //\r
309 // Write the specification version and release version at the begine\r
310 // of autogen.h file.\r
311 // Note: the specification version and release version should\r
312 // be got from module surface area instead of hard code by it's\r
313 // moduleType.\r
314 //\r
83fba802 315 moduleType = saq.getModuleType();\r
5f907e4a 316\r
317 //\r
318 // Add "extern int __make_me_compile_correctly;" at begin of\r
319 // AutoGen.h.\r
320 //\r
cb4d97bd 321 fileBuffer.append(CommonDefinition.AUTOGENHBEGIN);\r
136adffc 322\r
323 //\r
324 // Put EFI_SPECIFICATION_VERSION, and EDK_RELEASE_VERSION.\r
878ddf1f 325 //\r
83fba802 326 String[] specList = saq.getExternSpecificaiton();\r
136adffc 327 for (int i = 0; i < specList.length; i++) {\r
cb4d97bd 328 fileBuffer.append(CommonDefinition.DEFINE + specList[i]\r
daa7a3eb 329 + "\n");\r
5f907e4a 330 }\r
331 //\r
332 // Write consumed package's mdouleInfo related .h file to autogen.h\r
333 //\r
334 // PackageIdentification[] consumedPkgIdList = SurfaceAreaQuery\r
335 // .getDependencePkg(this.arch);\r
83fba802 336 PackageIdentification[] consumedPkgIdList = saq.getDependencePkg(this.arch);\r
5f907e4a 337 if (consumedPkgIdList != null) {\r
338 headerFileList = depPkgToAutogenH(consumedPkgIdList, moduleType);\r
339 item = headerFileList.iterator();\r
340 while (item.hasNext()) {\r
341 fileBuffer.append(item.next().toString());\r
342 }\r
343 }\r
344\r
345 //\r
346 // Write library class's related *.h file to autogen.h.\r
347 //\r
83fba802 348 String[] libClassList = saq.getLibraryClasses(CommonDefinition.ALWAYSCONSUMED,this.arch);\r
5f907e4a 349 if (libClassList != null) {\r
350 libClassIncludeH = LibraryClassToAutogenH(libClassList);\r
351 item = libClassIncludeH.iterator();\r
352 while (item.hasNext()) {\r
353 fileBuffer.append(item.next().toString());\r
354 }\r
878ddf1f 355 }\r
5f907e4a 356\r
83fba802 357 libClassList = saq.getLibraryClasses(CommonDefinition.ALWAYSPRODUCED, this.arch);\r
5f907e4a 358 if (libClassList != null) {\r
359 libClassIncludeH = LibraryClassToAutogenH(libClassList);\r
360 item = libClassIncludeH.iterator();\r
361 while (item.hasNext()) {\r
362 fileBuffer.append(item.next().toString());\r
363 }\r
364 }\r
daa7a3eb 365 fileBuffer.append("\n");\r
136adffc 366\r
73b4e31a 367 //\r
ff225cbb 368 // If is TianoR8FlashMap, copy {Fv_DIR}/FlashMap.h to\r
73b4e31a 369 // {DEST_DIR_DRBUG}/FlashMap.h\r
ff225cbb 370 //\r
83fba802 371 if (saq.isHaveTianoR8FlashMap()) {\r
cb4d97bd 372 fileBuffer.append(CommonDefinition.INCLUDE);\r
73b4e31a 373 fileBuffer.append(" <");\r
daa7a3eb 374 fileBuffer.append(CommonDefinition.TIANOR8PLASHMAPH + ">\n");\r
73b4e31a 375 copyFlashMapHToDebugDir();\r
376 }\r
377\r
5f907e4a 378 // Write PCD autogen information to AutoGen.h.\r
379 //\r
380 if (this.myPcdAutogen != null) {\r
daa7a3eb 381 fileBuffer.append("\n");\r
11eb278a 382 fileBuffer.append(this.myPcdAutogen.getHAutoGenString());\r
5f907e4a 383 }\r
384\r
385 //\r
386 // Append the #endif at AutoGen.h\r
387 //\r
daa7a3eb 388 fileBuffer.append("#endif\n");\r
5f907e4a 389\r
390 //\r
391 // Save string buffer content in AutoGen.h.\r
392 //\r
393 if (!saveFile(outputPath + File.separatorChar + "AutoGen.h", fileBuffer)) {\r
61528a1b 394 throw new AutoGenException("Failed to generate AutoGen.h !!!");\r
5f907e4a 395 }\r
396 }\r
397\r
398 /**\r
cb4d97bd 399 moduleGenAutogenC\r
400 \r
401 This function generates AutoGen.c for module.\r
402 \r
403 @throws BuildException\r
404 Failed to generate AutoGen.c.\r
405 **/\r
61528a1b 406 void moduleGenAutogenC() throws EdkException {\r
5f907e4a 407\r
408 StringBuffer fileBuffer = new StringBuffer(8192);\r
409 //\r
410 // Write Autogen.c header notation\r
411 //\r
cb4d97bd 412 fileBuffer.append(CommonDefinition.AUTOGENCNOTATION);\r
5f907e4a 413\r
5f907e4a 414 //\r
415 // Get the native MSA file infomation. Since before call autogen,\r
416 // the MSA native <Externs> information were overrided. So before\r
417 // process <Externs> it should be set the DOC as the Native MSA info.\r
418 //\r
419 Map<String, XmlObject> doc = GlobalData.getNativeMsa(this.moduleId);\r
83fba802 420 saq.push(doc);\r
5f907e4a 421 //\r
422 // Write <Extern>\r
423 // DriverBinding/ComponentName/DriverConfiguration/DriverDialog\r
424 // to AutoGen.c\r
425 //\r
426\r
427 ExternsDriverBindingToAutoGenC(fileBuffer);\r
428\r
429 //\r
430 // Write DriverExitBootServicesEvent/DriverSetVirtualAddressMapEvent\r
431 // to Autogen.c\r
432 //\r
433 ExternCallBackToAutoGenC(fileBuffer);\r
434\r
435 //\r
436 // Write EntryPoint to autgoGen.c\r
437 //\r
83fba802 438 String[] entryPointList = saq.getModuleEntryPointArray();\r
e425f073 439 String[] unloadImageList = saq.getModuleUnloadImageArray();\r
cb4d97bd 440 EntryPointToAutoGen(CommonDefinition.remDupString(entryPointList), \r
a387de3b 441 CommonDefinition.remDupString(unloadImageList),\r
442 fileBuffer);\r
5f907e4a 443\r
83fba802 444 pcdDriverType = saq.getPcdDriverType();\r
5f907e4a 445\r
446 //\r
447 // Restore the DOC which include the FPD module info.\r
448 //\r
83fba802 449 saq.pop();\r
5f907e4a 450\r
451 //\r
452 // Write Guid to autogen.c\r
453 //\r
83fba802 454 String guid = CommonDefinition.formatGuidName(saq.getModuleGuid());\r
2f403520 455 if (this.moduleId.getModuleType().equalsIgnoreCase(EdkDefinitions.MODULE_TYPE_BASE)) {\r
a387de3b 456 fileBuffer.append("GLOBAL_REMOVE_IF_UNREFERENCED GUID gEfiCallerIdGuid = {");\r
457 } else {\r
458 fileBuffer.append("GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiCallerIdGuid = {");\r
459 }\r
460\r
5f907e4a 461 if (guid == null) {\r
462 throw new AutoGenException("Guid value must set!\n");\r
463 }\r
464\r
465 //\r
466 // Formate Guid as ANSI c form.Example:\r
467 // {0xd2b2b828, 0x826, 0x48a7,{0xb3, 0xdf, 0x98, 0x3c, 0x0, 0x60, 0x24,\r
468 // 0xf0}}\r
469 //\r
470\r
471 fileBuffer.append(guid);\r
daa7a3eb 472 fileBuffer.append("};\n");\r
5f907e4a 473\r
474 //\r
475 // Generate library instance consumed protocol, guid, ppi, pcd list.\r
476 // Save those to this.protocolList, this.ppiList, this.pcdList,\r
477 // this.guidList. Write Consumed library constructor and desconstuct to\r
478 // autogen.c\r
479 //\r
136adffc 480 LibInstanceToAutogenC(fileBuffer);\r
ff225cbb 481\r
878ddf1f 482 //\r
136adffc 483 // Get module dependent Package identification.\r
878ddf1f 484 //\r
83fba802 485 PackageIdentification[] packages = saq.getDependencePkg(this.arch);\r
5f907e4a 486 for (int i = 0; i < packages.length; i++) {\r
487 if (!this.mDepPkgList.contains(packages[i])) {\r
136adffc 488 this.mDepPkgList.add(packages[i]);\r
878ddf1f 489 }\r
ff225cbb 490\r
136adffc 491 }\r
ff225cbb 492\r
5f907e4a 493 //\r
494 // Write consumed ppi, guid, protocol to autogen.c\r
495 //\r
496 ProtocolGuidToAutogenC(fileBuffer);\r
497 PpiGuidToAutogenC(fileBuffer);\r
498 GuidGuidToAutogenC(fileBuffer);\r
ff225cbb 499\r
5f907e4a 500 //\r
501 // Call pcd autogen.\r
502 //\r
503 this.myPcdAutogen = new PCDAutoGenAction(moduleId, \r
504 arch, \r
505 false, \r
506 null,\r
2eb7d78d 507 pcdDriverType, \r
508 parentId);\r
a387de3b 509\r
61528a1b 510 this.myPcdAutogen.execute();\r
5f907e4a 511 if (this.myPcdAutogen != null) {\r
daa7a3eb 512 fileBuffer.append("\n");\r
11eb278a 513 fileBuffer.append(this.myPcdAutogen.getCAutoGenString());\r
5f907e4a 514 }\r
515\r
516 if (!saveFile(outputPath + File.separatorChar + "AutoGen.c", fileBuffer)) {\r
61528a1b 517 throw new AutoGenException("Failed to generate AutoGen.c !!!");\r
5f907e4a 518 }\r
519\r
520 }\r
521\r
522 /**\r
cb4d97bd 523 libGenAutogenH\r
524 \r
525 This function generates AutoGen.h for library.\r
526 \r
527 @throws BuildException\r
528 Failed to generate AutoGen.c.\r
529 **/\r
61528a1b 530 void libGenAutogenH() throws EdkException {\r
5f907e4a 531\r
532 Set<String> libClassIncludeH;\r
533 String moduleType;\r
534 List<String> headerFileList;\r
535 Iterator item;\r
536 StringBuffer fileBuffer = new StringBuffer(10240);\r
537\r
538 //\r
539 // Write Autogen.h header notation\r
540 //\r
cb4d97bd 541 fileBuffer.append(CommonDefinition.AUTOGENHNOTATION);\r
5f907e4a 542\r
543 //\r
544 // Add #ifndef ${BaseName}_AUTOGENH\r
545 // #def ${BseeName}_AUTOGENH\r
546 //\r
cb4d97bd 547 fileBuffer.append(CommonDefinition.IFNDEF \r
a387de3b 548 + CommonDefinition.AUTOGENH\r
549 + this.moduleId.getGuid().replaceAll("-", "_") \r
550 + ToolDefinitions.LINE_SEPARATOR);\r
cb4d97bd 551 fileBuffer.append(CommonDefinition.DEFINE \r
a387de3b 552 + CommonDefinition.AUTOGENH\r
553 + this.moduleId.getGuid().replaceAll("-", "_") \r
554 + ToolDefinitions.LINE_SEPARATOR \r
555 + ToolDefinitions.LINE_SEPARATOR);\r
5f907e4a 556\r
557 //\r
558 // Write EFI_SPECIFICATION_VERSION and EDK_RELEASE_VERSION\r
559 // to autogen.h file.\r
560 // Note: the specification version and release version should\r
561 // be get from module surface area instead of hard code.\r
562 //\r
cb4d97bd 563 fileBuffer.append(CommonDefinition.AUTOGENHBEGIN);\r
83fba802 564 String[] specList = saq.getExternSpecificaiton();\r
5f907e4a 565 for (int i = 0; i < specList.length; i++) {\r
cb4d97bd 566 fileBuffer.append(CommonDefinition.DEFINE + specList[i]\r
daa7a3eb 567 + "\n");\r
5f907e4a 568 }\r
569 // fileBuffer.append(CommonDefinition.autoGenHLine1);\r
570 // fileBuffer.append(CommonDefinition.autoGenHLine2);\r
571\r
572 //\r
573 // Write consumed package's mdouleInfo related *.h file to autogen.h.\r
574 //\r
83fba802 575 moduleType = saq.getModuleType();\r
576 PackageIdentification[] cosumedPkglist = saq\r
5f907e4a 577 .getDependencePkg(this.arch);\r
578 headerFileList = depPkgToAutogenH(cosumedPkglist, moduleType);\r
579 item = headerFileList.iterator();\r
580 while (item.hasNext()) {\r
581 fileBuffer.append(item.next().toString());\r
582 }\r
583 //\r
584 // Write library class's related *.h file to autogen.h\r
585 //\r
a387de3b 586 String[] libClassList = saq.getLibraryClasses(CommonDefinition.ALWAYSCONSUMED, this.arch);\r
5f907e4a 587 if (libClassList != null) {\r
588 libClassIncludeH = LibraryClassToAutogenH(libClassList);\r
589 item = libClassIncludeH.iterator();\r
590 while (item.hasNext()) {\r
591 fileBuffer.append(item.next().toString());\r
592 }\r
593 }\r
594\r
a387de3b 595 libClassList = saq.getLibraryClasses(CommonDefinition.ALWAYSPRODUCED, this.arch);\r
5f907e4a 596 if (libClassList != null) {\r
597 libClassIncludeH = LibraryClassToAutogenH(libClassList);\r
598 item = libClassIncludeH.iterator();\r
599 while (item.hasNext()) {\r
600 fileBuffer.append(item.next().toString());\r
601 }\r
602 }\r
cb4d97bd 603 fileBuffer.append(ToolDefinitions.LINE_SEPARATOR);\r
136adffc 604\r
73b4e31a 605 //\r
ff225cbb 606 // If is TianoR8FlashMap, copy {Fv_DIR}/FlashMap.h to\r
73b4e31a 607 // {DEST_DIR_DRBUG}/FlashMap.h\r
ff225cbb 608 //\r
83fba802 609 if (saq.isHaveTianoR8FlashMap()) {\r
cb4d97bd 610 fileBuffer.append(CommonDefinition.INCLUDE);\r
73b4e31a 611 fileBuffer.append(" <");\r
daa7a3eb 612 fileBuffer.append(CommonDefinition.TIANOR8PLASHMAPH + ">\n");\r
73b4e31a 613 copyFlashMapHToDebugDir();\r
614 }\r
615\r
5f907e4a 616 //\r
617 // Write PCD information to library AutoGen.h.\r
618 //\r
619 if (this.myPcdAutogen != null) {\r
daa7a3eb 620 fileBuffer.append("\n");\r
11eb278a 621 fileBuffer.append(this.myPcdAutogen.getHAutoGenString());\r
5f907e4a 622 }\r
623\r
624 //\r
625 // Append the #endif at AutoGen.h\r
626 //\r
daa7a3eb 627 fileBuffer.append("#endif\n");\r
5f907e4a 628\r
629 //\r
630 // Save content of string buffer to AutoGen.h file.\r
631 //\r
632 if (!saveFile(outputPath + File.separatorChar + "AutoGen.h", fileBuffer)) {\r
61528a1b 633 throw new AutoGenException("Failed to generate AutoGen.h !!!");\r
5f907e4a 634 }\r
635 }\r
636\r
637 /**\r
cb4d97bd 638 libGenAutogenC\r
639 \r
640 This function generates AutoGen.h for library.\r
641 \r
642 @throws BuildException\r
643 Failed to generate AutoGen.c.\r
644 **/\r
61528a1b 645 void libGenAutogenC() throws EdkException {\r
5f907e4a 646 StringBuffer fileBuffer = new StringBuffer(10240);\r
647\r
648 //\r
649 // Write Autogen.c header notation\r
650 //\r
cb4d97bd 651 fileBuffer.append(CommonDefinition.AUTOGENCNOTATION);\r
5f907e4a 652\r
cb4d97bd 653 fileBuffer.append(ToolDefinitions.LINE_SEPARATOR);\r
654 fileBuffer.append(ToolDefinitions.LINE_SEPARATOR);\r
5f907e4a 655\r
656 //\r
657 // Call pcd autogen.\r
658 //\r
659 this.myPcdAutogen = new PCDAutoGenAction(moduleId,\r
660 arch,\r
661 true,\r
7432a214 662 saq.getModulePcdEntryNameArray(this.arch),\r
2eb7d78d 663 pcdDriverType, \r
664 parentId);\r
61528a1b 665 this.myPcdAutogen.execute();\r
5f907e4a 666 if (this.myPcdAutogen != null) {\r
cb4d97bd 667 fileBuffer.append(ToolDefinitions.LINE_SEPARATOR);\r
11eb278a 668 fileBuffer.append(this.myPcdAutogen.getCAutoGenString());\r
5f907e4a 669 }\r
670\r
671 if (!saveFile(outputPath + File.separatorChar + "AutoGen.c", fileBuffer)) {\r
61528a1b 672 throw new AutoGenException("Failed to generate AutoGen.c !!!");\r
5f907e4a 673 }\r
674 }\r
675\r
676 /**\r
cb4d97bd 677 LibraryClassToAutogenH\r
678 \r
679 This function returns *.h files declared by library classes which are\r
680 consumed or produced by current build module or library.\r
681 \r
682 @param libClassList\r
683 List of library class which consumed or produce by current\r
684 build module or library.\r
685 @return includeStrList List of *.h file.\r
686 **/\r
5f907e4a 687 Set<String> LibraryClassToAutogenH(String[] libClassList)\r
61528a1b 688 throws EdkException {\r
cb4d97bd 689 Set<String> includeStrList = new LinkedHashSet<String>();\r
690 String includeName[];\r
5f907e4a 691 String str = "";\r
692\r
693 //\r
694 // Get include file from GlobalData's SPDTable according to\r
695 // library class name.\r
696 //\r
5f907e4a 697 for (int i = 0; i < libClassList.length; i++) {\r
cb4d97bd 698 includeName = GlobalData.getLibraryClassHeaderFiles(\r
a387de3b 699 saq.getDependencePkg(this.arch),\r
700 libClassList[i]);\r
701 if (includeName == null) {\r
702 throw new AutoGenException("Can not find library class ["\r
5f907e4a 703 + libClassList[i] + "] declaration in any SPD package. ");\r
704 }\r
cb4d97bd 705 for (int j = 0; j < includeName.length; j++) {\r
706 String includeNameStr = includeName[j];\r
5f907e4a 707 if (includeNameStr != null) {\r
cb4d97bd 708 str = CommonDefinition.INCLUDE + " " + "<";\r
daa7a3eb 709 str = str + includeNameStr + ">\n";\r
cb4d97bd 710 includeStrList.add(str);\r
5f907e4a 711 includeNameStr = null;\r
878ddf1f 712 }\r
5f907e4a 713 }\r
714 }\r
cb4d97bd 715 return includeStrList;\r
5f907e4a 716 }\r
717\r
718 /**\r
cb4d97bd 719 IncludesToAutogenH\r
720 \r
721 This function add include file in AutoGen.h file.\r
722 \r
723 @param packageNameList\r
724 List of module depended package.\r
725 @param moduleType\r
726 Module type.\r
727 @return\r
728 **/\r
5f907e4a 729 List<String> depPkgToAutogenH(PackageIdentification[] packageNameList,\r
730 String moduleType) throws AutoGenException {\r
731\r
732 List<String> includeStrList = new LinkedList<String>();\r
733 String pkgHeader;\r
734 String includeStr = "";\r
735\r
736 //\r
737 // Get include file from moduleInfo file\r
738 //\r
739 for (int i = 0; i < packageNameList.length; i++) {\r
740 pkgHeader = GlobalData.getPackageHeaderFiles(packageNameList[i],\r
741 moduleType);\r
742 if (pkgHeader == null) {\r
743 throw new AutoGenException("Can not find package ["\r
744 + packageNameList[i]\r
745 + "] declaration in any SPD package. ");\r
746 } else if (!pkgHeader.equalsIgnoreCase("")) {\r
cb4d97bd 747 includeStr = CommonDefinition.INCLUDE + " <" + pkgHeader\r
daa7a3eb 748 + ">\n";\r
5f907e4a 749 includeStrList.add(includeStr);\r
750 }\r
751 }\r
752\r
753 return includeStrList;\r
754 }\r
755\r
756 /**\r
cb4d97bd 757 EntryPointToAutoGen\r
758 \r
759 This function convert <ModuleEntryPoint> & <ModuleUnloadImage>\r
760 information in mas to AutoGen.c\r
761 \r
762 @param entryPointList\r
763 List of entry point.\r
764 @param fileBuffer\r
765 String buffer fo AutoGen.c.\r
766 @throws Exception\r
767 **/\r
768 void EntryPointToAutoGen(String[] entryPointList, String[] unloadImageList, StringBuffer fileBuffer)\r
61528a1b 769 throws EdkException {\r
5f907e4a 770\r
83fba802 771 String typeStr = saq.getModuleType();\r
a387de3b 772 String debugStr = "DEBUG ((EFI_D_INFO | EFI_D_LOAD, \"Module Entry Point (%s) 0x%%p\\n\", (VOID *)(UINTN)%s));\n";\r
773 int unloadImageCount = 0;\r
cb4d97bd 774 int entryPointCount = 0;\r
5f907e4a 775\r
776 //\r
777 // The parameters and return value of entryPoint is difference\r
778 // for difference module type.\r
779 //\r
780 switch (CommonDefinition.getModuleType(typeStr)) {\r
781 \r
782 case CommonDefinition.ModuleTypePeiCore:\r
783 if (entryPointList == null ||entryPointList.length != 1 ) {\r
61528a1b 784 throw new AutoGenException(\r
a387de3b 785 "Module type = 'PEI_CORE', can have only one module entry point!");\r
5f907e4a 786 } else {\r
daa7a3eb 787 fileBuffer.append("EFI_STATUS\n");\r
788 fileBuffer.append("EFIAPI\n");\r
5f907e4a 789 fileBuffer.append(entryPointList[0]);\r
daa7a3eb 790 fileBuffer.append(" (\n");\r
791 fileBuffer.append(" IN EFI_PEI_STARTUP_DESCRIPTOR *PeiStartupDescriptor,\n");\r
792 fileBuffer.append(" IN VOID *OldCoreData\n");\r
793 fileBuffer.append(" );\n\n");\r
794\r
795 fileBuffer.append("EFI_STATUS\n");\r
796 fileBuffer.append("EFIAPI\n");\r
797 fileBuffer.append("ProcessModuleEntryPointList (\n");\r
798 fileBuffer.append(" IN EFI_PEI_STARTUP_DESCRIPTOR *PeiStartupDescriptor,\n");\r
799 fileBuffer.append(" IN VOID *OldCoreData\n");\r
800 fileBuffer.append(" )\n\n");\r
801 fileBuffer.append("{\n");\r
5f907e4a 802 fileBuffer.append(" return ");\r
803 fileBuffer.append(entryPointList[0]);\r
daa7a3eb 804 fileBuffer.append(" (PeiStartupDescriptor, OldCoreData);\n");\r
805 fileBuffer.append("}\n\n");\r
5f907e4a 806 }\r
807 break;\r
878ddf1f 808\r
5f907e4a 809 case CommonDefinition.ModuleTypeDxeCore:\r
daa7a3eb 810 fileBuffer.append("const UINT32 _gUefiDriverRevision = 0;\n");\r
5f907e4a 811 if (entryPointList == null || entryPointList.length != 1) {\r
a387de3b 812 throw new AutoGenException("Module type = 'DXE_CORE', can have only one module entry point!");\r
5f907e4a 813 } else {\r
daa7a3eb 814 fileBuffer.append("VOID\n");\r
815 fileBuffer.append("EFIAPI\n");\r
5f907e4a 816 fileBuffer.append(entryPointList[0]);\r
817 fileBuffer.append(" (\n");\r
daa7a3eb 818 fileBuffer.append(" IN VOID *HobStart\n");\r
819 fileBuffer.append(" );\n\n");\r
820\r
821 fileBuffer.append("VOID\n");\r
822 fileBuffer.append("EFIAPI\n");\r
823 fileBuffer.append("ProcessModuleEntryPointList (\n");\r
824 fileBuffer.append(" IN VOID *HobStart\n");\r
825 fileBuffer.append(" )\n\n");\r
826 fileBuffer.append("{\n");\r
5f907e4a 827 fileBuffer.append(" ");\r
828 fileBuffer.append(entryPointList[0]);\r
daa7a3eb 829 fileBuffer.append(" (HobStart);\n");\r
830 fileBuffer.append("}\n\n");\r
5f907e4a 831 }\r
832 break;\r
833\r
834 case CommonDefinition.ModuleTypePeim:\r
cb4d97bd 835 entryPointCount = 0;\r
daa7a3eb 836 fileBuffer.append("GLOBAL_REMOVE_IF_UNREFERENCED const UINT32 _gPeimRevision = 0;\n");\r
5f907e4a 837 if (entryPointList == null || entryPointList.length == 0) {\r
daa7a3eb 838 fileBuffer.append("EFI_STATUS\n");\r
839 fileBuffer.append("EFIAPI\n");\r
840 fileBuffer.append("ProcessModuleEntryPointList (\n");\r
841 fileBuffer.append(" IN EFI_FFS_FILE_HEADER *FfsHeader,\n");\r
842 fileBuffer.append(" IN EFI_PEI_SERVICES **PeiServices\n");\r
843 fileBuffer.append(" )\n\n");\r
844 fileBuffer.append("{\n");\r
845 fileBuffer.append(" return EFI_SUCCESS;\n");\r
846 fileBuffer.append("}\n\n");\r
5f907e4a 847 break;\r
848 }\r
849 for (int i = 0; i < entryPointList.length; i++) {\r
daa7a3eb 850 fileBuffer.append("EFI_STATUS\n");\r
851 fileBuffer.append("EFIAPI\n");\r
5f907e4a 852 fileBuffer.append(entryPointList[i]);\r
daa7a3eb 853 fileBuffer.append(" (\n");\r
854 fileBuffer.append(" IN EFI_FFS_FILE_HEADER *FfsHeader,\n");\r
855 fileBuffer.append(" IN EFI_PEI_SERVICES **PeiServices\n");\r
856 fileBuffer.append(" );\n");\r
5f907e4a 857 entryPointCount++;\r
5f907e4a 858 }\r
859\r
daa7a3eb 860 fileBuffer.append("EFI_STATUS\n");\r
861 fileBuffer.append("EFIAPI\n");\r
862 fileBuffer.append("ProcessModuleEntryPointList (\n");\r
863 fileBuffer.append(" IN EFI_FFS_FILE_HEADER *FfsHeader,\n");\r
864 fileBuffer.append(" IN EFI_PEI_SERVICES **PeiServices\n");\r
865 fileBuffer.append(" )\n\n");\r
866 fileBuffer.append("{\n");\r
5f907e4a 867 if (entryPointCount == 1) {\r
a387de3b 868 fileBuffer.append(String.format(" " + debugStr, entryPointList[0], entryPointList[0]));\r
5f907e4a 869 fileBuffer.append(" return ");\r
870 fileBuffer.append(entryPointList[0]);\r
daa7a3eb 871 fileBuffer.append(" (FfsHeader, PeiServices);\n");\r
5f907e4a 872 } else {\r
daa7a3eb 873 fileBuffer.append(" EFI_STATUS Status;\n");\r
874 fileBuffer.append(" EFI_STATUS CombinedStatus;\n\n");\r
875 fileBuffer.append(" CombinedStatus = EFI_LOAD_ERROR;\n\n");\r
5f907e4a 876 for (int i = 0; i < entryPointList.length; i++) {\r
877 if (!entryPointList[i].equals("")) {\r
a387de3b 878 fileBuffer.append(String.format(" " + debugStr, entryPointList[i], entryPointList[i]));\r
5f907e4a 879 fileBuffer.append(" Status = ");\r
880 fileBuffer.append(entryPointList[i]);\r
daa7a3eb 881 fileBuffer.append(" (FfsHeader, PeiServices);\n");\r
882 fileBuffer.append(" if (!EFI_ERROR (Status) || EFI_ERROR (CombinedStatus)) {\n");\r
883 fileBuffer.append(" CombinedStatus = Status;\n");\r
884 fileBuffer.append(" }\n\n");\r
5f907e4a 885 } else {\r
886 break;\r
887 }\r
888 }\r
daa7a3eb 889 fileBuffer.append(" return CombinedStatus;\n");\r
5f907e4a 890 }\r
daa7a3eb 891 fileBuffer.append("}\n\n");\r
5f907e4a 892 break;\r
893\r
894 case CommonDefinition.ModuleTypeDxeSmmDriver:\r
895 entryPointCount = 0;\r
896 //\r
897 // If entryPoint is null, create an empty ProcessModuleEntryPointList\r
898 // function.\r
899 //\r
900 if (entryPointList == null || entryPointList.length == 0) {\r
a387de3b 901 fileBuffer.append("GLOBAL_REMOVE_IF_UNREFERENCED const UINT8 _gDriverEntryPointCount = ");\r
5f907e4a 902 fileBuffer.append(Integer.toString(entryPointCount));\r
daa7a3eb 903 fileBuffer.append(";\n");\r
904 fileBuffer.append("EFI_STATUS\n");\r
905 fileBuffer.append("EFIAPI\n");\r
906 fileBuffer.append("ProcessModuleEntryPointList (\n");\r
907 fileBuffer.append(" IN EFI_HANDLE ImageHandle,\n");\r
908 fileBuffer.append(" IN EFI_SYSTEM_TABLE *SystemTable\n");\r
909 fileBuffer.append(" )\n\n");\r
910 fileBuffer.append("{\n");\r
911 fileBuffer.append(" return EFI_SUCCESS;\n");\r
912 fileBuffer.append("}\n\n");\r
5f907e4a 913\r
914 } else {\r
915 for (int i = 0; i < entryPointList.length; i++) {\r
daa7a3eb 916 fileBuffer.append("EFI_STATUS\n");\r
917 fileBuffer.append("EFIAPI\n");\r
5f907e4a 918 fileBuffer.append(entryPointList[i]);\r
daa7a3eb 919 fileBuffer.append(" (\n");\r
920 fileBuffer.append(" IN EFI_HANDLE ImageHandle,\n");\r
921 fileBuffer.append(" IN EFI_SYSTEM_TABLE *SystemTable\n");\r
922 fileBuffer.append(" );\n");\r
5f907e4a 923 entryPointCount++;\r
924 }\r
a387de3b 925 fileBuffer.append("GLOBAL_REMOVE_IF_UNREFERENCED const UINT8 _gDriverEntryPointCount = ");\r
5f907e4a 926 fileBuffer.append(Integer.toString(entryPointCount));\r
daa7a3eb 927 fileBuffer.append(";\n");\r
928 fileBuffer.append("static BASE_LIBRARY_JUMP_BUFFER mJumpContext;\n");\r
929 fileBuffer.append("static EFI_STATUS mDriverEntryPointStatus = EFI_LOAD_ERROR;\n\n");\r
930\r
931 fileBuffer.append("EFI_STATUS\n");\r
932 fileBuffer.append("EFIAPI\n");\r
933 fileBuffer.append("ProcessModuleEntryPointList (\n");\r
934 fileBuffer.append(" IN EFI_HANDLE ImageHandle,\n");\r
935 fileBuffer.append(" IN EFI_SYSTEM_TABLE *SystemTable\n");\r
936 fileBuffer.append(" )\n\n");\r
937 fileBuffer.append("{\n");\r
5f907e4a 938\r
5f907e4a 939 for (int i = 0; i < entryPointList.length; i++) {\r
daa7a3eb 940 fileBuffer.append(" if (SetJump (&mJumpContext) == 0) {\n");\r
a387de3b 941 fileBuffer.append(String.format(" " + debugStr, entryPointList[i], entryPointList[i]));\r
5f907e4a 942 fileBuffer.append(" ExitDriver (");\r
943 fileBuffer.append(entryPointList[i]);\r
daa7a3eb 944 fileBuffer.append(" (ImageHandle, SystemTable));\n");\r
945 fileBuffer.append(" ASSERT (FALSE);\n");\r
946 fileBuffer.append(" }\n");\r
136adffc 947 }\r
daa7a3eb 948 fileBuffer.append(" return mDriverEntryPointStatus;\n");\r
949 fileBuffer.append("}\n\n");\r
136adffc 950\r
daa7a3eb 951 fileBuffer.append("VOID\n");\r
952 fileBuffer.append("EFIAPI\n");\r
953 fileBuffer.append("ExitDriver (\n");\r
136adffc 954 fileBuffer.append(" IN EFI_STATUS Status\n");\r
daa7a3eb 955 fileBuffer.append(" )\n\n");\r
956 fileBuffer.append("{\n");\r
957 fileBuffer.append(" if (!EFI_ERROR (Status) || EFI_ERROR (mDriverEntryPointStatus)) {\n");\r
958 fileBuffer.append(" mDriverEntryPointStatus = Status;\n");\r
959 fileBuffer.append(" }\n");\r
960 fileBuffer.append(" LongJump (&mJumpContext, (UINTN)-1);\n");\r
961 fileBuffer.append(" ASSERT (FALSE);\n");\r
962 fileBuffer.append("}\n\n");\r
136adffc 963 }\r
ff225cbb 964\r
965\r
5f907e4a 966 //\r
967 // Add "ModuleUnloadImage" for DxeSmmDriver module type;\r
968 //\r
cb4d97bd 969 //entryPointList = SurfaceAreaQuery.getModuleUnloadImageArray();\r
970 //entryPointList = CommonDefinition.remDupString(entryPointList);\r
971 //entryPointCount = 0;\r
136adffc 972\r
a387de3b 973 unloadImageCount = 0;\r
cb4d97bd 974 if (unloadImageList != null) {\r
975 for (int i = 0; i < unloadImageList.length; i++) {\r
daa7a3eb 976 fileBuffer.append("EFI_STATUS\n");\r
cb4d97bd 977 fileBuffer.append(unloadImageList[i]);\r
daa7a3eb 978 fileBuffer.append(" (\n");\r
979 fileBuffer.append(" IN EFI_HANDLE ImageHandle\n");\r
980 fileBuffer.append(" );\n");\r
cb4d97bd 981 unloadImageCount++;\r
a84091c4 982 }\r
5f907e4a 983 }\r
136adffc 984\r
a387de3b 985 fileBuffer.append("GLOBAL_REMOVE_IF_UNREFERENCED const UINT8 _gDriverUnloadImageCount = ");\r
cb4d97bd 986 fileBuffer.append(Integer.toString(unloadImageCount));\r
daa7a3eb 987 fileBuffer.append(";\n\n");\r
5f907e4a 988\r
daa7a3eb 989 fileBuffer.append("EFI_STATUS\n");\r
990 fileBuffer.append("EFIAPI\n");\r
991 fileBuffer.append("ProcessModuleUnloadList (\n");\r
992 fileBuffer.append(" IN EFI_HANDLE ImageHandle\n");\r
993 fileBuffer.append(" )\n");\r
994 fileBuffer.append("{\n");\r
5f907e4a 995\r
cb4d97bd 996 if (unloadImageCount == 0) {\r
daa7a3eb 997 fileBuffer.append(" return EFI_SUCCESS;\n");\r
cb4d97bd 998 } else if (unloadImageCount == 1) {\r
5f907e4a 999 fileBuffer.append(" return ");\r
cb4d97bd 1000 fileBuffer.append(unloadImageList[0]);\r
daa7a3eb 1001 fileBuffer.append("(ImageHandle);\n");\r
5f907e4a 1002 } else {\r
daa7a3eb 1003 fileBuffer.append(" EFI_STATUS Status;\n\n");\r
1004 fileBuffer.append(" Status = EFI_SUCCESS;\n\n");\r
cb4d97bd 1005 for (int i = 0; i < unloadImageList.length; i++) {\r
5f907e4a 1006 if (i == 0) {\r
136adffc 1007 fileBuffer.append(" Status = ");\r
cb4d97bd 1008 fileBuffer.append(unloadImageList[i]);\r
daa7a3eb 1009 fileBuffer.append("(ImageHandle);\n");\r
5f907e4a 1010 } else {\r
daa7a3eb 1011 fileBuffer.append(" if (EFI_ERROR (Status)) {\n");\r
878ddf1f 1012 fileBuffer.append(" ");\r
cb4d97bd 1013 fileBuffer.append(unloadImageList[i]);\r
daa7a3eb 1014 fileBuffer.append("(ImageHandle);\n");\r
1015 fileBuffer.append(" } else {\n");\r
878ddf1f 1016 fileBuffer.append(" Status = ");\r
cb4d97bd 1017 fileBuffer.append(unloadImageList[i]);\r
daa7a3eb 1018 fileBuffer.append("(ImageHandle);\n");\r
1019 fileBuffer.append(" }\n");\r
878ddf1f 1020 }\r
5f907e4a 1021 }\r
daa7a3eb 1022 fileBuffer.append(" return Status;\n");\r
5f907e4a 1023 }\r
daa7a3eb 1024 fileBuffer.append("}\n\n");\r
5f907e4a 1025 break;\r
1026\r
1027 case CommonDefinition.ModuleTypeDxeRuntimeDriver:\r
1028 case CommonDefinition.ModuleTypeDxeDriver:\r
1029 case CommonDefinition.ModuleTypeDxeSalDriver:\r
1030 case CommonDefinition.ModuleTypeUefiDriver:\r
1031 case CommonDefinition.ModuleTypeUefiApplication:\r
1032 entryPointCount = 0;\r
daa7a3eb 1033 fileBuffer.append("const UINT32 _gUefiDriverRevision = 0;\n");\r
136adffc 1034 //\r
1035 // If entry point is null, create a empty ProcessModuleEntryPointList function.\r
1036 //\r
5f907e4a 1037 if (entryPointList == null || entryPointList.length == 0) {\r
daa7a3eb 1038 fileBuffer.append("GLOBAL_REMOVE_IF_UNREFERENCED const UINT8 _gDriverEntryPointCount = 0;\n");\r
1039 fileBuffer.append("EFI_STATUS\n");\r
1040 fileBuffer.append("EFIAPI\n");\r
1041 fileBuffer.append("ProcessModuleEntryPointList (\n");\r
1042 fileBuffer.append(" IN EFI_HANDLE ImageHandle,\n");\r
1043 fileBuffer.append(" IN EFI_SYSTEM_TABLE *SystemTable\n");\r
1044 fileBuffer.append(" )\n\n");\r
1045 fileBuffer.append("{\n");\r
1046 fileBuffer.append(" return EFI_SUCCESS;\n");\r
1047 fileBuffer.append("}\n");\r
5f907e4a 1048\r
1049 } else {\r
136adffc 1050 for (int i = 0; i < entryPointList.length; i++) {\r
ff225cbb 1051\r
daa7a3eb 1052 fileBuffer.append("EFI_STATUS\n");\r
1053 fileBuffer.append("EFIAPI\n");\r
136adffc 1054 fileBuffer.append(entryPointList[i]);\r
daa7a3eb 1055 fileBuffer.append(" (\n");\r
1056 fileBuffer.append(" IN EFI_HANDLE ImageHandle,\n");\r
1057 fileBuffer.append(" IN EFI_SYSTEM_TABLE *SystemTable\n");\r
1058 fileBuffer.append(" );\n");\r
136adffc 1059 entryPointCount++;\r
878ddf1f 1060 }\r
1061\r
a387de3b 1062 fileBuffer.append("GLOBAL_REMOVE_IF_UNREFERENCED const UINT8 _gDriverEntryPointCount = ");\r
136adffc 1063 fileBuffer.append(Integer.toString(entryPointCount));\r
daa7a3eb 1064 fileBuffer.append(";\n");\r
136adffc 1065 if (entryPointCount > 1) {\r
daa7a3eb 1066 fileBuffer.append("static BASE_LIBRARY_JUMP_BUFFER mJumpContext;\n");\r
1067 fileBuffer.append("static EFI_STATUS mDriverEntryPointStatus = EFI_LOAD_ERROR;\n");\r
136adffc 1068 }\r
1069 fileBuffer.append("\n");\r
878ddf1f 1070\r
daa7a3eb 1071 fileBuffer.append("EFI_STATUS\n");\r
1072 fileBuffer.append("EFIAPI\n");\r
1073 fileBuffer.append("ProcessModuleEntryPointList (\n");\r
1074 fileBuffer.append(" IN EFI_HANDLE ImageHandle,\n");\r
1075 fileBuffer.append(" IN EFI_SYSTEM_TABLE *SystemTable\n");\r
1076 fileBuffer.append(" )\n\n");\r
1077 fileBuffer.append("{\n");\r
878ddf1f 1078\r
136adffc 1079 if (entryPointCount == 1) {\r
a387de3b 1080 fileBuffer.append(String.format(" " + debugStr, entryPointList[0], entryPointList[0]));\r
1081 fileBuffer.append(" return ");\r
136adffc 1082 fileBuffer.append(entryPointList[0]);\r
daa7a3eb 1083 fileBuffer.append(" (ImageHandle, SystemTable);\n");\r
136adffc 1084 } else {\r
1085 for (int i = 0; i < entryPointList.length; i++) {\r
1086 if (!entryPointList[i].equals("")) {\r
daa7a3eb 1087 fileBuffer.append(" if (SetJump (&mJumpContext) == 0) {\n");\r
a387de3b 1088 fileBuffer.append(String.format(" " + debugStr, entryPointList[i], entryPointList[i]));\r
136adffc 1089 fileBuffer.append(" ExitDriver (");\r
1090 fileBuffer.append(entryPointList[i]);\r
daa7a3eb 1091 fileBuffer.append(" (ImageHandle, SystemTable));\n");\r
1092 fileBuffer.append(" ASSERT (FALSE);\n");\r
1093 fileBuffer.append(" }\n");\r
136adffc 1094 } else {\r
1095 break;\r
1096 }\r
878ddf1f 1097 }\r
daa7a3eb 1098 fileBuffer.append(" return mDriverEntryPointStatus;\n");\r
878ddf1f 1099 }\r
daa7a3eb 1100 fileBuffer.append("}\n\n");\r
1101\r
1102 fileBuffer.append("VOID\n");\r
1103 fileBuffer.append("EFIAPI\n");\r
1104 fileBuffer.append("ExitDriver (\n");\r
1105 fileBuffer.append(" IN EFI_STATUS Status\n");\r
1106 fileBuffer.append(" )\n\n");\r
1107 fileBuffer.append("{\n");\r
136adffc 1108 if (entryPointCount <= 1) {\r
daa7a3eb 1109 fileBuffer.append(" if (EFI_ERROR (Status)) {\n");\r
1110 fileBuffer.append(" ProcessLibraryDestructorList (gImageHandle, gST);\n");\r
1111 fileBuffer.append(" }\n");\r
136adffc 1112 fileBuffer\r
daa7a3eb 1113 .append(" gBS->Exit (gImageHandle, Status, 0, NULL);\n");\r
878ddf1f 1114 } else {\r
daa7a3eb 1115 fileBuffer.append(" if (!EFI_ERROR (Status) || EFI_ERROR (mDriverEntryPointStatus)) {\n");\r
1116 fileBuffer.append(" mDriverEntryPointStatus = Status;\n");\r
1117 fileBuffer.append(" }\n");\r
1118 fileBuffer.append(" LongJump (&mJumpContext, (UINTN)-1);\n");\r
1119 fileBuffer.append(" ASSERT (FALSE);\n");\r
878ddf1f 1120 }\r
daa7a3eb 1121 fileBuffer.append("}\n\n");\r
878ddf1f 1122 }\r
ff225cbb 1123\r
5f907e4a 1124 //\r
1125 // Add ModuleUnloadImage for DxeDriver and UefiDriver module type.\r
1126 //\r
d8f1335e 1127 //entryPointList = SurfaceAreaQuery.getModuleUnloadImageArray();\r
1128 //\r
1129 // Remover duplicate unload entry point.\r
1130 //\r
1131 //entryPointList = CommonDefinition.remDupString(entryPointList);\r
1132 //entryPointCount = 0;\r
a387de3b 1133 unloadImageCount = 0;\r
cb4d97bd 1134 if (unloadImageList != null) {\r
1135 for (int i = 0; i < unloadImageList.length; i++) {\r
daa7a3eb 1136 fileBuffer.append("EFI_STATUS\n");\r
1137 fileBuffer.append("EFIAPI\n");\r
cb4d97bd 1138 fileBuffer.append(unloadImageList[i]);\r
daa7a3eb 1139 fileBuffer.append(" (\n");\r
1140 fileBuffer.append(" IN EFI_HANDLE ImageHandle\n");\r
1141 fileBuffer.append(" );\n");\r
cb4d97bd 1142 unloadImageCount++;\r
5f907e4a 1143 }\r
1144 }\r
1145\r
a387de3b 1146 fileBuffer.append("GLOBAL_REMOVE_IF_UNREFERENCED const UINT8 _gDriverUnloadImageCount = ");\r
cb4d97bd 1147 fileBuffer.append(Integer.toString(unloadImageCount));\r
daa7a3eb 1148 fileBuffer.append(";\n\n");\r
5f907e4a 1149\r
1150 fileBuffer.append("EFI_STATUS\n");\r
daa7a3eb 1151 fileBuffer.append("EFIAPI\n");\r
1152 fileBuffer.append("ProcessModuleUnloadList (\n");\r
1153 fileBuffer.append(" IN EFI_HANDLE ImageHandle\n");\r
1154 fileBuffer.append(" )\n");\r
1155 fileBuffer.append("{\n");\r
5f907e4a 1156\r
cb4d97bd 1157 if (unloadImageCount == 0) {\r
daa7a3eb 1158 fileBuffer.append(" return EFI_SUCCESS;\n");\r
cb4d97bd 1159 } else if (unloadImageCount == 1) {\r
5f907e4a 1160 fileBuffer.append(" return ");\r
cb4d97bd 1161 fileBuffer.append(unloadImageList[0]);\r
daa7a3eb 1162 fileBuffer.append("(ImageHandle);\n");\r
5f907e4a 1163 } else {\r
daa7a3eb 1164 fileBuffer.append(" EFI_STATUS Status;\n\n");\r
1165 fileBuffer.append(" Status = EFI_SUCCESS;\n\n");\r
cb4d97bd 1166 for (int i = 0; i < unloadImageList.length; i++) {\r
25832ed3 1167 if (i == 0) {\r
1168 fileBuffer.append(" Status = ");\r
cb4d97bd 1169 fileBuffer.append(unloadImageList[i]);\r
daa7a3eb 1170 fileBuffer.append("(ImageHandle);\n");\r
5f907e4a 1171 } else {\r
daa7a3eb 1172 fileBuffer.append(" if (EFI_ERROR (Status)) {\n");\r
5f907e4a 1173 fileBuffer.append(" ");\r
cb4d97bd 1174 fileBuffer.append(unloadImageList[i]);\r
daa7a3eb 1175 fileBuffer.append("(ImageHandle);\n");\r
1176 fileBuffer.append(" } else {\n");\r
5f907e4a 1177 fileBuffer.append(" Status = ");\r
cb4d97bd 1178 fileBuffer.append(unloadImageList[i]);\r
daa7a3eb 1179 fileBuffer.append("(ImageHandle);\n");\r
1180 fileBuffer.append(" }\n");\r
25832ed3 1181 }\r
5f907e4a 1182 }\r
daa7a3eb 1183 fileBuffer.append(" return Status;\n");\r
5f907e4a 1184 }\r
daa7a3eb 1185 fileBuffer.append("}\n\n");\r
5f907e4a 1186 break;\r
1187 }\r
1188 }\r
1189\r
1190 /**\r
cb4d97bd 1191 PpiGuidToAutogenc\r
1192 \r
1193 This function gets GUIDs from SPD file accrodeing to <PPIs> information\r
1194 and write those GUIDs to AutoGen.c.\r
1195 \r
1196 @param fileBuffer\r
1197 String Buffer for Autogen.c file.\r
1198 @throws BuildException\r
1199 Guid must set value!\r
1200 **/\r
5f907e4a 1201 void PpiGuidToAutogenC(StringBuffer fileBuffer) throws AutoGenException {\r
1202 String[] cNameGuid = null;\r
1203\r
1204 //\r
1205 // Get the all PPI adn PPI Notify from MSA file,\r
1206 // then add those PPI ,and PPI Notify name to list.\r
1207 //\r
1208\r
83fba802 1209 String[] ppiList = saq.getPpiArray(this.arch);\r
5f907e4a 1210 for (int i = 0; i < ppiList.length; i++) {\r
1211 this.mPpiList.add(ppiList[i]);\r
1212 }\r
1213\r
83fba802 1214 String[] ppiNotifyList = saq.getPpiNotifyArray(this.arch);\r
5f907e4a 1215 for (int i = 0; i < ppiNotifyList.length; i++) {\r
1216 this.mPpiList.add(ppiNotifyList[i]);\r
1217 }\r
1218\r
1219 //\r
1220 // Find CNAME and GUID from dependence SPD file and write to Autogen.c\r
1221 //\r
1222 Iterator ppiIterator = this.mPpiList.iterator();\r
1223 String ppiKeyWord = null;\r
1224 while (ppiIterator.hasNext()) {\r
1225 ppiKeyWord = ppiIterator.next().toString();\r
1226 cNameGuid = GlobalData.getPpiGuid(this.mDepPkgList, ppiKeyWord);\r
1227 if (cNameGuid != null) {\r
daa7a3eb 1228 fileBuffer.append("\nGLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID ");\r
5f907e4a 1229 fileBuffer.append(cNameGuid[0]);\r
1230 fileBuffer.append(" = { ");\r
1231 fileBuffer.append(CommonDefinition.formatGuidName(cNameGuid[1]));\r
1232 fileBuffer.append(" } ;");\r
1233 } else {\r
1234 //\r
1235 // If can't find Ppi GUID declaration in every package\r
1236 //\r
1237 throw new AutoGenException("Can not find Ppi GUID ["\r
1238 + ppiKeyWord + "] declaration in any SPD package!");\r
1239 }\r
1240 }\r
1241 }\r
1242\r
1243 /**\r
cb4d97bd 1244 ProtocolGuidToAutogenc\r
1245 \r
1246 This function gets GUIDs from SPD file accrodeing to <Protocol>\r
1247 information and write those GUIDs to AutoGen.c.\r
1248 \r
1249 @param fileBuffer\r
1250 String Buffer for Autogen.c file.\r
1251 @throws BuildException\r
1252 Protocol name must set.\r
1253 **/\r
61528a1b 1254 void ProtocolGuidToAutogenC(StringBuffer fileBuffer) throws EdkException {\r
5f907e4a 1255 String[] cNameGuid = null;\r
1256\r
83fba802 1257 String[] protocolList = saq.getProtocolArray(this.arch);\r
5f907e4a 1258\r
1259 //\r
1260 // Add result to Autogen global list.\r
1261 //\r
1262 for (int i = 0; i < protocolList.length; i++) {\r
1263 this.mProtocolList.add(protocolList[i]);\r
1264 }\r
1265\r
a387de3b 1266 String[] protocolNotifyList = saq.getProtocolNotifyArray(this.arch);\r
5f907e4a 1267\r
1268 for (int i = 0; i < protocolNotifyList.length; i++) {\r
1269 this.mProtocolList.add(protocolNotifyList[i]);\r
1270 }\r
1271\r
1272 //\r
1273 // Get the NAME and GUID from dependence SPD and write to Autogen.c\r
1274 //\r
1275 Iterator protocolIterator = this.mProtocolList.iterator();\r
1276 String protocolKeyWord = null;\r
1277\r
1278\r
1279 while (protocolIterator.hasNext()) {\r
1280 protocolKeyWord = protocolIterator.next().toString();\r
1281 cNameGuid = GlobalData.getProtocolGuid(this.mDepPkgList, protocolKeyWord);\r
1282 if (cNameGuid != null) {\r
daa7a3eb 1283 fileBuffer.append("\nGLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID ");\r
5f907e4a 1284 fileBuffer.append(cNameGuid[0]);\r
1285 fileBuffer.append(" = { ");\r
1286 fileBuffer.append(CommonDefinition.formatGuidName(cNameGuid[1]));\r
1287 fileBuffer.append(" } ;");\r
1288 } else {\r
1289 //\r
1290 // If can't find protocol GUID declaration in every package\r
1291 //\r
61528a1b 1292 throw new AutoGenException("Can not find protocol Guid ["\r
a387de3b 1293 + protocolKeyWord + "] declaration in any SPD package!");\r
5f907e4a 1294 }\r
1295 }\r
1296 }\r
1297\r
1298 /**\r
cb4d97bd 1299 GuidGuidToAutogenc\r
1300 \r
1301 This function gets GUIDs from SPD file accrodeing to <Guids> information\r
1302 and write those GUIDs to AutoGen.c.\r
1303 \r
1304 @param fileBuffer\r
1305 String Buffer for Autogen.c file.\r
1306 \r
1307 **/\r
5f907e4a 1308 void GuidGuidToAutogenC(StringBuffer fileBuffer) throws AutoGenException {\r
1309 String[] cNameGuid = null;\r
1310 String guidKeyWord = null;\r
1311\r
83fba802 1312 String[] guidList = saq.getGuidEntryArray(this.arch);\r
5f907e4a 1313\r
1314 for (int i = 0; i < guidList.length; i++) {\r
1315 this.mGuidList.add(guidList[i]);\r
1316 }\r
1317\r
1318\r
1319 Iterator guidIterator = this.mGuidList.iterator();\r
1320 while (guidIterator.hasNext()) {\r
1321 guidKeyWord = guidIterator.next().toString();\r
1322 cNameGuid = GlobalData.getGuid(this.mDepPkgList, guidKeyWord);\r
1323\r
1324 if (cNameGuid != null) {\r
daa7a3eb 1325 fileBuffer.append("\nGLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID ");\r
5f907e4a 1326 fileBuffer.append(cNameGuid[0]);\r
1327 fileBuffer.append(" = { ");\r
1328 fileBuffer.append(CommonDefinition.formatGuidName(cNameGuid[1]));\r
1329 fileBuffer.append("} ;");\r
1330 } else {\r
1331 //\r
1332 // If can't find GUID declaration in every package\r
1333 //\r
1334 throw new AutoGenException("Can not find Guid [" + guidKeyWord\r
1335 + "] declaration in any SPD package. ");\r
1336 }\r
1337\r
1338 }\r
1339 }\r
1340\r
1341 /**\r
cb4d97bd 1342 LibInstanceToAutogenC\r
1343 \r
1344 This function adds dependent library instance to autogen.c,which\r
1345 includeing library's constructor, destructor, and library dependent ppi,\r
1346 protocol, guid, pcd information.\r
1347 \r
1348 @param fileBuffer\r
1349 String buffer for AutoGen.c\r
1350 @throws BuildException\r
1351 **/\r
61528a1b 1352 void LibInstanceToAutogenC(StringBuffer fileBuffer) throws EdkException {\r
a387de3b 1353 String moduleType = this.moduleId.getModuleType();\r
1354 //\r
1355 // Add library constructor to AutoGen.c\r
1356 //\r
1357 LibConstructorToAutogenC(libConstructList, moduleType,\r
1358 fileBuffer/* autogenC */);\r
1359 //\r
1360 // Add library destructor to AutoGen.c\r
1361 //\r
1362 LibDestructorToAutogenC(libDestructList, moduleType, fileBuffer/* autogenC */);\r
5f907e4a 1363 }\r
1364\r
1365 /**\r
cb4d97bd 1366 LibConstructorToAutogenc\r
1367 \r
1368 This function writes library constructor list to AutoGen.c. The library\r
1369 constructor's parameter and return value depend on module type.\r
1370 \r
1371 @param libInstanceList\r
1372 List of library construct name.\r
1373 @param moduleType\r
1374 Module type.\r
1375 @param fileBuffer\r
1376 String buffer for AutoGen.c\r
1377 @throws Exception\r
1378 **/\r
4353d8e1 1379 void LibConstructorToAutogenC(List<String[]> libInstanceList,\r
61528a1b 1380 String moduleType, StringBuffer fileBuffer) throws EdkException {\r
5f907e4a 1381 boolean isFirst = true;\r
1382\r
1383 //\r
1384 // The library constructor's parameter and return value depend on\r
1385 // module type.\r
1386 //\r
1387 for (int i = 0; i < libInstanceList.size(); i++) {\r
a387de3b 1388 if (libInstanceList.get(i)[1].equalsIgnoreCase(EdkDefinitions.MODULE_TYPE_BASE)) {\r
daa7a3eb 1389 fileBuffer.append("RETURN_STATUS\n");\r
1390 fileBuffer.append("EFIAPI\n");\r
4353d8e1 1391 fileBuffer.append(libInstanceList.get(i)[0]);\r
daa7a3eb 1392 fileBuffer.append(" (\n");\r
1393 fileBuffer.append(" VOID\n");\r
1394 fileBuffer.append(" );\n");\r
a387de3b 1395 } else {\r
1396 switch (CommonDefinition.getModuleType(moduleType)) {\r
4353d8e1 1397 case CommonDefinition.ModuleTypeBase:\r
daa7a3eb 1398 fileBuffer.append("RETURN_STATUS\n");\r
1399 fileBuffer.append("EFIAPI\n");\r
4353d8e1 1400 fileBuffer.append(libInstanceList.get(i)[0]);\r
daa7a3eb 1401 fileBuffer.append(" (\n");\r
1402 fileBuffer.append(" VOID\n");\r
1403 fileBuffer.append(" );\n");\r
4353d8e1 1404 break;\r
1405\r
1406 case CommonDefinition.ModuleTypePeiCore:\r
1407 case CommonDefinition.ModuleTypePeim:\r
daa7a3eb 1408 fileBuffer.append("EFI_STATUS\n");\r
1409 fileBuffer.append("EFIAPI\n");\r
a387de3b 1410 fileBuffer.append(libInstanceList.get(i)[0]);\r
daa7a3eb 1411 fileBuffer.append(" (\n");\r
1412 fileBuffer.append(" IN EFI_FFS_FILE_HEADER *FfsHeader,\n");\r
1413 fileBuffer.append(" IN EFI_PEI_SERVICES **PeiServices\n");\r
1414 fileBuffer.append(" );\n");\r
a387de3b 1415 break;\r
1416\r
1417 case CommonDefinition.ModuleTypeDxeCore:\r
1418 case CommonDefinition.ModuleTypeDxeDriver:\r
1419 case CommonDefinition.ModuleTypeDxeRuntimeDriver:\r
1420 case CommonDefinition.ModuleTypeDxeSmmDriver:\r
1421 case CommonDefinition.ModuleTypeDxeSalDriver:\r
1422 case CommonDefinition.ModuleTypeUefiDriver:\r
1423 case CommonDefinition.ModuleTypeUefiApplication:\r
daa7a3eb 1424 fileBuffer.append("EFI_STATUS\n");\r
1425 fileBuffer.append("EFIAPI\n");\r
a387de3b 1426 fileBuffer.append(libInstanceList.get(i)[0]);\r
daa7a3eb 1427 fileBuffer.append(" (\n");\r
1428 fileBuffer.append(" IN EFI_HANDLE ImageHandle,\n");\r
1429 fileBuffer.append(" IN EFI_SYSTEM_TABLE *SystemTable\n");\r
1430 fileBuffer.append(" );\n");\r
a387de3b 1431 break;\r
1432\r
1433 }\r
5f907e4a 1434 }\r
1435 }\r
1436\r
1437 //\r
1438 // Add ProcessLibraryConstructorList in AutoGen.c\r
1439 //\r
daa7a3eb 1440 fileBuffer.append("VOID\n");\r
1441 fileBuffer.append("EFIAPI\n");\r
1442 fileBuffer.append("ProcessLibraryConstructorList (\n");\r
5f907e4a 1443 switch (CommonDefinition.getModuleType(moduleType)) {\r
1444 case CommonDefinition.ModuleTypeBase:\r
daa7a3eb 1445 fileBuffer.append(" VOID\n");\r
5f907e4a 1446 break;\r
1447\r
1448 case CommonDefinition.ModuleTypePeiCore:\r
1449 case CommonDefinition.ModuleTypePeim:\r
daa7a3eb 1450 fileBuffer.append(" IN EFI_FFS_FILE_HEADER *FfsHeader,\n");\r
5f907e4a 1451 fileBuffer\r
daa7a3eb 1452 .append(" IN EFI_PEI_SERVICES **PeiServices\n");\r
5f907e4a 1453 break;\r
1454\r
1455 case CommonDefinition.ModuleTypeDxeCore:\r
1456 case CommonDefinition.ModuleTypeDxeDriver:\r
1457 case CommonDefinition.ModuleTypeDxeRuntimeDriver:\r
1458 case CommonDefinition.ModuleTypeDxeSmmDriver:\r
1459 case CommonDefinition.ModuleTypeDxeSalDriver:\r
1460 case CommonDefinition.ModuleTypeUefiDriver:\r
1461 case CommonDefinition.ModuleTypeUefiApplication:\r
daa7a3eb 1462 fileBuffer.append(" IN EFI_HANDLE ImageHandle,\n");\r
1463 fileBuffer.append(" IN EFI_SYSTEM_TABLE *SystemTable\n");\r
5f907e4a 1464 break;\r
1465 }\r
1466\r
daa7a3eb 1467 fileBuffer.append(" )\n");\r
1468 fileBuffer.append("{\n");\r
136adffc 1469 //\r
1470 // If no constructor function, return EFI_SUCCESS.\r
1471 //\r
1472 //if (libInstanceList.size() == 0){\r
daa7a3eb 1473 // fileBuffer.append(" return EFI_SUCCESS;\n");\r
136adffc 1474 //}\r
5f907e4a 1475 for (int i = 0; i < libInstanceList.size(); i++) {\r
1476 if (isFirst) {\r
daa7a3eb 1477 fileBuffer.append(" EFI_STATUS Status;\n");\r
1478 fileBuffer.append(" Status = EFI_SUCCESS;\n");\r
1479 fileBuffer.append("\n");\r
5f907e4a 1480 isFirst = false;\r
1481 }\r
a387de3b 1482 if (libInstanceList.get(i)[1].equalsIgnoreCase(EdkDefinitions.MODULE_TYPE_BASE)) {\r
5f907e4a 1483 fileBuffer.append(" Status = ");\r
4353d8e1 1484 fileBuffer.append(libInstanceList.get(i)[0]);\r
daa7a3eb 1485 fileBuffer.append("();\n");\r
a387de3b 1486 } else {\r
1487 switch (CommonDefinition.getModuleType(moduleType)) {\r
1488 case CommonDefinition.ModuleTypeBase:\r
1489 fileBuffer.append(" Status = ");\r
1490 fileBuffer.append(libInstanceList.get(i)[0]);\r
daa7a3eb 1491 fileBuffer.append("();\n");\r
a387de3b 1492 break;\r
1493 case CommonDefinition.ModuleTypePeiCore:\r
1494 case CommonDefinition.ModuleTypePeim:\r
1495 fileBuffer.append(" Status = ");\r
1496 fileBuffer.append(libInstanceList.get(i)[0]);\r
daa7a3eb 1497 fileBuffer.append(" (FfsHeader, PeiServices);\n");\r
a387de3b 1498 break;\r
1499 case CommonDefinition.ModuleTypeDxeCore:\r
1500 case CommonDefinition.ModuleTypeDxeDriver:\r
1501 case CommonDefinition.ModuleTypeDxeRuntimeDriver:\r
1502 case CommonDefinition.ModuleTypeDxeSmmDriver:\r
1503 case CommonDefinition.ModuleTypeDxeSalDriver:\r
1504 case CommonDefinition.ModuleTypeUefiDriver:\r
1505 case CommonDefinition.ModuleTypeUefiApplication:\r
1506 fileBuffer.append(" Status = ");\r
1507 fileBuffer.append(libInstanceList.get(i)[0]);\r
daa7a3eb 1508 fileBuffer.append(" (ImageHandle, SystemTable);\n");\r
a387de3b 1509 break;\r
1510 default:\r
1511 EdkLog.log(EdkLog.EDK_INFO,"Autogen doesn't know how to deal with module type - " + moduleType + "!");\r
1512 }\r
1513\r
5f907e4a 1514 }\r
daa7a3eb 1515 fileBuffer.append(" ASSERT_EFI_ERROR (Status);\n");\r
5f907e4a 1516 }\r
daa7a3eb 1517 fileBuffer.append("}\n");\r
5f907e4a 1518 }\r
1519\r
1520 /**\r
cb4d97bd 1521 LibDestructorToAutogenc\r
1522 \r
1523 This function writes library destructor list to AutoGen.c. The library\r
1524 destructor's parameter and return value depend on module type.\r
1525 \r
1526 @param libInstanceList\r
1527 List of library destructor name.\r
1528 @param moduleType\r
1529 Module type.\r
1530 @param fileBuffer\r
1531 String buffer for AutoGen.c\r
1532 @throws Exception\r
1533 **/\r
4353d8e1 1534 void LibDestructorToAutogenC(List<String[]> libInstanceList,\r
61528a1b 1535 String moduleType, StringBuffer fileBuffer) throws EdkException {\r
5f907e4a 1536 boolean isFirst = true;\r
1537 for (int i = 0; i < libInstanceList.size(); i++) {\r
a387de3b 1538 if (libInstanceList.get(i)[1].equalsIgnoreCase(EdkDefinitions.MODULE_TYPE_BASE)) {\r
daa7a3eb 1539 fileBuffer.append("RETURN_STATUS\n");\r
1540 fileBuffer.append("EFIAPI\n");\r
4353d8e1 1541 fileBuffer.append(libInstanceList.get(i)[0]);\r
daa7a3eb 1542 fileBuffer.append(" (\n");\r
1543 fileBuffer.append(" VOID\n");\r
1544 fileBuffer.append(" );\n");\r
a387de3b 1545 } else {\r
1546 switch (CommonDefinition.getModuleType(moduleType)) {\r
1547 case CommonDefinition.ModuleTypeBase:\r
daa7a3eb 1548 fileBuffer.append("RETURN_STATUS\n");\r
1549 fileBuffer.append("EFIAPI\n");\r
a387de3b 1550 fileBuffer.append(libInstanceList.get(i)[0]);\r
daa7a3eb 1551 fileBuffer.append(" (\n");\r
1552 fileBuffer.append(" VOID\n");\r
1553 fileBuffer.append(" );\n");\r
a387de3b 1554 break;\r
1555 case CommonDefinition.ModuleTypePeiCore:\r
1556 case CommonDefinition.ModuleTypePeim:\r
daa7a3eb 1557 fileBuffer.append("EFI_STATUS\n");\r
1558 fileBuffer.append("EFIAPI\n");\r
a387de3b 1559 fileBuffer.append(libInstanceList.get(i)[0]);\r
daa7a3eb 1560 fileBuffer.append(" (\n");\r
1561 fileBuffer.append(" IN EFI_FFS_FILE_HEADER *FfsHeader,\n");\r
1562 fileBuffer.append(" IN EFI_PEI_SERVICES **PeiServices\n");\r
1563 fileBuffer.append(" );\n");\r
a387de3b 1564 break;\r
1565 case CommonDefinition.ModuleTypeDxeCore:\r
1566 case CommonDefinition.ModuleTypeDxeDriver:\r
1567 case CommonDefinition.ModuleTypeDxeRuntimeDriver:\r
1568 case CommonDefinition.ModuleTypeDxeSmmDriver:\r
1569 case CommonDefinition.ModuleTypeDxeSalDriver:\r
1570 case CommonDefinition.ModuleTypeUefiDriver:\r
1571 case CommonDefinition.ModuleTypeUefiApplication:\r
daa7a3eb 1572 fileBuffer.append("EFI_STATUS\n");\r
1573 fileBuffer.append("EFIAPI\n");\r
a387de3b 1574 fileBuffer.append(libInstanceList.get(i)[0]);\r
daa7a3eb 1575 fileBuffer.append(" (\n");\r
1576 fileBuffer.append(" IN EFI_HANDLE ImageHandle,\n");\r
1577 fileBuffer.append(" IN EFI_SYSTEM_TABLE *SystemTable\n");\r
1578 fileBuffer.append(" );\n");\r
a387de3b 1579 break;\r
1580 }\r
5f907e4a 1581 }\r
1582 }\r
1583\r
1584 //\r
1585 // Write ProcessLibraryDestructor list to autogen.c\r
1586 //\r
1587 switch (CommonDefinition.getModuleType(moduleType)) {\r
1588 case CommonDefinition.ModuleTypeBase:\r
1589 case CommonDefinition.ModuleTypePeiCore:\r
1590 case CommonDefinition.ModuleTypePeim:\r
1591 break;\r
1592 case CommonDefinition.ModuleTypeDxeCore:\r
1593 case CommonDefinition.ModuleTypeDxeDriver:\r
1594 case CommonDefinition.ModuleTypeDxeRuntimeDriver:\r
1595 case CommonDefinition.ModuleTypeDxeSmmDriver:\r
1596 case CommonDefinition.ModuleTypeDxeSalDriver:\r
1597 case CommonDefinition.ModuleTypeUefiDriver:\r
1598 case CommonDefinition.ModuleTypeUefiApplication:\r
daa7a3eb 1599 fileBuffer.append("VOID\n");\r
1600 fileBuffer.append("EFIAPI\n");\r
1601 fileBuffer.append("ProcessLibraryDestructorList (\n");\r
1602 fileBuffer.append(" IN EFI_HANDLE ImageHandle,\n");\r
1603 fileBuffer.append(" IN EFI_SYSTEM_TABLE *SystemTable\n");\r
1604 fileBuffer.append(" )\n");\r
1605 fileBuffer.append("{\n");\r
878ddf1f 1606 //\r
136adffc 1607 // If no library destructor function, return EFI_SUCCESS.\r
878ddf1f 1608 //\r
ff225cbb 1609\r
5f907e4a 1610 for (int i = 0; i < libInstanceList.size(); i++) {\r
1611 if (isFirst) {\r
daa7a3eb 1612 fileBuffer.append(" EFI_STATUS Status;\n");\r
1613 fileBuffer.append(" Status = EFI_SUCCESS;\n");\r
1614 fileBuffer.append("\n");\r
5f907e4a 1615 isFirst = false;\r
1616 }\r
a387de3b 1617 if (libInstanceList.get(i)[1].equalsIgnoreCase(EdkDefinitions.MODULE_TYPE_BASE)) {\r
4353d8e1 1618 fileBuffer.append(" Status = ");\r
1619 fileBuffer.append(libInstanceList.get(i)[0]);\r
daa7a3eb 1620 fileBuffer.append("();\n");\r
1621 fileBuffer.append(" VOID\n");\r
a387de3b 1622 } else {\r
1623 fileBuffer.append(" Status = ");\r
1624 fileBuffer.append(libInstanceList.get(i)[0]);\r
daa7a3eb 1625 fileBuffer.append("(ImageHandle, SystemTable);\n");\r
1626 fileBuffer.append(" ASSERT_EFI_ERROR (Status);\n");\r
a387de3b 1627 }\r
5f907e4a 1628 }\r
daa7a3eb 1629 fileBuffer.append("}\n");\r
5f907e4a 1630 break;\r
1631 }\r
1632 }\r
1633\r
1634 /**\r
cb4d97bd 1635 ExternsDriverBindingToAutoGenC\r
1636 \r
1637 This function is to write DRIVER_BINDING, COMPONENT_NAME,\r
1638 DRIVER_CONFIGURATION, DRIVER_DIAGNOSTIC in AutoGen.c.\r
1639 \r
1640 @param fileBuffer\r
1641 String buffer for AutoGen.c\r
1642 **/\r
5f907e4a 1643 void ExternsDriverBindingToAutoGenC(StringBuffer fileBuffer)\r
61528a1b 1644 throws EdkException {\r
5f907e4a 1645 //\r
d8f1335e 1646 // Get the arry of extern. The driverBindingGroup is a 2 dimension array.\r
e425f073 1647 // The second dimension is include following element: DriverBinding, \r
1648 // ComponentName, DriverConfiguration, DriverDiag;\r
1649 // \r
d8f1335e 1650 String[][] driverBindingGroup = this.saq.getExternProtocolGroup();\r
5f907e4a 1651\r
e87022aa 1652\r
a387de3b 1653 //\r
1654 // inital BitMask;\r
1655 // \r
1656 int BitMask = 0;\r
5f907e4a 1657\r
1658 //\r
1659 // Write driver binding protocol extern to autogen.c\r
1660 //\r
d8f1335e 1661 for (int i = 0; i < driverBindingGroup.length; i++) {\r
e425f073 1662 if (driverBindingGroup[i][0] != null) {\r
1663 fileBuffer.append("extern EFI_DRIVER_BINDING_PROTOCOL ");\r
d8f1335e 1664 fileBuffer.append(driverBindingGroup[i][0]);\r
daa7a3eb 1665 fileBuffer.append(";\n");\r
a387de3b 1666 }\r
5f907e4a 1667 }\r
1668\r
1669 //\r
1670 // Write component name protocol extern to autogen.c\r
1671 //\r
e425f073 1672 if (!componentNamePcd) {\r
1673 for (int i = 0; i < driverBindingGroup.length; i++) {\r
1674 if (driverBindingGroup[i][1]!= null) {\r
1675 if (driverBindingGroup[i][0] != null) {\r
1676 BitMask |= 0x01;\r
1677 fileBuffer.append("extern EFI_COMPONENT_NAME_PROTOCOL ");\r
e87022aa 1678 fileBuffer.append(driverBindingGroup[i][1]);\r
daa7a3eb 1679 fileBuffer.append(";\n");\r
e425f073 1680 } else {\r
e87022aa 1681 throw new AutoGenException("DriverBinding can't be empty!!");\r
e425f073 1682 }\r
a387de3b 1683 }\r
1684 }\r
1685 }\r
1686\r
5f907e4a 1687 //\r
1688 // Write driver configration protocol extern to autogen.c\r
1689 //\r
e425f073 1690 for (int i = 0; i < driverBindingGroup.length; i++) {\r
1691 if (driverBindingGroup[i][2] != null) {\r
1692 if (driverBindingGroup[i][0] != null) {\r
d8f1335e 1693 BitMask |= 0x02;\r
e425f073 1694 fileBuffer.append("extern EFI_DRIVER_CONFIGURATION_PROTOCOL ");\r
d8f1335e 1695 fileBuffer.append(driverBindingGroup[i][2]);\r
daa7a3eb 1696 fileBuffer.append(";\n");\r
e425f073 1697 } else {\r
d8f1335e 1698 throw new AutoGenException("DriverBinding can't be empty!!");\r
e425f073 1699 }\r
1700 }\r
1701 }\r
a387de3b 1702\r
5f907e4a 1703 //\r
1704 // Write driver dignastic protocol extern to autogen.c\r
1705 //\r
e425f073 1706 if (!driverDiagnostPcd) {\r
1707 for (int i = 0; i < driverBindingGroup.length; i++) {\r
1708 if (driverBindingGroup[i][3] != null) {\r
1709 if (driverBindingGroup[i][0] != null) {\r
e87022aa 1710 BitMask |= 0x04;\r
1711 fileBuffer.append("extern EFI_DRIVER_DIAGNOSTICS_PROTOCOL ");\r
1712 fileBuffer.append(driverBindingGroup[i][3]);\r
daa7a3eb 1713 fileBuffer.append(";\n");\r
e425f073 1714 } else {\r
e87022aa 1715 throw new AutoGenException("DriverBinding can't be empty!!");\r
e425f073 1716 }\r
1717 }\r
1718 }\r
1719 }\r
a387de3b 1720\r
1721\r
5f907e4a 1722 //\r
1723 // Write driver module protocol bitmask.\r
1724 //\r
a387de3b 1725 fileBuffer.append("GLOBAL_REMOVE_IF_UNREFERENCED const UINT8 _gDriverModelProtocolBitmask = ");\r
5f907e4a 1726 fileBuffer.append(Integer.toString(BitMask));\r
daa7a3eb 1727 fileBuffer.append(";\n");\r
5f907e4a 1728\r
1729 //\r
1730 // Write driver module protocol list entry\r
1731 //\r
a387de3b 1732 fileBuffer.append("GLOBAL_REMOVE_IF_UNREFERENCED const UINTN _gDriverModelProtocolListEntries = ");\r
5f907e4a 1733\r
d8f1335e 1734 fileBuffer.append(Integer.toString(driverBindingGroup.length));\r
daa7a3eb 1735 fileBuffer.append(";\n");\r
5f907e4a 1736\r
1737 //\r
1738 // Write drive module protocol list to autogen.c\r
1739 //\r
e425f073 1740 if (driverBindingGroup.length > 0) {\r
a387de3b 1741 fileBuffer.append("GLOBAL_REMOVE_IF_UNREFERENCED const EFI_DRIVER_MODEL_PROTOCOL_LIST _gDriverModelProtocolList[] = {");\r
1742 }\r
1743\r
1744\r
d8f1335e 1745 for (int i = 0; i < driverBindingGroup.length; i++) {\r
5f907e4a 1746 if (i != 0) {\r
1747 fileBuffer.append(",");\r
1748 }\r
e425f073 1749 //\r
1750 // DriverBinding\r
1751 // \r
daa7a3eb 1752 fileBuffer.append("\n {\n");\r
5f907e4a 1753 fileBuffer.append(" &");\r
d8f1335e 1754 fileBuffer.append(driverBindingGroup[i][0]);\r
daa7a3eb 1755 fileBuffer.append(", \n");\r
a387de3b 1756\r
e87022aa 1757 //\r
e425f073 1758 // ComponentName\r
1759 // \r
1760 if (driverBindingGroup[i][1] != null && componentNamePcd != true) {\r
5f907e4a 1761 fileBuffer.append(" &");\r
d8f1335e 1762 fileBuffer.append(driverBindingGroup[i][1]);\r
daa7a3eb 1763 fileBuffer.append(", \n");\r
5f907e4a 1764 } else {\r
daa7a3eb 1765 fileBuffer.append(" NULL, \n");\r
5f907e4a 1766 }\r
1767\r
e425f073 1768 //\r
1769 // DriverConfiguration\r
1770 // \r
d8f1335e 1771 if (driverBindingGroup[i][2] != null) {\r
5f907e4a 1772 fileBuffer.append(" &");\r
d8f1335e 1773 fileBuffer.append(driverBindingGroup[i][2]);\r
daa7a3eb 1774 fileBuffer.append(", \n");\r
5f907e4a 1775 } else {\r
daa7a3eb 1776 fileBuffer.append(" NULL, \n");\r
5f907e4a 1777 }\r
1778\r
e425f073 1779 //\r
1780 // DriverDiagnostic\r
1781 // \r
1782 if (driverBindingGroup[i][3] != null && driverDiagnostPcd != true) {\r
5f907e4a 1783 fileBuffer.append(" &");\r
d8f1335e 1784 fileBuffer.append(driverBindingGroup[i][3]);\r
daa7a3eb 1785 fileBuffer.append(", \n");\r
5f907e4a 1786 } else {\r
daa7a3eb 1787 fileBuffer.append(" NULL, \n");\r
5f907e4a 1788 }\r
1789 fileBuffer.append(" }");\r
1790 }\r
d8f1335e 1791\r
e425f073 1792 if (driverBindingGroup.length > 0) {\r
daa7a3eb 1793 fileBuffer.append("\n};\n");\r
e425f073 1794 }\r
5f907e4a 1795 }\r
1796\r
1797 /**\r
cb4d97bd 1798 ExternCallBackToAutoGenC\r
1799 \r
1800 This function adds <SetVirtualAddressMapCallBack> and\r
1801 <ExitBootServicesCallBack> infomation to AutoGen.c\r
1802 \r
1803 @param fileBuffer\r
1804 String buffer for AutoGen.c\r
1805 @throws BuildException\r
1806 **/\r
5f907e4a 1807 void ExternCallBackToAutoGenC(StringBuffer fileBuffer)\r
61528a1b 1808 throws EdkException {\r
5f907e4a 1809 //\r
1810 // Collect module's <SetVirtualAddressMapCallBack> and\r
1811 // <ExitBootServiceCallBack> and add to setVirtualAddList\r
1812 // exitBootServiceList.\r
1813 //\r
83fba802 1814 String[] setVirtuals = saq.getSetVirtualAddressMapCallBackArray();\r
1815 String[] exitBoots = saq.getExitBootServicesCallBackArray();\r
a2733a33 1816 if (setVirtuals != null) {\r
1817 for (int j = 0; j < setVirtuals.length; j++) {\r
5f907e4a 1818 this.setVirtalAddList.add(setVirtuals[j]);\r
1819 }\r
1820 }\r
1821 if (exitBoots != null) {\r
1822 for (int k = 0; k < exitBoots.length; k++) {\r
1823 this.exitBootServiceList.add(exitBoots[k]);\r
1824 }\r
1825 }\r
1826 //\r
1827 // Add c code in autogen.c which relate to <SetVirtualAddressMapCallBack>\r
1828 // and <ExitBootServicesCallBack>\r
1829 //\r
1830 String moduleType = this.moduleId.getModuleType();\r
5f907e4a 1831 switch (CommonDefinition.getModuleType(moduleType)) {\r
1832 case CommonDefinition.ModuleTypeDxeDriver:\r
1833 case CommonDefinition.ModuleTypeDxeRuntimeDriver:\r
1834 case CommonDefinition.ModuleTypeDxeSalDriver:\r
1835 case CommonDefinition.ModuleTypeUefiDriver:\r
e425f073 1836 case CommonDefinition.ModuleTypeUefiApplication:\r
1837 //\r
1838 // If moduleType is one of above, call setVirtualAddressToAutogenC,\r
1839 // and setExitBootServiceToAutogenC.\r
1840 // \r
c60019f6 1841 setVirtualAddressToAutogenC(fileBuffer);\r
e425f073 1842 setExitBootServiceToAutogenC(fileBuffer);\r
5f907e4a 1843 break;\r
1844 default:\r
1845 break;\r
1846 }\r
5f907e4a 1847 }\r
878ddf1f 1848\r
cb4d97bd 1849 /**\r
1850 copyFlashMapHToDebugDir\r
1851 \r
1852 This function is to copy the falshmap.h to debug directory and change \r
1853 its name to TianoR8FlashMap.h\r
1854 \r
1855 @param \r
1856 @return\r
1857 **/\r
73b4e31a 1858 private void copyFlashMapHToDebugDir() throws AutoGenException{\r
ff225cbb 1859\r
cb4d97bd 1860 File inFile = new File(fvDir + File.separatorChar + CommonDefinition.FLASHMAPH);\r
73b4e31a 1861 int size = (int)inFile.length();\r
1862 byte[] buffer = new byte[size];\r
cb4d97bd 1863 File outFile = new File (this.outputPath + File.separatorChar + CommonDefinition.TIANOR8PLASHMAPH);\r
5f907e4a 1864 //\r
1865 // If TianoR8FlashMap.h existed and the flashMap.h don't change,\r
1866 // do nothing.\r
1867 //\r
31a9215c 1868 if ((!outFile.exists()) ||(inFile.lastModified() - outFile.lastModified()) >= 0) {\r
e425f073 1869 if (inFile.exists()) {\r
a387de3b 1870 try {\r
e425f073 1871 FileInputStream fis = new FileInputStream (inFile);\r
1872 fis.read(buffer);\r
1873 FileOutputStream fos = new FileOutputStream(outFile);\r
1874 fos.write(buffer);\r
1875 fis.close();\r
1876 fos.close();\r
a387de3b 1877 } catch (IOException e) {\r
61528a1b 1878 throw new AutoGenException("The file, flashMap.h can't be open!");\r
e425f073 1879 }\r
a387de3b 1880\r
e425f073 1881 } else {\r
1882 throw new AutoGenException("The file, flashMap.h doesn't exist!");\r
1883 }\r
5f907e4a 1884 }\r
73b4e31a 1885 }\r
ff225cbb 1886\r
2336382f 1887 /**\r
cb4d97bd 1888 This function first order the library instances, then collect\r
1889 library instance 's PPI, Protocol, GUID,\r
1890 SetVirtalAddressMapCallBack, ExitBootServiceCallBack, and\r
1891 Destructor, Constructor.\r
1892 \r
1893 @param\r
1894 @return \r
5f907e4a 1895 **/\r
892b0e7a 1896 private void collectLibInstanceInfo() throws EdkException{\r
5f907e4a 1897 int index;\r
1898\r
5f907e4a 1899 String libConstructName = null;\r
1900 String libDestructName = null;\r
a387de3b 1901 String libModuleType = null;\r
5f907e4a 1902 String[] setVirtuals = null;\r
1903 String[] exitBoots = null;\r
1904\r
83fba802 1905 ModuleIdentification[] libraryIdList = saq.getLibraryInstance(this.arch);\r
5f907e4a 1906\r
a387de3b 1907 if (libraryIdList != null) {\r
1908 //\r
1909 // Reorder library instance sequence.\r
1910 //\r
1911 AutogenLibOrder libOrder = new AutogenLibOrder(libraryIdList,\r
1912 this.arch);\r
1913 List<ModuleIdentification> orderList = libOrder\r
1914 .orderLibInstance();\r
1915\r
1916 if (orderList != null) {\r
1917 //\r
1918 // Process library instance one by one.\r
1919 //\r
1920 for (int i = 0; i < orderList.size(); i++) {\r
1921 //\r
1922 // Get library instance basename.\r
1923 //\r
1924 ModuleIdentification libInstanceId = orderList.get(i);\r
1925\r
1926 //\r
1927 // Get override map\r
1928 //\r
1929\r
1930 Map<String, XmlObject> libDoc = GlobalData.getDoc(libInstanceId, this.arch);\r
1931 saq.push(libDoc);\r
1932 //\r
1933 // Get <PPis>, <Protocols>, <Guids> list of this library\r
1934 // instance.\r
1935 //\r
1936 String[] ppiList = saq.getPpiArray(this.arch);\r
1937 String[] ppiNotifyList = saq.getPpiNotifyArray(this.arch);\r
1938 String[] protocolList = saq.getProtocolArray(this.arch);\r
1939 String[] protocolNotifyList = saq.getProtocolNotifyArray(this.arch);\r
1940 String[] guidList = saq.getGuidEntryArray(this.arch);\r
1941 PackageIdentification[] pkgList = saq.getDependencePkg(this.arch);\r
1942\r
1943 //\r
1944 // Add those ppi, protocol, guid in global ppi,\r
1945 // protocol, guid\r
1946 // list.\r
1947 //\r
1948 for (index = 0; index < ppiList.length; index++) {\r
1949 this.mPpiList.add(ppiList[index]);\r
1950 }\r
1951\r
1952 for (index = 0; index < ppiNotifyList.length; index++) {\r
1953 this.mPpiList.add(ppiNotifyList[index]);\r
1954 }\r
1955\r
1956 for (index = 0; index < protocolList.length; index++) {\r
1957 this.mProtocolList.add(protocolList[index]);\r
1958 }\r
1959\r
1960 for (index = 0; index < protocolNotifyList.length; index++) {\r
1961 this.mProtocolList.add(protocolNotifyList[index]);\r
1962 }\r
1963\r
1964 for (index = 0; index < guidList.length; index++) {\r
1965 this.mGuidList.add(guidList[index]);\r
1966 }\r
1967 for (index = 0; index < pkgList.length; index++) {\r
1968 if (!this.mDepPkgList.contains(pkgList[index])) {\r
1969 this.mDepPkgList.add(pkgList[index]);\r
1970 }\r
1971 }\r
1972\r
1973 //\r
1974 // If not yet parse this library instance's constructor\r
1975 // element,parse it.\r
1976 //\r
1977 libConstructName = saq.getLibConstructorName();\r
1978 libDestructName = saq.getLibDestructorName();\r
1979 libModuleType = saq.getModuleType();\r
1980\r
1981 //\r
1982 // Collect SetVirtualAddressMapCallBack and\r
1983 // ExitBootServiceCallBack.\r
1984 //\r
1985 setVirtuals = saq.getSetVirtualAddressMapCallBackArray();\r
1986 exitBoots = saq.getExitBootServicesCallBackArray();\r
1987 if (setVirtuals != null) {\r
1988 for (int j = 0; j < setVirtuals.length; j++) {\r
1989 this.setVirtalAddList.add(setVirtuals[j]);\r
1990 }\r
1991 }\r
1992 if (exitBoots != null) {\r
1993 for (int k = 0; k < exitBoots.length; k++) {\r
1994 this.exitBootServiceList.add(exitBoots[k]);\r
1995 }\r
1996 }\r
1997 saq.pop();\r
1998 //\r
1999 // Add dependent library instance constructor function.\r
2000 //\r
2001 if (libConstructName != null) {\r
2002 this.libConstructList.add(new String[] {libConstructName, libModuleType});\r
2003 }\r
2004 //\r
2005 // Add dependent library instance destructor fuction.\r
2006 //\r
2007 if (libDestructName != null) {\r
2008 this.libDestructList.add(new String[] {libDestructName, libModuleType});\r
2009 }\r
2010 }\r
2011 }\r
2012 }\r
5f907e4a 2013 }\r
e425f073 2014 private void setVirtualAddressToAutogenC(StringBuffer fileBuffer){\r
c60019f6 2015 //\r
2016 // Entry point lib for these module types needs to know the count\r
2017 // of entryPoint.\r
2018 //\r
daa7a3eb 2019 fileBuffer.append("\nGLOBAL_REMOVE_IF_UNREFERENCED const UINTN _gDriverSetVirtualAddressMapEventCount = ");\r
a387de3b 2020\r
2021 //\r
2022 // If the list is not valid or has no entries set count to zero else\r
2023 // set count to the number of valid entries\r
2024 //\r
2025 int Count = 0;\r
2026 int i = 0;\r
2027 if (this.setVirtalAddList != null) {\r
2028 for (i = 0; i < this.setVirtalAddList.size(); i++) {\r
2029 if (this.setVirtalAddList.get(i).equalsIgnoreCase("")) {\r
2030 break;\r
2031 }\r
2032 }\r
2033 Count = i;\r
2034 }\r
2035\r
2036 fileBuffer.append(Integer.toString(Count));\r
daa7a3eb 2037 fileBuffer.append(";\n\n");\r
a387de3b 2038 if (this.setVirtalAddList == null || this.setVirtalAddList.size() == 0) {\r
2039 //\r
2040 // No data so make a NULL list\r
2041 //\r
daa7a3eb 2042 fileBuffer.append("\nGLOBAL_REMOVE_IF_UNREFERENCED const EFI_EVENT_NOTIFY _gDriverSetVirtualAddressMapEvent[] = {\n");\r
2043 fileBuffer.append(" NULL\n");\r
2044 fileBuffer.append("};\n\n");\r
a387de3b 2045 } else {\r
2046 //\r
2047 // Write SetVirtualAddressMap function definition.\r
2048 //\r
2049 for (i = 0; i < this.setVirtalAddList.size(); i++) {\r
2050 if (this.setVirtalAddList.get(i).equalsIgnoreCase("")) {\r
2051 break;\r
2052 }\r
daa7a3eb 2053 fileBuffer.append("VOID\n");\r
2054 fileBuffer.append("EFIAPI\n");\r
a387de3b 2055 fileBuffer.append(this.setVirtalAddList.get(i));\r
daa7a3eb 2056 fileBuffer.append(" (\n");\r
2057 fileBuffer.append(" IN EFI_EVENT Event,\n");\r
2058 fileBuffer.append(" IN VOID *Context\n");\r
2059 fileBuffer.append(" );\n\n");\r
a387de3b 2060 }\r
2061\r
2062 //\r
2063 // Write SetVirtualAddressMap entry point array.\r
2064 //\r
daa7a3eb 2065 fileBuffer.append("\nGLOBAL_REMOVE_IF_UNREFERENCED const EFI_EVENT_NOTIFY _gDriverSetVirtualAddressMapEvent[] = {");\r
a387de3b 2066 for (i = 0; i < this.setVirtalAddList.size(); i++) {\r
2067 if (this.setVirtalAddList.get(i).equalsIgnoreCase("")) {\r
2068 break;\r
2069 }\r
2070\r
2071 if (i == 0) {\r
daa7a3eb 2072 fileBuffer.append("\n ");\r
a387de3b 2073 } else {\r
daa7a3eb 2074 fileBuffer.append(",\n ");\r
a387de3b 2075 }\r
2076\r
2077 fileBuffer.append(this.setVirtalAddList.get(i));\r
2078 }\r
2079 //\r
2080 // add the NULL at the end of _gDriverSetVirtualAddressMapEvent list.\r
2081 //\r
daa7a3eb 2082 fileBuffer.append(",\n NULL");\r
2083 fileBuffer.append("\n};\n\n");\r
a387de3b 2084 }\r
2085 }\r
2086\r
2087\r
2088 private void setExitBootServiceToAutogenC(StringBuffer fileBuffer){\r
2089 //\r
2090 // Entry point lib for these module types needs to know the count.\r
2091 //\r
e425f073 2092 fileBuffer\r
daa7a3eb 2093 .append("\nGLOBAL_REMOVE_IF_UNREFERENCED const UINTN _gDriverExitBootServicesEventCount = ");\r
a387de3b 2094\r
2095 //\r
2096 // If the list is not valid or has no entries set count to zero else\r
2097 // set count to the number of valid entries.\r
2098 //\r
2099 int Count = 0;\r
2100 int i = 0; \r
2101 if (this.exitBootServiceList != null) {\r
2102 for (i = 0; i < this.exitBootServiceList.size(); i++) {\r
2103 if (this.exitBootServiceList.get(i).equalsIgnoreCase("")) {\r
2104 break;\r
2105 }\r
2106 }\r
2107 Count = i;\r
2108 }\r
2109 fileBuffer.append(Integer.toString(Count));\r
daa7a3eb 2110 fileBuffer.append(";\n\n");\r
a387de3b 2111\r
2112 if (this.exitBootServiceList == null || this.exitBootServiceList.size() == 0) {\r
2113 // \r
2114 // No data so make a NULL list.\r
2115 //\r
daa7a3eb 2116 fileBuffer.append("\nGLOBAL_REMOVE_IF_UNREFERENCED const EFI_EVENT_NOTIFY _gDriverExitBootServicesEvent[] = {\n");\r
2117 fileBuffer.append(" NULL\n");\r
2118 fileBuffer.append("};\n\n");\r
a387de3b 2119 } else {\r
2120 //\r
2121 // Write DriverExitBootServices function definition.\r
2122 //\r
2123 for (i = 0; i < this.exitBootServiceList.size(); i++) {\r
2124 if (this.exitBootServiceList.get(i).equalsIgnoreCase("")) {\r
2125 break;\r
2126 }\r
2127\r
daa7a3eb 2128 fileBuffer.append("VOID\n");\r
2129 fileBuffer.append("EFIAPI\n");\r
a387de3b 2130 fileBuffer.append(this.exitBootServiceList.get(i));\r
daa7a3eb 2131 fileBuffer.append(" (\n");\r
2132 fileBuffer.append(" IN EFI_EVENT Event,\n");\r
2133 fileBuffer.append(" IN VOID *Context\n");\r
2134 fileBuffer.append(" );\n\n");\r
a387de3b 2135 }\r
2136\r
2137 //\r
2138 // Write DriverExitBootServices entry point array.\r
2139 //\r
daa7a3eb 2140 fileBuffer.append("\nGLOBAL_REMOVE_IF_UNREFERENCED const EFI_EVENT_NOTIFY _gDriverExitBootServicesEvent[] = {");\r
a387de3b 2141 for (i = 0; i < this.exitBootServiceList.size(); i++) {\r
2142 if (this.exitBootServiceList.get(i).equalsIgnoreCase("")) {\r
2143 break;\r
2144 }\r
2145\r
2146 if (i == 0) {\r
daa7a3eb 2147 fileBuffer.append("\n ");\r
a387de3b 2148 } else {\r
daa7a3eb 2149 fileBuffer.append(",\n ");\r
a387de3b 2150 }\r
2151 fileBuffer.append(this.exitBootServiceList.get(i));\r
2152 }\r
2153\r
daa7a3eb 2154 fileBuffer.append(",\n NULL");\r
2155 fileBuffer.append("\n};\n\n");\r
a387de3b 2156 } \r
e425f073 2157 }\r
2158 /**\r
2159 setPcdComponentName\r
2160 \r
2161 Get the Pcd Value of ComponentName to \r
2162 decide whether need to disable the componentName. \r
2163 \r
2164 **/\r
2165 public void setPcdComponentName (){\r
a387de3b 2166 String pcdValue = null;\r
2167 pcdValue = saq.getPcdValueBycName("PcdComponentNameDisable");\r
2168 if (pcdValue != null && pcdValue.equalsIgnoreCase("true")) {\r
e425f073 2169 this.componentNamePcd = true;\r
a387de3b 2170 }\r
e425f073 2171 }\r
a387de3b 2172\r
e425f073 2173 /**\r
2174 setPcdDriverDiagnostic \r
2175 \r
2176 Get the Pcd Value of DriverDiagnostic to \r
2177 decide whether need to disable DriverDiagnostic.\r
2178 \r
2179 **/\r
2180 public void setPcdDriverDiagnostic (){\r
a387de3b 2181 String pcdValue = null;\r
e425f073 2182 pcdValue = saq.getPcdValueBycName("PcdDriverDiagnosticsDisable");\r
a387de3b 2183 if (pcdValue != null && pcdValue.equalsIgnoreCase("true")) {\r
e425f073 2184 this.driverDiagnostPcd = true;\r
a387de3b 2185 }\r
e425f073 2186 } \r
a387de3b 2187\r
2336382f 2188}\r