diff options
author | Stephen Cprek <smcprek@us.ibm.com> | 2017-09-27 16:22:04 -0500 |
---|---|---|
committer | William G. Hoffa <wghoffa@us.ibm.com> | 2017-11-01 16:17:58 -0400 |
commit | 89c19d7e3a5b6f2781636ca5373672f38d8f0a13 (patch) | |
tree | 009a08dbf556fcb21259ada013bc9d211d4a460d /src/usr/runtime/preverifiedlidmgr.C | |
parent | 141c67de2310692873ff1c3f977a1c6e5d4300ca (diff) | |
download | talos-hostboot-89c19d7e3a5b6f2781636ca5373672f38d8f0a13.tar.gz talos-hostboot-89c19d7e3a5b6f2781636ca5373672f38d8f0a13.zip |
Process Components in Master Container Lid
Change-Id: I31523494f462c88addb51973f605b2ed72674e97
RTC: 125304
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/46840
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Reviewed-by: Nicholas E. Bofferding <bofferdn@us.ibm.com>
Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com>
Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com>
Reviewed-by: Michael Baiocchi <mbaiocch@us.ibm.com>
Reviewed-by: Marshall J. Wilks <mjwilks@us.ibm.com>
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Reviewed-by: William G. Hoffa <wghoffa@us.ibm.com>
Diffstat (limited to 'src/usr/runtime/preverifiedlidmgr.C')
-rw-r--r-- | src/usr/runtime/preverifiedlidmgr.C | 137 |
1 files changed, 120 insertions, 17 deletions
diff --git a/src/usr/runtime/preverifiedlidmgr.C b/src/usr/runtime/preverifiedlidmgr.C index 0f3398721..4e5d9a2dc 100644 --- a/src/usr/runtime/preverifiedlidmgr.C +++ b/src/usr/runtime/preverifiedlidmgr.C @@ -34,13 +34,14 @@ #include <util/singleton.H> #include <stdio.h> #include <arch/ppc.H> +#include <targeting/common/target.H> +#include <targeting/common/attributes.H> extern trace_desc_t *g_trac_runtime; // Set static variables TARGETING::PAYLOAD_KIND PreVerifiedLidMgr::cv_payloadKind = TARGETING::PAYLOAD_KIND_NONE; std::map<uint64_t,bool> PreVerifiedLidMgr::cv_lidsLoaded {}; -bool PreVerifiedLidMgr::cv_phypLidSeen = false; PreVerifiedLidMgr::ResvMemInfo* PreVerifiedLidMgr::cv_pResvMemInfo = nullptr; PreVerifiedLidMgr::ResvMemInfo PreVerifiedLidMgr::cv_resvMemInfo {}; PreVerifiedLidMgr::ResvMemInfo PreVerifiedLidMgr::cv_phypResvMemInfo {}; @@ -75,6 +76,19 @@ errlHndl_t PreVerifiedLidMgr::loadFromPnor(const PNOR::SectionId i_sec, i_size); } +errlHndl_t PreVerifiedLidMgr::loadFromMCL(const uint32_t i_lidId, + const uint64_t i_addr, + const size_t i_size, + const bool i_isPhypComp, + uint64_t &o_resvMemAddr) +{ + return Singleton<PreVerifiedLidMgr>::instance()._loadFromMCL(i_lidId, + i_addr, + i_size, + i_isPhypComp, + o_resvMemAddr); +} + /******************** Private Implementations of Static Public Methods ********************/ @@ -86,12 +100,11 @@ void PreVerifiedLidMgr::_initLock(const uint64_t i_prevAddr, mutex_lock(&cv_mutex); cv_payloadKind = TARGETING::PAYLOAD_KIND_NONE; - cv_phypLidSeen = false; // Default Reserved Memory Information cv_resvMemInfo.rangeId = i_rangeId; - cv_resvMemInfo.curAddr = i_prevAddr; - cv_resvMemInfo.prevSize = i_prevSize; + cv_resvMemInfo.curAddr = ALIGN_PAGE(i_prevAddr); + cv_resvMemInfo.prevSize = ALIGN_PAGE(i_prevSize); // PHYP Reserved Memory Information cv_phypResvMemInfo.rangeId = i_rangeId; @@ -131,7 +144,6 @@ void PreVerifiedLidMgr::_initLock(const uint64_t i_prevAddr, void PreVerifiedLidMgr::_unlock() { - TRACFCOMP(g_trac_runtime, "PreVerifiedLidMgr::_unlock"); mutex_unlock(&cv_mutex); } @@ -162,16 +174,14 @@ errlHndl_t PreVerifiedLidMgr::_loadFromPnor(const PNOR::SectionId i_sec, break; } - // Get next available HB resverved memory address + // Get next available HB reserved memory address cv_pResvMemInfo->curAddr = getNextAddress(i_size); - // @TODO RTC:178163 remove need for l_loadImage bool l_loadImage = false; if(cv_payloadKind == TARGETING::PAYLOAD_KIND_PHYP) { - // @TODO RTC:178163 enable when we can Load ALL pre-verfied lids - // There are checks in phyp for ANY hdat entry marked "RHB_TYPE_VERIFIED_LIDS" - // If there are any missing phyp will fail to boot. + // @TODO RTC:178163 enable when PHYP changes necessary for pre-verified + // lids are in a fips release /* l_loadImage = true; // Verified Lid - Header Only @@ -184,7 +194,7 @@ errlHndl_t PreVerifiedLidMgr::_loadFromPnor(const PNOR::SectionId i_sec, l_errl = RUNTIME::setNextHbRsvMemEntry(HDAT::RHB_TYPE_VERIFIED_LIDS, cv_pResvMemInfo->rangeId, cv_pResvMemInfo->curAddr, - getAlignedSize(PAGE_SIZE), + PAGE_SIZE, l_containerLidStr); if(l_errl) { @@ -202,7 +212,7 @@ errlHndl_t PreVerifiedLidMgr::_loadFromPnor(const PNOR::SectionId i_sec, l_errl = RUNTIME::setNextHbRsvMemEntry(HDAT::RHB_TYPE_VERIFIED_LIDS, cv_pResvMemInfo->rangeId, cv_pResvMemInfo->curAddr+PAGE_SIZE, - getAlignedSize(i_size), + i_size, l_lidStr); if(l_errl) { @@ -254,6 +264,83 @@ errlHndl_t PreVerifiedLidMgr::_loadFromPnor(const PNOR::SectionId i_sec, return l_errl; } +errlHndl_t PreVerifiedLidMgr::_loadFromMCL(const uint32_t i_lidId, + const uint64_t i_addr, + const size_t i_size, + const bool i_isPhypComp, + uint64_t &o_resvMemAddr) +{ + mutex_lock(&cv_loadImageMutex); + + TRACFCOMP(g_trac_runtime, ENTER_MRK"PreVerifiedLidMgr::_loadFromMCL lid = 0x%X", + i_lidId); + + errlHndl_t l_errl = nullptr; + + // Switch to Different Memory Info for PHYP component + if (i_isPhypComp) + { + cv_pResvMemInfo = &cv_phypResvMemInfo; + TRACFCOMP( g_trac_runtime, "PreVerifiedLidMgr::_loadFromMCL - Loading Special Component PHYP"); + } + + do { + + // Only load if not previously done. + if( isLidLoaded(i_lidId) ) + { + TRACFCOMP( g_trac_runtime, "PreVerifiedLidMgr::_loadFromMCL - lid 0x%08X already loaded", + i_lidId); + continue; + } + + // Get next available HB reserved memory address + cv_pResvMemInfo->curAddr = getNextAddress(i_size); + + // Return the address the lid was loaded to the caller + o_resvMemAddr = cv_pResvMemInfo->curAddr; + + if(cv_payloadKind == TARGETING::PAYLOAD_KIND_PHYP) + { + // Verified Lid + char l_lidStr[Util::lidIdStrLength] {}; + snprintf (l_lidStr, Util::lidIdStrLength, "%08X",i_lidId); + l_errl = RUNTIME::setNextHbRsvMemEntry(HDAT::RHB_TYPE_VERIFIED_LIDS, + cv_pResvMemInfo->rangeId, + cv_pResvMemInfo->curAddr, + i_size, + l_lidStr); + if(l_errl) + { + TRACFCOMP( g_trac_runtime, ERR_MRK"PreVerifiedLidMgr::_loadFromMCL - setNextHbRsvMemEntry Lid content failed"); + break; + } + + // Load image into HB reserved memory + l_errl = loadImage(i_addr, i_size); + if(l_errl) + { + TRACFCOMP( g_trac_runtime, ERR_MRK"PreVerifiedLidMgr::_loadFromMCL - Load Image failed"); + break; + } + + // Indicate the lid has been loaded + cv_lidsLoaded.insert(std::make_pair(i_lidId, true)); + } + + } while (0); + + // Force switch back to default reserved memory info + cv_pResvMemInfo = &cv_resvMemInfo; + + TRACFCOMP(g_trac_runtime, EXIT_MRK"PreVerifiedLidMgr::_loadFromMCL lid = 0x%X", + i_lidId); + + mutex_unlock(&cv_loadImageMutex); + + return l_errl; +} + /******************** Private/Protected Methods ********************/ @@ -293,22 +380,29 @@ bool PreVerifiedLidMgr::isLidLoaded(uint32_t i_lidId) errlHndl_t PreVerifiedLidMgr::loadImage(const uint64_t i_imgAddr, const size_t i_imgSize) { - TRACFCOMP( g_trac_runtime, ENTER_MRK"PreVerifiedLidMgr::loadImage"); + TRACFCOMP( g_trac_runtime, ENTER_MRK"PreVerifiedLidMgr::loadImage addr = 0x%X, size = 0x%X", + i_imgAddr, i_imgSize); errlHndl_t l_errl = nullptr; do { uint64_t l_tmpVaddr = 0; + size_t l_alignedSize = ALIGN_PAGE(i_imgSize); + // Load the Verified image into HB resv memory - l_errl = RUNTIME::mapPhysAddr(cv_pResvMemInfo->curAddr, i_imgSize, l_tmpVaddr); + l_errl = RUNTIME::mapPhysAddr(cv_pResvMemInfo->curAddr, l_alignedSize, l_tmpVaddr); if(l_errl) { TRACFCOMP( g_trac_runtime, ERR_MRK"PreVerifiedLidMgr::loadImage - mapPhysAddr failed"); break; } + TRACFCOMP(g_trac_runtime, "PreVerifiedLidMgr::loadImage - curAddr 0x%X, size 0x%X, vaddr 0x%X", + cv_pResvMemInfo->curAddr, i_imgSize, l_tmpVaddr); + // Include Header page from pnor image. + // NOTE: Do not use aligned size for memcpy memcpy(reinterpret_cast<void*>(l_tmpVaddr), reinterpret_cast<void*>(i_imgAddr), i_imgSize); @@ -320,9 +414,18 @@ errlHndl_t PreVerifiedLidMgr::loadImage(const uint64_t i_imgAddr, break; } - // Update previous size using aligned size for OPAL alignment even if that - // means there is some wasted space. - cv_pResvMemInfo->prevSize = getAlignedSize(i_imgSize); + if(cv_payloadKind == TARGETING::PAYLOAD_KIND_SAPPHIRE) + { + // Update previous size using aligned size for OPAL alignment even if + // that means there is some wasted space. + cv_pResvMemInfo->prevSize = getAlignedSize(i_imgSize); + } + else + { + // align previous size to page size to ensure starting addresses are + // page aligned. + cv_pResvMemInfo->prevSize = l_alignedSize; + } } while(0); |