]>
git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Source/Python/GenFds/AprioriSection.py
2 # process APRIORI file data and generate PEI/DXE APRIORI file
4 # Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>
6 # SPDX-License-Identifier: BSD-2-Clause-Patent
12 from __future__
import absolute_import
13 from struct
import pack
14 import Common
.LongFilePathOs
as os
15 from io
import BytesIO
16 from .FfsFileStatement
import FileStatement
17 from .GenFdsGlobalVariable
import GenFdsGlobalVariable
18 from Common
.StringUtils
import NormPath
19 from Common
.Misc
import SaveFileOnChange
, PathClass
20 from Common
.EdkLogger
import error
as EdkLoggerError
21 from Common
.BuildToolError
import RESOURCE_NOT_AVAILABLE
22 from Common
.DataType
import TAB_COMMON
24 DXE_APRIORI_GUID
= "FC510EE7-FFDC-11D4-BD41-0080C73C8881"
25 PEI_APRIORI_GUID
= "1B45CC0A-156A-428A-AF62-49864DA0E6E6"
27 ## process APRIORI file data and generate PEI/DXE APRIORI file
30 class AprioriSection (object):
33 # @param self The object pointer
36 self
.DefineVarDict
= {}
42 # Generate FFS for APRIORI file
44 # @param self The object pointer
45 # @param FvName for whom apriori file generated
46 # @param Dict dictionary contains macro and its value
47 # @retval string Generated file name
49 def GenFfs (self
, FvName
, Dict
= None, IsMakefile
= False):
53 if self
.AprioriType
== "PEI":
54 AprioriFileGuid
= PEI_APRIORI_GUID
56 AprioriFileGuid
= DXE_APRIORI_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
, 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
]
87 Inf
= GenFdsGlobalVariable
.WorkSpace
.BuildObject
[PathClass(InfFileName
, GenFdsGlobalVariable
.WorkSpaceDir
), TAB_COMMON
, GenFdsGlobalVariable
.TargetName
, GenFdsGlobalVariable
.ToolChainTag
]
90 if not Inf
.Module
.Binaries
:
91 EdkLoggerError("GenFds", RESOURCE_NOT_AVAILABLE
,
92 "INF %s not found in build ARCH %s!" \
93 % (InfFileName
, GenFdsGlobalVariable
.ArchList
))
95 GuidPart
= Guid
.split('-')
96 Buffer
.write(pack('I', int(GuidPart
[0], 16)))
97 Buffer
.write(pack('H', int(GuidPart
[1], 16)))
98 Buffer
.write(pack('H', int(GuidPart
[2], 16)))
101 Char
= GuidPart
[3][Num
*2:Num
*2+2]
102 Buffer
.write(pack('B', int(Char
, 16)))
105 Char
= GuidPart
[4][Num
*2:Num
*2+2]
106 Buffer
.write(pack('B', int(Char
, 16)))
108 SaveFileOnChange(OutputAprFileName
, Buffer
.getvalue())
110 RawSectionFileName
= os
.path
.join( OutputAprFilePath
, \
111 AprioriFileGuid
+ FvName
+ '.raw' )
116 MakefilePath
= InfFileName
, Arch
117 GenFdsGlobalVariable
.GenerateSection(RawSectionFileName
, [OutputAprFileName
], 'EFI_SECTION_RAW', IsMakefile
=IsMakefile
)
118 GenFdsGlobalVariable
.GenerateFfs(AprFfsFileName
, [RawSectionFileName
],
119 'EFI_FV_FILETYPE_FREEFORM', AprioriFileGuid
, MakefilePath
=MakefilePath
)
121 return AprFfsFileName