]>
Commit | Line | Data |
---|---|---|
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 | |
11 | FmpPayloadHeader\r | |
12 | '''\r | |
13 | \r | |
14 | import struct\r | |
15 | \r | |
16 | def _SIGNATURE_32 (A, B, C, D):\r | |
17 | return struct.unpack ('=I',bytearray (A + B + C + D, 'ascii'))[0]\r | |
18 | \r | |
19 | def _SIGNATURE_32_TO_STRING (Signature):\r | |
20 | return struct.pack ("<I", Signature).decode ()\r | |
21 | \r | |
22 | class 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 |