mirror of
https://github.com/tianocore/edk2
synced 2026-08-27 00:23:19 -04:00
113 lines
3.2 KiB
C
113 lines
3.2 KiB
C
|
|
/** @file
|
||
|
|
Metadata Handler Library.
|
||
|
|
|
||
|
|
Copyright (c) 2025, Arm Limited. All rights reserved.
|
||
|
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||
|
|
**/
|
||
|
|
|
||
|
|
#include <Base.h>
|
||
|
|
#include <Library/BaseLib.h>
|
||
|
|
#include <Library/BaseMemoryLib.h>
|
||
|
|
#include <Library/DebugLib.h>
|
||
|
|
#include <Library/MemoryAllocationLib.h>
|
||
|
|
#include <ConfigurationManagerObject.h>
|
||
|
|
|
||
|
|
#include <Library/MetadataObjLib.h>
|
||
|
|
#include "MetadataHandler.h"
|
||
|
|
|
||
|
|
/* Metadata handlers. */
|
||
|
|
STATIC METADATA_HANDLERS mMetadataHandlers[MetadataTypeMax] = {
|
||
|
|
// MetadataTypeUid
|
||
|
|
{
|
||
|
|
MetadataGenerateUid,
|
||
|
|
MetadataValidateUid,
|
||
|
|
},
|
||
|
|
// MetadataTypeProximityDomain
|
||
|
|
{
|
||
|
|
MetadataGenerateProximityDomain,
|
||
|
|
MetadataValidateProximityDomain,
|
||
|
|
},
|
||
|
|
};
|
||
|
|
|
||
|
|
/** Query the MetadataObjLib for metadata matching the input (Type/Token).
|
||
|
|
If the metadata exists, return it.
|
||
|
|
Otherwise:
|
||
|
|
- Generate a new metadata object
|
||
|
|
- Add it to the MetadataObjLib
|
||
|
|
- return it
|
||
|
|
|
||
|
|
@param[in] Root Root of the Metadata information.
|
||
|
|
@param[in] Type METADATA_TYPE of the entry to generate.
|
||
|
|
@param[in] Token Token uniquely identifying an entry among other
|
||
|
|
objects with the input METADATA_TYPE.
|
||
|
|
@param[in] Context Optional context to use during the Metadata generation.
|
||
|
|
@param[in, out] Metadata On input, can contain METADATA_TYPE-specific information.
|
||
|
|
On output and if success, contains the generated
|
||
|
|
Metadata object.
|
||
|
|
@param[in] MetadataSize Size of the input Metadata.
|
||
|
|
|
||
|
|
@retval EFI_SUCCESS Success.
|
||
|
|
@retval EFI_INVALID_PARAMETER A parameter is invalid.
|
||
|
|
**/
|
||
|
|
EFI_STATUS
|
||
|
|
EFIAPI
|
||
|
|
MetadataHandlerGenerate (
|
||
|
|
IN METADATA_ROOT_HANDLE Root,
|
||
|
|
IN METADATA_TYPE Type,
|
||
|
|
IN CM_OBJECT_TOKEN Token,
|
||
|
|
IN VOID *Context,
|
||
|
|
IN OUT VOID *Metadata,
|
||
|
|
IN UINT32 MetadataSize
|
||
|
|
)
|
||
|
|
{
|
||
|
|
EFI_STATUS Status;
|
||
|
|
|
||
|
|
if ((Type >= MetadataTypeMax) ||
|
||
|
|
(Token == CM_NULL_TOKEN) ||
|
||
|
|
(Metadata == NULL) ||
|
||
|
|
(MetadataSize == 0))
|
||
|
|
{
|
||
|
|
ASSERT (Type < MetadataTypeMax);
|
||
|
|
ASSERT (Token != CM_NULL_TOKEN);
|
||
|
|
ASSERT (Metadata != NULL);
|
||
|
|
ASSERT (MetadataSize != 0);
|
||
|
|
return EFI_INVALID_PARAMETER;
|
||
|
|
}
|
||
|
|
|
||
|
|
Status = mMetadataHandlers[Type].Generate (
|
||
|
|
Root,
|
||
|
|
Type,
|
||
|
|
Token,
|
||
|
|
Context,
|
||
|
|
Metadata,
|
||
|
|
MetadataSize
|
||
|
|
);
|
||
|
|
ASSERT_EFI_ERROR (Status);
|
||
|
|
|
||
|
|
return Status;
|
||
|
|
}
|
||
|
|
|
||
|
|
/** Validate the Metadata.
|
||
|
|
|
||
|
|
@param[in] Root Root of the Metadata information.
|
||
|
|
|
||
|
|
@retval EFI_SUCCESS Success.
|
||
|
|
@retval EFI_INVALID_PARAMETER A parameter is invalid.
|
||
|
|
**/
|
||
|
|
EFI_STATUS
|
||
|
|
EFIAPI
|
||
|
|
MetadataHandlerValidate (
|
||
|
|
IN METADATA_ROOT_HANDLE Root
|
||
|
|
)
|
||
|
|
{
|
||
|
|
EFI_STATUS Status;
|
||
|
|
METADATA_TYPE Type;
|
||
|
|
|
||
|
|
for (Type = 0; Type < MetadataTypeMax; Type++) {
|
||
|
|
Status = mMetadataHandlers[Type].Validate (Root);
|
||
|
|
ASSERT_EFI_ERROR (Status);
|
||
|
|
}
|
||
|
|
|
||
|
|
return Status;
|
||
|
|
}
|