]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/Common/Edk2/Capsule/FmpPayloadHeader.py
BaseTools: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / BaseTools / Source / Python / Common / Edk2 / Capsule / FmpPayloadHeader.py
CommitLineData
8b63877a
KM
1## @file\r
2# Module that encodes and decodes a FMP_PAYLOAD_HEADER with a payload.\r
3# The FMP_PAYLOAD_HEADER is processed by the FmpPayloadHeaderLib in the\r
4# FmpDevicePkg.\r
5#\r
6# Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>\r
2e351cbe 7# SPDX-License-Identifier: BSD-2-Clause-Patent\r
8b63877a
KM
8#\r
9\r
10'''\r
11FmpPayloadHeader\r
12'''\r
13\r
14import struct\r
15\r
16def _SIGNATURE_32 (A, B, C, D):\r
17 return struct.unpack ('=I',bytearray (A + B + C + D, 'ascii'))[0]\r
18\r
19def _SIGNATURE_32_TO_STRING (Signature):\r
20 return struct.pack ("<I", Signature).decode ()\r
21\r
22class FmpPayloadHeaderClass (object):\r
23 #\r
24 # typedef struct {\r
25 # UINT32 Signature;\r
26 # UINT32 HeaderSize;\r
27 # UINT32 FwVersion;\r
28 # UINT32 LowestSupportedVersion;\r
29 # } FMP_PAYLOAD_HEADER;\r
30 #\r
31 # #define FMP_PAYLOAD_HEADER_SIGNATURE SIGNATURE_32 ('M', 'S', 'S', '1')\r
32 #\r
33 _StructFormat = '<IIII'\r
34 _StructSize = struct.calcsize (_StructFormat)\r
35\r
36 _FMP_PAYLOAD_HEADER_SIGNATURE = _SIGNATURE_32 ('M', 'S', 'S', '1')\r
37\r
38 def __init__ (self):\r
39 self._Valid = False\r
40 self.Signature = self._FMP_PAYLOAD_HEADER_SIGNATURE\r
41 self.HeaderSize = self._StructSize\r
42 self.FwVersion = 0x00000000\r
43 self.LowestSupportedVersion = 0x00000000\r
44 self.Payload = b''\r
45\r
46 def Encode (self):\r
47 FmpPayloadHeader = struct.pack (\r
48 self._StructFormat,\r
49 self.Signature,\r
50 self.HeaderSize,\r
51 self.FwVersion,\r
52 self.LowestSupportedVersion\r
53 )\r
54 self._Valid = True\r
55 return FmpPayloadHeader + self.Payload\r
56\r
57 def Decode (self, Buffer):\r
58 if len (Buffer) < self._StructSize:\r
59 raise ValueError\r
60 (Signature, HeaderSize, FwVersion, LowestSupportedVersion) = \\r
61 struct.unpack (\r
62 self._StructFormat,\r
63 Buffer[0:self._StructSize]\r
64 )\r
65 if Signature != self._FMP_PAYLOAD_HEADER_SIGNATURE:\r
66 raise ValueError\r
67 if HeaderSize < self._StructSize:\r
68 raise ValueError\r
69 self.Signature = Signature\r
70 self.HeaderSize = HeaderSize\r
71 self.FwVersion = FwVersion\r
72 self.LowestSupportedVersion = LowestSupportedVersion\r
73 self.Payload = Buffer[self.HeaderSize:]\r
74\r
75 self._Valid = True\r
76 return self.Payload\r
77\r
78 def DumpInfo (self):\r
79 if not self._Valid:\r
80 raise ValueError\r
81 print ('FMP_PAYLOAD_HEADER.Signature = {Signature:08X} ({SignatureString})'.format (Signature = self.Signature, SignatureString = _SIGNATURE_32_TO_STRING (self.Signature)))\r
82 print ('FMP_PAYLOAD_HEADER.HeaderSize = {HeaderSize:08X}'.format (HeaderSize = self.HeaderSize))\r
83 print ('FMP_PAYLOAD_HEADER.FwVersion = {FwVersion:08X}'.format (FwVersion = self.FwVersion))\r
84 print ('FMP_PAYLOAD_HEADER.LowestSupportedVersion = {LowestSupportedVersion:08X}'.format (LowestSupportedVersion = self.LowestSupportedVersion))\r
85 print ('sizeof (Payload) = {Size:08X}'.format (Size = len (self.Payload)))\r