summaryrefslogtreecommitdiffstats
path: root/src/usr/util
diff options
context:
space:
mode:
authorStephen Cprek <smcprek@us.ibm.com>2017-07-27 16:56:12 -0500
committerDaniel M. Crowell <dcrowell@us.ibm.com>2017-08-11 10:09:54 -0400
commitca30e6bf9ea440ba1fd8c7fb5092b9fe6e18aba0 (patch)
tree9a8028d226e4c24071fb216c47cb49f6faaa0e8b /src/usr/util
parenta0e8246b27da999d4d8beba64994daef6333a442 (diff)
downloadtalos-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.C2
-rw-r--r--src/usr/util/test/testlidmgr.H16
-rw-r--r--src/usr/util/utillidmgr.C2
-rw-r--r--src/usr/util/utillidpnor.C103
-rw-r--r--src/usr/util/utillidpnor.H74
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
OpenPOWER on IntegriCloud