]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/Common/Uefi/Capsule/UefiCapsuleHeader.py
BaseTools/Capsule: Add Capsule Generation Tools
[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
5# This program and the accompanying materials\r
6# are licensed and made available under the terms and conditions of the BSD License\r
7# which accompanies this distribution. The full text of the license may be found at\r
8# http://opensource.org/licenses/bsd-license.php\r
9#\r
10# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12#\r
13\r
14'''\r
15UefiCapsuleHeader\r
16'''\r
17\r
18import struct\r
19import uuid\r
20\r
21class UefiCapsuleHeaderClass (object):\r
22 # typedef struct {\r
23 # ///\r
24 # /// A GUID that defines the contents of a capsule.\r
25 # ///\r
26 # EFI_GUID CapsuleGuid;\r
27 # ///\r
28 # /// The size of the capsule header. This may be larger than the size of\r
29 # /// the EFI_CAPSULE_HEADER since CapsuleGuid may imply\r
30 # /// extended header entries\r
31 # ///\r
32 # UINT32 HeaderSize;\r
33 # ///\r
34 # /// Bit-mapped list describing the capsule attributes. The Flag values\r
35 # /// of 0x0000 - 0xFFFF are defined by CapsuleGuid. Flag values\r
36 # /// of 0x10000 - 0xFFFFFFFF are defined by this specification\r
37 # ///\r
38 # UINT32 Flags;\r
39 # ///\r
40 # /// Size in bytes of the capsule.\r
41 # ///\r
42 # UINT32 CapsuleImageSize;\r
43 # } EFI_CAPSULE_HEADER;\r
44 #\r
45 # #define CAPSULE_FLAGS_PERSIST_ACROSS_RESET 0x00010000\r
46 # #define CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE 0x00020000\r
47 # #define CAPSULE_FLAGS_INITIATE_RESET 0x00040000\r
48 #\r
49 _StructFormat = '<16sIIII'\r
50 _StructSize = struct.calcsize (_StructFormat)\r
51\r
52 EFI_FIRMWARE_MANAGEMENT_CAPSULE_ID_GUID = uuid.UUID ('6DCBD5ED-E82D-4C44-BDA1-7194199AD92A')\r
53\r
54 _CAPSULE_FLAGS_PERSIST_ACROSS_RESET = 0x00010000\r
55 _CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE = 0x00020000\r
56 _CAPSULE_FLAGS_INITIATE_RESET = 0x00040000\r
57\r
58 def __init__ (self):\r
59 self._Valid = False\r
60 self.CapsuleGuid = self.EFI_FIRMWARE_MANAGEMENT_CAPSULE_ID_GUID\r
61 self.HeaderSize = self._StructSize\r
62 self.OemFlags = 0x0000\r
63 self.PersistAcrossReset = False\r
64 self.PopulateSystemTable = False\r
65 self.InitiateReset = False\r
66 self.CapsuleImageSize = self.HeaderSize\r
67 self.Payload = b''\r
68\r
69 def Encode (self):\r
70 Flags = self.OemFlags\r
71 if self.PersistAcrossReset:\r
72 Flags = Flags | self._CAPSULE_FLAGS_PERSIST_ACROSS_RESET\r
73 if self.PopulateSystemTable:\r
74 Flags = Flags | self._CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE\r
75 if self.InitiateReset:\r
76 Flags = Flags | self._CAPSULE_FLAGS_INITIATE_RESET\r
77\r
78 self.CapsuleImageSize = self.HeaderSize + len (self.Payload)\r
79\r
80 UefiCapsuleHeader = struct.pack (\r
81 self._StructFormat,\r
82 self.CapsuleGuid.bytes_le,\r
83 self.HeaderSize,\r
84 Flags,\r
85 self.CapsuleImageSize,\r
86 0\r
87 )\r
88 self._Valid = True\r
89 return UefiCapsuleHeader + self.Payload\r
90\r
91 def Decode (self, Buffer):\r
92 if len (Buffer) < self._StructSize:\r
93 raise ValueError\r
94 (CapsuleGuid, HeaderSize, Flags, CapsuleImageSize, Reserved) = \\r
95 struct.unpack (\r
96 self._StructFormat,\r
97 Buffer[0:self._StructSize]\r
98 )\r
99 if HeaderSize < self._StructSize:\r
100 raise ValueError\r
101 if CapsuleImageSize != len (Buffer):\r
102 raise ValueError\r
103 self.CapsuleGuid = uuid.UUID (bytes_le = CapsuleGuid)\r
104 self.HeaderSize = HeaderSize\r
105 self.OemFlags = Flags & 0xffff\r
106 self.PersistAcrossReset = (Flags & self._CAPSULE_FLAGS_PERSIST_ACROSS_RESET) != 0\r
107 self.PopulateSystemTable = (Flags & self._CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE) != 0\r
108 self.InitiateReset = (Flags & self._CAPSULE_FLAGS_INITIATE_RESET) != 0\r
109 self.CapsuleImageSize = CapsuleImageSize\r
110 self.Payload = Buffer[self.HeaderSize:]\r
111\r
112 self._Valid = True\r
113 return self.Payload\r
114\r
115 def DumpInfo (self):\r
116 if not self._Valid:\r
117 raise ValueError\r
118 Flags = self.OemFlags\r
119 if self.PersistAcrossReset:\r
120 Flags = Flags | self._CAPSULE_FLAGS_PERSIST_ACROSS_RESET\r
121 if self.PopulateSystemTable:\r
122 Flags = Flags | self._CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE\r
123 if self.InitiateReset:\r
124 Flags = Flags | self._CAPSULE_FLAGS_INITIATE_RESET\r
125 print ('EFI_CAPSULE_HEADER.CapsuleGuid = {Guid}'.format (Guid = str(self.CapsuleGuid).upper()))\r
126 print ('EFI_CAPSULE_HEADER.HeaderSize = {Size:08X}'.format (Size = self.HeaderSize))\r
127 print ('EFI_CAPSULE_HEADER.Flags = {Flags:08X}'.format (Flags = Flags))\r
128 print (' OEM Flags = {Flags:04X}'.format (Flags = self.OemFlags))\r
129 if self.PersistAcrossReset:\r
130 print (' CAPSULE_FLAGS_PERSIST_ACROSS_RESET')\r
131 if self.PopulateSystemTable:\r
132 print (' CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE')\r
133 if self.InitiateReset:\r
134 print (' CAPSULE_FLAGS_INITIATE_RESET')\r
135 print ('EFI_CAPSULE_HEADER.CapsuleImageSize = {Size:08X}'.format (Size = self.CapsuleImageSize))\r
136 print ('sizeof (Payload) = {Size:08X}'.format (Size = len (self.Payload)))\r