123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- /** @file
- Provides services to retrieve values from Version 1 of a capsule's FMP Payload
- Header. The FMP Payload Header structure is not defined in the library class.
- Instead, services are provided to retrieve information from the FMP Payload
- Header. If information is added to the FMP Payload Header, then new services
- may be added to this library class to retrieve the new information.
- Copyright (c) 2016, Microsoft Corporation. All rights reserved.<BR>
- Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>
- SPDX-License-Identifier: BSD-2-Clause-Patent
- **/
- #include <PiDxe.h>
- #include <Library/FmpPayloadHeaderLib.h>
- ///
- /// Define FMP Payload Header structure here so it is not public
- ///
- #pragma pack(1)
- typedef struct {
- UINT32 Signature;
- UINT32 HeaderSize;
- UINT32 FwVersion;
- UINT32 LowestSupportedVersion;
- } FMP_PAYLOAD_HEADER;
- #pragma pack()
- ///
- /// Identifier is used to make sure the data in the header is for this structure
- /// and version. If the structure changes update the last digit.
- ///
- #define FMP_PAYLOAD_HEADER_SIGNATURE SIGNATURE_32 ('M', 'S', 'S', '1')
- /**
- Returns the FMP Payload Header size in bytes.
- @param[in] Header FMP Payload Header to evaluate
- @param[in] FmpPayloadSize Size of FMP payload
- @param[out] Size The size, in bytes, of the FMP Payload Header.
- @retval EFI_SUCCESS The firmware version was returned.
- @retval EFI_INVALID_PARAMETER Header is NULL.
- @retval EFI_INVALID_PARAMETER Size is NULL.
- @retval EFI_INVALID_PARAMETER Header is not a valid FMP Payload Header.
- **/
- EFI_STATUS
- EFIAPI
- GetFmpPayloadHeaderSize (
- IN CONST VOID *Header,
- IN CONST UINTN FmpPayloadSize,
- OUT UINT32 *Size
- )
- {
- FMP_PAYLOAD_HEADER *FmpPayloadHeader;
- FmpPayloadHeader = NULL;
- if ((Header == NULL) || (Size == NULL)) {
- return EFI_INVALID_PARAMETER;
- }
- FmpPayloadHeader = (FMP_PAYLOAD_HEADER *)Header;
- if (((UINTN)FmpPayloadHeader + sizeof (FMP_PAYLOAD_HEADER) < (UINTN)FmpPayloadHeader) ||
- ((UINTN)FmpPayloadHeader + sizeof (FMP_PAYLOAD_HEADER) >= (UINTN)FmpPayloadHeader + FmpPayloadSize) ||
- (FmpPayloadHeader->HeaderSize < sizeof (FMP_PAYLOAD_HEADER)))
- {
- return EFI_INVALID_PARAMETER;
- }
- if (FmpPayloadHeader->Signature != FMP_PAYLOAD_HEADER_SIGNATURE) {
- return EFI_INVALID_PARAMETER;
- }
- *Size = FmpPayloadHeader->HeaderSize;
- return EFI_SUCCESS;
- }
- /**
- Returns the version described in the FMP Payload Header.
- @param[in] Header FMP Payload Header to evaluate
- @param[in] FmpPayloadSize Size of FMP payload
- @param[out] Version The firmware version described in the FMP Payload
- Header.
- @retval EFI_SUCCESS The firmware version was returned.
- @retval EFI_INVALID_PARAMETER Header is NULL.
- @retval EFI_INVALID_PARAMETER Version is NULL.
- @retval EFI_INVALID_PARAMETER Header is not a valid FMP Payload Header.
- **/
- EFI_STATUS
- EFIAPI
- GetFmpPayloadHeaderVersion (
- IN CONST VOID *Header,
- IN CONST UINTN FmpPayloadSize,
- OUT UINT32 *Version
- )
- {
- FMP_PAYLOAD_HEADER *FmpPayloadHeader;
- FmpPayloadHeader = NULL;
- if ((Header == NULL) || (Version == NULL)) {
- return EFI_INVALID_PARAMETER;
- }
- FmpPayloadHeader = (FMP_PAYLOAD_HEADER *)Header;
- if (((UINTN)FmpPayloadHeader + sizeof (FMP_PAYLOAD_HEADER) < (UINTN)FmpPayloadHeader) ||
- ((UINTN)FmpPayloadHeader + sizeof (FMP_PAYLOAD_HEADER) >= (UINTN)FmpPayloadHeader + FmpPayloadSize) ||
- (FmpPayloadHeader->HeaderSize < sizeof (FMP_PAYLOAD_HEADER)))
- {
- return EFI_INVALID_PARAMETER;
- }
- if (FmpPayloadHeader->Signature != FMP_PAYLOAD_HEADER_SIGNATURE) {
- return EFI_INVALID_PARAMETER;
- }
- *Version = FmpPayloadHeader->FwVersion;
- return EFI_SUCCESS;
- }
- /**
- Returns the lowest supported version described in the FMP Payload Header.
- @param[in] Header FMP Payload Header to evaluate
- @param[in] FmpPayloadSize Size of FMP payload
- @param[out] LowestSupportedVersion The lowest supported version described in
- the FMP Payload Header.
- @retval EFI_SUCCESS The lowest support version was returned.
- @retval EFI_INVALID_PARAMETER Header is NULL.
- @retval EFI_INVALID_PARAMETER LowestSupportedVersion is NULL.
- @retval EFI_INVALID_PARAMETER Header is not a valid FMP Payload Header.
- **/
- EFI_STATUS
- EFIAPI
- GetFmpPayloadHeaderLowestSupportedVersion (
- IN CONST VOID *Header,
- IN CONST UINTN FmpPayloadSize,
- OUT UINT32 *LowestSupportedVersion
- )
- {
- FMP_PAYLOAD_HEADER *FmpPayloadHeader;
- FmpPayloadHeader = NULL;
- if ((Header == NULL) || (LowestSupportedVersion == NULL)) {
- return EFI_INVALID_PARAMETER;
- }
- FmpPayloadHeader = (FMP_PAYLOAD_HEADER *)Header;
- if (((UINTN)FmpPayloadHeader + sizeof (FMP_PAYLOAD_HEADER) < (UINTN)FmpPayloadHeader) ||
- ((UINTN)FmpPayloadHeader + sizeof (FMP_PAYLOAD_HEADER) >= (UINTN)FmpPayloadHeader + FmpPayloadSize) ||
- (FmpPayloadHeader->HeaderSize < sizeof (FMP_PAYLOAD_HEADER)))
- {
- return EFI_INVALID_PARAMETER;
- }
- if (FmpPayloadHeader->Signature != FMP_PAYLOAD_HEADER_SIGNATURE) {
- return EFI_INVALID_PARAMETER;
- }
- *LowestSupportedVersion = FmpPayloadHeader->LowestSupportedVersion;
- return EFI_SUCCESS;
- }
|