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