mirror of https://github.com/acidanthera/audk.git
225 lines
5.9 KiB
C
225 lines
5.9 KiB
C
/** @file
|
|
Token Mapper
|
|
|
|
Copyright (c) 2021, Arm Limited. All rights reserved.<BR>
|
|
|
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
|
|
@par Glossary:
|
|
- Cm or CM - Configuration Manager
|
|
- Obj or OBJ - Object
|
|
**/
|
|
|
|
#include <Library/BaseMemoryLib.h>
|
|
#include <Library/DebugLib.h>
|
|
#include <Library/MemoryAllocationLib.h>
|
|
#include <Protocol/ConfigurationManagerProtocol.h>
|
|
|
|
#include "TokenMapper.h"
|
|
|
|
/** Add a CmObjDesc to the TokenMapper.
|
|
|
|
@param [in] TokenMapper The TokenMapper instance.
|
|
@param [in] Token CmObj token.
|
|
@param [in] ObjectId CmObj ObjectId.
|
|
@param [in] Size CmObj Size.
|
|
@param [in] Data CmObj Data.
|
|
This memory is referenced, not copied.
|
|
|
|
@retval EFI_SUCCESS The function completed successfully.
|
|
@retval EFI_BUFFER_TOO_SMALL Buffer too small.
|
|
@retval EFI_INVALID_PARAMETER A parameter is invalid.
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
TokenMapperAddObject (
|
|
IN TOKEN_MAPPER *TokenMapper,
|
|
IN CM_OBJECT_TOKEN Token,
|
|
IN CM_OBJECT_ID ObjectId,
|
|
IN UINT32 Size,
|
|
IN VOID *Data
|
|
)
|
|
{
|
|
TOKEN_MAP_DESCRIPTOR *TokenMapDesc;
|
|
CM_OBJ_DESCRIPTOR *CmObjDesc;
|
|
|
|
if ((TokenMapper == NULL) ||
|
|
(TokenMapper->TokenDescArray == NULL) ||
|
|
(Size == 0) ||
|
|
(Data == NULL))
|
|
{
|
|
ASSERT (0);
|
|
return EFI_INVALID_PARAMETER;
|
|
}
|
|
|
|
if (TokenMapper->ItemCount >= TokenMapper->MaxTokenDescCount) {
|
|
ASSERT (0);
|
|
return EFI_BUFFER_TOO_SMALL;
|
|
}
|
|
|
|
TokenMapDesc = &TokenMapper->TokenDescArray[TokenMapper->ItemCount++];
|
|
TokenMapDesc->Token = Token;
|
|
CmObjDesc = &TokenMapDesc->CmObjDesc;
|
|
CmObjDesc->ObjectId = ObjectId;
|
|
CmObjDesc->Size = Size;
|
|
|
|
// Point inside the finalized array.
|
|
CmObjDesc->Data = Data;
|
|
|
|
// Only EArmObjCmRef CmObj can be added as arrays (more than 1 elements).
|
|
if ((GET_CM_NAMESPACE_ID (ObjectId) == EObjNameSpaceArm) &&
|
|
(GET_CM_OBJECT_ID (ObjectId) == EArmObjCmRef))
|
|
{
|
|
CmObjDesc->Count = Size / sizeof (CM_ARM_OBJ_REF);
|
|
} else {
|
|
CmObjDesc->Count = 1;
|
|
}
|
|
|
|
return EFI_SUCCESS;
|
|
}
|
|
|
|
/** Get a CmObjDesc from a ObjectId/Token couple.
|
|
|
|
The Token parameter is not optional. An existing token must be provided.
|
|
|
|
@param [in] TokenMapper The TokenMapper instance.
|
|
@param [in] Token Token of the CmObj to search.
|
|
@param [in] ObjectId Object Id of the CmObj to search.
|
|
@param [out] CmObjDesc CM_OBJ_DESCRIPTOR containing the CmObj searched.
|
|
|
|
@retval EFI_SUCCESS The function completed successfully.
|
|
@retval EFI_INVALID_PARAMETER A parameter is invalid.
|
|
@retval EFI_NOT_FOUND Not found.
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
TokenMapperGetObject (
|
|
IN TOKEN_MAPPER *TokenMapper,
|
|
IN CM_OBJECT_TOKEN Token,
|
|
IN CM_OBJECT_ID ObjectId,
|
|
OUT CM_OBJ_DESCRIPTOR *CmObjDesc
|
|
)
|
|
{
|
|
UINTN Index;
|
|
UINTN MaxCount;
|
|
TOKEN_MAP_DESCRIPTOR *TokenMapDesc;
|
|
|
|
// Nothing to do.
|
|
if ((TokenMapper != NULL) && (TokenMapper->MaxTokenDescCount == 0)) {
|
|
goto exit_handler;
|
|
}
|
|
|
|
if ((Token == CM_NULL_TOKEN) ||
|
|
(CmObjDesc == NULL) ||
|
|
(TokenMapper == NULL) ||
|
|
(TokenMapper->TokenDescArray == NULL))
|
|
{
|
|
ASSERT (0);
|
|
return EFI_INVALID_PARAMETER;
|
|
}
|
|
|
|
TokenMapDesc = TokenMapper->TokenDescArray;
|
|
MaxCount = TokenMapper->MaxTokenDescCount;
|
|
for (Index = 0; Index < MaxCount; Index++) {
|
|
if ((TokenMapDesc->CmObjDesc.ObjectId == ObjectId) &&
|
|
(TokenMapDesc->Token == Token))
|
|
{
|
|
CopyMem (
|
|
CmObjDesc,
|
|
&TokenMapDesc->CmObjDesc,
|
|
sizeof (CM_OBJ_DESCRIPTOR)
|
|
);
|
|
return EFI_SUCCESS;
|
|
}
|
|
|
|
TokenMapDesc++;
|
|
} // for
|
|
|
|
exit_handler:
|
|
DEBUG ((
|
|
DEBUG_INFO,
|
|
"INFO: Requested CmObj of type 0x%x with token 0x%x"
|
|
" not found in the dynamic repository\n.",
|
|
ObjectId,
|
|
Token
|
|
));
|
|
return EFI_NOT_FOUND;
|
|
}
|
|
|
|
/** Initialise a TokenMapper.
|
|
|
|
@param [in] TokenMapper The TokenMapper to initialise.
|
|
@param [in] DescriptorCount Number of entries to allocate.
|
|
|
|
@retval EFI_SUCCESS The function completed successfully.
|
|
@retval EFI_ALREADY_STARTED Instance already initialised.
|
|
@retval EFI_INVALID_PARAMETER A parameter is invalid.
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
TokenMapperInitialise (
|
|
IN TOKEN_MAPPER *TokenMapper,
|
|
IN UINTN DescriptorCount
|
|
)
|
|
{
|
|
if (TokenMapper == NULL) {
|
|
ASSERT (0);
|
|
return EFI_INVALID_PARAMETER;
|
|
}
|
|
|
|
// Nothing to do.
|
|
if (DescriptorCount == 0) {
|
|
return EFI_SUCCESS;
|
|
}
|
|
|
|
if (TokenMapper->TokenDescArray != NULL) {
|
|
DEBUG ((DEBUG_ERROR, "ERROR: Token mapper already initialised\n."));
|
|
ASSERT (0);
|
|
return EFI_ALREADY_STARTED;
|
|
}
|
|
|
|
TokenMapper->TokenDescArray =
|
|
AllocateZeroPool (sizeof (TOKEN_MAP_DESCRIPTOR) * DescriptorCount);
|
|
if (TokenMapper->TokenDescArray == NULL) {
|
|
ASSERT (0);
|
|
return EFI_OUT_OF_RESOURCES;
|
|
}
|
|
|
|
TokenMapper->MaxTokenDescCount = DescriptorCount;
|
|
TokenMapper->ItemCount = 0;
|
|
|
|
return EFI_SUCCESS;
|
|
}
|
|
|
|
/** Shutdown a TokenMapper.
|
|
|
|
@param [in] TokenMapper The TokenMapper to shutdown.
|
|
|
|
@retval EFI_SUCCESS The function completed successfully.
|
|
@retval EFI_INVALID_PARAMETER A parameter is invalid.
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
TokenMapperShutdown (
|
|
IN TOKEN_MAPPER *TokenMapper
|
|
)
|
|
{
|
|
// Nothing to do.
|
|
if ((TokenMapper != NULL) && (TokenMapper->MaxTokenDescCount == 0)) {
|
|
return EFI_SUCCESS;
|
|
}
|
|
|
|
if ((TokenMapper == NULL) ||
|
|
(TokenMapper->TokenDescArray == NULL))
|
|
{
|
|
ASSERT (0);
|
|
return EFI_INVALID_PARAMETER;
|
|
}
|
|
|
|
FreePool (TokenMapper->TokenDescArray);
|
|
TokenMapper->TokenDescArray = NULL;
|
|
TokenMapper->MaxTokenDescCount = 0;
|
|
|
|
return EFI_SUCCESS;
|
|
}
|