4 This class is to generate Autogen.h and Autogen.c according to module surface area
5 or library surface area.
7 Copyright (c) 2006, Intel Corporation
8 All rights reserved. This program and the accompanying materials
9 are licensed and made available under the terms and conditions of the BSD License
10 which accompanies this distribution. The full text of the license may be found at
11 http://opensource.org/licenses/bsd-license.php
13 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
14 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
18 package org
.tianocore
.build
.autogen
;
21 import java
.io
.FileInputStream
;
22 import java
.io
.FileOutputStream
;
23 import java
.io
.FileReader
;
24 import java
.io
.FileWriter
;
25 import java
.io
.IOException
;
26 import java
.util
.ArrayList
;
27 import java
.util
.HashSet
;
28 import java
.util
.Iterator
;
29 import java
.util
.LinkedHashSet
;
30 import java
.util
.LinkedList
;
31 import java
.util
.List
;
35 import org
.apache
.tools
.ant
.BuildException
;
36 import org
.apache
.xmlbeans
.XmlObject
;
37 import org
.tianocore
.build
.exception
.AutoGenException
;
38 import org
.tianocore
.build
.global
.GlobalData
;
39 import org
.tianocore
.build
.global
.SurfaceAreaQuery
;
40 import org
.tianocore
.build
.id
.ModuleIdentification
;
41 import org
.tianocore
.build
.id
.PackageIdentification
;
42 import org
.tianocore
.build
.pcd
.action
.PCDAutoGenAction
;
43 import org
.tianocore
.common
.definitions
.ToolDefinitions
;
44 import org
.tianocore
.common
.definitions
.EdkDefinitions
;
45 import org
.tianocore
.common
.exception
.EdkException
;
46 import org
.tianocore
.common
.logger
.EdkLog
;
49 This class is to generate Autogen.h and Autogen.c according to module surface
50 area or library surface area.
52 public class AutoGen
{
54 /// The output path of Autogen.h and Autogen.c
56 private String outputPath
;
59 /// The name of FV directory
64 /// The base name of module or library.
66 private ModuleIdentification moduleId
;
69 /// The build architecture
74 /// PcdAutogen instance which is used to manage how to generate the PCD
77 private PCDAutoGenAction myPcdAutogen
;
80 /// the one of type : NOT_PCD_DRIVER, PEI_PCD_DRIVER, DXE_PCD_DRIVER
82 private CommonDefinition
.PCD_DRIVER_TYPE pcdDriverType
;
85 /// The protocl list which records in module or library surface area and
86 /// it's dependence on library instance surface area.
88 private Set
<String
> mProtocolList
= new HashSet
<String
>();
91 /// The Ppi list which recorded in module or library surface area and its
92 /// dependency on library instance surface area.
94 private Set
<String
> mPpiList
= new HashSet
<String
>();
97 /// The Guid list which recoreded in module or library surface area and it's
98 /// dependence on library instance surface area.
100 private Set
<String
> mGuidList
= new HashSet
<String
>();
103 /// The dependence package list which recoreded in module or library surface
104 /// area and it's dependence on library instance surface area.
106 private List
<PackageIdentification
> mDepPkgList
= new LinkedList
<PackageIdentification
>();
109 /// For non library module, add its library instance's construct and destructor to
110 /// list. String[0] recode LibConstructor name, String[1] recode Lib instance
113 private List
<String
[]> libConstructList
= new ArrayList
<String
[]>();
114 private List
<String
[]> libDestructList
= new ArrayList
<String
[]>();
117 /// List to store SetVirtalAddressMapCallBack, ExitBootServiceCallBack
119 private List
<String
> setVirtalAddList
= new ArrayList
<String
>();
120 private List
<String
> exitBootServiceList
= new ArrayList
<String
>();
123 // flag of PcdComponentNameDisable, PcdDriverDiagnosticDisable
125 private boolean componentNamePcd
= false;
126 private boolean driverDiagnostPcd
= false;
129 // Instance of SurfaceAreaQuery
131 private SurfaceAreaQuery saq
= null;
133 private ModuleIdentification parentId
= null;
138 This function mainly initialize some member variable.
141 Absolute path of FV directory.
143 Output path of AutoGen file.
145 Module identification.
149 public AutoGen(String fvDir
, String outputPath
, ModuleIdentification moduleId
, String arch
, SurfaceAreaQuery saq
, ModuleIdentification parentId
) {
150 this.outputPath
= outputPath
;
151 this.moduleId
= moduleId
;
155 this.parentId
= parentId
;
161 This function save the content in stringBuffer to file.
166 The content of AutoGen file in buffer.
171 private boolean saveFile(String fileName
, StringBuffer fileBuffer
) {
173 File autoGenH
= new File(fileName
);
176 // if the file exists, compare their content
178 if (autoGenH
.exists()) {
179 char[] oldFileBuffer
= new char[(int) autoGenH
.length()];
181 FileReader fIn
= new FileReader(autoGenH
);
182 fIn
.read(oldFileBuffer
, 0, (int) autoGenH
.length());
184 } catch (IOException e
) {
185 EdkLog
.log(EdkLog
.EDK_INFO
, this.moduleId
.getName()
188 + " is exist, but can't be open!!");
193 // if we got the same file, don't re-generate it to prevent
194 // sources depending on it from re-building
196 if (fileBuffer
.toString().compareTo(new String(oldFileBuffer
)) == 0) {
202 FileWriter fOut
= new FileWriter(autoGenH
);
203 fOut
.write(fileBuffer
.toString());
206 } catch (IOException e
) {
207 EdkLog
.log(EdkLog
.EDK_INFO
, this.moduleId
.getName()
210 + " can't be create!!");
219 This function call libGenAutoGen or moduleGenAutogen function, which
220 dependence on generate library autogen or module autogen.
222 @throws BuildException
223 Failed to creat AutoGen.c & AutoGen.h.
225 public void genAutogen() throws EdkException
{
227 // If outputPath do not exist, create it.
229 File path
= new File(outputPath
);
233 // Check current is library or not, then call the corresponding
236 if (this.moduleId
.isLibrary()) {
244 moduleGenAutogen function
246 This function generates AutoGen.c & AutoGen.h for module.
248 @throws BuildException
249 Faile to create module AutoGen.c & AutoGen.h.
251 void moduleGenAutogen() throws EdkException
{
252 setPcdComponentName();
253 setPcdDriverDiagnostic();
254 collectLibInstanceInfo();
260 libGenAutogen function
262 This function generates AutoGen.c & AutoGen.h for library.
264 @throws BuildException
265 Faile to create library AutoGen.c & AutoGen.h
267 void libGenAutogen() throws EdkException
{
275 This function generates AutoGen.h for module.
277 @throws BuildException
278 Failed to generate AutoGen.h.
280 void moduleGenAutogenH() throws EdkException
{
282 Set
<String
> libClassIncludeH
;
284 // List<String> headerFileList;
285 List
<String
> headerFileList
;
287 StringBuffer fileBuffer
= new StringBuffer(8192);
290 // Write Autogen.h header notation
292 fileBuffer
.append(CommonDefinition
.AUTOGENHNOTATION
);
295 // Add #ifndef ${BaseName}_AUTOGENH
296 // #def ${BseeName}_AUTOGENH
298 fileBuffer
.append(CommonDefinition
.IFNDEF
299 + CommonDefinition
.AUTOGENH
300 + this.moduleId
.getGuid().replaceAll("-", "_")
301 + ToolDefinitions
.LINE_SEPARATOR
);
302 fileBuffer
.append(CommonDefinition
.DEFINE
303 + CommonDefinition
.AUTOGENH
304 + this.moduleId
.getGuid().replaceAll("-", "_")
305 + ToolDefinitions
.LINE_SEPARATOR
306 + ToolDefinitions
.LINE_SEPARATOR
);
309 // Write the specification version and release version at the begine
310 // of autogen.h file.
311 // Note: the specification version and release version should
312 // be got from module surface area instead of hard code by it's
315 moduleType
= saq
.getModuleType();
318 // Add "extern int __make_me_compile_correctly;" at begin of
321 fileBuffer
.append(CommonDefinition
.AUTOGENHBEGIN
);
324 // Put EFI_SPECIFICATION_VERSION, and EDK_RELEASE_VERSION.
326 String
[] specList
= saq
.getExternSpecificaiton();
327 for (int i
= 0; i
< specList
.length
; i
++) {
328 fileBuffer
.append(CommonDefinition
.DEFINE
+ specList
[i
]
332 // Write consumed package's mdouleInfo related .h file to autogen.h
334 // PackageIdentification[] consumedPkgIdList = SurfaceAreaQuery
335 // .getDependencePkg(this.arch);
336 PackageIdentification
[] consumedPkgIdList
= saq
.getDependencePkg(this.arch
);
337 if (consumedPkgIdList
!= null) {
338 headerFileList
= depPkgToAutogenH(consumedPkgIdList
, moduleType
);
339 item
= headerFileList
.iterator();
340 while (item
.hasNext()) {
341 fileBuffer
.append(item
.next().toString());
346 // Write library class's related *.h file to autogen.h.
348 String
[] libClassList
= saq
.getLibraryClasses(CommonDefinition
.ALWAYSCONSUMED
,this.arch
);
349 if (libClassList
!= null) {
350 libClassIncludeH
= LibraryClassToAutogenH(libClassList
);
351 item
= libClassIncludeH
.iterator();
352 while (item
.hasNext()) {
353 fileBuffer
.append(item
.next().toString());
357 libClassList
= saq
.getLibraryClasses(CommonDefinition
.ALWAYSPRODUCED
, this.arch
);
358 if (libClassList
!= null) {
359 libClassIncludeH
= LibraryClassToAutogenH(libClassList
);
360 item
= libClassIncludeH
.iterator();
361 while (item
.hasNext()) {
362 fileBuffer
.append(item
.next().toString());
365 fileBuffer
.append("\r\n");
368 // If is TianoR8FlashMap, copy {Fv_DIR}/FlashMap.h to
369 // {DEST_DIR_DRBUG}/FlashMap.h
371 if (saq
.isHaveTianoR8FlashMap()) {
372 fileBuffer
.append(CommonDefinition
.INCLUDE
);
373 fileBuffer
.append(" <");
374 fileBuffer
.append(CommonDefinition
.TIANOR8PLASHMAPH
+ ">\r\n");
375 copyFlashMapHToDebugDir();
378 // Write PCD autogen information to AutoGen.h.
380 if (this.myPcdAutogen
!= null) {
381 fileBuffer
.append("\r\n");
382 fileBuffer
.append(this.myPcdAutogen
.getHAutoGenString());
386 // Append the #endif at AutoGen.h
388 fileBuffer
.append("#endif\r\n");
391 // Save string buffer content in AutoGen.h.
393 if (!saveFile(outputPath
+ File
.separatorChar
+ "AutoGen.h", fileBuffer
)) {
394 throw new AutoGenException("Failed to generate AutoGen.h !!!");
401 This function generates AutoGen.c for module.
403 @throws BuildException
404 Failed to generate AutoGen.c.
406 void moduleGenAutogenC() throws EdkException
{
408 StringBuffer fileBuffer
= new StringBuffer(8192);
410 // Write Autogen.c header notation
412 fileBuffer
.append(CommonDefinition
.AUTOGENCNOTATION
);
415 // Write #include <AutoGen.h> at beginning of AutoGen.c
417 fileBuffer
.append(CommonDefinition
.INCLUDEAUTOGENH
);
420 // Get the native MSA file infomation. Since before call autogen,
421 // the MSA native <Externs> information were overrided. So before
422 // process <Externs> it should be set the DOC as the Native MSA info.
424 Map
<String
, XmlObject
> doc
= GlobalData
.getNativeMsa(this.moduleId
);
428 // DriverBinding/ComponentName/DriverConfiguration/DriverDialog
432 ExternsDriverBindingToAutoGenC(fileBuffer
);
435 // Write DriverExitBootServicesEvent/DriverSetVirtualAddressMapEvent
438 ExternCallBackToAutoGenC(fileBuffer
);
441 // Write EntryPoint to autgoGen.c
443 String
[] entryPointList
= saq
.getModuleEntryPointArray();
444 String
[] unloadImageList
= saq
.getModuleUnloadImageArray();
445 EntryPointToAutoGen(CommonDefinition
.remDupString(entryPointList
),
446 CommonDefinition
.remDupString(unloadImageList
),
449 pcdDriverType
= saq
.getPcdDriverType();
452 // Restore the DOC which include the FPD module info.
457 // Write Guid to autogen.c
459 String guid
= CommonDefinition
.formatGuidName(saq
.getModuleGuid());
460 if (this.moduleId
.getModuleType().equalsIgnoreCase(EdkDefinitions
.MODULE_TYPE_BASE
)) {
461 fileBuffer
.append("GLOBAL_REMOVE_IF_UNREFERENCED GUID gEfiCallerIdGuid = {");
463 fileBuffer
.append("GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiCallerIdGuid = {");
467 throw new AutoGenException("Guid value must set!\n");
471 // Formate Guid as ANSI c form.Example:
472 // {0xd2b2b828, 0x826, 0x48a7,{0xb3, 0xdf, 0x98, 0x3c, 0x0, 0x60, 0x24,
476 fileBuffer
.append(guid
);
477 fileBuffer
.append("};\r\n");
480 // Generate library instance consumed protocol, guid, ppi, pcd list.
481 // Save those to this.protocolList, this.ppiList, this.pcdList,
482 // this.guidList. Write Consumed library constructor and desconstuct to
485 LibInstanceToAutogenC(fileBuffer
);
488 // Get module dependent Package identification.
490 PackageIdentification
[] packages
= saq
.getDependencePkg(this.arch
);
491 for (int i
= 0; i
< packages
.length
; i
++) {
492 if (!this.mDepPkgList
.contains(packages
[i
])) {
493 this.mDepPkgList
.add(packages
[i
]);
499 // Write consumed ppi, guid, protocol to autogen.c
501 ProtocolGuidToAutogenC(fileBuffer
);
502 PpiGuidToAutogenC(fileBuffer
);
503 GuidGuidToAutogenC(fileBuffer
);
508 this.myPcdAutogen
= new PCDAutoGenAction(moduleId
,
515 this.myPcdAutogen
.execute();
516 if (this.myPcdAutogen
!= null) {
517 fileBuffer
.append("\r\n");
518 fileBuffer
.append(this.myPcdAutogen
.getCAutoGenString());
521 if (!saveFile(outputPath
+ File
.separatorChar
+ "AutoGen.c", fileBuffer
)) {
522 throw new AutoGenException("Failed to generate AutoGen.c !!!");
530 This function generates AutoGen.h for library.
532 @throws BuildException
533 Failed to generate AutoGen.c.
535 void libGenAutogenH() throws EdkException
{
537 Set
<String
> libClassIncludeH
;
539 List
<String
> headerFileList
;
541 StringBuffer fileBuffer
= new StringBuffer(10240);
544 // Write Autogen.h header notation
546 fileBuffer
.append(CommonDefinition
.AUTOGENHNOTATION
);
549 // Add #ifndef ${BaseName}_AUTOGENH
550 // #def ${BseeName}_AUTOGENH
552 fileBuffer
.append(CommonDefinition
.IFNDEF
553 + CommonDefinition
.AUTOGENH
554 + this.moduleId
.getGuid().replaceAll("-", "_")
555 + ToolDefinitions
.LINE_SEPARATOR
);
556 fileBuffer
.append(CommonDefinition
.DEFINE
557 + CommonDefinition
.AUTOGENH
558 + this.moduleId
.getGuid().replaceAll("-", "_")
559 + ToolDefinitions
.LINE_SEPARATOR
560 + ToolDefinitions
.LINE_SEPARATOR
);
563 // Write EFI_SPECIFICATION_VERSION and EDK_RELEASE_VERSION
564 // to autogen.h file.
565 // Note: the specification version and release version should
566 // be get from module surface area instead of hard code.
568 fileBuffer
.append(CommonDefinition
.AUTOGENHBEGIN
);
569 String
[] specList
= saq
.getExternSpecificaiton();
570 for (int i
= 0; i
< specList
.length
; i
++) {
571 fileBuffer
.append(CommonDefinition
.DEFINE
+ specList
[i
]
574 // fileBuffer.append(CommonDefinition.autoGenHLine1);
575 // fileBuffer.append(CommonDefinition.autoGenHLine2);
578 // Write consumed package's mdouleInfo related *.h file to autogen.h.
580 moduleType
= saq
.getModuleType();
581 PackageIdentification
[] cosumedPkglist
= saq
582 .getDependencePkg(this.arch
);
583 headerFileList
= depPkgToAutogenH(cosumedPkglist
, moduleType
);
584 item
= headerFileList
.iterator();
585 while (item
.hasNext()) {
586 fileBuffer
.append(item
.next().toString());
589 // Write library class's related *.h file to autogen.h
591 String
[] libClassList
= saq
.getLibraryClasses(CommonDefinition
.ALWAYSCONSUMED
, this.arch
);
592 if (libClassList
!= null) {
593 libClassIncludeH
= LibraryClassToAutogenH(libClassList
);
594 item
= libClassIncludeH
.iterator();
595 while (item
.hasNext()) {
596 fileBuffer
.append(item
.next().toString());
600 libClassList
= saq
.getLibraryClasses(CommonDefinition
.ALWAYSPRODUCED
, this.arch
);
601 if (libClassList
!= null) {
602 libClassIncludeH
= LibraryClassToAutogenH(libClassList
);
603 item
= libClassIncludeH
.iterator();
604 while (item
.hasNext()) {
605 fileBuffer
.append(item
.next().toString());
608 fileBuffer
.append(ToolDefinitions
.LINE_SEPARATOR
);
611 // If is TianoR8FlashMap, copy {Fv_DIR}/FlashMap.h to
612 // {DEST_DIR_DRBUG}/FlashMap.h
614 if (saq
.isHaveTianoR8FlashMap()) {
615 fileBuffer
.append(CommonDefinition
.INCLUDE
);
616 fileBuffer
.append(" <");
617 fileBuffer
.append(CommonDefinition
.TIANOR8PLASHMAPH
+ ">\r\n");
618 copyFlashMapHToDebugDir();
622 // Write PCD information to library AutoGen.h.
624 if (this.myPcdAutogen
!= null) {
625 fileBuffer
.append("\r\n");
626 fileBuffer
.append(this.myPcdAutogen
.getHAutoGenString());
630 // Append the #endif at AutoGen.h
632 fileBuffer
.append("#endif\r\n");
635 // Save content of string buffer to AutoGen.h file.
637 if (!saveFile(outputPath
+ File
.separatorChar
+ "AutoGen.h", fileBuffer
)) {
638 throw new AutoGenException("Failed to generate AutoGen.h !!!");
645 This function generates AutoGen.h for library.
647 @throws BuildException
648 Failed to generate AutoGen.c.
650 void libGenAutogenC() throws EdkException
{
651 StringBuffer fileBuffer
= new StringBuffer(10240);
654 // Write Autogen.c header notation
656 fileBuffer
.append(CommonDefinition
.AUTOGENCNOTATION
);
658 fileBuffer
.append(ToolDefinitions
.LINE_SEPARATOR
);
659 fileBuffer
.append(ToolDefinitions
.LINE_SEPARATOR
);
664 this.myPcdAutogen
= new PCDAutoGenAction(moduleId
,
667 saq
.getModulePcdEntryNameArray(this.arch
),
670 this.myPcdAutogen
.execute();
671 if (this.myPcdAutogen
!= null) {
672 fileBuffer
.append(ToolDefinitions
.LINE_SEPARATOR
);
673 fileBuffer
.append(this.myPcdAutogen
.getCAutoGenString());
676 if (!saveFile(outputPath
+ File
.separatorChar
+ "AutoGen.c", fileBuffer
)) {
677 throw new AutoGenException("Failed to generate AutoGen.c !!!");
682 LibraryClassToAutogenH
684 This function returns *.h files declared by library classes which are
685 consumed or produced by current build module or library.
688 List of library class which consumed or produce by current
689 build module or library.
690 @return includeStrList List of *.h file.
692 Set
<String
> LibraryClassToAutogenH(String
[] libClassList
)
693 throws EdkException
{
694 Set
<String
> includeStrList
= new LinkedHashSet
<String
>();
695 String includeName
[];
699 // Get include file from GlobalData's SPDTable according to
700 // library class name.
702 for (int i
= 0; i
< libClassList
.length
; i
++) {
703 includeName
= GlobalData
.getLibraryClassHeaderFiles(
704 saq
.getDependencePkg(this.arch
),
706 if (includeName
== null) {
707 throw new AutoGenException("Can not find library class ["
708 + libClassList
[i
] + "] declaration in any SPD package. ");
710 for (int j
= 0; j
< includeName
.length
; j
++) {
711 String includeNameStr
= includeName
[j
];
712 if (includeNameStr
!= null) {
713 str
= CommonDefinition
.INCLUDE
+ " " + "<";
714 str
= str
+ includeNameStr
+ ">\r\n";
715 includeStrList
.add(str
);
716 includeNameStr
= null;
720 return includeStrList
;
726 This function add include file in AutoGen.h file.
728 @param packageNameList
729 List of module depended package.
734 List
<String
> depPkgToAutogenH(PackageIdentification
[] packageNameList
,
735 String moduleType
) throws AutoGenException
{
737 List
<String
> includeStrList
= new LinkedList
<String
>();
739 String includeStr
= "";
742 // Get include file from moduleInfo file
744 for (int i
= 0; i
< packageNameList
.length
; i
++) {
745 pkgHeader
= GlobalData
.getPackageHeaderFiles(packageNameList
[i
],
747 if (pkgHeader
== null) {
748 throw new AutoGenException("Can not find package ["
750 + "] declaration in any SPD package. ");
751 } else if (!pkgHeader
.equalsIgnoreCase("")) {
752 includeStr
= CommonDefinition
.INCLUDE
+ " <" + pkgHeader
754 includeStrList
.add(includeStr
);
758 return includeStrList
;
764 This function convert <ModuleEntryPoint> & <ModuleUnloadImage>
765 information in mas to AutoGen.c
767 @param entryPointList
770 String buffer fo AutoGen.c.
773 void EntryPointToAutoGen(String
[] entryPointList
, String
[] unloadImageList
, StringBuffer fileBuffer
)
774 throws EdkException
{
776 String typeStr
= saq
.getModuleType();
777 String debugStr
= "DEBUG ((EFI_D_INFO | EFI_D_LOAD, \"Module Entry Point (%s) 0x%%p\\n\", (VOID *)(UINTN)%s));\n";
778 int unloadImageCount
= 0;
779 int entryPointCount
= 0;
782 // The parameters and return value of entryPoint is difference
783 // for difference module type.
785 switch (CommonDefinition
.getModuleType(typeStr
)) {
787 case CommonDefinition
.ModuleTypePeiCore
:
788 if (entryPointList
== null ||entryPointList
.length
!= 1 ) {
789 throw new AutoGenException(
790 "Module type = 'PEI_CORE', can have only one module entry point!");
792 fileBuffer
.append("EFI_STATUS\r\n");
793 fileBuffer
.append(entryPointList
[0]);
794 fileBuffer
.append(" (\r\n");
795 fileBuffer
.append(" IN EFI_PEI_STARTUP_DESCRIPTOR *PeiStartupDescriptor,\r\n");
796 fileBuffer
.append(" IN VOID *OldCoreData\r\n");
797 fileBuffer
.append(" );\r\n\r\n");
799 fileBuffer
.append("EFI_STATUS\r\n");
800 fileBuffer
.append("EFIAPI\r\n");
801 fileBuffer
.append("ProcessModuleEntryPointList (\r\n");
802 fileBuffer
.append(" IN EFI_PEI_STARTUP_DESCRIPTOR *PeiStartupDescriptor,\r\n");
803 fileBuffer
.append(" IN VOID *OldCoreData\r\n");
804 fileBuffer
.append(" )\r\n\r\n");
805 fileBuffer
.append("{\r\n");
806 // fileBuffer.append(" DEBUG ((EFI_D_INFO, \"Module Entry Point 0x%08x\\n\", (UINTN)" + entryPointList[0] + "));\n");
807 fileBuffer
.append(String
.format(" " + debugStr
, entryPointList
[0], entryPointList
[0]));
808 fileBuffer
.append(" return ");
809 fileBuffer
.append(entryPointList
[0]);
810 fileBuffer
.append(" (PeiStartupDescriptor, OldCoreData);\r\n");
811 fileBuffer
.append("}\r\n\r\n");
815 case CommonDefinition
.ModuleTypeDxeCore
:
816 fileBuffer
.append("const UINT32 _gUefiDriverRevision = 0;\r\n");
817 if (entryPointList
== null || entryPointList
.length
!= 1) {
818 throw new AutoGenException("Module type = 'DXE_CORE', can have only one module entry point!");
820 fileBuffer
.append("VOID\r\n");
821 fileBuffer
.append(entryPointList
[0]);
822 fileBuffer
.append(" (\n");
823 fileBuffer
.append(" IN VOID *HobStart\r\n");
824 fileBuffer
.append(" );\r\n\r\n");
826 fileBuffer
.append("VOID\r\n");
827 fileBuffer
.append("EFIAPI\r\n");
828 fileBuffer
.append("ProcessModuleEntryPointList (\r\n");
829 fileBuffer
.append(" IN VOID *HobStart\r\n");
830 fileBuffer
.append(" )\r\n\r\n");
831 fileBuffer
.append("{\r\n");
832 //fileBuffer.append(" DEBUG ((EFI_D_INFO, \"Module Entry Point 0x%08x\\n\", (UINTN)" + entryPointList[0] + "));\n");
833 fileBuffer
.append(String
.format(" " + debugStr
, entryPointList
[0], entryPointList
[0]));
834 fileBuffer
.append(" ");
835 fileBuffer
.append(entryPointList
[0]);
836 fileBuffer
.append(" (HobStart);\r\n");
837 fileBuffer
.append("}\r\n\r\n");
841 case CommonDefinition
.ModuleTypePeim
:
843 fileBuffer
.append("GLOBAL_REMOVE_IF_UNREFERENCED const UINT32 _gPeimRevision = 0;\r\n");
844 if (entryPointList
== null || entryPointList
.length
== 0) {
845 fileBuffer
.append("EFI_STATUS\r\n");
846 fileBuffer
.append("EFIAPI\r\n");
847 fileBuffer
.append("ProcessModuleEntryPointList (\r\n");
848 fileBuffer
.append(" IN EFI_FFS_FILE_HEADER *FfsHeader,\r\n");
849 fileBuffer
.append(" IN EFI_PEI_SERVICES **PeiServices\r\n");
850 fileBuffer
.append(" )\r\n\r\n");
851 fileBuffer
.append("{\r\n");
852 fileBuffer
.append(" return EFI_SUCCESS;\r\n");
853 fileBuffer
.append("}\r\n\r\n");
856 for (int i
= 0; i
< entryPointList
.length
; i
++) {
857 fileBuffer
.append("EFI_STATUS\r\n");
858 fileBuffer
.append(entryPointList
[i
]);
859 fileBuffer
.append(" (\r\n");
860 fileBuffer
.append(" IN EFI_FFS_FILE_HEADER *FfsHeader,\r\n");
861 fileBuffer
.append(" IN EFI_PEI_SERVICES **PeiServices\r\n");
862 fileBuffer
.append(" );\r\n");
866 fileBuffer
.append("EFI_STATUS\r\n");
867 fileBuffer
.append("EFIAPI\r\n");
868 fileBuffer
.append("ProcessModuleEntryPointList (\r\n");
869 fileBuffer
.append(" IN EFI_FFS_FILE_HEADER *FfsHeader,\r\n");
870 fileBuffer
.append(" IN EFI_PEI_SERVICES **PeiServices\r\n");
871 fileBuffer
.append(" )\r\n\r\n");
872 fileBuffer
.append("{\r\n");
873 if (entryPointCount
== 1) {
874 //fileBuffer.append(" DEBUG ((EFI_D_INFO, \"Module Entry Point 0x%08x\\n\", (UINTN)" + entryPointList[0] + "));\n");
875 fileBuffer
.append(String
.format(" " + debugStr
, entryPointList
[0], entryPointList
[0]));
876 fileBuffer
.append(" return ");
877 fileBuffer
.append(entryPointList
[0]);
878 fileBuffer
.append(" (FfsHeader, PeiServices);\r\n");
880 fileBuffer
.append(" EFI_STATUS Status;\r\n");
881 fileBuffer
.append(" EFI_STATUS CombinedStatus;\r\n\r\n");
882 fileBuffer
.append(" CombinedStatus = EFI_LOAD_ERROR;\r\n\r\n");
883 for (int i
= 0; i
< entryPointList
.length
; i
++) {
884 if (!entryPointList
[i
].equals("")) {
885 //fileBuffer.append(" DEBUG ((EFI_D_INFO, \"Module Entry Point 0x%08x\\n\", (UINTN)" + entryPointList[i] + "));\n");
886 fileBuffer
.append(String
.format(" " + debugStr
, entryPointList
[i
], entryPointList
[i
]));
887 fileBuffer
.append(" Status = ");
888 fileBuffer
.append(entryPointList
[i
]);
889 fileBuffer
.append(" (FfsHeader, PeiServices);\r\n");
890 fileBuffer
.append(" if (!EFI_ERROR (Status) || EFI_ERROR (CombinedStatus)) {\r\n");
891 fileBuffer
.append(" CombinedStatus = Status;\r\n");
892 fileBuffer
.append(" }\r\n\r\n");
897 fileBuffer
.append(" return CombinedStatus;\r\n");
899 fileBuffer
.append("}\r\n\r\n");
902 case CommonDefinition
.ModuleTypeDxeSmmDriver
:
905 // If entryPoint is null, create an empty ProcessModuleEntryPointList
908 if (entryPointList
== null || entryPointList
.length
== 0) {
909 fileBuffer
.append("GLOBAL_REMOVE_IF_UNREFERENCED const UINT8 _gDriverEntryPointCount = ");
910 fileBuffer
.append(Integer
.toString(entryPointCount
));
911 fileBuffer
.append(";\r\n");
912 fileBuffer
.append("EFI_STATUS\r\n");
913 fileBuffer
.append("EFIAPI\r\n");
914 fileBuffer
.append("ProcessModuleEntryPointList (\r\n");
915 fileBuffer
.append(" IN EFI_HANDLE ImageHandle,\r\n");
916 fileBuffer
.append(" IN EFI_SYSTEM_TABLE *SystemTable\r\n");
917 fileBuffer
.append(" )\r\n\r\n");
918 fileBuffer
.append("{\r\n");
919 fileBuffer
.append(" return EFI_SUCCESS;\r\n");
920 fileBuffer
.append("}\r\n\r\n");
923 for (int i
= 0; i
< entryPointList
.length
; i
++) {
924 fileBuffer
.append("EFI_STATUS\r\n");
925 fileBuffer
.append(entryPointList
[i
]);
926 fileBuffer
.append(" (\r\n");
927 fileBuffer
.append(" IN EFI_HANDLE ImageHandle,\r\n");
928 fileBuffer
.append(" IN EFI_SYSTEM_TABLE *SystemTable\r\n");
929 fileBuffer
.append(" );\r\n");
932 fileBuffer
.append("GLOBAL_REMOVE_IF_UNREFERENCED const UINT8 _gDriverEntryPointCount = ");
933 fileBuffer
.append(Integer
.toString(entryPointCount
));
934 fileBuffer
.append(";\r\n");
935 fileBuffer
.append("static BASE_LIBRARY_JUMP_BUFFER mJumpContext;\r\n");
936 fileBuffer
.append("static EFI_STATUS mDriverEntryPointStatus = EFI_LOAD_ERROR;\r\n\r\n");
938 fileBuffer
.append("EFI_STATUS\r\n");
939 fileBuffer
.append("EFIAPI\r\n");
940 fileBuffer
.append("ProcessModuleEntryPointList (\r\n");
941 fileBuffer
.append(" IN EFI_HANDLE ImageHandle,\r\n");
942 fileBuffer
.append(" IN EFI_SYSTEM_TABLE *SystemTable\r\n");
943 fileBuffer
.append(" )\r\n\r\n");
944 fileBuffer
.append("{\r\n");
946 for (int i
= 0; i
< entryPointList
.length
; i
++) {
947 fileBuffer
.append(" if (SetJump (&mJumpContext) == 0) {\r\n");
948 //fileBuffer.append(" DEBUG ((EFI_D_INFO, \"Module Entry Point 0x%08x\\n\", (UINTN)" + entryPointList[i] + "));\n");
949 fileBuffer
.append(String
.format(" " + debugStr
, entryPointList
[i
], entryPointList
[i
]));
950 fileBuffer
.append(" ExitDriver (");
951 fileBuffer
.append(entryPointList
[i
]);
952 fileBuffer
.append(" (ImageHandle, SystemTable));\r\n");
953 fileBuffer
.append(" ASSERT (FALSE);\r\n");
954 fileBuffer
.append(" }\r\n");
956 fileBuffer
.append(" return mDriverEntryPointStatus;\r\n");
957 fileBuffer
.append("}\r\n\r\n");
959 fileBuffer
.append("VOID\r\n");
960 fileBuffer
.append("EFIAPI\r\n");
961 fileBuffer
.append("ExitDriver (\r\n");
962 fileBuffer
.append(" IN EFI_STATUS Status\n");
963 fileBuffer
.append(" )\r\n\r\n");
964 fileBuffer
.append("{\r\n");
965 fileBuffer
.append(" if (!EFI_ERROR (Status) || EFI_ERROR (mDriverEntryPointStatus)) {\r\n");
966 fileBuffer
.append(" mDriverEntryPointStatus = Status;\r\n");
967 fileBuffer
.append(" }\r\n");
968 fileBuffer
.append(" LongJump (&mJumpContext, (UINTN)-1);\r\n");
969 fileBuffer
.append(" ASSERT (FALSE);\r\n");
970 fileBuffer
.append("}\r\n\r\n");
975 // Add "ModuleUnloadImage" for DxeSmmDriver module type;
977 //entryPointList = SurfaceAreaQuery.getModuleUnloadImageArray();
978 //entryPointList = CommonDefinition.remDupString(entryPointList);
979 //entryPointCount = 0;
981 unloadImageCount
= 0;
982 if (unloadImageList
!= null) {
983 for (int i
= 0; i
< unloadImageList
.length
; i
++) {
984 fileBuffer
.append("EFI_STATUS\r\n");
985 fileBuffer
.append(unloadImageList
[i
]);
986 fileBuffer
.append(" (\r\n");
987 fileBuffer
.append(" IN EFI_HANDLE ImageHandle\r\n");
988 fileBuffer
.append(" );\r\n");
993 fileBuffer
.append("GLOBAL_REMOVE_IF_UNREFERENCED const UINT8 _gDriverUnloadImageCount = ");
994 fileBuffer
.append(Integer
.toString(unloadImageCount
));
995 fileBuffer
.append(";\r\n\r\n");
997 fileBuffer
.append("EFI_STATUS\r\n");
998 fileBuffer
.append("EFIAPI\r\n");
999 fileBuffer
.append("ProcessModuleUnloadList (\r\n");
1000 fileBuffer
.append(" IN EFI_HANDLE ImageHandle\r\n");
1001 fileBuffer
.append(" )\r\n");
1002 fileBuffer
.append("{\r\n");
1004 if (unloadImageCount
== 0) {
1005 fileBuffer
.append(" return EFI_SUCCESS;\r\n");
1006 } else if (unloadImageCount
== 1) {
1007 fileBuffer
.append(" return ");
1008 fileBuffer
.append(unloadImageList
[0]);
1009 fileBuffer
.append("(ImageHandle);\r\n");
1011 fileBuffer
.append(" EFI_STATUS Status;\r\n\r\n");
1012 fileBuffer
.append(" Status = EFI_SUCCESS;\r\n\r\n");
1013 for (int i
= 0; i
< unloadImageList
.length
; i
++) {
1015 fileBuffer
.append(" Status = ");
1016 fileBuffer
.append(unloadImageList
[i
]);
1017 fileBuffer
.append("(ImageHandle);\r\n");
1019 fileBuffer
.append(" if (EFI_ERROR (Status)) {\r\n");
1020 fileBuffer
.append(" ");
1021 fileBuffer
.append(unloadImageList
[i
]);
1022 fileBuffer
.append("(ImageHandle);\r\n");
1023 fileBuffer
.append(" } else {\r\n");
1024 fileBuffer
.append(" Status = ");
1025 fileBuffer
.append(unloadImageList
[i
]);
1026 fileBuffer
.append("(ImageHandle);\r\n");
1027 fileBuffer
.append(" }\r\n");
1030 fileBuffer
.append(" return Status;\r\n");
1032 fileBuffer
.append("}\r\n\r\n");
1035 case CommonDefinition
.ModuleTypeDxeRuntimeDriver
:
1036 case CommonDefinition
.ModuleTypeDxeDriver
:
1037 case CommonDefinition
.ModuleTypeDxeSalDriver
:
1038 case CommonDefinition
.ModuleTypeUefiDriver
:
1039 case CommonDefinition
.ModuleTypeUefiApplication
:
1040 entryPointCount
= 0;
1041 fileBuffer
.append("const UINT32 _gUefiDriverRevision = 0;\r\n");
1043 // If entry point is null, create a empty ProcessModuleEntryPointList function.
1045 if (entryPointList
== null || entryPointList
.length
== 0) {
1046 fileBuffer
.append("GLOBAL_REMOVE_IF_UNREFERENCED const UINT8 _gDriverEntryPointCount = 0;\r\n");
1047 fileBuffer
.append("EFI_STATUS\r\n");
1048 fileBuffer
.append("EFIAPI\r\n");
1049 fileBuffer
.append("ProcessModuleEntryPointList (\r\n");
1050 fileBuffer
.append(" IN EFI_HANDLE ImageHandle,\r\n");
1051 fileBuffer
.append(" IN EFI_SYSTEM_TABLE *SystemTable\r\n");
1052 fileBuffer
.append(" )\r\n\r\n");
1053 fileBuffer
.append("{\r\n");
1054 fileBuffer
.append(" return EFI_SUCCESS;\r\n");
1055 fileBuffer
.append("}\r\n");
1058 for (int i
= 0; i
< entryPointList
.length
; i
++) {
1060 fileBuffer
.append("EFI_STATUS\r\n");
1061 fileBuffer
.append(entryPointList
[i
]);
1062 fileBuffer
.append(" (\r\n");
1063 fileBuffer
.append(" IN EFI_HANDLE ImageHandle,\r\n");
1064 fileBuffer
.append(" IN EFI_SYSTEM_TABLE *SystemTable\r\n");
1065 fileBuffer
.append(" );\r\n");
1069 fileBuffer
.append("GLOBAL_REMOVE_IF_UNREFERENCED const UINT8 _gDriverEntryPointCount = ");
1070 fileBuffer
.append(Integer
.toString(entryPointCount
));
1071 fileBuffer
.append(";\r\n");
1072 if (entryPointCount
> 1) {
1073 fileBuffer
.append("static BASE_LIBRARY_JUMP_BUFFER mJumpContext;\r\n");
1074 fileBuffer
.append("static EFI_STATUS mDriverEntryPointStatus = EFI_LOAD_ERROR;\r\n");
1076 fileBuffer
.append("\n");
1078 fileBuffer
.append("EFI_STATUS\r\n");
1079 fileBuffer
.append("EFIAPI\r\n");
1080 fileBuffer
.append("ProcessModuleEntryPointList (\r\n");
1081 fileBuffer
.append(" IN EFI_HANDLE ImageHandle,\r\n");
1082 fileBuffer
.append(" IN EFI_SYSTEM_TABLE *SystemTable\r\n");
1083 fileBuffer
.append(" )\r\n\r\n");
1084 fileBuffer
.append("{\r\n");
1086 if (entryPointCount
== 1) {
1087 //fileBuffer.append(" DEBUG ((EFI_D_INFO, \"Module Entry Point 0x%08x\\n\", (UINTN)" + entryPointList[0] + "));\n");
1088 fileBuffer
.append(String
.format(" " + debugStr
, entryPointList
[0], entryPointList
[0]));
1089 fileBuffer
.append(" return ");
1090 fileBuffer
.append(entryPointList
[0]);
1091 fileBuffer
.append(" (ImageHandle, SystemTable);\r\n");
1093 for (int i
= 0; i
< entryPointList
.length
; i
++) {
1094 if (!entryPointList
[i
].equals("")) {
1095 fileBuffer
.append(" if (SetJump (&mJumpContext) == 0) {\r\n");
1096 //fileBuffer.append(" DEBUG ((EFI_D_INFO, \"Module Entry Point 0x%08x\\n\", (UINTN)" + entryPointList[i] + "));\n");
1097 fileBuffer
.append(String
.format(" " + debugStr
, entryPointList
[i
], entryPointList
[i
]));
1098 fileBuffer
.append(" ExitDriver (");
1099 fileBuffer
.append(entryPointList
[i
]);
1100 fileBuffer
.append(" (ImageHandle, SystemTable));\r\n");
1101 fileBuffer
.append(" ASSERT (FALSE);\r\n");
1102 fileBuffer
.append(" }\r\n");
1107 fileBuffer
.append(" return mDriverEntryPointStatus;\r\n");
1109 fileBuffer
.append("}\r\n\r\n");
1111 fileBuffer
.append("VOID\r\n");
1112 fileBuffer
.append("EFIAPI\r\n");
1113 fileBuffer
.append("ExitDriver (\r\n");
1114 fileBuffer
.append(" IN EFI_STATUS Status\r\n");
1115 fileBuffer
.append(" )\r\n\r\n");
1116 fileBuffer
.append("{\r\n");
1117 if (entryPointCount
<= 1) {
1118 fileBuffer
.append(" if (EFI_ERROR (Status)) {\r\n");
1119 fileBuffer
.append(" ProcessLibraryDestructorList (gImageHandle, gST);\r\n");
1120 fileBuffer
.append(" }\r\n");
1122 .append(" gBS->Exit (gImageHandle, Status, 0, NULL);\r\n");
1124 fileBuffer
.append(" if (!EFI_ERROR (Status) || EFI_ERROR (mDriverEntryPointStatus)) {\r\n");
1125 fileBuffer
.append(" mDriverEntryPointStatus = Status;\r\n");
1126 fileBuffer
.append(" }\r\n");
1127 fileBuffer
.append(" LongJump (&mJumpContext, (UINTN)-1);\r\n");
1128 fileBuffer
.append(" ASSERT (FALSE);\r\n");
1130 fileBuffer
.append("}\r\n\r\n");
1134 // Add ModuleUnloadImage for DxeDriver and UefiDriver module type.
1136 //entryPointList = SurfaceAreaQuery.getModuleUnloadImageArray();
1138 // Remover duplicate unload entry point.
1140 //entryPointList = CommonDefinition.remDupString(entryPointList);
1141 //entryPointCount = 0;
1142 unloadImageCount
= 0;
1143 if (unloadImageList
!= null) {
1144 for (int i
= 0; i
< unloadImageList
.length
; i
++) {
1145 fileBuffer
.append("EFI_STATUS\r\n");
1146 fileBuffer
.append("EFIAPI\r\n");
1147 fileBuffer
.append(unloadImageList
[i
]);
1148 fileBuffer
.append(" (\r\n");
1149 fileBuffer
.append(" IN EFI_HANDLE ImageHandle\r\n");
1150 fileBuffer
.append(" );\r\n");
1155 fileBuffer
.append("GLOBAL_REMOVE_IF_UNREFERENCED const UINT8 _gDriverUnloadImageCount = ");
1156 fileBuffer
.append(Integer
.toString(unloadImageCount
));
1157 fileBuffer
.append(";\r\n\r\n");
1159 fileBuffer
.append("EFI_STATUS\n");
1160 fileBuffer
.append("EFIAPI\r\n");
1161 fileBuffer
.append("ProcessModuleUnloadList (\r\n");
1162 fileBuffer
.append(" IN EFI_HANDLE ImageHandle\r\n");
1163 fileBuffer
.append(" )\r\n");
1164 fileBuffer
.append("{\r\n");
1166 if (unloadImageCount
== 0) {
1167 fileBuffer
.append(" return EFI_SUCCESS;\r\n");
1168 } else if (unloadImageCount
== 1) {
1169 fileBuffer
.append(" return ");
1170 fileBuffer
.append(unloadImageList
[0]);
1171 fileBuffer
.append("(ImageHandle);\r\n");
1173 fileBuffer
.append(" EFI_STATUS Status;\r\n\r\n");
1174 fileBuffer
.append(" Status = EFI_SUCCESS;\r\n\r\n");
1175 for (int i
= 0; i
< unloadImageList
.length
; i
++) {
1177 fileBuffer
.append(" Status = ");
1178 fileBuffer
.append(unloadImageList
[i
]);
1179 fileBuffer
.append("(ImageHandle);\r\n");
1181 fileBuffer
.append(" if (EFI_ERROR (Status)) {\r\n");
1182 fileBuffer
.append(" ");
1183 fileBuffer
.append(unloadImageList
[i
]);
1184 fileBuffer
.append("(ImageHandle);\r\n");
1185 fileBuffer
.append(" } else {\r\n");
1186 fileBuffer
.append(" Status = ");
1187 fileBuffer
.append(unloadImageList
[i
]);
1188 fileBuffer
.append("(ImageHandle);\r\n");
1189 fileBuffer
.append(" }\r\n");
1192 fileBuffer
.append(" return Status;\r\n");
1194 fileBuffer
.append("}\r\n\r\n");
1202 This function gets GUIDs from SPD file accrodeing to <PPIs> information
1203 and write those GUIDs to AutoGen.c.
1206 String Buffer for Autogen.c file.
1207 @throws BuildException
1208 Guid must set value!
1210 void PpiGuidToAutogenC(StringBuffer fileBuffer
) throws AutoGenException
{
1211 String
[] cNameGuid
= null;
1214 // Get the all PPI adn PPI Notify from MSA file,
1215 // then add those PPI ,and PPI Notify name to list.
1218 String
[] ppiList
= saq
.getPpiArray(this.arch
);
1219 for (int i
= 0; i
< ppiList
.length
; i
++) {
1220 this.mPpiList
.add(ppiList
[i
]);
1223 String
[] ppiNotifyList
= saq
.getPpiNotifyArray(this.arch
);
1224 for (int i
= 0; i
< ppiNotifyList
.length
; i
++) {
1225 this.mPpiList
.add(ppiNotifyList
[i
]);
1229 // Find CNAME and GUID from dependence SPD file and write to Autogen.c
1231 Iterator ppiIterator
= this.mPpiList
.iterator();
1232 String ppiKeyWord
= null;
1233 while (ppiIterator
.hasNext()) {
1234 ppiKeyWord
= ppiIterator
.next().toString();
1235 cNameGuid
= GlobalData
.getPpiGuid(this.mDepPkgList
, ppiKeyWord
);
1236 if (cNameGuid
!= null) {
1237 fileBuffer
.append("\r\nGLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID ");
1238 fileBuffer
.append(cNameGuid
[0]);
1239 fileBuffer
.append(" = { ");
1240 fileBuffer
.append(CommonDefinition
.formatGuidName(cNameGuid
[1]));
1241 fileBuffer
.append(" } ;");
1244 // If can't find Ppi GUID declaration in every package
1246 throw new AutoGenException("Can not find Ppi GUID ["
1247 + ppiKeyWord
+ "] declaration in any SPD package!");
1253 ProtocolGuidToAutogenc
1255 This function gets GUIDs from SPD file accrodeing to <Protocol>
1256 information and write those GUIDs to AutoGen.c.
1259 String Buffer for Autogen.c file.
1260 @throws BuildException
1261 Protocol name must set.
1263 void ProtocolGuidToAutogenC(StringBuffer fileBuffer
) throws EdkException
{
1264 String
[] cNameGuid
= null;
1266 String
[] protocolList
= saq
.getProtocolArray(this.arch
);
1269 // Add result to Autogen global list.
1271 for (int i
= 0; i
< protocolList
.length
; i
++) {
1272 this.mProtocolList
.add(protocolList
[i
]);
1275 String
[] protocolNotifyList
= saq
.getProtocolNotifyArray(this.arch
);
1277 for (int i
= 0; i
< protocolNotifyList
.length
; i
++) {
1278 this.mProtocolList
.add(protocolNotifyList
[i
]);
1282 // Get the NAME and GUID from dependence SPD and write to Autogen.c
1284 Iterator protocolIterator
= this.mProtocolList
.iterator();
1285 String protocolKeyWord
= null;
1288 while (protocolIterator
.hasNext()) {
1289 protocolKeyWord
= protocolIterator
.next().toString();
1290 cNameGuid
= GlobalData
.getProtocolGuid(this.mDepPkgList
, protocolKeyWord
);
1291 if (cNameGuid
!= null) {
1292 fileBuffer
.append("\r\nGLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID ");
1293 fileBuffer
.append(cNameGuid
[0]);
1294 fileBuffer
.append(" = { ");
1295 fileBuffer
.append(CommonDefinition
.formatGuidName(cNameGuid
[1]));
1296 fileBuffer
.append(" } ;");
1299 // If can't find protocol GUID declaration in every package
1301 throw new AutoGenException("Can not find protocol Guid ["
1302 + protocolKeyWord
+ "] declaration in any SPD package!");
1310 This function gets GUIDs from SPD file accrodeing to <Guids> information
1311 and write those GUIDs to AutoGen.c.
1314 String Buffer for Autogen.c file.
1317 void GuidGuidToAutogenC(StringBuffer fileBuffer
) throws AutoGenException
{
1318 String
[] cNameGuid
= null;
1319 String guidKeyWord
= null;
1321 String
[] guidList
= saq
.getGuidEntryArray(this.arch
);
1323 for (int i
= 0; i
< guidList
.length
; i
++) {
1324 this.mGuidList
.add(guidList
[i
]);
1328 Iterator guidIterator
= this.mGuidList
.iterator();
1329 while (guidIterator
.hasNext()) {
1330 guidKeyWord
= guidIterator
.next().toString();
1331 cNameGuid
= GlobalData
.getGuid(this.mDepPkgList
, guidKeyWord
);
1333 if (cNameGuid
!= null) {
1334 fileBuffer
.append("\r\nGLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID ");
1335 fileBuffer
.append(cNameGuid
[0]);
1336 fileBuffer
.append(" = { ");
1337 fileBuffer
.append(CommonDefinition
.formatGuidName(cNameGuid
[1]));
1338 fileBuffer
.append("} ;");
1341 // If can't find GUID declaration in every package
1343 throw new AutoGenException("Can not find Guid [" + guidKeyWord
1344 + "] declaration in any SPD package. ");
1351 LibInstanceToAutogenC
1353 This function adds dependent library instance to autogen.c,which
1354 includeing library's constructor, destructor, and library dependent ppi,
1355 protocol, guid, pcd information.
1358 String buffer for AutoGen.c
1359 @throws BuildException
1361 void LibInstanceToAutogenC(StringBuffer fileBuffer
) throws EdkException
{
1362 String moduleType
= this.moduleId
.getModuleType();
1364 // Add library constructor to AutoGen.c
1366 LibConstructorToAutogenC(libConstructList
, moduleType
,
1367 fileBuffer
/* autogenC */);
1369 // Add library destructor to AutoGen.c
1371 LibDestructorToAutogenC(libDestructList
, moduleType
, fileBuffer
/* autogenC */);
1375 LibConstructorToAutogenc
1377 This function writes library constructor list to AutoGen.c. The library
1378 constructor's parameter and return value depend on module type.
1380 @param libInstanceList
1381 List of library construct name.
1385 String buffer for AutoGen.c
1388 void LibConstructorToAutogenC(List
<String
[]> libInstanceList
,
1389 String moduleType
, StringBuffer fileBuffer
) throws EdkException
{
1390 boolean isFirst
= true;
1393 // The library constructor's parameter and return value depend on
1396 for (int i
= 0; i
< libInstanceList
.size(); i
++) {
1397 if (libInstanceList
.get(i
)[1].equalsIgnoreCase(EdkDefinitions
.MODULE_TYPE_BASE
)) {
1398 fileBuffer
.append("RETURN_STATUS\r\n");
1399 fileBuffer
.append("EFIAPI\r\n");
1400 fileBuffer
.append(libInstanceList
.get(i
)[0]);
1401 fileBuffer
.append(" (\r\n");
1402 fileBuffer
.append(" VOID\r\n");
1403 fileBuffer
.append(" );\r\n");
1405 switch (CommonDefinition
.getModuleType(moduleType
)) {
1406 case CommonDefinition
.ModuleTypeBase
:
1407 fileBuffer
.append("RETURN_STATUS\r\n");
1408 fileBuffer
.append("EFIAPI\r\n");
1409 fileBuffer
.append(libInstanceList
.get(i
)[0]);
1410 fileBuffer
.append(" (\r\n");
1411 fileBuffer
.append(" VOID\r\n");
1412 fileBuffer
.append(" );\r\n");
1415 case CommonDefinition
.ModuleTypePeiCore
:
1416 case CommonDefinition
.ModuleTypePeim
:
1417 fileBuffer
.append("EFI_STATUS\r\n");
1418 fileBuffer
.append("EFIAPI\r\n");
1419 fileBuffer
.append(libInstanceList
.get(i
)[0]);
1420 fileBuffer
.append(" (\r\n");
1421 fileBuffer
.append(" IN EFI_FFS_FILE_HEADER *FfsHeader,\r\n");
1422 fileBuffer
.append(" IN EFI_PEI_SERVICES **PeiServices\r\n");
1423 fileBuffer
.append(" );\r\n");
1426 case CommonDefinition
.ModuleTypeDxeCore
:
1427 case CommonDefinition
.ModuleTypeDxeDriver
:
1428 case CommonDefinition
.ModuleTypeDxeRuntimeDriver
:
1429 case CommonDefinition
.ModuleTypeDxeSmmDriver
:
1430 case CommonDefinition
.ModuleTypeDxeSalDriver
:
1431 case CommonDefinition
.ModuleTypeUefiDriver
:
1432 case CommonDefinition
.ModuleTypeUefiApplication
:
1433 fileBuffer
.append("EFI_STATUS\r\n");
1434 fileBuffer
.append("EFIAPI\r\n");
1435 fileBuffer
.append(libInstanceList
.get(i
)[0]);
1436 fileBuffer
.append(" (\r\n");
1437 fileBuffer
.append(" IN EFI_HANDLE ImageHandle,\r\n");
1438 fileBuffer
.append(" IN EFI_SYSTEM_TABLE *SystemTable\r\n");
1439 fileBuffer
.append(" );\r\n");
1447 // Add ProcessLibraryConstructorList in AutoGen.c
1449 fileBuffer
.append("VOID\r\n");
1450 fileBuffer
.append("EFIAPI\r\n");
1451 fileBuffer
.append("ProcessLibraryConstructorList (\r\n");
1452 switch (CommonDefinition
.getModuleType(moduleType
)) {
1453 case CommonDefinition
.ModuleTypeBase
:
1454 fileBuffer
.append(" VOID\r\n");
1457 case CommonDefinition
.ModuleTypePeiCore
:
1458 case CommonDefinition
.ModuleTypePeim
:
1459 fileBuffer
.append(" IN EFI_FFS_FILE_HEADER *FfsHeader,\r\n");
1461 .append(" IN EFI_PEI_SERVICES **PeiServices\r\n");
1464 case CommonDefinition
.ModuleTypeDxeCore
:
1465 case CommonDefinition
.ModuleTypeDxeDriver
:
1466 case CommonDefinition
.ModuleTypeDxeRuntimeDriver
:
1467 case CommonDefinition
.ModuleTypeDxeSmmDriver
:
1468 case CommonDefinition
.ModuleTypeDxeSalDriver
:
1469 case CommonDefinition
.ModuleTypeUefiDriver
:
1470 case CommonDefinition
.ModuleTypeUefiApplication
:
1471 fileBuffer
.append(" IN EFI_HANDLE ImageHandle,\r\n");
1472 fileBuffer
.append(" IN EFI_SYSTEM_TABLE *SystemTable\r\n");
1476 fileBuffer
.append(" )\r\n");
1477 fileBuffer
.append("{\r\n");
1479 // If no constructor function, return EFI_SUCCESS.
1481 //if (libInstanceList.size() == 0){
1482 // fileBuffer.append(" return EFI_SUCCESS;\r\n");
1484 for (int i
= 0; i
< libInstanceList
.size(); i
++) {
1486 fileBuffer
.append(" EFI_STATUS Status;\r\n");
1487 fileBuffer
.append(" Status = EFI_SUCCESS;\r\n");
1488 fileBuffer
.append("\r\n");
1491 if (libInstanceList
.get(i
)[1].equalsIgnoreCase(EdkDefinitions
.MODULE_TYPE_BASE
)) {
1492 fileBuffer
.append(" Status = ");
1493 fileBuffer
.append(libInstanceList
.get(i
)[0]);
1494 fileBuffer
.append("();\r\n");
1496 switch (CommonDefinition
.getModuleType(moduleType
)) {
1497 case CommonDefinition
.ModuleTypeBase
:
1498 fileBuffer
.append(" Status = ");
1499 fileBuffer
.append(libInstanceList
.get(i
)[0]);
1500 fileBuffer
.append("();\r\n");
1502 case CommonDefinition
.ModuleTypePeiCore
:
1503 case CommonDefinition
.ModuleTypePeim
:
1504 fileBuffer
.append(" Status = ");
1505 fileBuffer
.append(libInstanceList
.get(i
)[0]);
1506 fileBuffer
.append(" (FfsHeader, PeiServices);\r\n");
1508 case CommonDefinition
.ModuleTypeDxeCore
:
1509 case CommonDefinition
.ModuleTypeDxeDriver
:
1510 case CommonDefinition
.ModuleTypeDxeRuntimeDriver
:
1511 case CommonDefinition
.ModuleTypeDxeSmmDriver
:
1512 case CommonDefinition
.ModuleTypeDxeSalDriver
:
1513 case CommonDefinition
.ModuleTypeUefiDriver
:
1514 case CommonDefinition
.ModuleTypeUefiApplication
:
1515 fileBuffer
.append(" Status = ");
1516 fileBuffer
.append(libInstanceList
.get(i
)[0]);
1517 fileBuffer
.append(" (ImageHandle, SystemTable);\r\n");
1520 EdkLog
.log(EdkLog
.EDK_INFO
,"Autogen doesn't know how to deal with module type - " + moduleType
+ "!");
1524 fileBuffer
.append(" ASSERT_EFI_ERROR (Status);\r\n");
1526 fileBuffer
.append("}\r\n");
1530 LibDestructorToAutogenc
1532 This function writes library destructor list to AutoGen.c. The library
1533 destructor's parameter and return value depend on module type.
1535 @param libInstanceList
1536 List of library destructor name.
1540 String buffer for AutoGen.c
1543 void LibDestructorToAutogenC(List
<String
[]> libInstanceList
,
1544 String moduleType
, StringBuffer fileBuffer
) throws EdkException
{
1545 boolean isFirst
= true;
1546 for (int i
= 0; i
< libInstanceList
.size(); i
++) {
1547 if (libInstanceList
.get(i
)[1].equalsIgnoreCase(EdkDefinitions
.MODULE_TYPE_BASE
)) {
1548 fileBuffer
.append("RETURN_STATUS\r\n");
1549 fileBuffer
.append("EFIAPI\r\n");
1550 fileBuffer
.append(libInstanceList
.get(i
)[0]);
1551 fileBuffer
.append(" (\r\n");
1552 fileBuffer
.append(" VOID\r\n");
1553 fileBuffer
.append(" );\r\n");
1555 switch (CommonDefinition
.getModuleType(moduleType
)) {
1556 case CommonDefinition
.ModuleTypeBase
:
1557 fileBuffer
.append("RETURN_STATUS\r\n");
1558 fileBuffer
.append("EFIAPI\r\n");
1559 fileBuffer
.append(libInstanceList
.get(i
)[0]);
1560 fileBuffer
.append(" (\r\n");
1561 fileBuffer
.append(" VOID\r\n");
1562 fileBuffer
.append(" );\r\n");
1564 case CommonDefinition
.ModuleTypePeiCore
:
1565 case CommonDefinition
.ModuleTypePeim
:
1566 fileBuffer
.append("EFI_STATUS\r\n");
1567 fileBuffer
.append("EFIAPI\r\n");
1568 fileBuffer
.append(libInstanceList
.get(i
)[0]);
1569 fileBuffer
.append(" (\r\n");
1570 fileBuffer
.append(" IN EFI_FFS_FILE_HEADER *FfsHeader,\r\n");
1571 fileBuffer
.append(" IN EFI_PEI_SERVICES **PeiServices\r\n");
1572 fileBuffer
.append(" );\r\n");
1574 case CommonDefinition
.ModuleTypeDxeCore
:
1575 case CommonDefinition
.ModuleTypeDxeDriver
:
1576 case CommonDefinition
.ModuleTypeDxeRuntimeDriver
:
1577 case CommonDefinition
.ModuleTypeDxeSmmDriver
:
1578 case CommonDefinition
.ModuleTypeDxeSalDriver
:
1579 case CommonDefinition
.ModuleTypeUefiDriver
:
1580 case CommonDefinition
.ModuleTypeUefiApplication
:
1581 fileBuffer
.append("EFI_STATUS\r\n");
1582 fileBuffer
.append("EFIAPI\r\n");
1583 fileBuffer
.append(libInstanceList
.get(i
)[0]);
1584 fileBuffer
.append(" (\r\n");
1585 fileBuffer
.append(" IN EFI_HANDLE ImageHandle,\r\n");
1586 fileBuffer
.append(" IN EFI_SYSTEM_TABLE *SystemTable\r\n");
1587 fileBuffer
.append(" );\r\n");
1594 // Write ProcessLibraryDestructor list to autogen.c
1596 switch (CommonDefinition
.getModuleType(moduleType
)) {
1597 case CommonDefinition
.ModuleTypeBase
:
1598 case CommonDefinition
.ModuleTypePeiCore
:
1599 case CommonDefinition
.ModuleTypePeim
:
1601 case CommonDefinition
.ModuleTypeDxeCore
:
1602 case CommonDefinition
.ModuleTypeDxeDriver
:
1603 case CommonDefinition
.ModuleTypeDxeRuntimeDriver
:
1604 case CommonDefinition
.ModuleTypeDxeSmmDriver
:
1605 case CommonDefinition
.ModuleTypeDxeSalDriver
:
1606 case CommonDefinition
.ModuleTypeUefiDriver
:
1607 case CommonDefinition
.ModuleTypeUefiApplication
:
1608 fileBuffer
.append("VOID\r\n");
1609 fileBuffer
.append("EFIAPI\r\n");
1610 fileBuffer
.append("ProcessLibraryDestructorList (\r\n");
1611 fileBuffer
.append(" IN EFI_HANDLE ImageHandle,\r\n");
1612 fileBuffer
.append(" IN EFI_SYSTEM_TABLE *SystemTable\r\n");
1613 fileBuffer
.append(" )\r\n");
1614 fileBuffer
.append("{\r\n");
1616 // If no library destructor function, return EFI_SUCCESS.
1619 for (int i
= 0; i
< libInstanceList
.size(); i
++) {
1621 fileBuffer
.append(" EFI_STATUS Status;\r\n");
1622 fileBuffer
.append(" Status = EFI_SUCCESS;\r\n");
1623 fileBuffer
.append("\r\n");
1626 if (libInstanceList
.get(i
)[1].equalsIgnoreCase(EdkDefinitions
.MODULE_TYPE_BASE
)) {
1627 fileBuffer
.append(" Status = ");
1628 fileBuffer
.append(libInstanceList
.get(i
)[0]);
1629 fileBuffer
.append("();\r\n");
1630 fileBuffer
.append(" VOID\r\n");
1632 fileBuffer
.append(" Status = ");
1633 fileBuffer
.append(libInstanceList
.get(i
)[0]);
1634 fileBuffer
.append("(ImageHandle, SystemTable);\r\n");
1635 fileBuffer
.append(" ASSERT_EFI_ERROR (Status);\r\n");
1638 fileBuffer
.append("}\r\n");
1644 ExternsDriverBindingToAutoGenC
1646 This function is to write DRIVER_BINDING, COMPONENT_NAME,
1647 DRIVER_CONFIGURATION, DRIVER_DIAGNOSTIC in AutoGen.c.
1650 String buffer for AutoGen.c
1652 void ExternsDriverBindingToAutoGenC(StringBuffer fileBuffer
)
1653 throws EdkException
{
1655 // Get the arry of extern. The driverBindingGroup is a 2 dimension array.
1656 // The second dimension is include following element: DriverBinding,
1657 // ComponentName, DriverConfiguration, DriverDiag;
1659 String
[][] driverBindingGroup
= this.saq
.getExternProtocolGroup();
1668 // Write driver binding protocol extern to autogen.c
1670 for (int i
= 0; i
< driverBindingGroup
.length
; i
++) {
1671 if (driverBindingGroup
[i
][0] != null) {
1672 fileBuffer
.append("extern EFI_DRIVER_BINDING_PROTOCOL ");
1673 fileBuffer
.append(driverBindingGroup
[i
][0]);
1674 fileBuffer
.append(";\r\n");
1679 // Write component name protocol extern to autogen.c
1681 if (!componentNamePcd
) {
1682 for (int i
= 0; i
< driverBindingGroup
.length
; i
++) {
1683 if (driverBindingGroup
[i
][1]!= null) {
1684 if (driverBindingGroup
[i
][0] != null) {
1686 fileBuffer
.append("extern EFI_COMPONENT_NAME_PROTOCOL ");
1687 fileBuffer
.append(driverBindingGroup
[i
][1]);
1688 fileBuffer
.append(";\r\n");
1690 throw new AutoGenException("DriverBinding can't be empty!!");
1697 // Write driver configration protocol extern to autogen.c
1699 for (int i
= 0; i
< driverBindingGroup
.length
; i
++) {
1700 if (driverBindingGroup
[i
][2] != null) {
1701 if (driverBindingGroup
[i
][0] != null) {
1703 fileBuffer
.append("extern EFI_DRIVER_CONFIGURATION_PROTOCOL ");
1704 fileBuffer
.append(driverBindingGroup
[i
][2]);
1705 fileBuffer
.append(";\r\n");
1707 throw new AutoGenException("DriverBinding can't be empty!!");
1713 // Write driver dignastic protocol extern to autogen.c
1715 if (!driverDiagnostPcd
) {
1716 for (int i
= 0; i
< driverBindingGroup
.length
; i
++) {
1717 if (driverBindingGroup
[i
][3] != null) {
1718 if (driverBindingGroup
[i
][0] != null) {
1720 fileBuffer
.append("extern EFI_DRIVER_DIAGNOSTICS_PROTOCOL ");
1721 fileBuffer
.append(driverBindingGroup
[i
][3]);
1722 fileBuffer
.append(";\r\n");
1724 throw new AutoGenException("DriverBinding can't be empty!!");
1732 // Write driver module protocol bitmask.
1734 fileBuffer
.append("GLOBAL_REMOVE_IF_UNREFERENCED const UINT8 _gDriverModelProtocolBitmask = ");
1735 fileBuffer
.append(Integer
.toString(BitMask
));
1736 fileBuffer
.append(";\r\n");
1739 // Write driver module protocol list entry
1741 fileBuffer
.append("GLOBAL_REMOVE_IF_UNREFERENCED const UINTN _gDriverModelProtocolListEntries = ");
1743 fileBuffer
.append(Integer
.toString(driverBindingGroup
.length
));
1744 fileBuffer
.append(";\r\n");
1747 // Write drive module protocol list to autogen.c
1749 if (driverBindingGroup
.length
> 0) {
1750 fileBuffer
.append("GLOBAL_REMOVE_IF_UNREFERENCED const EFI_DRIVER_MODEL_PROTOCOL_LIST _gDriverModelProtocolList[] = {");
1754 for (int i
= 0; i
< driverBindingGroup
.length
; i
++) {
1756 fileBuffer
.append(",");
1761 fileBuffer
.append("\r\n {\r\n");
1762 fileBuffer
.append(" &");
1763 fileBuffer
.append(driverBindingGroup
[i
][0]);
1764 fileBuffer
.append(", \r\n");
1769 if (driverBindingGroup
[i
][1] != null && componentNamePcd
!= true) {
1770 fileBuffer
.append(" &");
1771 fileBuffer
.append(driverBindingGroup
[i
][1]);
1772 fileBuffer
.append(", \r\n");
1774 fileBuffer
.append(" NULL, \r\n");
1778 // DriverConfiguration
1780 if (driverBindingGroup
[i
][2] != null) {
1781 fileBuffer
.append(" &");
1782 fileBuffer
.append(driverBindingGroup
[i
][2]);
1783 fileBuffer
.append(", \r\n");
1785 fileBuffer
.append(" NULL, \r\n");
1791 if (driverBindingGroup
[i
][3] != null && driverDiagnostPcd
!= true) {
1792 fileBuffer
.append(" &");
1793 fileBuffer
.append(driverBindingGroup
[i
][3]);
1794 fileBuffer
.append(", \r\n");
1796 fileBuffer
.append(" NULL, \r\n");
1798 fileBuffer
.append(" }");
1801 if (driverBindingGroup
.length
> 0) {
1802 fileBuffer
.append("\r\n};\r\n");
1807 ExternCallBackToAutoGenC
1809 This function adds <SetVirtualAddressMapCallBack> and
1810 <ExitBootServicesCallBack> infomation to AutoGen.c
1813 String buffer for AutoGen.c
1814 @throws BuildException
1816 void ExternCallBackToAutoGenC(StringBuffer fileBuffer
)
1817 throws EdkException
{
1819 // Collect module's <SetVirtualAddressMapCallBack> and
1820 // <ExitBootServiceCallBack> and add to setVirtualAddList
1821 // exitBootServiceList.
1823 String
[] setVirtuals
= saq
.getSetVirtualAddressMapCallBackArray();
1824 String
[] exitBoots
= saq
.getExitBootServicesCallBackArray();
1825 if (setVirtuals
!= null) {
1826 for (int j
= 0; j
< setVirtuals
.length
; j
++) {
1827 this.setVirtalAddList
.add(setVirtuals
[j
]);
1830 if (exitBoots
!= null) {
1831 for (int k
= 0; k
< exitBoots
.length
; k
++) {
1832 this.exitBootServiceList
.add(exitBoots
[k
]);
1836 // Add c code in autogen.c which relate to <SetVirtualAddressMapCallBack>
1837 // and <ExitBootServicesCallBack>
1839 String moduleType
= this.moduleId
.getModuleType();
1840 switch (CommonDefinition
.getModuleType(moduleType
)) {
1841 case CommonDefinition
.ModuleTypeDxeDriver
:
1842 case CommonDefinition
.ModuleTypeDxeRuntimeDriver
:
1843 case CommonDefinition
.ModuleTypeDxeSalDriver
:
1844 case CommonDefinition
.ModuleTypeUefiDriver
:
1845 case CommonDefinition
.ModuleTypeUefiApplication
:
1847 // If moduleType is one of above, call setVirtualAddressToAutogenC,
1848 // and setExitBootServiceToAutogenC.
1850 setVirtualAddressToAutogenC(fileBuffer
);
1851 setExitBootServiceToAutogenC(fileBuffer
);
1859 copyFlashMapHToDebugDir
1861 This function is to copy the falshmap.h to debug directory and change
1862 its name to TianoR8FlashMap.h
1867 private void copyFlashMapHToDebugDir() throws AutoGenException
{
1869 File inFile
= new File(fvDir
+ File
.separatorChar
+ CommonDefinition
.FLASHMAPH
);
1870 int size
= (int)inFile
.length();
1871 byte[] buffer
= new byte[size
];
1872 File outFile
= new File (this.outputPath
+ File
.separatorChar
+ CommonDefinition
.TIANOR8PLASHMAPH
);
1874 // If TianoR8FlashMap.h existed and the flashMap.h don't change,
1877 if ((!outFile
.exists()) ||(inFile
.lastModified() - outFile
.lastModified()) >= 0) {
1878 if (inFile
.exists()) {
1880 FileInputStream fis
= new FileInputStream (inFile
);
1882 FileOutputStream fos
= new FileOutputStream(outFile
);
1886 } catch (IOException e
) {
1887 throw new AutoGenException("The file, flashMap.h can't be open!");
1891 throw new AutoGenException("The file, flashMap.h doesn't exist!");
1897 This function first order the library instances, then collect
1898 library instance 's PPI, Protocol, GUID,
1899 SetVirtalAddressMapCallBack, ExitBootServiceCallBack, and
1900 Destructor, Constructor.
1905 private void collectLibInstanceInfo() throws EdkException
{
1908 String libConstructName
= null;
1909 String libDestructName
= null;
1910 String libModuleType
= null;
1911 String
[] setVirtuals
= null;
1912 String
[] exitBoots
= null;
1914 ModuleIdentification
[] libraryIdList
= saq
.getLibraryInstance(this.arch
);
1916 if (libraryIdList
!= null) {
1918 // Reorder library instance sequence.
1920 AutogenLibOrder libOrder
= new AutogenLibOrder(libraryIdList
,
1922 List
<ModuleIdentification
> orderList
= libOrder
1923 .orderLibInstance();
1925 if (orderList
!= null) {
1927 // Process library instance one by one.
1929 for (int i
= 0; i
< orderList
.size(); i
++) {
1931 // Get library instance basename.
1933 ModuleIdentification libInstanceId
= orderList
.get(i
);
1939 Map
<String
, XmlObject
> libDoc
= GlobalData
.getDoc(libInstanceId
, this.arch
);
1942 // Get <PPis>, <Protocols>, <Guids> list of this library
1945 String
[] ppiList
= saq
.getPpiArray(this.arch
);
1946 String
[] ppiNotifyList
= saq
.getPpiNotifyArray(this.arch
);
1947 String
[] protocolList
= saq
.getProtocolArray(this.arch
);
1948 String
[] protocolNotifyList
= saq
.getProtocolNotifyArray(this.arch
);
1949 String
[] guidList
= saq
.getGuidEntryArray(this.arch
);
1950 PackageIdentification
[] pkgList
= saq
.getDependencePkg(this.arch
);
1953 // Add those ppi, protocol, guid in global ppi,
1957 for (index
= 0; index
< ppiList
.length
; index
++) {
1958 this.mPpiList
.add(ppiList
[index
]);
1961 for (index
= 0; index
< ppiNotifyList
.length
; index
++) {
1962 this.mPpiList
.add(ppiNotifyList
[index
]);
1965 for (index
= 0; index
< protocolList
.length
; index
++) {
1966 this.mProtocolList
.add(protocolList
[index
]);
1969 for (index
= 0; index
< protocolNotifyList
.length
; index
++) {
1970 this.mProtocolList
.add(protocolNotifyList
[index
]);
1973 for (index
= 0; index
< guidList
.length
; index
++) {
1974 this.mGuidList
.add(guidList
[index
]);
1976 for (index
= 0; index
< pkgList
.length
; index
++) {
1977 if (!this.mDepPkgList
.contains(pkgList
[index
])) {
1978 this.mDepPkgList
.add(pkgList
[index
]);
1983 // If not yet parse this library instance's constructor
1984 // element,parse it.
1986 libConstructName
= saq
.getLibConstructorName();
1987 libDestructName
= saq
.getLibDestructorName();
1988 libModuleType
= saq
.getModuleType();
1991 // Collect SetVirtualAddressMapCallBack and
1992 // ExitBootServiceCallBack.
1994 setVirtuals
= saq
.getSetVirtualAddressMapCallBackArray();
1995 exitBoots
= saq
.getExitBootServicesCallBackArray();
1996 if (setVirtuals
!= null) {
1997 for (int j
= 0; j
< setVirtuals
.length
; j
++) {
1998 this.setVirtalAddList
.add(setVirtuals
[j
]);
2001 if (exitBoots
!= null) {
2002 for (int k
= 0; k
< exitBoots
.length
; k
++) {
2003 this.exitBootServiceList
.add(exitBoots
[k
]);
2008 // Add dependent library instance constructor function.
2010 if (libConstructName
!= null) {
2011 this.libConstructList
.add(new String
[] {libConstructName
, libModuleType
});
2014 // Add dependent library instance destructor fuction.
2016 if (libDestructName
!= null) {
2017 this.libDestructList
.add(new String
[] {libDestructName
, libModuleType
});
2023 private void setVirtualAddressToAutogenC(StringBuffer fileBuffer
){
2025 // Entry point lib for these module types needs to know the count
2028 fileBuffer
.append("\r\nGLOBAL_REMOVE_IF_UNREFERENCED const UINTN _gDriverSetVirtualAddressMapEventCount = ");
2031 // If the list is not valid or has no entries set count to zero else
2032 // set count to the number of valid entries
2036 if (this.setVirtalAddList
!= null) {
2037 for (i
= 0; i
< this.setVirtalAddList
.size(); i
++) {
2038 if (this.setVirtalAddList
.get(i
).equalsIgnoreCase("")) {
2045 fileBuffer
.append(Integer
.toString(Count
));
2046 fileBuffer
.append(";\r\n\r\n");
2047 if (this.setVirtalAddList
== null || this.setVirtalAddList
.size() == 0) {
2049 // No data so make a NULL list
2051 fileBuffer
.append("\r\nGLOBAL_REMOVE_IF_UNREFERENCED const EFI_EVENT_NOTIFY _gDriverSetVirtualAddressMapEvent[] = {\r\n");
2052 fileBuffer
.append(" NULL\r\n");
2053 fileBuffer
.append("};\r\n\r\n");
2056 // Write SetVirtualAddressMap function definition.
2058 for (i
= 0; i
< this.setVirtalAddList
.size(); i
++) {
2059 if (this.setVirtalAddList
.get(i
).equalsIgnoreCase("")) {
2062 fileBuffer
.append("VOID\r\n");
2063 fileBuffer
.append("EFIAPI\r\n");
2064 fileBuffer
.append(this.setVirtalAddList
.get(i
));
2065 fileBuffer
.append(" (\r\n");
2066 fileBuffer
.append(" IN EFI_EVENT Event,\r\n");
2067 fileBuffer
.append(" IN VOID *Context\r\n");
2068 fileBuffer
.append(" );\r\n\r\n");
2072 // Write SetVirtualAddressMap entry point array.
2074 fileBuffer
.append("\r\nGLOBAL_REMOVE_IF_UNREFERENCED const EFI_EVENT_NOTIFY _gDriverSetVirtualAddressMapEvent[] = {");
2075 for (i
= 0; i
< this.setVirtalAddList
.size(); i
++) {
2076 if (this.setVirtalAddList
.get(i
).equalsIgnoreCase("")) {
2081 fileBuffer
.append("\r\n ");
2083 fileBuffer
.append(",\r\n ");
2086 fileBuffer
.append(this.setVirtalAddList
.get(i
));
2089 // add the NULL at the end of _gDriverSetVirtualAddressMapEvent list.
2091 fileBuffer
.append(",\r\n NULL");
2092 fileBuffer
.append("\r\n};\r\n\r\n");
2097 private void setExitBootServiceToAutogenC(StringBuffer fileBuffer
){
2099 // Entry point lib for these module types needs to know the count.
2102 .append("\r\nGLOBAL_REMOVE_IF_UNREFERENCED const UINTN _gDriverExitBootServicesEventCount = ");
2105 // If the list is not valid or has no entries set count to zero else
2106 // set count to the number of valid entries.
2110 if (this.exitBootServiceList
!= null) {
2111 for (i
= 0; i
< this.exitBootServiceList
.size(); i
++) {
2112 if (this.exitBootServiceList
.get(i
).equalsIgnoreCase("")) {
2118 fileBuffer
.append(Integer
.toString(Count
));
2119 fileBuffer
.append(";\r\n\r\n");
2121 if (this.exitBootServiceList
== null || this.exitBootServiceList
.size() == 0) {
2123 // No data so make a NULL list.
2125 fileBuffer
.append("\r\nGLOBAL_REMOVE_IF_UNREFERENCED const EFI_EVENT_NOTIFY _gDriverExitBootServicesEvent[] = {\r\n");
2126 fileBuffer
.append(" NULL\r\n");
2127 fileBuffer
.append("};\r\n\r\n");
2130 // Write DriverExitBootServices function definition.
2132 for (i
= 0; i
< this.exitBootServiceList
.size(); i
++) {
2133 if (this.exitBootServiceList
.get(i
).equalsIgnoreCase("")) {
2137 fileBuffer
.append("VOID\r\n");
2138 fileBuffer
.append("EFIAPI\r\n");
2139 fileBuffer
.append(this.exitBootServiceList
.get(i
));
2140 fileBuffer
.append(" (\r\n");
2141 fileBuffer
.append(" IN EFI_EVENT Event,\r\n");
2142 fileBuffer
.append(" IN VOID *Context\r\n");
2143 fileBuffer
.append(" );\r\n\r\n");
2147 // Write DriverExitBootServices entry point array.
2149 fileBuffer
.append("\r\nGLOBAL_REMOVE_IF_UNREFERENCED const EFI_EVENT_NOTIFY _gDriverExitBootServicesEvent[] = {");
2150 for (i
= 0; i
< this.exitBootServiceList
.size(); i
++) {
2151 if (this.exitBootServiceList
.get(i
).equalsIgnoreCase("")) {
2156 fileBuffer
.append("\r\n ");
2158 fileBuffer
.append(",\r\n ");
2160 fileBuffer
.append(this.exitBootServiceList
.get(i
));
2163 fileBuffer
.append(",\r\n NULL");
2164 fileBuffer
.append("\r\n};\r\n\r\n");
2170 Get the Pcd Value of ComponentName to
2171 decide whether need to disable the componentName.
2174 public void setPcdComponentName (){
2175 String pcdValue
= null;
2176 pcdValue
= saq
.getPcdValueBycName("PcdComponentNameDisable");
2177 if (pcdValue
!= null && pcdValue
.equalsIgnoreCase("true")) {
2178 this.componentNamePcd
= true;
2183 setPcdDriverDiagnostic
2185 Get the Pcd Value of DriverDiagnostic to
2186 decide whether need to disable DriverDiagnostic.
2189 public void setPcdDriverDiagnostic (){
2190 String pcdValue
= null;
2191 pcdValue
= saq
.getPcdValueBycName("PcdDriverDiagnosticsDisable");
2192 if (pcdValue
!= null && pcdValue
.equalsIgnoreCase("true")) {
2193 this.driverDiagnostPcd
= true;