2 # process APRIORI file data and generate PEI/DXE APRIORI file
4 # Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>
6 # This program and the accompanying materials
7 # are licensed and made available under the terms and conditions of the BSD License
8 # which accompanies this distribution. The full text of the license may be found at
9 # http://opensource.org/licenses/bsd-license.php
11 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
19 import Common
.LongFilePathOs
as os
20 from io
import BytesIO
21 from . import FfsFileStatement
22 from .GenFdsGlobalVariable
import GenFdsGlobalVariable
23 from CommonDataClass
.FdfClass
import AprioriSectionClassObject
24 from Common
.StringUtils
import *
25 from Common
.Misc
import SaveFileOnChange
, PathClass
26 from Common
import EdkLogger
27 from Common
.BuildToolError
import *
28 from Common
.DataType
import TAB_COMMON
30 ## process APRIORI file data and generate PEI/DXE APRIORI file
33 class AprioriSection (AprioriSectionClassObject
):
36 # @param self The object pointer
39 AprioriSectionClassObject
.__init
__(self
)
44 # Generate FFS for APRIORI file
46 # @param self The object pointer
47 # @param FvName for whom apriori file generated
48 # @param Dict dictionary contains macro and its value
49 # @retval string Generated file name
51 def GenFfs (self
, FvName
, Dict
= {}, IsMakefile
= False):
52 DXE_GUID
= "FC510EE7-FFDC-11D4-BD41-0080C73C8881"
53 PEI_GUID
= "1B45CC0A-156A-428A-AF62-49864DA0E6E6"
55 AprioriFileGuid
= DXE_GUID
56 if self
.AprioriType
== "PEI":
57 AprioriFileGuid
= PEI_GUID
58 OutputAprFilePath
= os
.path
.join (GenFdsGlobalVariable
.WorkSpaceDir
, \
59 GenFdsGlobalVariable
.FfsDir
,\
60 AprioriFileGuid
+ FvName
)
61 if not os
.path
.exists(OutputAprFilePath
) :
62 os
.makedirs(OutputAprFilePath
)
64 OutputAprFileName
= os
.path
.join( OutputAprFilePath
, \
65 AprioriFileGuid
+ FvName
+ '.Apri' )
66 AprFfsFileName
= os
.path
.join (OutputAprFilePath
,\
67 AprioriFileGuid
+ FvName
+ '.Ffs')
69 Dict
.update(self
.DefineVarDict
)
71 for FfsObj
in self
.FfsList
:
73 if isinstance(FfsObj
, FfsFileStatement
.FileStatement
):
74 Guid
= FfsObj
.NameGuid
76 InfFileName
= NormPath(FfsObj
.InfFileName
)
77 Arch
= FfsObj
.GetCurrentArch()
80 Dict
['$(ARCH)'] = Arch
81 InfFileName
= GenFdsGlobalVariable
.MacroExtend(InfFileName
, Dict
, Arch
)
84 Inf
= GenFdsGlobalVariable
.WorkSpace
.BuildObject
[PathClass(InfFileName
, GenFdsGlobalVariable
.WorkSpaceDir
), Arch
, GenFdsGlobalVariable
.TargetName
, GenFdsGlobalVariable
.ToolChainTag
]
88 Inf
= GenFdsGlobalVariable
.WorkSpace
.BuildObject
[PathClass(InfFileName
, GenFdsGlobalVariable
.WorkSpaceDir
), TAB_COMMON
, GenFdsGlobalVariable
.TargetName
, GenFdsGlobalVariable
.ToolChainTag
]
91 self
.BinFileList
= Inf
.Module
.Binaries
92 if self
.BinFileList
== []:
93 EdkLogger
.error("GenFds", RESOURCE_NOT_AVAILABLE
,
94 "INF %s not found in build ARCH %s!" \
95 % (InfFileName
, GenFdsGlobalVariable
.ArchList
))
98 GuidPart
= Guid
.split('-')
99 Buffer
.write(pack('I', long(GuidPart
[0], 16)))
100 Buffer
.write(pack('H', int(GuidPart
[1], 16)))
101 Buffer
.write(pack('H', int(GuidPart
[2], 16)))
104 Char
= GuidPart
[3][Num
*2:Num
*2+2]
105 Buffer
.write(pack('B', int(Char
, 16)))
108 Char
= GuidPart
[4][Num
*2:Num
*2+2]
109 Buffer
.write(pack('B', int(Char
, 16)))
111 SaveFileOnChange(OutputAprFileName
, Buffer
.getvalue())
113 RawSectionFileName
= os
.path
.join( OutputAprFilePath
, \
114 AprioriFileGuid
+ FvName
+ '.raw' )
119 MakefilePath
= InfFileName
, Arch
120 GenFdsGlobalVariable
.GenerateSection(RawSectionFileName
, [OutputAprFileName
], 'EFI_SECTION_RAW', IsMakefile
=IsMakefile
)
121 GenFdsGlobalVariable
.GenerateFfs(AprFfsFileName
, [RawSectionFileName
],
122 'EFI_FV_FILETYPE_FREEFORM', AprioriFileGuid
, MakefilePath
=MakefilePath
)
124 return AprFfsFileName