]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/Common/Uefi/Capsule/UefiCapsuleHeader.py
BaseTools: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / BaseTools / Source / Python / Common / Uefi / Capsule / UefiCapsuleHeader.py
CommitLineData
8b63877a
KM
1## @file\r
2# Module that encodes and decodes a EFI_CAPSULE_HEADER with a payload\r
3#\r
4# Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>\r
2e351cbe 5# SPDX-License-Identifier: BSD-2-Clause-Patent\r
8b63877a
KM
6#\r
7\r
8'''\r
9UefiCapsuleHeader\r
10'''\r
11\r
12import struct\r
13import uuid\r
14\r
15class UefiCapsuleHeaderClass (object):\r
16 # typedef struct {\r
17 # ///\r
18 # /// A GUID that defines the contents of a capsule.\r
19 # ///\r
20 # EFI_GUID CapsuleGuid;\r
21 # ///\r
22 # /// The size of the capsule header. This may be larger than the size of\r
23 # /// the EFI_CAPSULE_HEADER since CapsuleGuid may imply\r
24 # /// extended header entries\r
25 # ///\r
26 # UINT32 HeaderSize;\r
27 # ///\r
28 # /// Bit-mapped list describing the capsule attributes. The Flag values\r
29 # /// of 0x0000 - 0xFFFF are defined by CapsuleGuid. Flag values\r
30 # /// of 0x10000 - 0xFFFFFFFF are defined by this specification\r
31 # ///\r
32 # UINT32 Flags;\r
33 # ///\r
34 # /// Size in bytes of the capsule.\r
35 # ///\r
36 # UINT32 CapsuleImageSize;\r
37 # } EFI_CAPSULE_HEADER;\r
38 #\r
39 # #define CAPSULE_FLAGS_PERSIST_ACROSS_RESET 0x00010000\r
40 # #define CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE 0x00020000\r
41 # #define CAPSULE_FLAGS_INITIATE_RESET 0x00040000\r
42 #\r
43 _StructFormat = '<16sIIII'\r
44 _StructSize = struct.calcsize (_StructFormat)\r
45\r
46 EFI_FIRMWARE_MANAGEMENT_CAPSULE_ID_GUID = uuid.UUID ('6DCBD5ED-E82D-4C44-BDA1-7194199AD92A')\r
47\r
48 _CAPSULE_FLAGS_PERSIST_ACROSS_RESET = 0x00010000\r
49 _CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE = 0x00020000\r
50 _CAPSULE_FLAGS_INITIATE_RESET = 0x00040000\r
51\r
52 def __init__ (self):\r
53 self._Valid = False\r
54 self.CapsuleGuid = self.EFI_FIRMWARE_MANAGEMENT_CAPSULE_ID_GUID\r
55 self.HeaderSize = self._StructSize\r
56 self.OemFlags = 0x0000\r
57 self.PersistAcrossReset = False\r
58 self.PopulateSystemTable = False\r
59 self.InitiateReset = False\r
60 self.CapsuleImageSize = self.HeaderSize\r
61 self.Payload = b''\r
62\r
63 def Encode (self):\r
64 Flags = self.OemFlags\r
65 if self.PersistAcrossReset:\r
66 Flags = Flags | self._CAPSULE_FLAGS_PERSIST_ACROSS_RESET\r
67 if self.PopulateSystemTable:\r
68 Flags = Flags | self._CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE\r
69 if self.InitiateReset:\r
70 Flags = Flags | self._CAPSULE_FLAGS_INITIATE_RESET\r
71\r
72 self.CapsuleImageSize = self.HeaderSize + len (self.Payload)\r
73\r
74 UefiCapsuleHeader = struct.pack (\r
75 self._StructFormat,\r
76 self.CapsuleGuid.bytes_le,\r
77 self.HeaderSize,\r
78 Flags,\r
79 self.CapsuleImageSize,\r
80 0\r
81 )\r
82 self._Valid = True\r
83 return UefiCapsuleHeader + self.Payload\r
84\r
85 def Decode (self, Buffer):\r
86 if len (Buffer) < self._StructSize:\r
87 raise ValueError\r
88 (CapsuleGuid, HeaderSize, Flags, CapsuleImageSize, Reserved) = \\r
89 struct.unpack (\r
90 self._StructFormat,\r
91 Buffer[0:self._StructSize]\r
92 )\r
93 if HeaderSize < self._StructSize:\r
94 raise ValueError\r
95 if CapsuleImageSize != len (Buffer):\r
96 raise ValueError\r
97 self.CapsuleGuid = uuid.UUID (bytes_le = CapsuleGuid)\r
98 self.HeaderSize = HeaderSize\r
99 self.OemFlags = Flags & 0xffff\r
100 self.PersistAcrossReset = (Flags & self._CAPSULE_FLAGS_PERSIST_ACROSS_RESET) != 0\r
101 self.PopulateSystemTable = (Flags & self._CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE) != 0\r
102 self.InitiateReset = (Flags & self._CAPSULE_FLAGS_INITIATE_RESET) != 0\r
103 self.CapsuleImageSize = CapsuleImageSize\r
104 self.Payload = Buffer[self.HeaderSize:]\r
105\r
106 self._Valid = True\r
107 return self.Payload\r
108\r
109 def DumpInfo (self):\r
110 if not self._Valid:\r
111 raise ValueError\r
112 Flags = self.OemFlags\r
113 if self.PersistAcrossReset:\r
114 Flags = Flags | self._CAPSULE_FLAGS_PERSIST_ACROSS_RESET\r
115 if self.PopulateSystemTable:\r
116 Flags = Flags | self._CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE\r
117 if self.InitiateReset:\r
118 Flags = Flags | self._CAPSULE_FLAGS_INITIATE_RESET\r
119 print ('EFI_CAPSULE_HEADER.CapsuleGuid = {Guid}'.format (Guid = str(self.CapsuleGuid).upper()))\r
120 print ('EFI_CAPSULE_HEADER.HeaderSize = {Size:08X}'.format (Size = self.HeaderSize))\r
121 print ('EFI_CAPSULE_HEADER.Flags = {Flags:08X}'.format (Flags = Flags))\r
122 print (' OEM Flags = {Flags:04X}'.format (Flags = self.OemFlags))\r
123 if self.PersistAcrossReset:\r
124 print (' CAPSULE_FLAGS_PERSIST_ACROSS_RESET')\r
125 if self.PopulateSystemTable:\r
126 print (' CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE')\r
127 if self.InitiateReset:\r
128 print (' CAPSULE_FLAGS_INITIATE_RESET')\r
129 print ('EFI_CAPSULE_HEADER.CapsuleImageSize = {Size:08X}'.format (Size = self.CapsuleImageSize))\r
130 print ('sizeof (Payload) = {Size:08X}'.format (Size = len (self.Payload)))\r