FLEX-FORD-OBC-BM/Source/bsw/FblBmHdr/bm_hdr.c

235 lines
10 KiB
C

/***********************************************************************************************************************
* FILE DESCRIPTION
* ------------------------------------------------------------------------------------------------------------------*/
/** \file
* \brief BM Header module
*
* --------------------------------------------------------------------------------------------------------------------
* COPYRIGHT
* --------------------------------------------------------------------------------------------------------------------
* \par Copyright
* \verbatim
* Copyright (c) 2024 by Vector Informatik GmbH. All rights reserved.
*
* This software is copyright protected and proprietary to Vector Informatik GmbH.
* Vector Informatik GmbH grants to you only those rights as set out in the license conditions.
* All other rights remain with Vector Informatik GmbH.
* \endverbatim
*/
/**********************************************************************************************************************/
/***********************************************************************************************************************
* REVISION HISTORY
* --------------------------------------------------------------------------------------------------------------------
* Version Date Author Change Id Description
* --------------------------------------------------------------------------------------------------------------------
* 01.00.00 2019-31-01 visrie - Initial release
* 01.01.00 2019-02-18 vismvi - No changes
* visrie ESCAN00102184 Maximum number of verification entries are not correctly evaluated
* 01.02.00 2019-07-22 visrie ESCAN00103790 Support invalid entry address configuration
* ESCAN00103791 Support of custom verification
* ESCAN00103803 No changes
* 02.00.00 2019-12-03 visrie FBL-456 Added support for new FblLibSecBoot interface
* 02.00.01 2020-01-15 visrie ESCAN00105368 Added missing encapsulation
* 02.01.00 2022-02-25 vistbe FBL-4128 Added/adapted MemMap sections
* 02.02.00 2024-08-29 viswmo FBL-9163 Add target-based BmHdrHeader search for updater
**********************************************************************************************************************/
#define BM_HDR_SOURCE
/***********************************************************************************************************************
* INCLUDES
**********************************************************************************************************************/
#include "fbl_inc.h"
#include "bm_main.h"
#include "fbl_lbt_access.h"
#if defined( FBLBM_ENABLE_SECURE_BOOT )
# include "fbl_secboot.h"
#endif
/***********************************************************************************************************************
* VERSION
**********************************************************************************************************************/
#if ( FBLBM_HDR_VERSION != 0x0202u ) || \
( FBLBM_HDR_RELEASE_VERSION != 0x00u )
# error "Error in bm_hdr.c: Source and Header file are inconsistent!"
#endif
#if ( FBLBM_HDR_VERSION != _FBLBM_HDR_VERSION ) || ( FBLBM_HDR_RELEASE_VERSION != _FBLBM_HDR_RELEASE_VERSION )
# error "Error in bm_hdr.c: Source and v_ver.h are inconsistent!"
#endif
/***********************************************************************************************************************
* DEFINES
**********************************************************************************************************************/
/***********************************************************************************************************************
* GLOBAL FUNCTIONS
**********************************************************************************************************************/
#define FBLBMHDR_START_SEC_CODE
#include "MemMap.h" /* PRQA S 5087 */ /* MD_MSR_MemMap */
/***********************************************************************************************************************
* FblBmHdrGetBmHeader
**********************************************************************************************************************/
/*! \brief Validate a specific bootmanager header of a logical block
* \param[in] targetHandle Target handle (e.g. Bootloader, Application)
* \param[in] bmHeaderAddress Location of the BmHeader structure.
* \param[out] bmHeader Buffer for the BmHeader
* \return Result of operation
* FBLBMHDR_CHKHDR_OK when operation succeeded
* FBLBMHDR_CHKHDR_READ_FAIL when reading the BmHeader failed
* FBLBMHDR_CHKHDR_HEADER_INCONSISTENT when the BmHeader is inconsistent
* FBLBMHDR_CHKHDR_WRONG_TARGET when the BmHeader is for another target
**********************************************************************************************************************/
tFblBmHdrCheckBmHeaderResult FblBmHdrGetBmHeader(tFblBmHdrTargetHandle targetHandle, tFblAddress bmHeaderAddress,
V_MEMRAM1 tFblBmHdrHeader V_MEMRAM2 V_MEMRAM3 * bmHeader)
{
tFblBmHdrCheckBmHeaderResult result;
result = FBLBMHDR_CHKHDR_OK;
if (FblReadProm(bmHeaderAddress, (vuint8 *)bmHeader, sizeof(tFblBmHdrHeader)) != sizeof(tFblBmHdrHeader))
{
result = FBLBMHDR_CHKHDR_READ_FAIL;
}
/* Check for correct target handle */
if (result == FBLBMHDR_CHKHDR_OK)
{
if (bmHeader->bmTargetHandle != targetHandle)
{
result = FBLBMHDR_CHKHDR_WRONG_TARGET;
}
}
/* Check for consistency errors */
if (result == FBLBMHDR_CHKHDR_OK)
{
if (kFblOk != FblBmHdrCheckConsistency(bmHeader))
{
result = FBLBMHDR_CHKHDR_HEADER_INCONSISTENT;
}
}
return result;
} /* PRQA S 6010 */ /* MD_MSR_STPTH */
/***********************************************************************************************************************
* FblBmHdrCheckConsistency
**********************************************************************************************************************/
/*! \brief Checks the consistency of the BM header structure
* \param[in] bmHeader: Pointer to the BM Header structure
* \return Result of operation
**********************************************************************************************************************/
tFblResult FblBmHdrCheckConsistency( const V_MEMRAM1 tFblBmHdrHeader V_MEMRAM2 V_MEMRAM3 * pBmHeader )
{
tFblResult result;
#if defined( FBLBMHDR_ENABLE_HEADER_VERIFICATION_LIST )
vuintx i;
#endif /* FBLBMHDR_ENABLE_HEADER_VERIFICATION_LIST */
/* Initialize variables */
result = kFblOk;
/* Check magic value */
if (pBmHeader->bmMagicFlag != FBLBMHDR_MAGIC_FLAG)
{
result = kFblFailed;
}
#if defined( FBLBMHDR_ENABLE_HEADER_VERIFICATION_LIST )
/* Check number of verification regions */
if (result == kFblOk)
{
if (pBmHeader->bmVerificationListEntries > FBLBMHDR_NUM_OF_VERIFICATION_ENTRIES)
{
result = kFblFailed;
}
}
/* Check if a verification region contains the entry address */
if ( (result == kFblOk)
&& (pBmHeader->bmEntryAddress != FBLBMHDR_ENTRY_ADDRESS_INVALID))
{
/* Change result to failed, it will be set back to OK if a valid region was found */
result = kFblFailed;
for (i = 0u; i < pBmHeader->bmVerificationListEntries; i++)
{
if ( (pBmHeader->bmEntryAddress >= pBmHeader->bmVerificationList[i].address)
&& (pBmHeader->bmEntryAddress < (pBmHeader->bmVerificationList[i].address + pBmHeader->bmVerificationList[i].length)))
{
/* Entry address is in a verification range */
result = kFblOk;
break;
}
}
}
#endif /* FBLBMHDR_ENABLE_HEADER_VERIFICATION_LIST */
return result;
}
#if defined( FBLBM_CALLOUT_IS_VALIDBLOCK )
/***********************************************************************************************************************
* FblBmHdrFindValidHeader
**********************************************************************************************************************/
/*! \brief Find a valid bootmanager header structure for the given target
* \param[in] targetHandle Target handle (e.g. Bootloader, Application)
* \param[in,out] pBlockInfo Pointer to a structure which holds a pointer to the BM header and the corresponding
* logical block.
* \return Result of operation
* FBLBMHDR_CHKHDR_OK A valid BmHeader is found
* FBLBMHDR_CHKHDR_NOT_FOUND No BmHeader found
* FBLBMHDR_CHKHDR_BLOCK_INVALID Logical block is not valid
* see FblBmHdrCheckBmHeader for further return values.
* see FblBmHdrVerifyBmHeader for further return values.
**********************************************************************************************************************/
tFblBmHdrCheckBmHeaderResult FblBmHdrFindValidHeader(tFblBmHdrTargetHandle targetHandle,
V_MEMRAM1 tFblBmBlockInfo V_MEMRAM2 V_MEMRAM3 * pBlockInfo)
{
tFblBmHdrCheckBmHeaderResult result;
tFblLbtBlockFilter blockFilter;
/* Initialize variables */
result = FBLBMHDR_CHKHDR_NOT_FOUND;
/* Iterate over all mandatory blocks */
FblLbtBlockFilterInit(&blockFilter);
pBlockInfo->logicalBlock = FblLbtBlockFirst(&blockFilter);
while (FblLbtBlockDone() == FALSE)
{
if (kFblOk == FBLBM_CALLOUT_IS_VALIDBLOCK(targetHandle, &pBlockInfo->logicalBlock))
{
result = FblBmHdrGetBmHeader(targetHandle, pBlockInfo->logicalBlock.bmHeaderAddress, &pBlockInfo->bmHeader);
}
else
{
result = FBLBMHDR_CHKHDR_BLOCK_INVALID;
}
if (result == FBLBMHDR_CHKHDR_OK)
{
/* Leave loop after first hit */
break;
}
/* Prepare next cycle */
pBlockInfo->logicalBlock = FblLbtBlockNext();
}
return result;
}
#endif /* FBLBM_CALLOUT_IS_VALIDBLOCK */
#define FBLBMHDR_STOP_SEC_CODE
#include "MemMap.h" /* PRQA S 5087 */ /* MD_MSR_MemMap */
/***********************************************************************************************************************
* END OF FILE: BM_HDR.C
**********************************************************************************************************************/