- 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