/** @file Token Mapper Copyright (c) 2021, Arm Limited. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent @par Glossary: - Cm or CM - Configuration Manager - Obj or OBJ - Object **/ #include #include #include #include #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; }