]>
git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Source/Python/GenFds/Fd.py
973936b6f273a2a36774581bf35625810e97e174
2 # process FD generation
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
15 import Common
.LongFilePathOs
as os
16 from io
import BytesIO
19 from .GenFdsGlobalVariable
import GenFdsGlobalVariable
20 from CommonDataClass
.FdfClass
import FDClassObject
21 from Common
import EdkLogger
22 from Common
.BuildToolError
import *
23 from Common
.Misc
import SaveFileOnChange
24 from Common
.DataType
import BINARY_FILE_TYPE_FV
29 class FD(FDClassObject
):
32 # @param self The object pointer
35 FDClassObject
.__init
__(self
)
41 # @retval string Generated FD file name
43 def GenFd (self
, Flag
= False):
44 if self
.FdUiName
.upper() + 'fd' in GenFdsGlobalVariable
.ImageBinDict
:
45 return GenFdsGlobalVariable
.ImageBinDict
[self
.FdUiName
.upper() + 'fd']
50 FdFileName
= os
.path
.join(GenFdsGlobalVariable
.FvDir
, self
.FdUiName
+ '.fd')
52 GenFdsGlobalVariable
.InfLogger("\nFd File Name:%s (%s)" %(self
.FdUiName
, FdFileName
))
55 for item
in self
.BlockSizeList
:
56 Offset
= Offset
+ item
[0] * item
[1]
57 if Offset
!= self
.Size
:
58 EdkLogger
.error("GenFds", GENFDS_ERROR
, 'FD %s Size not consistent with block array' % self
.FdUiName
)
59 GenFdsGlobalVariable
.VerboseLogger('Following Fv will be add to Fd !!!')
60 for FvObj
in GenFdsGlobalVariable
.FdfParser
.Profile
.FvDict
:
61 GenFdsGlobalVariable
.VerboseLogger(FvObj
)
63 HasCapsuleRegion
= False
64 for RegionObj
in self
.RegionList
:
65 if RegionObj
.RegionType
== 'CAPSULE':
66 HasCapsuleRegion
= True
69 TempFdBuffer
= BytesIO()
70 PreviousRegionStart
= -1
71 PreviousRegionSize
= 1
73 for RegionObj
in self
.RegionList
:
74 if RegionObj
.RegionType
== 'CAPSULE':
76 if RegionObj
.Offset
+ RegionObj
.Size
<= PreviousRegionStart
:
78 elif RegionObj
.Offset
<= PreviousRegionStart
or (RegionObj
.Offset
>=PreviousRegionStart
and RegionObj
.Offset
< PreviousRegionStart
+ PreviousRegionSize
):
80 elif RegionObj
.Offset
> PreviousRegionStart
+ PreviousRegionSize
:
82 GenFdsGlobalVariable
.InfLogger('Padding region starting from offset 0x%X, with size 0x%X' %(PreviousRegionStart
+ PreviousRegionSize
, RegionObj
.Offset
- (PreviousRegionStart
+ PreviousRegionSize
)))
83 PadRegion
= Region
.Region()
84 PadRegion
.Offset
= PreviousRegionStart
+ PreviousRegionSize
85 PadRegion
.Size
= RegionObj
.Offset
- PadRegion
.Offset
87 PadRegion
.AddToBuffer(TempFdBuffer
, self
.BaseAddress
, self
.BlockSizeList
, self
.ErasePolarity
, GenFdsGlobalVariable
.ImageBinDict
, self
.DefineVarDict
)
88 PreviousRegionStart
= RegionObj
.Offset
89 PreviousRegionSize
= RegionObj
.Size
91 # Call each region's AddToBuffer function
93 if PreviousRegionSize
> self
.Size
:
95 GenFdsGlobalVariable
.VerboseLogger('Call each region\'s AddToBuffer function')
96 RegionObj
.AddToBuffer (TempFdBuffer
, self
.BaseAddress
, self
.BlockSizeList
, self
.ErasePolarity
, GenFdsGlobalVariable
.ImageBinDict
, self
.DefineVarDict
)
99 PreviousRegionStart
= -1
100 PreviousRegionSize
= 1
101 for RegionObj
in self
.RegionList
:
102 if RegionObj
.Offset
+ RegionObj
.Size
<= PreviousRegionStart
:
103 EdkLogger
.error("GenFds", GENFDS_ERROR
,
104 'Region offset 0x%X in wrong order with Region starting from 0x%X, size 0x%X\nRegions in FDF must have offsets appear in ascending order.'\
105 % (RegionObj
.Offset
, PreviousRegionStart
, PreviousRegionSize
))
106 elif RegionObj
.Offset
<= PreviousRegionStart
or (RegionObj
.Offset
>=PreviousRegionStart
and RegionObj
.Offset
< PreviousRegionStart
+ PreviousRegionSize
):
107 EdkLogger
.error("GenFds", GENFDS_ERROR
,
108 'Region offset 0x%X overlaps with Region starting from 0x%X, size 0x%X' \
109 % (RegionObj
.Offset
, PreviousRegionStart
, PreviousRegionSize
))
110 elif RegionObj
.Offset
> PreviousRegionStart
+ PreviousRegionSize
:
112 GenFdsGlobalVariable
.InfLogger('Padding region starting from offset 0x%X, with size 0x%X' %(PreviousRegionStart
+ PreviousRegionSize
, RegionObj
.Offset
- (PreviousRegionStart
+ PreviousRegionSize
)))
113 PadRegion
= Region
.Region()
114 PadRegion
.Offset
= PreviousRegionStart
+ PreviousRegionSize
115 PadRegion
.Size
= RegionObj
.Offset
- PadRegion
.Offset
117 PadRegion
.AddToBuffer(FdBuffer
, self
.BaseAddress
, self
.BlockSizeList
, self
.ErasePolarity
, GenFdsGlobalVariable
.ImageBinDict
, self
.DefineVarDict
)
118 PreviousRegionStart
= RegionObj
.Offset
119 PreviousRegionSize
= RegionObj
.Size
121 # Verify current region fits within allocated FD section Size
123 if PreviousRegionStart
+ PreviousRegionSize
> self
.Size
:
124 EdkLogger
.error("GenFds", GENFDS_ERROR
,
125 'FD %s size too small to fit region with offset 0x%X and size 0x%X'
126 % (self
.FdUiName
, PreviousRegionStart
, PreviousRegionSize
))
128 # Call each region's AddToBuffer function
130 GenFdsGlobalVariable
.VerboseLogger('Call each region\'s AddToBuffer function')
131 RegionObj
.AddToBuffer (FdBuffer
, self
.BaseAddress
, self
.BlockSizeList
, self
.ErasePolarity
, GenFdsGlobalVariable
.ImageBinDict
, self
.DefineVarDict
, Flag
=Flag
)
133 # Write the buffer contents to Fd file
135 GenFdsGlobalVariable
.VerboseLogger('Write the buffer contents to Fd file')
137 SaveFileOnChange(FdFileName
, FdBuffer
.getvalue())
139 GenFdsGlobalVariable
.ImageBinDict
[self
.FdUiName
.upper() + 'fd'] = FdFileName
142 ## generate flash map file
144 # @param self The object pointer
146 def GenFlashMap (self
):