+ if IsUpdSect and AutoAlign:\r
+ ItemLength = int(ConfigDict['length'])\r
+ ItemOffset = int(ConfigDict['offset'])\r
+ ItemStruct = ConfigDict['struct']\r
+ Unit = 1\r
+ if ItemLength in [1, 2, 4, 8] and not ConfigDict['value'].startswith('{'):\r
+ Unit = ItemLength\r
+ # If there are 64 bit unit, align to 64\r
+ if Unit == 8:\r
+ MaxAlign = 64\r
+ SizeAlign = 8\r
+ if ItemStruct != '':\r
+ UnitDict = {'UINT8':1, 'UINT16':2, 'UINT32':4, 'UINT64':8}\r
+ if ItemStruct in ['UINT8', 'UINT16', 'UINT32', 'UINT64']:\r
+ Unit = UnitDict[ItemStruct]\r
+ # If there are 64 bit unit, align to 64\r
+ if Unit == 8:\r
+ MaxAlign = 64\r
+ SizeAlign = max(SizeAlign, Unit)\r
+ if (ConfigDict['embed'].find(':START') != -1):\r
+ Base = ItemOffset\r
+ SubOffset = ItemOffset - Base\r
+ SubRemainder = SubOffset % Unit\r
+ if SubRemainder:\r
+ Diff = Unit - SubRemainder\r
+ Offset = Offset + Diff\r
+ ItemOffset = ItemOffset + Diff\r
+\r
+ if (ConfigDict['embed'].find(':END') != -1):\r
+ Remainder = Offset % (MaxAlign/8) # MaxAlign is either 32 or 64\r
+ if Remainder:\r
+ Diff = (MaxAlign/8) - Remainder\r
+ Offset = Offset + Diff\r
+ ItemOffset = ItemOffset + Diff\r
+ MaxAlign = 32 # Reset to default 32 align when struct end\r
+ if (ConfigDict['cname'] == 'UpdTerminator'):\r
+ # ItemLength is the size of UpdTerminator\r
+ # Itemlength might be 16, 32, or 64\r
+ # Struct align to 64 if UpdTerminator\r
+ # or struct size is 64 bit, else align to 32\r
+ Remainder = Offset % max(ItemLength/8, 4, SizeAlign)\r
+ Offset = Offset + ItemLength\r
+ if Remainder:\r
+ Diff = max(ItemLength/8, 4, SizeAlign) - Remainder\r
+ ItemOffset = ItemOffset + Diff\r
+ ConfigDict['offset'] = ItemOffset\r