]> git.proxmox.com Git - mirror_edk2.git/blame - FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayloadHeaderLib.c
FmpDevicePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / FmpDevicePkg / Library / FmpPayloadHeaderLibV1 / FmpPayloadHeaderLib.c
CommitLineData
a6d73269 1/** @file\r
403d4bcd
KM
2 Provides services to retrieve values from Version 1 of a capsule's FMP Payload\r
3 Header. The FMP Payload Header structure is not defined in the library class.\r
4 Instead, services are provided to retrieve information from the FMP Payload\r
5 Header. If information is added to the FMP Payload Header, then new services\r
6 may be added to this library class to retrieve the new information.\r
7\r
8 Copyright (c) 2016, Microsoft Corporation. All rights reserved.<BR>\r
9 Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>\r
10\r
bcef758c 11 SPDX-License-Identifier: BSD-2-Clause-Patent\r
403d4bcd
KM
12\r
13**/\r
14\r
15#include <PiDxe.h>\r
16#include <Library/FmpPayloadHeaderLib.h>\r
17\r
18///\r
19/// Define FMP Payload Header structure here so it is not public\r
20///\r
21\r
22#pragma pack(1)\r
23\r
24typedef 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#pragma pack()\r
32\r
33///\r
34/// Identifier is used to make sure the data in the header is for this structure\r
35/// and version. If the structure changes update the last digit.\r
36///\r
37#define FMP_PAYLOAD_HEADER_SIGNATURE SIGNATURE_32 ('M', 'S', 'S', '1')\r
38\r
39/**\r
40 Returns the FMP Payload Header size in bytes.\r
41\r
42 @param[in] Header FMP Payload Header to evaluate\r
43 @param[in] FmpPayloadSize Size of FMP payload\r
44 @param[out] Size The size, in bytes, of the FMP Payload Header.\r
45\r
46 @retval EFI_SUCCESS The firmware version was returned.\r
47 @retval EFI_INVALID_PARAMETER Header is NULL.\r
48 @retval EFI_INVALID_PARAMETER Size is NULL.\r
49 @retval EFI_INVALID_PARAMETER Header is not a valid FMP Payload Header.\r
50\r
51**/\r
52EFI_STATUS\r
53EFIAPI\r
54GetFmpPayloadHeaderSize (\r
55 IN CONST VOID *Header,\r
56 IN CONST UINTN FmpPayloadSize,\r
57 OUT UINT32 *Size\r
58 )\r
59{\r
60 FMP_PAYLOAD_HEADER *FmpPayloadHeader;\r
61\r
62 FmpPayloadHeader = NULL;\r
63\r
64 if (Header == NULL || Size == NULL) {\r
65 return EFI_INVALID_PARAMETER;\r
66 }\r
67\r
68 FmpPayloadHeader = (FMP_PAYLOAD_HEADER *)Header;\r
69 if ((UINTN)FmpPayloadHeader + sizeof (FMP_PAYLOAD_HEADER) < (UINTN)FmpPayloadHeader ||\r
70 (UINTN)FmpPayloadHeader + sizeof (FMP_PAYLOAD_HEADER) >= (UINTN)FmpPayloadHeader + FmpPayloadSize ||\r
71 FmpPayloadHeader->HeaderSize < sizeof (FMP_PAYLOAD_HEADER)) {\r
72 return EFI_INVALID_PARAMETER;\r
73 }\r
74\r
75 if (FmpPayloadHeader->Signature != FMP_PAYLOAD_HEADER_SIGNATURE) {\r
76 return EFI_INVALID_PARAMETER;\r
77 }\r
78\r
79 *Size = FmpPayloadHeader->HeaderSize;\r
80 return EFI_SUCCESS;\r
81}\r
82\r
83/**\r
84 Returns the version described in the FMP Payload Header.\r
85\r
86 @param[in] Header FMP Payload Header to evaluate\r
87 @param[in] FmpPayloadSize Size of FMP payload\r
88 @param[out] Version The firmware version described in the FMP Payload\r
89 Header.\r
90\r
91 @retval EFI_SUCCESS The firmware version was returned.\r
92 @retval EFI_INVALID_PARAMETER Header is NULL.\r
93 @retval EFI_INVALID_PARAMETER Version is NULL.\r
94 @retval EFI_INVALID_PARAMETER Header is not a valid FMP Payload Header.\r
95\r
96**/\r
97EFI_STATUS\r
98EFIAPI\r
99GetFmpPayloadHeaderVersion (\r
100 IN CONST VOID *Header,\r
101 IN CONST UINTN FmpPayloadSize,\r
102 OUT UINT32 *Version\r
103 )\r
104{\r
105 FMP_PAYLOAD_HEADER *FmpPayloadHeader;\r
106\r
107 FmpPayloadHeader = NULL;\r
108\r
109 if (Header == NULL || Version == NULL) {\r
110 return EFI_INVALID_PARAMETER;\r
111 }\r
112\r
113 FmpPayloadHeader = (FMP_PAYLOAD_HEADER *)Header;\r
114 if ((UINTN)FmpPayloadHeader + sizeof (FMP_PAYLOAD_HEADER) < (UINTN)FmpPayloadHeader ||\r
115 (UINTN)FmpPayloadHeader + sizeof (FMP_PAYLOAD_HEADER) >= (UINTN)FmpPayloadHeader + FmpPayloadSize ||\r
116 FmpPayloadHeader->HeaderSize < sizeof (FMP_PAYLOAD_HEADER)) {\r
117 return EFI_INVALID_PARAMETER;\r
118 }\r
119\r
120 if (FmpPayloadHeader->Signature != FMP_PAYLOAD_HEADER_SIGNATURE) {\r
121 return EFI_INVALID_PARAMETER;\r
122 }\r
123\r
124 *Version = FmpPayloadHeader->FwVersion;\r
125 return EFI_SUCCESS;\r
126}\r
127\r
128/**\r
129 Returns the lowest supported version described in the FMP Payload Header.\r
130\r
131 @param[in] Header FMP Payload Header to evaluate\r
132 @param[in] FmpPayloadSize Size of FMP payload\r
133 @param[out] LowestSupportedVersion The lowest supported version described in\r
134 the FMP Payload Header.\r
135\r
136 @retval EFI_SUCCESS The lowest support version was returned.\r
137 @retval EFI_INVALID_PARAMETER Header is NULL.\r
138 @retval EFI_INVALID_PARAMETER LowestSupportedVersion is NULL.\r
139 @retval EFI_INVALID_PARAMETER Header is not a valid FMP Payload Header.\r
140\r
141**/\r
142EFI_STATUS\r
143EFIAPI\r
144GetFmpPayloadHeaderLowestSupportedVersion (\r
a6d73269
SZ
145 IN CONST VOID *Header,\r
146 IN CONST UINTN FmpPayloadSize,\r
147 OUT UINT32 *LowestSupportedVersion\r
403d4bcd
KM
148 )\r
149{\r
150 FMP_PAYLOAD_HEADER *FmpPayloadHeader;\r
151\r
152 FmpPayloadHeader = NULL;\r
153\r
154 if (Header == NULL || LowestSupportedVersion == NULL) {\r
155 return EFI_INVALID_PARAMETER;\r
156 }\r
157\r
158 FmpPayloadHeader = (FMP_PAYLOAD_HEADER *)Header;\r
159 if ((UINTN)FmpPayloadHeader + sizeof (FMP_PAYLOAD_HEADER) < (UINTN)FmpPayloadHeader ||\r
160 (UINTN)FmpPayloadHeader + sizeof (FMP_PAYLOAD_HEADER) >= (UINTN)FmpPayloadHeader + FmpPayloadSize ||\r
161 FmpPayloadHeader->HeaderSize < sizeof (FMP_PAYLOAD_HEADER)) {\r
162 return EFI_INVALID_PARAMETER;\r
163 }\r
164\r
165 if (FmpPayloadHeader->Signature != FMP_PAYLOAD_HEADER_SIGNATURE) {\r
166 return EFI_INVALID_PARAMETER;\r
167 }\r
168\r
169 *LowestSupportedVersion = FmpPayloadHeader->LowestSupportedVersion;\r
170 return EFI_SUCCESS;\r
171}\r