diff options
-rw-r--r-- | src/usr/runtime/populate_hbruntime.C | 22 | ||||
-rw-r--r-- | src/usr/secureboot/trusted/tpmLogMgr.C | 33 | ||||
-rw-r--r-- | src/usr/secureboot/trusted/tpmLogMgr.H | 9 |
3 files changed, 52 insertions, 12 deletions
diff --git a/src/usr/runtime/populate_hbruntime.C b/src/usr/runtime/populate_hbruntime.C index bc2915ddd..eb92807fe 100644 --- a/src/usr/runtime/populate_hbruntime.C +++ b/src/usr/runtime/populate_hbruntime.C @@ -1252,18 +1252,16 @@ errlHndl_t populate_TpmInfoByNode() if(pLogMgr != nullptr) { #ifdef CONFIG_TPMDD - auto const * const pLogStart = - TRUSTEDBOOT::TpmLogMgr_getLogStartPtr(pLogMgr); - assert(pLogStart != nullptr,"populate_TpmInfoByNode: BUG! An " - "allocated log manager's log start pointer should never be " - "nullptr"); - - logSize = (pLogMgr->logSize < TPM_SRTM_EVENT_LOG_MAX) ? - pLogMgr->logSize : TPM_SRTM_EVENT_LOG_MAX; - - memcpy(reinterpret_cast<void*>(l_baseAddr + l_currOffset), - pLogStart, - logSize); + + // The log size always has to be specified to the max + // this is because after HDAT is populated additional + // entries can be posted to the log to cause it to + // grow beyond its current size + logSize = TPM_SRTM_EVENT_LOG_MAX; + + TRUSTEDBOOT::TpmLogMgr_relocateTpmLog(pLogMgr, + reinterpret_cast<uint8_t*>(l_baseAddr + l_currOffset), + logSize); #endif } else diff --git a/src/usr/secureboot/trusted/tpmLogMgr.C b/src/usr/secureboot/trusted/tpmLogMgr.C index fe773d5f3..625c6261a 100644 --- a/src/usr/secureboot/trusted/tpmLogMgr.C +++ b/src/usr/secureboot/trusted/tpmLogMgr.C @@ -572,6 +572,39 @@ namespace TRUSTEDBOOT i_val->devtreeI2cMasterOffset = i_i2cMasterOffset; } + void TpmLogMgr_relocateTpmLog(TpmLogMgr* i_val, + uint8_t* i_newLog, + size_t i_maxSize) + { + mutex_lock( &i_val->logMutex ); + + TRACUCOMP( g_trac_trustedboot, + ">>relocateTpmLog() LogSize:%d MaxSize:%d", + i_val->logSize, i_maxSize); + + assert(i_newLog != NULL, "Bug! Log start address is nullptr"); + assert(i_val->eventLogInMem == NULL, + "relocateTpmLog can only be called once"); + assert(i_val->logSize < i_maxSize, + "Logsize is greater than maxsize"); + + // Point logMgr to new location + i_val->eventLogInMem = i_newLog; + + // Copy log into new location + memset(i_val->eventLogInMem, 0, i_maxSize); + memcpy(i_val->eventLogInMem, i_val->eventLog, i_val->logSize); + i_val->newEventPtr = i_val->eventLogInMem + i_val->logSize; + + mutex_unlock( &i_val->logMutex ); + + TRACUCOMP( g_trac_trustedboot, + "<<relocateTpmLog() Addr:%p", + i_newLog); + return; + } + + #endif #ifdef __cplusplus diff --git a/src/usr/secureboot/trusted/tpmLogMgr.H b/src/usr/secureboot/trusted/tpmLogMgr.H index 09adc2f63..6828e42fe 100644 --- a/src/usr/secureboot/trusted/tpmLogMgr.H +++ b/src/usr/secureboot/trusted/tpmLogMgr.H @@ -164,6 +164,15 @@ namespace TRUSTEDBOOT void TpmLogMgr_setTpmDevtreeInfo(TpmLogMgr* i_val, uint64_t i_xscomAddr, uint32_t i_i2cMasterOffset); + /** + * @brief Relocate the TPM log to the provided location + * @param[in] i_val TpmLogMgr structure + * @param[in] i_newLog Pointer to locate to place log + * @param[in] i_maxSize Size of newLog location + */ + void TpmLogMgr_relocateTpmLog(TpmLogMgr* i_val, + uint8_t* i_newLog, + size_t i_maxSize); #endif |