]> git.proxmox.com Git - mirror_edk2.git/blame - FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayloadHeaderLib.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[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
45ce0a67
MK
25 UINT32 Signature;\r
26 UINT32 HeaderSize;\r
27 UINT32 FwVersion;\r
28 UINT32 LowestSupportedVersion;\r
403d4bcd
KM
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
45ce0a67 37#define FMP_PAYLOAD_HEADER_SIGNATURE SIGNATURE_32 ('M', 'S', 'S', '1')\r
403d4bcd
KM
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
45ce0a67 64 if ((Header == NULL) || (Size == NULL)) {\r
403d4bcd
KM
65 return EFI_INVALID_PARAMETER;\r
66 }\r
67\r
68 FmpPayloadHeader = (FMP_PAYLOAD_HEADER *)Header;\r
45ce0a67
MK
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 {\r
403d4bcd
KM
73 return EFI_INVALID_PARAMETER;\r
74 }\r
75\r
76 if (FmpPayloadHeader->Signature != FMP_PAYLOAD_HEADER_SIGNATURE) {\r
77 return EFI_INVALID_PARAMETER;\r
78 }\r
79\r
80 *Size = FmpPayloadHeader->HeaderSize;\r
81 return EFI_SUCCESS;\r
82}\r
83\r
84/**\r
85 Returns the version described in the FMP Payload Header.\r
86\r
87 @param[in] Header FMP Payload Header to evaluate\r
88 @param[in] FmpPayloadSize Size of FMP payload\r
89 @param[out] Version The firmware version described in the FMP Payload\r
90 Header.\r
91\r
92 @retval EFI_SUCCESS The firmware version was returned.\r
93 @retval EFI_INVALID_PARAMETER Header is NULL.\r
94 @retval EFI_INVALID_PARAMETER Version is NULL.\r
95 @retval EFI_INVALID_PARAMETER Header is not a valid FMP Payload Header.\r
96\r
97**/\r
98EFI_STATUS\r
99EFIAPI\r
100GetFmpPayloadHeaderVersion (\r
101 IN CONST VOID *Header,\r
102 IN CONST UINTN FmpPayloadSize,\r
103 OUT UINT32 *Version\r
104 )\r
105{\r
106 FMP_PAYLOAD_HEADER *FmpPayloadHeader;\r
107\r
108 FmpPayloadHeader = NULL;\r
109\r
45ce0a67 110 if ((Header == NULL) || (Version == NULL)) {\r
403d4bcd
KM
111 return EFI_INVALID_PARAMETER;\r
112 }\r
113\r
114 FmpPayloadHeader = (FMP_PAYLOAD_HEADER *)Header;\r
45ce0a67
MK
115 if (((UINTN)FmpPayloadHeader + sizeof (FMP_PAYLOAD_HEADER) < (UINTN)FmpPayloadHeader) ||\r
116 ((UINTN)FmpPayloadHeader + sizeof (FMP_PAYLOAD_HEADER) >= (UINTN)FmpPayloadHeader + FmpPayloadSize) ||\r
117 (FmpPayloadHeader->HeaderSize < sizeof (FMP_PAYLOAD_HEADER)))\r
118 {\r
403d4bcd
KM
119 return EFI_INVALID_PARAMETER;\r
120 }\r
121\r
122 if (FmpPayloadHeader->Signature != FMP_PAYLOAD_HEADER_SIGNATURE) {\r
123 return EFI_INVALID_PARAMETER;\r
124 }\r
125\r
126 *Version = FmpPayloadHeader->FwVersion;\r
127 return EFI_SUCCESS;\r
128}\r
129\r
130/**\r
131 Returns the lowest supported version described in the FMP Payload Header.\r
132\r
133 @param[in] Header FMP Payload Header to evaluate\r
134 @param[in] FmpPayloadSize Size of FMP payload\r
135 @param[out] LowestSupportedVersion The lowest supported version described in\r
136 the FMP Payload Header.\r
137\r
138 @retval EFI_SUCCESS The lowest support version was returned.\r
139 @retval EFI_INVALID_PARAMETER Header is NULL.\r
140 @retval EFI_INVALID_PARAMETER LowestSupportedVersion is NULL.\r
141 @retval EFI_INVALID_PARAMETER Header is not a valid FMP Payload Header.\r
142\r
143**/\r
144EFI_STATUS\r
145EFIAPI\r
146GetFmpPayloadHeaderLowestSupportedVersion (\r
45ce0a67
MK
147 IN CONST VOID *Header,\r
148 IN CONST UINTN FmpPayloadSize,\r
149 OUT UINT32 *LowestSupportedVersion\r
403d4bcd
KM
150 )\r
151{\r
152 FMP_PAYLOAD_HEADER *FmpPayloadHeader;\r
153\r
154 FmpPayloadHeader = NULL;\r
155\r
45ce0a67 156 if ((Header == NULL) || (LowestSupportedVersion == NULL)) {\r
403d4bcd
KM
157 return EFI_INVALID_PARAMETER;\r
158 }\r
159\r
160 FmpPayloadHeader = (FMP_PAYLOAD_HEADER *)Header;\r
45ce0a67
MK
161 if (((UINTN)FmpPayloadHeader + sizeof (FMP_PAYLOAD_HEADER) < (UINTN)FmpPayloadHeader) ||\r
162 ((UINTN)FmpPayloadHeader + sizeof (FMP_PAYLOAD_HEADER) >= (UINTN)FmpPayloadHeader + FmpPayloadSize) ||\r
163 (FmpPayloadHeader->HeaderSize < sizeof (FMP_PAYLOAD_HEADER)))\r
164 {\r
403d4bcd
KM
165 return EFI_INVALID_PARAMETER;\r
166 }\r
167\r
168 if (FmpPayloadHeader->Signature != FMP_PAYLOAD_HEADER_SIGNATURE) {\r
169 return EFI_INVALID_PARAMETER;\r
170 }\r
171\r
172 *LowestSupportedVersion = FmpPayloadHeader->LowestSupportedVersion;\r
173 return EFI_SUCCESS;\r
174}\r