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
.exception
.EdkException
;
45 import org
.tianocore
.common
.logger
.EdkLog
;
48 This class is to generate Autogen.h and Autogen.c according to module surface
49 area or library surface area.
51 public class AutoGen
{
53 /// The output path of Autogen.h and Autogen.c
55 private String outputPath
;
58 /// The name of FV directory
63 /// The base name of module or library.
65 private ModuleIdentification moduleId
;
68 /// The build architecture
73 /// PcdAutogen instance which is used to manage how to generate the PCD
76 private PCDAutoGenAction myPcdAutogen
;
79 /// the one of type : NOT_PCD_DRIVER, PEI_PCD_DRIVER, DXE_PCD_DRIVER
81 private CommonDefinition
.PCD_DRIVER_TYPE pcdDriverType
;
84 /// The protocl list which records in module or library surface area and
85 /// it's dependence on library instance surface area.
87 private Set
<String
> mProtocolList
= new HashSet
<String
>();
90 /// The Ppi list which recorded in module or library surface area and its
91 /// dependency on library instance surface area.
93 private Set
<String
> mPpiList
= new HashSet
<String
>();
96 /// The Guid list which recoreded in module or library surface area and it's
97 /// dependence on library instance surface area.
99 private Set
<String
> mGuidList
= new HashSet
<String
>();
102 /// The dependence package list which recoreded in module or library surface
103 /// area and it's dependence on library instance surface area.
105 private List
<PackageIdentification
> mDepPkgList
= new LinkedList
<PackageIdentification
>();
108 /// For non library module, add its library instance's construct and destructor to
111 private List
<String
> libConstructList
= new ArrayList
<String
>();
112 private List
<String
> libDestructList
= new ArrayList
<String
>();
115 /// List to store SetVirtalAddressMapCallBack, ExitBootServiceCallBack
117 private List
<String
> setVirtalAddList
= new ArrayList
<String
>();
118 private List
<String
> exitBootServiceList
= new ArrayList
<String
>();
120 private SurfaceAreaQuery saq
= null;
122 private ModuleIdentification parentId
= null;
127 This function mainly initialize some member variable.
130 Absolute path of FV directory.
132 Output path of AutoGen file.
134 Module identification.
138 public AutoGen(String fvDir
, String outputPath
, ModuleIdentification moduleId
, String arch
, SurfaceAreaQuery saq
, ModuleIdentification parentId
) {
139 this.outputPath
= outputPath
;
140 this.moduleId
= moduleId
;
144 this.parentId
= parentId
;
150 This function save the content in stringBuffer to file.
155 The content of AutoGen file in buffer.
160 private boolean saveFile(String fileName
, StringBuffer fileBuffer
) {
162 File autoGenH
= new File(fileName
);
165 // if the file exists, compare their content
167 if (autoGenH
.exists()) {
168 char[] oldFileBuffer
= new char[(int) autoGenH
.length()];
170 FileReader fIn
= new FileReader(autoGenH
);
171 fIn
.read(oldFileBuffer
, 0, (int) autoGenH
.length());
173 } catch (IOException e
) {
174 EdkLog
.log(EdkLog
.EDK_INFO
, this.moduleId
.getName()
177 + " is exist, but can't be open!!");
182 // if we got the same file, don't re-generate it to prevent
183 // sources depending on it from re-building
185 if (fileBuffer
.toString().compareTo(new String(oldFileBuffer
)) == 0) {
191 FileWriter fOut
= new FileWriter(autoGenH
);
192 fOut
.write(fileBuffer
.toString());
195 } catch (IOException e
) {
196 EdkLog
.log(EdkLog
.EDK_INFO
, this.moduleId
.getName()
199 + " can't be create!!");
208 This function call libGenAutoGen or moduleGenAutogen function, which
209 dependence on generate library autogen or module autogen.
211 @throws BuildException
212 Failed to creat AutoGen.c & AutoGen.h.
214 public void genAutogen() throws EdkException
{
217 // If outputPath do not exist, create it.
219 File path
= new File(outputPath
);
221 } catch (Exception e
) {
222 throw new AutoGenException(
224 + outputPath
+ " directory");
228 // Check current is library or not, then call the corresponding
231 if (this.moduleId
.isLibrary()) {
239 moduleGenAutogen function
241 This function generates AutoGen.c & AutoGen.h for module.
243 @throws BuildException
244 Faile to create module AutoGen.c & AutoGen.h.
246 void moduleGenAutogen() throws EdkException
{
247 collectLibInstanceInfo();
253 libGenAutogen function
255 This function generates AutoGen.c & AutoGen.h for library.
257 @throws BuildException
258 Faile to create library AutoGen.c & AutoGen.h
260 void libGenAutogen() throws EdkException
{
268 This function generates AutoGen.h for module.
270 @throws BuildException
271 Failed to generate AutoGen.h.
273 void moduleGenAutogenH() throws EdkException
{
275 Set
<String
> libClassIncludeH
;
277 // List<String> headerFileList;
278 List
<String
> headerFileList
;
280 StringBuffer fileBuffer
= new StringBuffer(8192);
283 // Write Autogen.h header notation
285 fileBuffer
.append(CommonDefinition
.AUTOGENHNOTATION
);
288 // Add #ifndef ${BaseName}_AUTOGENH
289 // #def ${BseeName}_AUTOGENH
291 fileBuffer
.append(CommonDefinition
.IFNDEF
292 + CommonDefinition
.AUTOGENH
293 + this.moduleId
.getGuid().replaceAll("-", "_")
294 + ToolDefinitions
.LINE_SEPARATOR
);
295 fileBuffer
.append(CommonDefinition
.DEFINE
296 + CommonDefinition
.AUTOGENH
297 + this.moduleId
.getGuid().replaceAll("-", "_")
298 + ToolDefinitions
.LINE_SEPARATOR
299 + ToolDefinitions
.LINE_SEPARATOR
);
302 // Write the specification version and release version at the begine
303 // of autogen.h file.
304 // Note: the specification version and release version should
305 // be got from module surface area instead of hard code by it's
308 moduleType
= saq
.getModuleType();
311 // Add "extern int __make_me_compile_correctly;" at begin of
314 fileBuffer
.append(CommonDefinition
.AUTOGENHBEGIN
);
317 // Put EFI_SPECIFICATION_VERSION, and EDK_RELEASE_VERSION.
319 String
[] specList
= saq
.getExternSpecificaiton();
320 for (int i
= 0; i
< specList
.length
; i
++) {
321 fileBuffer
.append(CommonDefinition
.DEFINE
+ specList
[i
]
325 // Write consumed package's mdouleInfo related .h file to autogen.h
327 // PackageIdentification[] consumedPkgIdList = SurfaceAreaQuery
328 // .getDependencePkg(this.arch);
329 PackageIdentification
[] consumedPkgIdList
= saq
.getDependencePkg(this.arch
);
330 if (consumedPkgIdList
!= null) {
331 headerFileList
= depPkgToAutogenH(consumedPkgIdList
, moduleType
);
332 item
= headerFileList
.iterator();
333 while (item
.hasNext()) {
334 fileBuffer
.append(item
.next().toString());
339 // Write library class's related *.h file to autogen.h.
341 String
[] libClassList
= saq
.getLibraryClasses(CommonDefinition
.ALWAYSCONSUMED
,this.arch
);
342 if (libClassList
!= null) {
343 libClassIncludeH
= LibraryClassToAutogenH(libClassList
);
344 item
= libClassIncludeH
.iterator();
345 while (item
.hasNext()) {
346 fileBuffer
.append(item
.next().toString());
350 libClassList
= saq
.getLibraryClasses(CommonDefinition
.ALWAYSPRODUCED
, this.arch
);
351 if (libClassList
!= null) {
352 libClassIncludeH
= LibraryClassToAutogenH(libClassList
);
353 item
= libClassIncludeH
.iterator();
354 while (item
.hasNext()) {
355 fileBuffer
.append(item
.next().toString());
358 fileBuffer
.append("\r\n");
361 // If is TianoR8FlashMap, copy {Fv_DIR}/FlashMap.h to
362 // {DEST_DIR_DRBUG}/FlashMap.h
364 if (saq
.isHaveTianoR8FlashMap()) {
365 fileBuffer
.append(CommonDefinition
.INCLUDE
);
366 fileBuffer
.append(" <");
367 fileBuffer
.append(CommonDefinition
.TIANOR8PLASHMAPH
+ ">\r\n");
368 copyFlashMapHToDebugDir();
371 // Write PCD autogen information to AutoGen.h.
373 if (this.myPcdAutogen
!= null) {
374 fileBuffer
.append("\r\n");
375 fileBuffer
.append(this.myPcdAutogen
.getHAutoGenString());
379 // Append the #endif at AutoGen.h
381 fileBuffer
.append("#endif\r\n");
384 // Save string buffer content in AutoGen.h.
386 if (!saveFile(outputPath
+ File
.separatorChar
+ "AutoGen.h", fileBuffer
)) {
387 throw new AutoGenException("Failed to generate AutoGen.h !!!");
394 This function generates AutoGen.c for module.
396 @throws BuildException
397 Failed to generate AutoGen.c.
399 void moduleGenAutogenC() throws EdkException
{
401 StringBuffer fileBuffer
= new StringBuffer(8192);
403 // Write Autogen.c header notation
405 fileBuffer
.append(CommonDefinition
.AUTOGENCNOTATION
);
408 // Write #include <AutoGen.h> at beginning of AutoGen.c
410 fileBuffer
.append(CommonDefinition
.INCLUDEAUTOGENH
);
413 // Get the native MSA file infomation. Since before call autogen,
414 // the MSA native <Externs> information were overrided. So before
415 // process <Externs> it should be set the DOC as the Native MSA info.
417 Map
<String
, XmlObject
> doc
= GlobalData
.getNativeMsa(this.moduleId
);
421 // DriverBinding/ComponentName/DriverConfiguration/DriverDialog
425 ExternsDriverBindingToAutoGenC(fileBuffer
);
428 // Write DriverExitBootServicesEvent/DriverSetVirtualAddressMapEvent
431 ExternCallBackToAutoGenC(fileBuffer
);
434 // Write EntryPoint to autgoGen.c
436 String
[] entryPointList
= saq
.getModuleEntryPointArray();
437 String
[] unloadImageList
= saq
.getModuleUnloadImageArray();
438 EntryPointToAutoGen(CommonDefinition
.remDupString(entryPointList
),
439 CommonDefinition
.remDupString(unloadImageList
),
442 pcdDriverType
= saq
.getPcdDriverType();
445 // Restore the DOC which include the FPD module info.
450 // Write Guid to autogen.c
452 String guid
= CommonDefinition
.formatGuidName(saq
.getModuleGuid());
455 .append("GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID gEfiCallerIdGuid = {");
457 throw new AutoGenException("Guid value must set!\n");
461 // Formate Guid as ANSI c form.Example:
462 // {0xd2b2b828, 0x826, 0x48a7,{0xb3, 0xdf, 0x98, 0x3c, 0x0, 0x60, 0x24,
466 fileBuffer
.append(guid
);
467 fileBuffer
.append("};\r\n");
470 // Generate library instance consumed protocol, guid, ppi, pcd list.
471 // Save those to this.protocolList, this.ppiList, this.pcdList,
472 // this.guidList. Write Consumed library constructor and desconstuct to
475 LibInstanceToAutogenC(fileBuffer
);
478 // Get module dependent Package identification.
480 PackageIdentification
[] packages
= saq
.getDependencePkg(this.arch
);
481 for (int i
= 0; i
< packages
.length
; i
++) {
482 if (!this.mDepPkgList
.contains(packages
[i
])) {
483 this.mDepPkgList
.add(packages
[i
]);
489 // Write consumed ppi, guid, protocol to autogen.c
491 ProtocolGuidToAutogenC(fileBuffer
);
492 PpiGuidToAutogenC(fileBuffer
);
493 GuidGuidToAutogenC(fileBuffer
);
498 this.myPcdAutogen
= new PCDAutoGenAction(moduleId
,
505 this.myPcdAutogen
.execute();
506 if (this.myPcdAutogen
!= null) {
507 fileBuffer
.append("\r\n");
508 fileBuffer
.append(this.myPcdAutogen
.getCAutoGenString());
511 if (!saveFile(outputPath
+ File
.separatorChar
+ "AutoGen.c", fileBuffer
)) {
512 throw new AutoGenException("Failed to generate AutoGen.c !!!");
520 This function generates AutoGen.h for library.
522 @throws BuildException
523 Failed to generate AutoGen.c.
525 void libGenAutogenH() throws EdkException
{
527 Set
<String
> libClassIncludeH
;
529 List
<String
> headerFileList
;
531 StringBuffer fileBuffer
= new StringBuffer(10240);
534 // Write Autogen.h header notation
536 fileBuffer
.append(CommonDefinition
.AUTOGENHNOTATION
);
539 // Add #ifndef ${BaseName}_AUTOGENH
540 // #def ${BseeName}_AUTOGENH
542 fileBuffer
.append(CommonDefinition
.IFNDEF
543 + CommonDefinition
.AUTOGENH
544 + this.moduleId
.getGuid().replaceAll("-", "_")
545 + ToolDefinitions
.LINE_SEPARATOR
);
546 fileBuffer
.append(CommonDefinition
.DEFINE
547 + CommonDefinition
.AUTOGENH
548 + this.moduleId
.getGuid().replaceAll("-", "_")
549 + ToolDefinitions
.LINE_SEPARATOR
550 + ToolDefinitions
.LINE_SEPARATOR
);
553 // Write EFI_SPECIFICATION_VERSION and EDK_RELEASE_VERSION
554 // to autogen.h file.
555 // Note: the specification version and release version should
556 // be get from module surface area instead of hard code.
558 fileBuffer
.append(CommonDefinition
.AUTOGENHBEGIN
);
559 String
[] specList
= saq
.getExternSpecificaiton();
560 for (int i
= 0; i
< specList
.length
; i
++) {
561 fileBuffer
.append(CommonDefinition
.DEFINE
+ specList
[i
]
564 // fileBuffer.append(CommonDefinition.autoGenHLine1);
565 // fileBuffer.append(CommonDefinition.autoGenHLine2);
568 // Write consumed package's mdouleInfo related *.h file to autogen.h.
570 moduleType
= saq
.getModuleType();
571 PackageIdentification
[] cosumedPkglist
= saq
572 .getDependencePkg(this.arch
);
573 headerFileList
= depPkgToAutogenH(cosumedPkglist
, moduleType
);
574 item
= headerFileList
.iterator();
575 while (item
.hasNext()) {
576 fileBuffer
.append(item
.next().toString());
579 // Write library class's related *.h file to autogen.h
581 String
[] libClassList
= saq
582 .getLibraryClasses(CommonDefinition
.ALWAYSCONSUMED
, this.arch
);
583 if (libClassList
!= null) {
584 libClassIncludeH
= LibraryClassToAutogenH(libClassList
);
585 item
= libClassIncludeH
.iterator();
586 while (item
.hasNext()) {
587 fileBuffer
.append(item
.next().toString());
592 .getLibraryClasses(CommonDefinition
.ALWAYSPRODUCED
, this.arch
);
593 if (libClassList
!= null) {
594 libClassIncludeH
= LibraryClassToAutogenH(libClassList
);
595 item
= libClassIncludeH
.iterator();
596 while (item
.hasNext()) {
597 fileBuffer
.append(item
.next().toString());
600 fileBuffer
.append(ToolDefinitions
.LINE_SEPARATOR
);
603 // If is TianoR8FlashMap, copy {Fv_DIR}/FlashMap.h to
604 // {DEST_DIR_DRBUG}/FlashMap.h
606 if (saq
.isHaveTianoR8FlashMap()) {
607 fileBuffer
.append(CommonDefinition
.INCLUDE
);
608 fileBuffer
.append(" <");
609 fileBuffer
.append(CommonDefinition
.TIANOR8PLASHMAPH
+ ">\r\n");
610 copyFlashMapHToDebugDir();
614 // Write PCD information to library AutoGen.h.
616 if (this.myPcdAutogen
!= null) {
617 fileBuffer
.append("\r\n");
618 fileBuffer
.append(this.myPcdAutogen
.getHAutoGenString());
622 // Append the #endif at AutoGen.h
624 fileBuffer
.append("#endif\r\n");
627 // Save content of string buffer to AutoGen.h file.
629 if (!saveFile(outputPath
+ File
.separatorChar
+ "AutoGen.h", fileBuffer
)) {
630 throw new AutoGenException("Failed to generate AutoGen.h !!!");
637 This function generates AutoGen.h for library.
639 @throws BuildException
640 Failed to generate AutoGen.c.
642 void libGenAutogenC() throws EdkException
{
643 StringBuffer fileBuffer
= new StringBuffer(10240);
646 // Write Autogen.c header notation
648 fileBuffer
.append(CommonDefinition
.AUTOGENCNOTATION
);
650 fileBuffer
.append(ToolDefinitions
.LINE_SEPARATOR
);
651 fileBuffer
.append(ToolDefinitions
.LINE_SEPARATOR
);
656 this.myPcdAutogen
= new PCDAutoGenAction(moduleId
,
659 saq
.getModulePcdEntryNameArray(),
662 this.myPcdAutogen
.execute();
663 if (this.myPcdAutogen
!= null) {
664 fileBuffer
.append(ToolDefinitions
.LINE_SEPARATOR
);
665 fileBuffer
.append(this.myPcdAutogen
.getCAutoGenString());
668 if (!saveFile(outputPath
+ File
.separatorChar
+ "AutoGen.c", fileBuffer
)) {
669 throw new AutoGenException("Failed to generate AutoGen.c !!!");
674 LibraryClassToAutogenH
676 This function returns *.h files declared by library classes which are
677 consumed or produced by current build module or library.
680 List of library class which consumed or produce by current
681 build module or library.
682 @return includeStrList List of *.h file.
684 Set
<String
> LibraryClassToAutogenH(String
[] libClassList
)
685 throws EdkException
{
686 Set
<String
> includeStrList
= new LinkedHashSet
<String
>();
687 String includeName
[];
691 // Get include file from GlobalData's SPDTable according to
692 // library class name.
694 for (int i
= 0; i
< libClassList
.length
; i
++) {
695 includeName
= GlobalData
.getLibraryClassHeaderFiles(
696 saq
.getDependencePkg(this.arch
),
698 if (includeName
== null) {
699 throw new AutoGenException("Can not find library class ["
700 + libClassList
[i
] + "] declaration in any SPD package. ");
702 for (int j
= 0; j
< includeName
.length
; j
++) {
703 String includeNameStr
= includeName
[j
];
704 if (includeNameStr
!= null) {
705 str
= CommonDefinition
.INCLUDE
+ " " + "<";
706 str
= str
+ includeNameStr
+ ">\r\n";
707 includeStrList
.add(str
);
708 includeNameStr
= null;
712 return includeStrList
;
718 This function add include file in AutoGen.h file.
720 @param packageNameList
721 List of module depended package.
726 List
<String
> depPkgToAutogenH(PackageIdentification
[] packageNameList
,
727 String moduleType
) throws AutoGenException
{
729 List
<String
> includeStrList
= new LinkedList
<String
>();
731 String includeStr
= "";
734 // Get include file from moduleInfo file
736 for (int i
= 0; i
< packageNameList
.length
; i
++) {
737 pkgHeader
= GlobalData
.getPackageHeaderFiles(packageNameList
[i
],
739 if (pkgHeader
== null) {
740 throw new AutoGenException("Can not find package ["
742 + "] declaration in any SPD package. ");
743 } else if (!pkgHeader
.equalsIgnoreCase("")) {
744 includeStr
= CommonDefinition
.INCLUDE
+ " <" + pkgHeader
746 includeStrList
.add(includeStr
);
750 return includeStrList
;
756 This function convert <ModuleEntryPoint> & <ModuleUnloadImage>
757 information in mas to AutoGen.c
759 @param entryPointList
762 String buffer fo AutoGen.c.
765 void EntryPointToAutoGen(String
[] entryPointList
, String
[] unloadImageList
, StringBuffer fileBuffer
)
766 throws EdkException
{
768 String typeStr
= saq
.getModuleType();
769 int unloadImageCount
= 0;
770 int entryPointCount
= 0;
773 // The parameters and return value of entryPoint is difference
774 // for difference module type.
776 switch (CommonDefinition
.getModuleType(typeStr
)) {
778 case CommonDefinition
.ModuleTypePeiCore
:
779 if (entryPointList
== null ||entryPointList
.length
!= 1 ) {
780 throw new AutoGenException(
781 "Module type = 'PEI_CORE', can have only one module entry point!");
783 fileBuffer
.append("EFI_STATUS\r\n");
784 fileBuffer
.append(entryPointList
[0]);
785 fileBuffer
.append(" (\r\n");
787 .append(" IN EFI_PEI_STARTUP_DESCRIPTOR *PeiStartupDescriptor,\r\n");
789 .append(" IN VOID *OldCoreData\r\n");
790 fileBuffer
.append(" );\r\n\r\n");
792 fileBuffer
.append("EFI_STATUS\r\n");
793 fileBuffer
.append("EFIAPI\r\n");
794 fileBuffer
.append("ProcessModuleEntryPointList (\r\n");
796 .append(" IN EFI_PEI_STARTUP_DESCRIPTOR *PeiStartupDescriptor,\r\n");
798 .append(" IN VOID *OldCoreData\r\n");
799 fileBuffer
.append(" )\r\n\r\n");
800 fileBuffer
.append("{\r\n");
801 fileBuffer
.append(" return ");
802 fileBuffer
.append(entryPointList
[0]);
803 fileBuffer
.append(" (PeiStartupDescriptor, OldCoreData);\r\n");
804 fileBuffer
.append("}\r\n\r\n");
808 case CommonDefinition
.ModuleTypeDxeCore
:
809 fileBuffer
.append("const UINT32 _gUefiDriverRevision = 0;\r\n");
810 if (entryPointList
== null || entryPointList
.length
!= 1) {
811 throw new AutoGenException(
812 "Module type = 'DXE_CORE', can have only one module entry point!");
815 fileBuffer
.append("VOID\r\n");
816 fileBuffer
.append(entryPointList
[0]);
817 fileBuffer
.append(" (\n");
818 fileBuffer
.append(" IN VOID *HobStart\r\n");
819 fileBuffer
.append(" );\r\n\r\n");
821 fileBuffer
.append("VOID\r\n");
822 fileBuffer
.append("EFIAPI\r\n");
823 fileBuffer
.append("ProcessModuleEntryPointList (\r\n");
824 fileBuffer
.append(" IN VOID *HobStart\r\n");
825 fileBuffer
.append(" )\r\n\r\n");
826 fileBuffer
.append("{\r\n");
827 fileBuffer
.append(" ");
828 fileBuffer
.append(entryPointList
[0]);
829 fileBuffer
.append(" (HobStart);\r\n");
830 fileBuffer
.append("}\r\n\r\n");
834 case CommonDefinition
.ModuleTypePeim
:
837 .append("GLOBAL_REMOVE_IF_UNREFERENCED const UINT32 _gPeimRevision = 0;\r\n");
838 if (entryPointList
== null || entryPointList
.length
== 0) {
839 fileBuffer
.append("EFI_STATUS\r\n");
840 fileBuffer
.append("EFIAPI\r\n");
841 fileBuffer
.append("ProcessModuleEntryPointList (\r\n");
842 fileBuffer
.append(" IN EFI_FFS_FILE_HEADER *FfsHeader,\r\n");
843 fileBuffer
.append(" IN EFI_PEI_SERVICES **PeiServices\r\n");
844 fileBuffer
.append(" )\r\n\r\n");
845 fileBuffer
.append("{\r\n");
846 fileBuffer
.append(" return EFI_SUCCESS;\r\n");
847 fileBuffer
.append("}\r\n\r\n");
850 for (int i
= 0; i
< entryPointList
.length
; i
++) {
851 fileBuffer
.append("EFI_STATUS\r\n");
852 fileBuffer
.append(entryPointList
[i
]);
853 fileBuffer
.append(" (\r\n");
855 .append(" IN EFI_FFS_FILE_HEADER *FfsHeader,\r\n");
857 .append(" IN EFI_PEI_SERVICES **PeiServices\r\n");
858 fileBuffer
.append(" );\r\n");
863 fileBuffer
.append("EFI_STATUS\r\n");
864 fileBuffer
.append("EFIAPI\r\n");
865 fileBuffer
.append("ProcessModuleEntryPointList (\r\n");
866 fileBuffer
.append(" IN EFI_FFS_FILE_HEADER *FfsHeader,\r\n");
867 fileBuffer
.append(" IN EFI_PEI_SERVICES **PeiServices\r\n");
868 fileBuffer
.append(" )\r\n\r\n");
869 fileBuffer
.append("{\r\n");
870 if (entryPointCount
== 1) {
871 fileBuffer
.append(" return ");
872 fileBuffer
.append(entryPointList
[0]);
873 fileBuffer
.append(" (FfsHeader, PeiServices);\r\n");
875 fileBuffer
.append(" EFI_STATUS Status;\r\n");
876 fileBuffer
.append(" EFI_STATUS CombinedStatus;\r\n\r\n");
877 fileBuffer
.append(" CombinedStatus = EFI_LOAD_ERROR;\r\n\r\n");
878 for (int i
= 0; i
< entryPointList
.length
; i
++) {
879 if (!entryPointList
[i
].equals("")) {
880 fileBuffer
.append(" Status = ");
881 fileBuffer
.append(entryPointList
[i
]);
882 fileBuffer
.append(" (FfsHeader, PeiServices);\r\n");
884 .append(" if (!EFI_ERROR (Status) || EFI_ERROR (CombinedStatus)) {\r\n");
885 fileBuffer
.append(" CombinedStatus = Status;\r\n");
886 fileBuffer
.append(" }\r\n\r\n");
891 fileBuffer
.append(" return CombinedStatus;\r\n");
893 fileBuffer
.append("}\r\n\r\n");
896 case CommonDefinition
.ModuleTypeDxeSmmDriver
:
899 // If entryPoint is null, create an empty ProcessModuleEntryPointList
902 if (entryPointList
== null || entryPointList
.length
== 0) {
904 .append("GLOBAL_REMOVE_IF_UNREFERENCED const UINT8 _gDriverEntryPointCount = ");
905 fileBuffer
.append(Integer
.toString(entryPointCount
));
906 fileBuffer
.append(";\r\n");
907 fileBuffer
.append("EFI_STATUS\r\n");
908 fileBuffer
.append("EFIAPI\r\n");
909 fileBuffer
.append("ProcessModuleEntryPointList (\r\n");
910 fileBuffer
.append(" IN EFI_HANDLE ImageHandle,\r\n");
911 fileBuffer
.append(" IN EFI_SYSTEM_TABLE *SystemTable\r\n");
912 fileBuffer
.append(" )\r\n\r\n");
913 fileBuffer
.append("{\r\n");
914 fileBuffer
.append(" return EFI_SUCCESS;\r\n");
915 fileBuffer
.append("}\r\n\r\n");
918 for (int i
= 0; i
< entryPointList
.length
; i
++) {
919 fileBuffer
.append("EFI_STATUS\r\n");
920 fileBuffer
.append(entryPointList
[i
]);
921 fileBuffer
.append(" (\r\n");
922 fileBuffer
.append(" IN EFI_HANDLE ImageHandle,\r\n");
923 fileBuffer
.append(" IN EFI_SYSTEM_TABLE *SystemTable\r\n");
924 fileBuffer
.append(" );\r\n");
928 .append("GLOBAL_REMOVE_IF_UNREFERENCED const UINT8 _gDriverEntryPointCount = ");
929 fileBuffer
.append(Integer
.toString(entryPointCount
));
930 fileBuffer
.append(";\r\n");
932 .append("static BASE_LIBRARY_JUMP_BUFFER mJumpContext;\r\n");
934 .append("static EFI_STATUS mDriverEntryPointStatus = EFI_LOAD_ERROR;\r\n\r\n");
936 fileBuffer
.append("EFI_STATUS\r\n");
937 fileBuffer
.append("EFIAPI\r\n");
938 fileBuffer
.append("ProcessModuleEntryPointList (\r\n");
939 fileBuffer
.append(" IN EFI_HANDLE ImageHandle,\r\n");
940 fileBuffer
.append(" IN EFI_SYSTEM_TABLE *SystemTable\r\n");
941 fileBuffer
.append(" )\r\n\r\n");
942 fileBuffer
.append("{\r\n");
945 for (int i
= 0; i
< entryPointList
.length
; i
++) {
947 .append(" if (SetJump (&mJumpContext) == 0) {\r\n");
948 fileBuffer
.append(" ExitDriver (");
949 fileBuffer
.append(entryPointList
[i
]);
950 fileBuffer
.append(" (ImageHandle, SystemTable));\r\n");
951 fileBuffer
.append(" ASSERT (FALSE);\r\n");
952 fileBuffer
.append(" }\r\n");
955 fileBuffer
.append(" return mDriverEntryPointStatus;\r\n");
956 fileBuffer
.append("}\r\n\r\n");
958 fileBuffer
.append("VOID\r\n");
959 fileBuffer
.append("EFIAPI\r\n");
960 fileBuffer
.append("ExitDriver (\r\n");
961 fileBuffer
.append(" IN EFI_STATUS Status\n");
962 fileBuffer
.append(" )\r\n\r\n");
963 fileBuffer
.append("{\r\n");
965 .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");
976 // Add "ModuleUnloadImage" for DxeSmmDriver module type;
978 //entryPointList = SurfaceAreaQuery.getModuleUnloadImageArray();
979 //entryPointList = CommonDefinition.remDupString(entryPointList);
980 //entryPointCount = 0;
982 unloadImageCount
= 0;
983 if (unloadImageList
!= null) {
984 for (int i
= 0; i
< unloadImageList
.length
; i
++) {
985 fileBuffer
.append("EFI_STATUS\r\n");
986 fileBuffer
.append(unloadImageList
[i
]);
987 fileBuffer
.append(" (\r\n");
989 .append(" IN EFI_HANDLE ImageHandle\r\n");
990 fileBuffer
.append(" );\r\n");
996 .append("GLOBAL_REMOVE_IF_UNREFERENCED const UINT8 _gDriverUnloadImageCount = ");
997 fileBuffer
.append(Integer
.toString(unloadImageCount
));
998 fileBuffer
.append(";\r\n\r\n");
1000 fileBuffer
.append("EFI_STATUS\r\n");
1001 fileBuffer
.append("EFIAPI\r\n");
1002 fileBuffer
.append("ProcessModuleUnloadList (\r\n");
1003 fileBuffer
.append(" IN EFI_HANDLE ImageHandle\r\n");
1004 fileBuffer
.append(" )\r\n");
1005 fileBuffer
.append("{\r\n");
1007 if (unloadImageCount
== 0) {
1008 fileBuffer
.append(" return EFI_SUCCESS;\r\n");
1009 } else if (unloadImageCount
== 1) {
1010 fileBuffer
.append(" return ");
1011 fileBuffer
.append(unloadImageList
[0]);
1012 fileBuffer
.append("(ImageHandle);\r\n");
1014 fileBuffer
.append(" EFI_STATUS Status;\r\n\r\n");
1015 fileBuffer
.append(" Status = EFI_SUCCESS;\r\n\r\n");
1016 for (int i
= 0; i
< unloadImageList
.length
; i
++) {
1018 fileBuffer
.append(" Status = ");
1019 fileBuffer
.append(unloadImageList
[i
]);
1020 fileBuffer
.append("(ImageHandle);\r\n");
1022 fileBuffer
.append(" if (EFI_ERROR (Status)) {\r\n");
1023 fileBuffer
.append(" ");
1024 fileBuffer
.append(unloadImageList
[i
]);
1025 fileBuffer
.append("(ImageHandle);\r\n");
1026 fileBuffer
.append(" } else {\r\n");
1027 fileBuffer
.append(" Status = ");
1028 fileBuffer
.append(unloadImageList
[i
]);
1029 fileBuffer
.append("(ImageHandle);\r\n");
1030 fileBuffer
.append(" }\r\n");
1033 fileBuffer
.append(" return Status;\r\n");
1035 fileBuffer
.append("}\r\n\r\n");
1038 case CommonDefinition
.ModuleTypeDxeRuntimeDriver
:
1039 case CommonDefinition
.ModuleTypeDxeDriver
:
1040 case CommonDefinition
.ModuleTypeDxeSalDriver
:
1041 case CommonDefinition
.ModuleTypeUefiDriver
:
1042 case CommonDefinition
.ModuleTypeUefiApplication
:
1043 entryPointCount
= 0;
1044 fileBuffer
.append("const UINT32 _gUefiDriverRevision = 0;\r\n");
1046 // If entry point is null, create a empty ProcessModuleEntryPointList function.
1048 if (entryPointList
== null || entryPointList
.length
== 0) {
1050 .append("GLOBAL_REMOVE_IF_UNREFERENCED const UINT8 _gDriverEntryPointCount = 0;\r\n");
1051 fileBuffer
.append("EFI_STATUS\r\n");
1052 fileBuffer
.append("EFIAPI\r\n");
1053 fileBuffer
.append("ProcessModuleEntryPointList (\r\n");
1054 fileBuffer
.append(" IN EFI_HANDLE ImageHandle,\r\n");
1055 fileBuffer
.append(" IN EFI_SYSTEM_TABLE *SystemTable\r\n");
1056 fileBuffer
.append(" )\r\n\r\n");
1057 fileBuffer
.append("{\r\n");
1058 fileBuffer
.append(" return EFI_SUCCESS;\r\n");
1059 fileBuffer
.append("}\r\n");
1062 for (int i
= 0; i
< entryPointList
.length
; i
++) {
1064 fileBuffer
.append("EFI_STATUS\r\n");
1065 fileBuffer
.append(entryPointList
[i
]);
1066 fileBuffer
.append(" (\r\n");
1067 fileBuffer
.append(" IN EFI_HANDLE ImageHandle,\r\n");
1068 fileBuffer
.append(" IN EFI_SYSTEM_TABLE *SystemTable\r\n");
1069 fileBuffer
.append(" );\r\n");
1074 .append("GLOBAL_REMOVE_IF_UNREFERENCED const UINT8 _gDriverEntryPointCount = ");
1075 fileBuffer
.append(Integer
.toString(entryPointCount
));
1076 fileBuffer
.append(";\r\n");
1077 if (entryPointCount
> 1) {
1079 .append("static BASE_LIBRARY_JUMP_BUFFER mJumpContext;\r\n");
1081 .append("static EFI_STATUS mDriverEntryPointStatus = EFI_LOAD_ERROR;\r\n");
1083 fileBuffer
.append("\n");
1085 fileBuffer
.append("EFI_STATUS\r\n");
1086 fileBuffer
.append("EFIAPI\r\n");
1087 fileBuffer
.append("ProcessModuleEntryPointList (\r\n");
1088 fileBuffer
.append(" IN EFI_HANDLE ImageHandle,\r\n");
1089 fileBuffer
.append(" IN EFI_SYSTEM_TABLE *SystemTable\r\n");
1090 fileBuffer
.append(" )\r\n\r\n");
1091 fileBuffer
.append("{\r\n");
1093 if (entryPointCount
== 1) {
1094 fileBuffer
.append(" return (");
1095 fileBuffer
.append(entryPointList
[0]);
1096 fileBuffer
.append(" (ImageHandle, SystemTable));\r\n");
1098 for (int i
= 0; i
< entryPointList
.length
; i
++) {
1099 if (!entryPointList
[i
].equals("")) {
1101 .append(" if (SetJump (&mJumpContext) == 0) {\r\n");
1102 fileBuffer
.append(" ExitDriver (");
1103 fileBuffer
.append(entryPointList
[i
]);
1104 fileBuffer
.append(" (ImageHandle, SystemTable));\r\n");
1105 fileBuffer
.append(" ASSERT (FALSE);\r\n");
1106 fileBuffer
.append(" }\r\n");
1111 fileBuffer
.append(" return mDriverEntryPointStatus;\r\n");
1113 fileBuffer
.append("}\r\n\r\n");
1115 fileBuffer
.append("VOID\r\n");
1116 fileBuffer
.append("EFIAPI\r\n");
1117 fileBuffer
.append("ExitDriver (\r\n");
1118 fileBuffer
.append(" IN EFI_STATUS Status\r\n");
1119 fileBuffer
.append(" )\r\n\r\n");
1120 fileBuffer
.append("{\r\n");
1121 if (entryPointCount
<= 1) {
1122 fileBuffer
.append(" if (EFI_ERROR (Status)) {\r\n");
1124 .append(" ProcessLibraryDestructorList (gImageHandle, gST);\r\n");
1125 fileBuffer
.append(" }\r\n");
1127 .append(" gBS->Exit (gImageHandle, Status, 0, NULL);\r\n");
1130 .append(" if (!EFI_ERROR (Status) || EFI_ERROR (mDriverEntryPointStatus)) {\r\n");
1131 fileBuffer
.append(" mDriverEntryPointStatus = Status;\r\n");
1132 fileBuffer
.append(" }\r\n");
1133 fileBuffer
.append(" LongJump (&mJumpContext, (UINTN)-1);\r\n");
1134 fileBuffer
.append(" ASSERT (FALSE);\r\n");
1136 fileBuffer
.append("}\r\n\r\n");
1141 // Add ModuleUnloadImage for DxeDriver and UefiDriver module type.
1143 //entryPointList = SurfaceAreaQuery.getModuleUnloadImageArray();
1145 // Remover duplicate unload entry point.
1147 //entryPointList = CommonDefinition.remDupString(entryPointList);
1148 //entryPointCount = 0;
1149 unloadImageCount
= 0;
1150 if (unloadImageList
!= null) {
1151 for (int i
= 0; i
< unloadImageList
.length
; i
++) {
1152 fileBuffer
.append("EFI_STATUS\r\n");
1153 fileBuffer
.append("EFIAPI\r\n");
1154 fileBuffer
.append(unloadImageList
[i
]);
1155 fileBuffer
.append(" (\r\n");
1157 .append(" IN EFI_HANDLE ImageHandle\r\n");
1158 fileBuffer
.append(" );\r\n");
1164 .append("GLOBAL_REMOVE_IF_UNREFERENCED const UINT8 _gDriverUnloadImageCount = ");
1165 fileBuffer
.append(Integer
.toString(unloadImageCount
));
1166 fileBuffer
.append(";\r\n\r\n");
1168 fileBuffer
.append("EFI_STATUS\n");
1169 fileBuffer
.append("EFIAPI\r\n");
1170 fileBuffer
.append("ProcessModuleUnloadList (\r\n");
1171 fileBuffer
.append(" IN EFI_HANDLE ImageHandle\r\n");
1172 fileBuffer
.append(" )\r\n");
1173 fileBuffer
.append("{\r\n");
1175 if (unloadImageCount
== 0) {
1176 fileBuffer
.append(" return EFI_SUCCESS;\r\n");
1177 } else if (unloadImageCount
== 1) {
1178 fileBuffer
.append(" return ");
1179 fileBuffer
.append(unloadImageList
[0]);
1180 fileBuffer
.append("(ImageHandle);\r\n");
1182 fileBuffer
.append(" EFI_STATUS Status;\r\n\r\n");
1183 fileBuffer
.append(" Status = EFI_SUCCESS;\r\n\r\n");
1184 for (int i
= 0; i
< unloadImageList
.length
; i
++) {
1186 fileBuffer
.append(" Status = ");
1187 fileBuffer
.append(unloadImageList
[i
]);
1188 fileBuffer
.append("(ImageHandle);\r\n");
1190 fileBuffer
.append(" if (EFI_ERROR (Status)) {\r\n");
1191 fileBuffer
.append(" ");
1192 fileBuffer
.append(unloadImageList
[i
]);
1193 fileBuffer
.append("(ImageHandle);\r\n");
1194 fileBuffer
.append(" } else {\r\n");
1195 fileBuffer
.append(" Status = ");
1196 fileBuffer
.append(unloadImageList
[i
]);
1197 fileBuffer
.append("(ImageHandle);\r\n");
1198 fileBuffer
.append(" }\r\n");
1201 fileBuffer
.append(" return Status;\r\n");
1203 fileBuffer
.append("}\r\n\r\n");
1211 This function gets GUIDs from SPD file accrodeing to <PPIs> information
1212 and write those GUIDs to AutoGen.c.
1215 String Buffer for Autogen.c file.
1216 @throws BuildException
1217 Guid must set value!
1219 void PpiGuidToAutogenC(StringBuffer fileBuffer
) throws AutoGenException
{
1220 String
[] cNameGuid
= null;
1223 // Get the all PPI adn PPI Notify from MSA file,
1224 // then add those PPI ,and PPI Notify name to list.
1227 String
[] ppiList
= saq
.getPpiArray(this.arch
);
1228 for (int i
= 0; i
< ppiList
.length
; i
++) {
1229 this.mPpiList
.add(ppiList
[i
]);
1232 String
[] ppiNotifyList
= saq
.getPpiNotifyArray(this.arch
);
1233 for (int i
= 0; i
< ppiNotifyList
.length
; i
++) {
1234 this.mPpiList
.add(ppiNotifyList
[i
]);
1238 // Find CNAME and GUID from dependence SPD file and write to Autogen.c
1240 Iterator ppiIterator
= this.mPpiList
.iterator();
1241 String ppiKeyWord
= null;
1242 while (ppiIterator
.hasNext()) {
1243 ppiKeyWord
= ppiIterator
.next().toString();
1244 cNameGuid
= GlobalData
.getPpiGuid(this.mDepPkgList
, ppiKeyWord
);
1245 if (cNameGuid
!= null) {
1247 .append("\r\nGLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID ");
1248 fileBuffer
.append(cNameGuid
[0]);
1249 fileBuffer
.append(" = { ");
1250 fileBuffer
.append(CommonDefinition
.formatGuidName(cNameGuid
[1]));
1251 fileBuffer
.append(" } ;");
1254 // If can't find Ppi GUID declaration in every package
1256 throw new AutoGenException("Can not find Ppi GUID ["
1257 + ppiKeyWord
+ "] declaration in any SPD package!");
1263 ProtocolGuidToAutogenc
1265 This function gets GUIDs from SPD file accrodeing to <Protocol>
1266 information and write those GUIDs to AutoGen.c.
1269 String Buffer for Autogen.c file.
1270 @throws BuildException
1271 Protocol name must set.
1273 void ProtocolGuidToAutogenC(StringBuffer fileBuffer
) throws EdkException
{
1274 String
[] cNameGuid
= null;
1276 String
[] protocolList
= saq
.getProtocolArray(this.arch
);
1279 // Add result to Autogen global list.
1281 for (int i
= 0; i
< protocolList
.length
; i
++) {
1282 this.mProtocolList
.add(protocolList
[i
]);
1285 String
[] protocolNotifyList
= saq
1286 .getProtocolNotifyArray(this.arch
);
1288 for (int i
= 0; i
< protocolNotifyList
.length
; i
++) {
1289 this.mProtocolList
.add(protocolNotifyList
[i
]);
1293 // Get the NAME and GUID from dependence SPD and write to Autogen.c
1295 Iterator protocolIterator
= this.mProtocolList
.iterator();
1296 String protocolKeyWord
= null;
1299 while (protocolIterator
.hasNext()) {
1300 protocolKeyWord
= protocolIterator
.next().toString();
1301 cNameGuid
= GlobalData
.getProtocolGuid(this.mDepPkgList
, protocolKeyWord
);
1302 if (cNameGuid
!= null) {
1304 .append("\r\nGLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID ");
1305 fileBuffer
.append(cNameGuid
[0]);
1306 fileBuffer
.append(" = { ");
1307 fileBuffer
.append(CommonDefinition
.formatGuidName(cNameGuid
[1]));
1308 fileBuffer
.append(" } ;");
1311 // If can't find protocol GUID declaration in every package
1313 throw new AutoGenException("Can not find protocol Guid ["
1314 + protocolKeyWord
+ "] declaration in any SPD package!");
1322 This function gets GUIDs from SPD file accrodeing to <Guids> information
1323 and write those GUIDs to AutoGen.c.
1326 String Buffer for Autogen.c file.
1329 void GuidGuidToAutogenC(StringBuffer fileBuffer
) throws AutoGenException
{
1330 String
[] cNameGuid
= null;
1331 String guidKeyWord
= null;
1333 String
[] guidList
= saq
.getGuidEntryArray(this.arch
);
1335 for (int i
= 0; i
< guidList
.length
; i
++) {
1336 this.mGuidList
.add(guidList
[i
]);
1340 Iterator guidIterator
= this.mGuidList
.iterator();
1341 while (guidIterator
.hasNext()) {
1342 guidKeyWord
= guidIterator
.next().toString();
1343 cNameGuid
= GlobalData
.getGuid(this.mDepPkgList
, guidKeyWord
);
1345 if (cNameGuid
!= null) {
1347 .append("\r\nGLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID ");
1348 fileBuffer
.append(cNameGuid
[0]);
1349 fileBuffer
.append(" = { ");
1350 fileBuffer
.append(CommonDefinition
.formatGuidName(cNameGuid
[1]));
1351 fileBuffer
.append("} ;");
1354 // If can't find GUID declaration in every package
1356 throw new AutoGenException("Can not find Guid [" + guidKeyWord
1357 + "] declaration in any SPD package. ");
1364 LibInstanceToAutogenC
1366 This function adds dependent library instance to autogen.c,which
1367 includeing library's constructor, destructor, and library dependent ppi,
1368 protocol, guid, pcd information.
1371 String buffer for AutoGen.c
1372 @throws BuildException
1374 void LibInstanceToAutogenC(StringBuffer fileBuffer
) throws EdkException
{
1375 String moduleType
= this.moduleId
.getModuleType();
1377 // Add library constructor to AutoGen.c
1379 LibConstructorToAutogenC(libConstructList
, moduleType
,
1380 fileBuffer
/* autogenC */);
1382 // Add library destructor to AutoGen.c
1384 LibDestructorToAutogenC(libDestructList
, moduleType
, fileBuffer
/* autogenC */);
1388 LibConstructorToAutogenc
1390 This function writes library constructor list to AutoGen.c. The library
1391 constructor's parameter and return value depend on module type.
1393 @param libInstanceList
1394 List of library construct name.
1398 String buffer for AutoGen.c
1401 void LibConstructorToAutogenC(List
<String
> libInstanceList
,
1402 String moduleType
, StringBuffer fileBuffer
) throws EdkException
{
1403 boolean isFirst
= true;
1406 // The library constructor's parameter and return value depend on
1409 for (int i
= 0; i
< libInstanceList
.size(); i
++) {
1410 switch (CommonDefinition
.getModuleType(moduleType
)) {
1411 case CommonDefinition
.ModuleTypeBase
:
1412 fileBuffer
.append("RETURN_STATUS\r\n");
1413 fileBuffer
.append("EFIAPI\r\n");
1414 fileBuffer
.append(libInstanceList
.get(i
));
1415 fileBuffer
.append(" (\r\n");
1416 fileBuffer
.append(" VOID\r\n");
1417 fileBuffer
.append(" );\r\n");
1420 case CommonDefinition
.ModuleTypePeiCore
:
1421 case CommonDefinition
.ModuleTypePeim
:
1422 fileBuffer
.append("EFI_STATUS\r\n");
1423 fileBuffer
.append("EFIAPI\r\n");
1424 fileBuffer
.append(libInstanceList
.get(i
));
1425 fileBuffer
.append(" (\r\n");
1427 .append(" IN EFI_FFS_FILE_HEADER *FfsHeader,\r\n");
1429 .append(" IN EFI_PEI_SERVICES **PeiServices\r\n");
1430 fileBuffer
.append(" );\r\n");
1433 case CommonDefinition
.ModuleTypeDxeCore
:
1434 case CommonDefinition
.ModuleTypeDxeDriver
:
1435 case CommonDefinition
.ModuleTypeDxeRuntimeDriver
:
1436 case CommonDefinition
.ModuleTypeDxeSmmDriver
:
1437 case CommonDefinition
.ModuleTypeDxeSalDriver
:
1438 case CommonDefinition
.ModuleTypeUefiDriver
:
1439 case CommonDefinition
.ModuleTypeUefiApplication
:
1440 fileBuffer
.append("EFI_STATUS\r\n");
1441 fileBuffer
.append("EFIAPI\r\n");
1442 fileBuffer
.append(libInstanceList
.get(i
));
1443 fileBuffer
.append(" (\r\n");
1444 fileBuffer
.append(" IN EFI_HANDLE ImageHandle,\r\n");
1445 fileBuffer
.append(" IN EFI_SYSTEM_TABLE *SystemTable\r\n");
1446 fileBuffer
.append(" );\r\n");
1452 // Add ProcessLibraryConstructorList in AutoGen.c
1454 fileBuffer
.append("VOID\r\n");
1455 fileBuffer
.append("EFIAPI\r\n");
1456 fileBuffer
.append("ProcessLibraryConstructorList (\r\n");
1457 switch (CommonDefinition
.getModuleType(moduleType
)) {
1458 case CommonDefinition
.ModuleTypeBase
:
1459 fileBuffer
.append(" VOID\r\n");
1462 case CommonDefinition
.ModuleTypePeiCore
:
1463 case CommonDefinition
.ModuleTypePeim
:
1464 fileBuffer
.append(" IN EFI_FFS_FILE_HEADER *FfsHeader,\r\n");
1466 .append(" IN EFI_PEI_SERVICES **PeiServices\r\n");
1469 case CommonDefinition
.ModuleTypeDxeCore
:
1470 case CommonDefinition
.ModuleTypeDxeDriver
:
1471 case CommonDefinition
.ModuleTypeDxeRuntimeDriver
:
1472 case CommonDefinition
.ModuleTypeDxeSmmDriver
:
1473 case CommonDefinition
.ModuleTypeDxeSalDriver
:
1474 case CommonDefinition
.ModuleTypeUefiDriver
:
1475 case CommonDefinition
.ModuleTypeUefiApplication
:
1476 fileBuffer
.append(" IN EFI_HANDLE ImageHandle,\r\n");
1477 fileBuffer
.append(" IN EFI_SYSTEM_TABLE *SystemTable\r\n");
1481 fileBuffer
.append(" )\r\n");
1482 fileBuffer
.append("{\r\n");
1484 // If no constructor function, return EFI_SUCCESS.
1486 //if (libInstanceList.size() == 0){
1487 // fileBuffer.append(" return EFI_SUCCESS;\r\n");
1489 for (int i
= 0; i
< libInstanceList
.size(); i
++) {
1491 fileBuffer
.append(" EFI_STATUS Status;\r\n");
1492 fileBuffer
.append(" Status = EFI_SUCCESS;\r\n");
1493 fileBuffer
.append("\r\n");
1496 switch (CommonDefinition
.getModuleType(moduleType
)) {
1497 case CommonDefinition
.ModuleTypeBase
:
1498 fileBuffer
.append(" Status = ");
1499 fileBuffer
.append(libInstanceList
.get(i
));
1500 fileBuffer
.append("();\r\n");
1501 fileBuffer
.append(" VOID\r\n");
1503 case CommonDefinition
.ModuleTypePeiCore
:
1504 case CommonDefinition
.ModuleTypePeim
:
1505 fileBuffer
.append(" Status = ");
1506 fileBuffer
.append(libInstanceList
.get(i
));
1507 fileBuffer
.append(" (FfsHeader, PeiServices);\r\n");
1509 case CommonDefinition
.ModuleTypeDxeCore
:
1510 case CommonDefinition
.ModuleTypeDxeDriver
:
1511 case CommonDefinition
.ModuleTypeDxeRuntimeDriver
:
1512 case CommonDefinition
.ModuleTypeDxeSmmDriver
:
1513 case CommonDefinition
.ModuleTypeDxeSalDriver
:
1514 case CommonDefinition
.ModuleTypeUefiDriver
:
1515 case CommonDefinition
.ModuleTypeUefiApplication
:
1516 fileBuffer
.append(" Status = ");
1517 fileBuffer
.append(libInstanceList
.get(i
));
1518 fileBuffer
.append(" (ImageHandle, SystemTable);\r\n");
1521 EdkLog
.log(EdkLog
.EDK_INFO
,"Autogen doesn't know how to deal with module type - " + moduleType
+ "!");
1523 fileBuffer
.append(" ASSERT_EFI_ERROR (Status);\r\n");
1525 fileBuffer
.append("}\r\n");
1529 LibDestructorToAutogenc
1531 This function writes library destructor list to AutoGen.c. The library
1532 destructor's parameter and return value depend on module type.
1534 @param libInstanceList
1535 List of library destructor name.
1539 String buffer for AutoGen.c
1542 void LibDestructorToAutogenC(List
<String
> libInstanceList
,
1543 String moduleType
, StringBuffer fileBuffer
) throws EdkException
{
1544 boolean isFirst
= true;
1545 for (int i
= 0; i
< libInstanceList
.size(); i
++) {
1546 switch (CommonDefinition
.getModuleType(moduleType
)) {
1547 case CommonDefinition
.ModuleTypeBase
:
1548 fileBuffer
.append("RETURN_STATUS\r\n");
1549 fileBuffer
.append("EFIAPI\r\n");
1550 fileBuffer
.append(libInstanceList
.get(i
));
1551 fileBuffer
.append(" (\r\n");
1552 fileBuffer
.append(" VOID\r\n");
1553 fileBuffer
.append(" );\r\n");
1555 case CommonDefinition
.ModuleTypePeiCore
:
1556 case CommonDefinition
.ModuleTypePeim
:
1557 fileBuffer
.append("EFI_STATUS\r\n");
1558 fileBuffer
.append("EFIAPI\r\n");
1559 fileBuffer
.append(libInstanceList
.get(i
));
1560 fileBuffer
.append(" (\r\n");
1562 .append(" IN EFI_FFS_FILE_HEADER *FfsHeader,\r\n");
1564 .append(" IN EFI_PEI_SERVICES **PeiServices\r\n");
1565 fileBuffer
.append(" );\r\n");
1567 case CommonDefinition
.ModuleTypeDxeCore
:
1568 case CommonDefinition
.ModuleTypeDxeDriver
:
1569 case CommonDefinition
.ModuleTypeDxeRuntimeDriver
:
1570 case CommonDefinition
.ModuleTypeDxeSmmDriver
:
1571 case CommonDefinition
.ModuleTypeDxeSalDriver
:
1572 case CommonDefinition
.ModuleTypeUefiDriver
:
1573 case CommonDefinition
.ModuleTypeUefiApplication
:
1574 fileBuffer
.append("EFI_STATUS\r\n");
1575 fileBuffer
.append("EFIAPI\r\n");
1576 fileBuffer
.append(libInstanceList
.get(i
));
1577 fileBuffer
.append(" (\r\n");
1578 fileBuffer
.append(" IN EFI_HANDLE ImageHandle,\r\n");
1579 fileBuffer
.append(" IN EFI_SYSTEM_TABLE *SystemTable\r\n");
1580 fileBuffer
.append(" );\r\n");
1586 // Write ProcessLibraryDestructor list to autogen.c
1588 switch (CommonDefinition
.getModuleType(moduleType
)) {
1589 case CommonDefinition
.ModuleTypeBase
:
1590 case CommonDefinition
.ModuleTypePeiCore
:
1591 case CommonDefinition
.ModuleTypePeim
:
1593 case CommonDefinition
.ModuleTypeDxeCore
:
1594 case CommonDefinition
.ModuleTypeDxeDriver
:
1595 case CommonDefinition
.ModuleTypeDxeRuntimeDriver
:
1596 case CommonDefinition
.ModuleTypeDxeSmmDriver
:
1597 case CommonDefinition
.ModuleTypeDxeSalDriver
:
1598 case CommonDefinition
.ModuleTypeUefiDriver
:
1599 case CommonDefinition
.ModuleTypeUefiApplication
:
1600 fileBuffer
.append("VOID\r\n");
1601 fileBuffer
.append("EFIAPI\r\n");
1602 fileBuffer
.append("ProcessLibraryDestructorList (\r\n");
1603 fileBuffer
.append(" IN EFI_HANDLE ImageHandle,\r\n");
1604 fileBuffer
.append(" IN EFI_SYSTEM_TABLE *SystemTable\r\n");
1605 fileBuffer
.append(" )\r\n");
1606 fileBuffer
.append("{\r\n");
1608 // If no library destructor function, return EFI_SUCCESS.
1611 for (int i
= 0; i
< libInstanceList
.size(); i
++) {
1613 fileBuffer
.append(" EFI_STATUS Status;\r\n");
1614 fileBuffer
.append(" Status = EFI_SUCCESS;\r\n");
1615 fileBuffer
.append("\r\n");
1618 fileBuffer
.append(" Status = ");
1619 fileBuffer
.append(libInstanceList
.get(i
));
1620 fileBuffer
.append("(ImageHandle, SystemTable);\r\n");
1621 fileBuffer
.append(" ASSERT_EFI_ERROR (Status);\r\n");
1623 fileBuffer
.append("}\r\n");
1629 ExternsDriverBindingToAutoGenC
1631 This function is to write DRIVER_BINDING, COMPONENT_NAME,
1632 DRIVER_CONFIGURATION, DRIVER_DIAGNOSTIC in AutoGen.c.
1635 String buffer for AutoGen.c
1637 void ExternsDriverBindingToAutoGenC(StringBuffer fileBuffer
)
1638 throws EdkException
{
1641 // Get the arry of extern. The driverBindingGroup is a 2 dimension array.
1642 // The second dimension is include following element: DriverBinding,
1643 // ComponentName, DriverConfiguration, DriverDiag;
1645 String
[][] driverBindingGroup
= this.saq
.getExternProtocolGroup();
1653 // Write driver binding protocol extern to autogen.c
1655 for (int i
= 0; i
< driverBindingGroup
.length
; i
++) {
1656 if (driverBindingGroup
[i
][0] != null) {
1657 fileBuffer
.append("extern EFI_DRIVER_BINDING_PROTOCOL ");
1658 fileBuffer
.append(driverBindingGroup
[i
][0]);
1659 fileBuffer
.append(";\r\n");
1664 // Write component name protocol extern to autogen.c
1666 for (int i
= 0; i
< driverBindingGroup
.length
; i
++) {
1667 if (driverBindingGroup
[i
][1]!= null) {
1668 if (driverBindingGroup
[i
][0] != null) {
1670 fileBuffer
.append("extern EFI_COMPONENT_NAME_PROTOCOL ");
1671 fileBuffer
.append(driverBindingGroup
[i
][1]);
1672 fileBuffer
.append(";\r\n");
1674 throw new AutoGenException("DriverBinding can't be empty!!");
1680 // Write driver configration protocol extern to autogen.c
1682 for (int i
= 0; i
< driverBindingGroup
.length
; i
++) {
1683 if (driverBindingGroup
[i
][2] != null) {
1684 if (driverBindingGroup
[i
][0] != null) {
1686 fileBuffer
.append("extern EFI_DRIVER_CONFIGURATION_PROTOCOL ");
1687 fileBuffer
.append(driverBindingGroup
[i
][2]);
1688 fileBuffer
.append(";\r\n");
1690 throw new AutoGenException("DriverBinding can't be empty!!");
1696 // Write driver dignastic protocol extern to autogen.c
1698 for (int i
= 0; i
< driverBindingGroup
.length
; i
++) {
1699 if (driverBindingGroup
[i
][3] != null) {
1700 if (driverBindingGroup
[i
][0] != null) {
1702 fileBuffer
.append("extern EFI_DRIVER_DIAGNOSTICS_PROTOCOL ");
1703 fileBuffer
.append(driverBindingGroup
[i
][3]);
1704 fileBuffer
.append(";\r\n");
1706 throw new AutoGenException("DriverBinding can't be empty!!");
1712 // Write driver module protocol bitmask.
1715 .append("GLOBAL_REMOVE_IF_UNREFERENCED const UINT8 _gDriverModelProtocolBitmask = ");
1716 fileBuffer
.append(Integer
.toString(BitMask
));
1717 fileBuffer
.append(";\r\n");
1720 // Write driver module protocol list entry
1723 .append("GLOBAL_REMOVE_IF_UNREFERENCED const UINTN _gDriverModelProtocolListEntries = ");
1725 fileBuffer
.append(Integer
.toString(driverBindingGroup
.length
));
1726 fileBuffer
.append(";\r\n");
1729 // Write drive module protocol list to autogen.c
1731 if (driverBindingGroup
.length
> 0) {
1733 .append("GLOBAL_REMOVE_IF_UNREFERENCED const EFI_DRIVER_MODEL_PROTOCOL_LIST _gDriverModelProtocolList[] = {");
1737 for (int i
= 0; i
< driverBindingGroup
.length
; i
++) {
1739 fileBuffer
.append(",");
1742 fileBuffer
.append("\r\n {\r\n");
1743 fileBuffer
.append(" &");
1744 fileBuffer
.append(driverBindingGroup
[i
][0]);
1745 fileBuffer
.append(", \r\n");
1748 if (driverBindingGroup
[i
][1] != null) {
1749 fileBuffer
.append(" &");
1750 fileBuffer
.append(driverBindingGroup
[i
][1]);
1751 fileBuffer
.append(", \r\n");
1753 fileBuffer
.append(" NULL, \r\n");
1756 if (driverBindingGroup
[i
][2] != null) {
1757 fileBuffer
.append(" &");
1758 fileBuffer
.append(driverBindingGroup
[i
][2]);
1759 fileBuffer
.append(", \r\n");
1761 fileBuffer
.append(" NULL, \r\n");
1764 if (driverBindingGroup
[i
][3] != null) {
1765 fileBuffer
.append(" &");
1766 fileBuffer
.append(driverBindingGroup
[i
][3]);
1767 fileBuffer
.append(", \r\n");
1769 fileBuffer
.append(" NULL, \r\n");
1771 fileBuffer
.append(" }");
1774 if (driverBindingGroup
.length
> 0) {
1775 fileBuffer
.append("\r\n};\r\n");
1780 ExternCallBackToAutoGenC
1782 This function adds <SetVirtualAddressMapCallBack> and
1783 <ExitBootServicesCallBack> infomation to AutoGen.c
1786 String buffer for AutoGen.c
1787 @throws BuildException
1789 void ExternCallBackToAutoGenC(StringBuffer fileBuffer
)
1790 throws EdkException
{
1792 // Collect module's <SetVirtualAddressMapCallBack> and
1793 // <ExitBootServiceCallBack> and add to setVirtualAddList
1794 // exitBootServiceList.
1796 String
[] setVirtuals
= saq
.getSetVirtualAddressMapCallBackArray();
1797 String
[] exitBoots
= saq
.getExitBootServicesCallBackArray();
1798 if (setVirtuals
!= null) {
1799 for (int j
= 0; j
< setVirtuals
.length
; j
++) {
1800 this.setVirtalAddList
.add(setVirtuals
[j
]);
1803 if (exitBoots
!= null) {
1804 for (int k
= 0; k
< exitBoots
.length
; k
++) {
1805 this.exitBootServiceList
.add(exitBoots
[k
]);
1809 // Add c code in autogen.c which relate to <SetVirtualAddressMapCallBack>
1810 // and <ExitBootServicesCallBack>
1812 String moduleType
= this.moduleId
.getModuleType();
1813 switch (CommonDefinition
.getModuleType(moduleType
)) {
1814 case CommonDefinition
.ModuleTypeDxeDriver
:
1815 case CommonDefinition
.ModuleTypeDxeRuntimeDriver
:
1816 case CommonDefinition
.ModuleTypeDxeSalDriver
:
1817 case CommonDefinition
.ModuleTypeUefiDriver
:
1818 case CommonDefinition
.ModuleTypeUefiApplication
:
1820 // If moduleType is one of above, call setVirtualAddressToAutogenC,
1821 // and setExitBootServiceToAutogenC.
1823 setVirtualAddressToAutogenC(fileBuffer
);
1824 setExitBootServiceToAutogenC(fileBuffer
);
1832 copyFlashMapHToDebugDir
1834 This function is to copy the falshmap.h to debug directory and change
1835 its name to TianoR8FlashMap.h
1840 private void copyFlashMapHToDebugDir() throws AutoGenException
{
1842 File inFile
= new File(fvDir
+ File
.separatorChar
+ CommonDefinition
.FLASHMAPH
);
1843 int size
= (int)inFile
.length();
1844 byte[] buffer
= new byte[size
];
1845 File outFile
= new File (this.outputPath
+ File
.separatorChar
+ CommonDefinition
.TIANOR8PLASHMAPH
);
1847 // If TianoR8FlashMap.h existed and the flashMap.h don't change,
1850 if ((!outFile
.exists()) ||(inFile
.lastModified() - outFile
.lastModified()) >= 0) {
1851 if (inFile
.exists()) {
1853 FileInputStream fis
= new FileInputStream (inFile
);
1855 FileOutputStream fos
= new FileOutputStream(outFile
);
1859 } catch (IOException e
){
1860 throw new AutoGenException("The file, flashMap.h can't be open!");
1864 throw new AutoGenException("The file, flashMap.h doesn't exist!");
1870 This function first order the library instances, then collect
1871 library instance 's PPI, Protocol, GUID,
1872 SetVirtalAddressMapCallBack, ExitBootServiceCallBack, and
1873 Destructor, Constructor.
1878 private void collectLibInstanceInfo() throws EdkException
{
1881 String libConstructName
= null;
1882 String libDestructName
= null;
1883 String
[] setVirtuals
= null;
1884 String
[] exitBoots
= null;
1886 ModuleIdentification
[] libraryIdList
= saq
.getLibraryInstance(this.arch
);
1888 if (libraryIdList
!= null) {
1890 // Reorder library instance sequence.
1892 AutogenLibOrder libOrder
= new AutogenLibOrder(libraryIdList
,
1894 List
<ModuleIdentification
> orderList
= libOrder
1895 .orderLibInstance();
1897 if (orderList
!= null) {
1899 // Process library instance one by one.
1901 for (int i
= 0; i
< orderList
.size(); i
++) {
1904 // Get library instance basename.
1906 ModuleIdentification libInstanceId
= orderList
.get(i
);
1912 Map
<String
, XmlObject
> libDoc
= GlobalData
.getDoc(libInstanceId
, this.arch
);
1915 // Get <PPis>, <Protocols>, <Guids> list of this library
1918 String
[] ppiList
= saq
.getPpiArray(this.arch
);
1919 String
[] ppiNotifyList
= saq
.getPpiNotifyArray(this.arch
);
1920 String
[] protocolList
= saq
.getProtocolArray(this.arch
);
1921 String
[] protocolNotifyList
= saq
.getProtocolNotifyArray(this.arch
);
1922 String
[] guidList
= saq
.getGuidEntryArray(this.arch
);
1923 PackageIdentification
[] pkgList
= saq
.getDependencePkg(this.arch
);
1926 // Add those ppi, protocol, guid in global ppi,
1930 for (index
= 0; index
< ppiList
.length
; index
++) {
1931 this.mPpiList
.add(ppiList
[index
]);
1934 for (index
= 0; index
< ppiNotifyList
.length
; index
++) {
1935 this.mPpiList
.add(ppiNotifyList
[index
]);
1938 for (index
= 0; index
< protocolList
.length
; index
++) {
1939 this.mProtocolList
.add(protocolList
[index
]);
1942 for (index
= 0; index
< protocolNotifyList
.length
; index
++) {
1943 this.mProtocolList
.add(protocolNotifyList
[index
]);
1946 for (index
= 0; index
< guidList
.length
; index
++) {
1947 this.mGuidList
.add(guidList
[index
]);
1949 for (index
= 0; index
< pkgList
.length
; index
++) {
1950 if (!this.mDepPkgList
.contains(pkgList
[index
])) {
1951 this.mDepPkgList
.add(pkgList
[index
]);
1956 // If not yet parse this library instance's constructor
1957 // element,parse it.
1959 libConstructName
= saq
.getLibConstructorName();
1960 libDestructName
= saq
.getLibDestructorName();
1963 // Collect SetVirtualAddressMapCallBack and
1964 // ExitBootServiceCallBack.
1966 setVirtuals
= saq
.getSetVirtualAddressMapCallBackArray();
1967 exitBoots
= saq
.getExitBootServicesCallBackArray();
1968 if (setVirtuals
!= null) {
1969 for (int j
= 0; j
< setVirtuals
.length
; j
++) {
1970 this.setVirtalAddList
.add(setVirtuals
[j
]);
1973 if (exitBoots
!= null) {
1974 for (int k
= 0; k
< exitBoots
.length
; k
++) {
1975 this.exitBootServiceList
.add(exitBoots
[k
]);
1980 // Add dependent library instance constructor function.
1982 if (libConstructName
!= null) {
1983 this.libConstructList
.add(libConstructName
);
1986 // Add dependent library instance destructor fuction.
1988 if (libDestructName
!= null) {
1989 this.libDestructList
.add(libDestructName
);
1996 private void setVirtualAddressToAutogenC(StringBuffer fileBuffer
){
1998 // Entry point lib for these module types needs to know the count
2002 .append("\r\nGLOBAL_REMOVE_IF_UNREFERENCED const UINTN _gDriverSetVirtualAddressMapEventCount = ");
2005 // If the list is not valid or has no entries set count to zero else
2006 // set count to the number of valid entries
2010 if (this.setVirtalAddList
!= null) {
2011 for (i
= 0; i
< this.setVirtalAddList
.size(); i
++) {
2012 if (this.setVirtalAddList
.get(i
).equalsIgnoreCase("")) {
2019 fileBuffer
.append(Integer
.toString(Count
));
2020 fileBuffer
.append(";\r\n\r\n");
2021 if (this.setVirtalAddList
== null || this.setVirtalAddList
.size() == 0) {
2023 // No data so make a NULL list
2026 .append("\r\nGLOBAL_REMOVE_IF_UNREFERENCED const EFI_EVENT_NOTIFY _gDriverSetVirtualAddressMapEvent[] = {\r\n");
2027 fileBuffer
.append(" NULL\r\n");
2028 fileBuffer
.append("};\r\n\r\n");
2031 // Write SetVirtualAddressMap function definition.
2033 for (i
= 0; i
< this.setVirtalAddList
.size(); i
++) {
2034 if (this.setVirtalAddList
.get(i
).equalsIgnoreCase("")) {
2037 fileBuffer
.append("VOID\r\n");
2038 fileBuffer
.append("EFIAPI\r\n");
2039 fileBuffer
.append(this.setVirtalAddList
.get(i
));
2040 fileBuffer
.append(" (\r\n");
2041 fileBuffer
.append(" IN EFI_EVENT Event,\r\n");
2042 fileBuffer
.append(" IN VOID *Context\r\n");
2043 fileBuffer
.append(" );\r\n\r\n");
2047 // Write SetVirtualAddressMap entry point array.
2050 .append("\r\nGLOBAL_REMOVE_IF_UNREFERENCED const EFI_EVENT_NOTIFY _gDriverSetVirtualAddressMapEvent[] = {");
2051 for (i
= 0; i
< this.setVirtalAddList
.size(); i
++) {
2052 if (this.setVirtalAddList
.get(i
).equalsIgnoreCase("")) {
2057 fileBuffer
.append("\r\n ");
2059 fileBuffer
.append(",\r\n ");
2062 fileBuffer
.append(this.setVirtalAddList
.get(i
));
2065 // add the NULL at the end of _gDriverSetVirtualAddressMapEvent list.
2067 fileBuffer
.append(",\r\n NULL");
2068 fileBuffer
.append("\r\n};\r\n\r\n");
2073 private void setExitBootServiceToAutogenC(StringBuffer fileBuffer
){
2075 // Entry point lib for these module types needs to know the count.
2078 .append("\r\nGLOBAL_REMOVE_IF_UNREFERENCED const UINTN _gDriverExitBootServicesEventCount = ");
2081 // If the list is not valid or has no entries set count to zero else
2082 // set count to the number of valid entries.
2086 if (this.exitBootServiceList
!= null) {
2087 for (i
= 0; i
< this.exitBootServiceList
.size(); i
++) {
2088 if (this.exitBootServiceList
.get(i
).equalsIgnoreCase("")) {
2094 fileBuffer
.append(Integer
.toString(Count
));
2095 fileBuffer
.append(";\r\n\r\n");
2097 if (this.exitBootServiceList
== null || this.exitBootServiceList
.size() == 0) {
2099 // No data so make a NULL list.
2102 .append("\r\nGLOBAL_REMOVE_IF_UNREFERENCED const EFI_EVENT_NOTIFY _gDriverExitBootServicesEvent[] = {\r\n");
2103 fileBuffer
.append(" NULL\r\n");
2104 fileBuffer
.append("};\r\n\r\n");
2107 // Write DriverExitBootServices function definition.
2109 for (i
= 0; i
< this.exitBootServiceList
.size(); i
++) {
2110 if (this.exitBootServiceList
.get(i
).equalsIgnoreCase("")) {
2114 fileBuffer
.append("VOID\r\n");
2115 fileBuffer
.append("EFIAPI\r\n");
2116 fileBuffer
.append(this.exitBootServiceList
.get(i
));
2117 fileBuffer
.append(" (\r\n");
2118 fileBuffer
.append(" IN EFI_EVENT Event,\r\n");
2119 fileBuffer
.append(" IN VOID *Context\r\n");
2120 fileBuffer
.append(" );\r\n\r\n");
2124 // Write DriverExitBootServices entry point array.
2127 .append("\r\nGLOBAL_REMOVE_IF_UNREFERENCED const EFI_EVENT_NOTIFY _gDriverExitBootServicesEvent[] = {");
2128 for (i
= 0; i
< this.exitBootServiceList
.size(); i
++) {
2129 if (this.exitBootServiceList
.get(i
).equalsIgnoreCase("")) {
2134 fileBuffer
.append("\r\n ");
2136 fileBuffer
.append(",\r\n ");
2138 fileBuffer
.append(this.exitBootServiceList
.get(i
));
2141 fileBuffer
.append(",\r\n NULL");
2142 fileBuffer
.append("\r\n};\r\n\r\n");