diff options
author | Stephen Cprek <smcprek@us.ibm.com> | 2017-07-27 16:56:12 -0500 |
---|---|---|
committer | Daniel M. Crowell <dcrowell@us.ibm.com> | 2017-08-11 10:09:54 -0400 |
commit | ca30e6bf9ea440ba1fd8c7fb5092b9fe6e18aba0 (patch) | |
tree | 9a8028d226e4c24071fb216c47cb49f6faaa0e8b /src/usr/util | |
parent | a0e8246b27da999d4d8beba64994daef6333a442 (diff) | |
download | talos-hostboot-ca30e6bf9ea440ba1fd8c7fb5092b9fe6e18aba0.tar.gz talos-hostboot-ca30e6bf9ea440ba1fd8c7fb5092b9fe6e18aba0.zip |
Refactor lid to pnor mapping and add pnor to lid pair mapping
Change-Id: Ib4f3afef44cdab96c66b13426da86049b896757a
RTC: 175115
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/43809
Tested-by: Jenkins Server <pfd-jenkins+hostboot@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>
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Reviewed-by: Michael Baiocchi <mbaiocch@us.ibm.com>
Reviewed-by: Nicholas E. Bofferding <bofferdn@us.ibm.com>
Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src/usr/util')
-rw-r--r-- | src/usr/util/runtime/utillidmgr_rt.C | 2 | ||||
-rw-r--r-- | src/usr/util/test/testlidmgr.H | 16 | ||||
-rw-r--r-- | src/usr/util/utillidmgr.C | 2 | ||||
-rw-r--r-- | src/usr/util/utillidpnor.C | 103 | ||||
-rw-r--r-- | src/usr/util/utillidpnor.H | 74 |
5 files changed, 82 insertions, 115 deletions
diff --git a/src/usr/util/runtime/utillidmgr_rt.C b/src/usr/util/runtime/utillidmgr_rt.C index 6f1173666..ea31c61ce 100644 --- a/src/usr/util/runtime/utillidmgr_rt.C +++ b/src/usr/util/runtime/utillidmgr_rt.C @@ -241,7 +241,7 @@ void UtilLidMgr::updateLid(uint32_t i_lidId) { // If it's in PNOR it's not technically a lid // so use a slightly different extension - iv_isLidInPnor = getLidPnorSection(iv_lidId, iv_lidPnorInfo); + iv_isLidInPnor = getLidPnorSectionInfo(iv_lidId, iv_lidPnorInfo); } sprintf(iv_lidFileName, "%x.lidbin", iv_lidId); iv_isLidInVFS = VFS::module_exists(iv_lidFileName); diff --git a/src/usr/util/test/testlidmgr.H b/src/usr/util/test/testlidmgr.H index 334c1d810..1644b1432 100644 --- a/src/usr/util/test/testlidmgr.H +++ b/src/usr/util/test/testlidmgr.H @@ -35,27 +35,13 @@ #include <errl/errlmanager.H> #include "../utilbase.H" -#include "../utillidpnor.H" +#include <util/utillidmgr.H> class LidMgrTest : public CxxTest::TestSuite { public: /** - * @brief Test to check if the const array lidToPnor is sorted - */ - void testLidToPnorSorted(void) - { - for (size_t i = 0; (i+1) < Util::NUM_LID_TO_PNOR; ++i) - { - if (Util::lidToPnor[i].first > Util::lidToPnor[i+1].first) - { - TS_FAIL("testLidToPnorSorted: utilidmgr lidToPnor[] is not sorted"); - } - } - } - - /** * @brief Test to check if the structure that maps lidID's to pnor sections * is working correctly */ diff --git a/src/usr/util/utillidmgr.C b/src/usr/util/utillidmgr.C index 767b2df23..a92a30f3c 100644 --- a/src/usr/util/utillidmgr.C +++ b/src/usr/util/utillidmgr.C @@ -824,7 +824,7 @@ void UtilLidMgr::updateLid(uint32_t i_lidId) //if it's in PNOR, it's not technically lid, so use a slightly //different extension. sprintf(iv_lidFileName, "%x.lidbin", iv_lidId); - iv_isLidInPnor = getLidPnorSection(iv_lidId, iv_lidPnorInfo); + iv_isLidInPnor = getLidPnorSectionInfo(iv_lidId, iv_lidPnorInfo); UTIL_FT(INFO_MRK "UtilLidMgr: LID 0x%.8X in pnor: %d", iv_lidId ,iv_isLidInPnor); iv_isLidInVFS = VFS::module_exists(iv_lidFileName); diff --git a/src/usr/util/utillidpnor.C b/src/usr/util/utillidpnor.C index e98e97a7d..b4c2d8ba4 100644 --- a/src/usr/util/utillidpnor.C +++ b/src/usr/util/utillidpnor.C @@ -24,61 +24,117 @@ /* IBM_PROLOG_END_TAG */ #include <util/utillidmgr.H> -#include <utility> -#include "utillidpnor.H" +#include <util/utillidpnor.H> #include <config.h> #ifdef CONFIG_SECUREBOOT #include <pnor/pnorif.H> #include <errl/errlmanager.H> #endif -bool UtilLidMgr::getLidPnorSection(uint32_t i_lidId, - PNOR::SectionInfo_t &o_lidPnorInfo) +#include <utility> +#include <map> + +namespace Util { - errlHndl_t l_err = NULL; - bool l_lidInPnor = false; - const std::pair<uint32_t, PNOR::SectionId> l_lid(i_lidId, - PNOR::INVALID_SECTION); +// Map of PNOR section Ids to pairs of LidIds +// Key - PNOR section +// Value - LidAndContainerLid +// The first Lid in the pair is the image content +// The second Lid in the pair is the Container LID (Secure Header) +static const PnorLidsMap PnorToLidsMap = +{ + { PNOR::TESTRO, LidAndContainerLid(TEST_LIDID, INVALID_LIDID)}, + { PNOR::OCC, LidAndContainerLid(OCC_LIDID, OCC_CONTAINER_LIDID)}, + { PNOR::WOFDATA, LidAndContainerLid(WOF_LIDID, WOF_CONTAINER_LIDID)}, + { PNOR::HCODE, LidAndContainerLid(NIMBUS_HCODE_LIDID, HCODE_CONTAINER_LIDID)}, + /* @TODO RTC:177927 - Figure out how to handle different Lids for the + same PNOR section based on chip. + { PNOR::HCODE, LidAndContainerLid(CUMULUS_HCODE_LIDID, HCODE_CONTAINER_LIDID)}, + */ + { PNOR::RINGOVD, LidAndContainerLid(HWREFIMG_RINGOVD_LIDID,INVALID_LIDID)}, +}; - const std::pair<uint32_t, PNOR::SectionId>* l_result = - std::lower_bound (Util::lidToPnor, - Util::lidToPnor + Util::NUM_LID_TO_PNOR, - l_lid, - Util::cmpLidToPnor); +LidAndContainerLid getPnorSecLidIds(const PNOR::SectionId i_sec) +{ + LidAndContainerLid l_lids; - if (l_result != (Util::lidToPnor + Util::NUM_LID_TO_PNOR) && - l_result->first == l_lid.first && - l_result->second != PNOR::INVALID_SECTION) + auto l_secIter = PnorToLidsMap.find(i_sec); + if (l_secIter != PnorToLidsMap.end()) { - l_err = PNOR::getSectionInfo(l_result->second, o_lidPnorInfo); + l_lids.lid = l_secIter->second.lid; + l_lids.containerLid = l_secIter->second.containerLid; + } + + return l_lids; +} + +PNOR::SectionId getLidPnorSection(const LidId i_lid) +{ + PNOR::SectionId l_secId = PNOR::INVALID_SECTION; + + // Search map by value + // Note: Sacrificed constant look up with another map in the reverse + // direction to simplify maintenance with a single map + auto l_secIter = std::find_if( PnorToLidsMap.begin(), + PnorToLidsMap.end(), + [i_lid](const PnorLidsPair & pair) -> bool + { + return pair.second.lid == i_lid; + }); + // Check if we found a valid entry. + if (l_secIter != PnorToLidsMap.end()) + { + l_secId = l_secIter->first; + } + + return l_secId; +} + +} // end Util namespace + +bool UtilLidMgr::getLidPnorSectionInfo(uint32_t i_lidId, + PNOR::SectionInfo_t &o_lidPnorInfo) +{ + errlHndl_t l_err = NULL; + bool l_lidInPnor = false; + + // Search if a lid id maps to pnor section + auto l_secId = Util::getLidPnorSection(static_cast<Util::LidId>(i_lidId)); + // LidToPnor will return INVALID_SECITON if no mapping found + if (l_secId == PNOR::INVALID_SECTION) + { + o_lidPnorInfo.id = PNOR::INVALID_SECTION; + } + // A mapping was found + else + { + l_err = PNOR::getSectionInfo(l_secId, o_lidPnorInfo); // Section is optional or lid is not in PNOR, so just delete error if (l_err) { o_lidPnorInfo.id = PNOR::INVALID_SECTION; - l_lidInPnor = false; delete l_err; l_err = NULL; } else { l_lidInPnor = true; - #ifdef CONFIG_SECUREBOOT #ifndef __HOSTBOOT_RUNTIME // The lid could be securely signed in PNOR if(o_lidPnorInfo.secure) { // Load the secure section - l_err = loadSecureSection(l_result->second); + l_err = loadSecureSection(l_secId); // If secure section fails to load log the error and assert if (l_err) { errlCommit(l_err, UTIL_COMP_ID); - assert(false,"UtilLidMgr::getLidPnorSection: attempt to " + assert(false,"UtilLidMgr::getLidPnorSectionInfo: attempt to " "load Secure Section %d failed", - l_result->second); + l_secId); } // In Secureboot, rather than using the whole partition size, @@ -94,5 +150,4 @@ bool UtilLidMgr::getLidPnorSection(uint32_t i_lidId, } } return l_lidInPnor; - -} +}
\ No newline at end of file diff --git a/src/usr/util/utillidpnor.H b/src/usr/util/utillidpnor.H deleted file mode 100644 index f4da469dc..000000000 --- a/src/usr/util/utillidpnor.H +++ /dev/null @@ -1,74 +0,0 @@ -/* IBM_PROLOG_BEGIN_TAG */ -/* This is an automatically generated prolog. */ -/* */ -/* $Source: src/usr/util/utillidpnor.H $ */ -/* */ -/* OpenPOWER HostBoot Project */ -/* */ -/* Contributors Listed Below - COPYRIGHT 2014,2017 */ -/* [+] International Business Machines Corp. */ -/* */ -/* */ -/* Licensed under the Apache License, Version 2.0 (the "License"); */ -/* you may not use this file except in compliance with the License. */ -/* You may obtain a copy of the License at */ -/* */ -/* http://www.apache.org/licenses/LICENSE-2.0 */ -/* */ -/* Unless required by applicable law or agreed to in writing, software */ -/* distributed under the License is distributed on an "AS IS" BASIS, */ -/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */ -/* implied. See the License for the specific language governing */ -/* permissions and limitations under the License. */ -/* */ -/* IBM_PROLOG_END_TAG */ -#ifndef _UTILLIDPNOR_H -#define _UTILLIDPNOR_H - -/** - * @file lidpnor.H - * - * @brief brief Provides the lid to pnor mapping currently used in the lidmgr - * In its own file to limit number of duplicate definitions for - * every user compared to being defined in utillidmgr - * - */ - -#include <util/utillidmgr.H> -#include <utility> - -namespace Util -{ - -/** - * @brief Simple compare function for lidToPnor elements - */ -bool cmpLidToPnor (const std::pair<uint32_t, PNOR::SectionId> p1, - const std::pair<uint32_t, PNOR::SectionId> p2) -{ - return (p1.first < p2.first); -} - -/** - * @brief Array containing lid to pnor mappings - * When adding maintain order by uint32_t (lidID) - * There is a test case to confirm this is sorted - */ -const std::pair<uint32_t, PNOR::SectionId> - lidToPnor[] = - { - std::make_pair(Util::TEST_LIDID, PNOR::TESTRO), // 0x00000111 - std::make_pair(Util::OCC_LIDID, PNOR::OCC), // 0x81e00430 - std::make_pair(Util::WOF_LIDID, PNOR::WOFDATA), // 0x81e00440 - std::make_pair(Util::NIMBUS_HCODE_LIDID, PNOR::HCODE), // 0x81e00602 - std::make_pair(Util::CUMULUS_HCODE_LIDID, PNOR::HCODE), // 0x81e00603 - std::make_pair(Util::HWREFIMG_RINGOVD_LIDID, PNOR::RINGOVD)// 0x81e00620 - }; - -// Size of lidToPnor[] -const size_t NUM_LID_TO_PNOR = ( sizeof(lidToPnor) / - sizeof(std::pair<uint32_t, PNOR::SectionId>)); - -} - -#endif |