]> git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Source/Python/GenFds/AprioriSection.py
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / BaseTools / Source / Python / GenFds / AprioriSection.py
1 ## @file
2 # process APRIORI file data and generate PEI/DXE APRIORI file
3 #
4 # Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>
5 #
6 # SPDX-License-Identifier: BSD-2-Clause-Patent
7 #
8
9 ##
10 # Import Modules
11 #
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
23
24 DXE_APRIORI_GUID = "FC510EE7-FFDC-11D4-BD41-0080C73C8881"
25 PEI_APRIORI_GUID = "1B45CC0A-156A-428A-AF62-49864DA0E6E6"
26
27 ## process APRIORI file data and generate PEI/DXE APRIORI file
28 #
29 #
30 class AprioriSection (object):
31 ## The constructor
32 #
33 # @param self The object pointer
34 #
35 def __init__(self):
36 self.DefineVarDict = {}
37 self.FfsList = []
38 self.AprioriType = ""
39
40 ## GenFfs() method
41 #
42 # Generate FFS for APRIORI file
43 #
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
48 #
49 def GenFfs (self, FvName, Dict = None, IsMakefile = False):
50 if Dict is None:
51 Dict = {}
52 Buffer = BytesIO()
53 if self.AprioriType == "PEI":
54 AprioriFileGuid = PEI_APRIORI_GUID
55 else:
56 AprioriFileGuid = DXE_APRIORI_GUID
57
58 OutputAprFilePath = os.path.join (GenFdsGlobalVariable.WorkSpaceDir, \
59 GenFdsGlobalVariable.FfsDir,\
60 AprioriFileGuid + FvName)
61 if not os.path.exists(OutputAprFilePath):
62 os.makedirs(OutputAprFilePath)
63
64 OutputAprFileName = os.path.join( OutputAprFilePath, \
65 AprioriFileGuid + FvName + '.Apri' )
66 AprFfsFileName = os.path.join (OutputAprFilePath,\
67 AprioriFileGuid + FvName + '.Ffs')
68
69 Dict.update(self.DefineVarDict)
70 InfFileName = None
71 for FfsObj in self.FfsList:
72 Guid = ""
73 if isinstance(FfsObj, FileStatement):
74 Guid = FfsObj.NameGuid
75 else:
76 InfFileName = NormPath(FfsObj.InfFileName)
77 Arch = FfsObj.GetCurrentArch()
78
79 if Arch:
80 Dict['$(ARCH)'] = Arch
81 InfFileName = GenFdsGlobalVariable.MacroExtend(InfFileName, Dict, Arch)
82
83 if Arch:
84 Inf = GenFdsGlobalVariable.WorkSpace.BuildObject[PathClass(InfFileName, GenFdsGlobalVariable.WorkSpaceDir), Arch, GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag]
85 Guid = Inf.Guid
86 else:
87 Inf = GenFdsGlobalVariable.WorkSpace.BuildObject[PathClass(InfFileName, GenFdsGlobalVariable.WorkSpaceDir), TAB_COMMON, GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag]
88 Guid = Inf.Guid
89
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))
94
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)))
99
100 for Num in range(2):
101 Char = GuidPart[3][Num*2:Num*2+2]
102 Buffer.write(pack('B', int(Char, 16)))
103
104 for Num in range(6):
105 Char = GuidPart[4][Num*2:Num*2+2]
106 Buffer.write(pack('B', int(Char, 16)))
107
108 SaveFileOnChange(OutputAprFileName, Buffer.getvalue())
109
110 RawSectionFileName = os.path.join( OutputAprFilePath, \
111 AprioriFileGuid + FvName + '.raw' )
112 MakefilePath = None
113 if IsMakefile:
114 if not InfFileName:
115 return None
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)
120
121 return AprFfsFileName