diff options
author | Dan Crowell <dcrowell@us.ibm.com> | 2017-03-06 16:36:11 -0600 |
---|---|---|
committer | Daniel M. Crowell <dcrowell@us.ibm.com> | 2017-04-16 21:32:17 -0400 |
commit | 6677ffcbda04c73a7d3ed1e651e3394c8218e503 (patch) | |
tree | 2de578165f3517ecd95dd56548a4e5ebdfa4bb8b /src/usr/targeting | |
parent | 6274618ff6a4b0cd8447c1e31940c66b40fa1c42 (diff) | |
download | talos-hostboot-6677ffcbda04c73a7d3ed1e651e3394c8218e503.tar.gz talos-hostboot-6677ffcbda04c73a7d3ed1e651e3394c8218e503.zip |
Propagate attribute overrides up to the HBRT code
Attribute overrides are stored in a separate tank of memory from
the regular attribute values. This tank will be added as an
additional reserved memory section for HBRT to consume (only if
overrides exist).
Also fixed a couple bugs encountered while testing:
- No longer crashes if an error is created inside the targeting
initialization code.
- Added reserved bytes to RHB definition.
Change-Id: I5b10f7ad8dfcb58c550868bb83c4d843f48e1aae
RTC: 169942
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/38547
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com>
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Reviewed-by: Corey V. Swenson <cswenson@us.ibm.com>
Reviewed-by: Martin Gloff <mgloff@us.ibm.com>
Reviewed-by: Christian R. Geddes <crgeddes@us.ibm.com>
Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src/usr/targeting')
-rw-r--r-- | src/usr/targeting/attrPlatOverride.C | 11 | ||||
-rwxr-xr-x | src/usr/targeting/attrrp.C | 152 | ||||
-rwxr-xr-x | src/usr/targeting/common/xmltohb/target_types.xml | 12 | ||||
-rw-r--r-- | src/usr/targeting/runtime/attrPlatOverride_rt.C | 70 | ||||
-rw-r--r-- | src/usr/targeting/runtime/attrrp_rt.C | 9 | ||||
-rw-r--r-- | src/usr/targeting/runtime/test/testtargeting.H | 43 |
6 files changed, 267 insertions, 30 deletions
diff --git a/src/usr/targeting/attrPlatOverride.C b/src/usr/targeting/attrPlatOverride.C index b9af17f92..2848c920b 100644 --- a/src/usr/targeting/attrPlatOverride.C +++ b/src/usr/targeting/attrPlatOverride.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2014,2016 */ +/* Contributors Listed Below - COPYRIGHT 2014,2017 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -31,6 +31,14 @@ namespace TARGETING { +const std::pair<AttributeTank::TankLayer, PNOR::SectionId> + tankLayerToPnor[AttributeTank::TANK_LAYER_LAST] = + { + std::make_pair(AttributeTank::TANK_LAYER_FAPI, PNOR::ATTR_TMP), + std::make_pair(AttributeTank::TANK_LAYER_TARG, PNOR::ATTR_TMP), + std::make_pair(AttributeTank::TANK_LAYER_PERM, PNOR::ATTR_PERM) + }; + errlHndl_t getAttrOverrides(PNOR::SectionInfo_t &i_sectionInfo, AttributeTank* io_tanks[AttributeTank::TANK_LAYER_LAST]) { @@ -63,6 +71,7 @@ errlHndl_t getAttrOverrides(PNOR::SectionInfo_t &i_sectionInfo, do { + TRACFCOMP( g_trac_targeting, "Section id=%d, size=%d", i_sectionInfo.id, i_sectionInfo.size ); uint32_t l_index = 0; // Deserialize each section diff --git a/src/usr/targeting/attrrp.C b/src/usr/targeting/attrrp.C index cc0cc57c1..f67ac831f 100755 --- a/src/usr/targeting/attrrp.C +++ b/src/usr/targeting/attrrp.C @@ -43,9 +43,12 @@ #include <targeting/common/targreasoncodes.H> #include <targeting/attrrp.H> #include <targeting/common/trace.H> +#include <targeting/common/attributeTank.H> #include <initservice/initserviceif.H> #include <util/align.H> #include <sys/misc.h> +#include <fapi2/plat_attr_override_sync.H> +#include <targeting/attrPlatOverride.H> using namespace INITSERVICE; using namespace ERRORLOG; @@ -651,6 +654,13 @@ namespace TARGETING } // end maxSize + errlHndl_t AttrRP::saveOverrides( uint8_t* i_dest, size_t& io_size ) + { + // Call save on singleton instance. + return Singleton<AttrRP>::instance()._saveOverrides(i_dest,io_size); + } + + void* AttrRP::_save(uint64_t& io_addr) { TRACDCOMP(g_trac_targeting, "AttrRP::save: top @ 0x%lx", io_addr); @@ -687,4 +697,146 @@ namespace TARGETING return region; } + + errlHndl_t AttrRP::_saveOverrides( uint8_t* i_dest, size_t& io_size ) + { + TRACFCOMP( g_trac_targeting, ENTER_MRK"AttrRP::_saveOverrides: i_dest=%p, io_size=%d", i_dest, io_size ); + errlHndl_t l_err = nullptr; + + do + { + size_t l_maxSize = io_size; + io_size = 0; + + // Save the fapi and temp overrides + // Note: no need to look at PERM because those were added to + // the base targeting model + + size_t l_tankSize = l_maxSize; + uint8_t* l_dest = i_dest; + + // FAPI + l_err = saveOverrideTank( l_dest, + l_tankSize, + &fapi2::theAttrOverrideSync().iv_overrideTank, + AttributeTank::TANK_LAYER_FAPI ); + if( l_err ) + { + break; + } + l_maxSize -= l_tankSize; + io_size += l_tankSize; + + // TARGETING + l_tankSize = l_maxSize; + l_dest = i_dest + io_size; + l_err = saveOverrideTank( l_dest, + l_tankSize, + &Target::theTargOverrideAttrTank(), + AttributeTank::TANK_LAYER_TARG ); + if( l_err ) + { + break; + } + l_maxSize -= l_tankSize; + io_size += l_tankSize; + } while(0); + + TRACFCOMP( g_trac_targeting, EXIT_MRK"AttrRP::_saveOverrides: io_size=%d, l_err=%.8X", io_size, ERRL_GETRC_SAFE(l_err) ); + return l_err; + } + + errlHndl_t AttrRP::saveOverrideTank( uint8_t* i_dest, + size_t& io_size, + AttributeTank* i_tank, + AttributeTank::TankLayer i_layer ) + { + TRACFCOMP( g_trac_targeting, ENTER_MRK"AttrRP::saveOverrideTank: i_dest=%p, io_size=%d, i_layer=%d", i_dest, io_size, i_layer ); + errlHndl_t l_err = nullptr; + size_t l_maxSize = io_size; + io_size = 0; + + // List of chunks we're going to save away + std::vector<AttributeTank::AttributeSerializedChunk> l_chunks; + i_tank->serializeAttributes( + TARGETING::AttributeTank::ALLOC_TYPE_MALLOC, + PAGESIZE, l_chunks ); + + // Copy each chunk until we run out of space + for( auto l_chunk : l_chunks ) + { + // total size of data plus header for this chunk + uint32_t l_chunkSize = l_chunk.iv_size; + l_chunkSize += sizeof(AttrOverrideSection); + // don't want to double-count the data payload... + l_chunkSize -= sizeof(AttrOverrideSection::iv_chunk); + + // look for overflow, but only create 1 error + if( (l_err == nullptr) + && (io_size + l_chunkSize > l_maxSize) ) + { + TRACFCOMP( g_trac_targeting, ERR_MRK"Size of chunk is too big" ); + /*@ + * @errortype + * @moduleid TARG_MOD_SAVE_OVERRIDE_TANK + * @reasoncode TARG_SPACE_OVERRUN + * @userdata1[00:31] Maximum Available size + * @userdata1[32:63] Required size + * @userdata2[00:31] Chunk Size + * @userdata2[32:63] Previous Size + * + * @devdesc Size of override data exceeds available + * buffer space + * + * @custdesc Internal firmware error applying + * custom configuration settings + */ + l_err = new ErrlEntry(ERRL_SEV_UNRECOVERABLE, + TARG_CREATE_VMM_SECTIONS, + TARG_RC_MM_PERM_FAIL, + TWO_UINT32_TO_UINT64(l_maxSize, + io_size + l_chunkSize), + TWO_UINT32_TO_UINT64(l_chunkSize, + io_size), + true /*SW Error */); + //deliberately not breaking out here so that we can + // compute the required size and free the memory in + // one place + } + + if( l_err == nullptr ) + { + // fill in the header + AttrOverrideSection* l_header = + reinterpret_cast<AttrOverrideSection*>(i_dest+io_size); + l_header->iv_layer = i_layer; + l_header->iv_size = l_chunk.iv_size; + + // add the data + memcpy( l_header->iv_chunk, + l_chunk.iv_pAttributes, + l_chunk.iv_size ); + } + + io_size += l_chunkSize; + + // freeing data that was allocated by serializeAttributes() + free( l_chunk.iv_pAttributes ); + l_chunk.iv_pAttributes = NULL; + } + + // add a terminator at the end since the size might get lost + // but only if we found some overrides + if( (io_size > 0) + && (io_size + sizeof(AttributeTank::TankLayer) < l_maxSize) ) + { + AttrOverrideSection* l_term = + reinterpret_cast<AttrOverrideSection*>(i_dest+io_size); + l_term->iv_layer = AttributeTank::TANK_LAYER_TERM; + io_size += sizeof(AttributeTank::TankLayer); + } + + TRACFCOMP( g_trac_targeting, ENTER_MRK"AttrRP::saveOverrideTank: io_size=%d", io_size ); + return l_err; + } }; diff --git a/src/usr/targeting/common/xmltohb/target_types.xml b/src/usr/targeting/common/xmltohb/target_types.xml index eb56559c2..d0a0e529d 100755 --- a/src/usr/targeting/common/xmltohb/target_types.xml +++ b/src/usr/targeting/common/xmltohb/target_types.xml @@ -577,6 +577,18 @@ <attribute><id>SCRATCH_UINT32_ARRAY_2</id></attribute> <attribute><id>SCRATCH_UINT64_ARRAY_1</id></attribute> <attribute><id>SCRATCH_UINT64_ARRAY_2</id></attribute> + <attribute><id>SCRATCH_INT8_1</id></attribute> + <attribute><id>SCRATCH_INT8_2</id></attribute> + <attribute><id>SCRATCH_INT32_1</id></attribute> + <attribute><id>SCRATCH_INT32_2</id></attribute> + <attribute><id>SCRATCH_INT64_1</id></attribute> + <attribute><id>SCRATCH_INT64_2</id></attribute> + <attribute><id>SCRATCH_INT8_ARRAY_1</id></attribute> + <attribute><id>SCRATCH_INT8_ARRAY_2</id></attribute> + <attribute><id>SCRATCH_INT32_ARRAY_1</id></attribute> + <attribute><id>SCRATCH_INT32_ARRAY_2</id></attribute> + <attribute><id>SCRATCH_INT64_ARRAY_1</id></attribute> + <attribute><id>SCRATCH_INT64_ARRAY_2</id></attribute> <attribute> <id>AFFINITY_PATH</id> <default>affinity:sys-0</default> diff --git a/src/usr/targeting/runtime/attrPlatOverride_rt.C b/src/usr/targeting/runtime/attrPlatOverride_rt.C index 2c28edec8..92a937f03 100644 --- a/src/usr/targeting/runtime/attrPlatOverride_rt.C +++ b/src/usr/targeting/runtime/attrPlatOverride_rt.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2014,2016 */ +/* Contributors Listed Below - COPYRIGHT 2014,2017 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -89,37 +89,59 @@ int apply_attr_override(uint8_t* i_data, void applyTempOverrides() { - // With FSP, we can not access PNOR, just return - if(INITSERVICE::spBaseServicesEnabled()) + TRACFCOMP(g_trac_targeting, ENTER_MRK"applyTempOverrides"); + errlHndl_t l_err = NULL; + + // Get a pointer to the reserved memory where HB + // saved the overrides during boot + uint64_t l_overAddr = 0; + uint8_t* l_overPtr = nullptr; + if( g_hostInterfaces != NULL && + g_hostInterfaces->get_reserved_mem ) { + l_overAddr = g_hostInterfaces + ->get_reserved_mem("ibm,hbrt-targetoverride-image",0); + if( l_overAddr != 0 ) + { + TRACFCOMP(g_trac_targeting, "Overrides found at %.16X", l_overAddr ); + l_overPtr = reinterpret_cast<uint8_t*>(l_overAddr); + } + else + { + // grab the data we stashed at the end of the targeting data + l_overAddr = g_hostInterfaces + ->get_reserved_mem("ibm,hbrt-target-image",0); + if( l_overAddr != 0 ) + { + l_overAddr += (1*MEGABYTE - 64*KILOBYTE); + TRACFCOMP(g_trac_targeting, "NULL from get_reserved_mem, using stashed value at %.llX instead", l_overAddr ); + l_overPtr = reinterpret_cast<uint8_t*>(l_overAddr); + } + } + } + + // Having no overrides is a normal thing + if( l_overPtr == nullptr ) + { + TRACFCOMP(g_trac_targeting, "No Overrides found" ); + TRACFCOMP(g_trac_targeting, EXIT_MRK"applyTempOverrides"); return; } - TRACFCOMP(g_trac_targeting, ENTER_MRK"applyTempOverrides"); - errlHndl_t l_err = NULL; + // Use a faux PNOR Section that is associated + // with the data in mainstore PNOR::SectionInfo_t l_info; - // Get temporary attribute overrides from pnor - l_err = PNOR::getSectionInfo(PNOR::ATTR_TMP, l_info); + l_info.vaddr = l_overAddr; + l_info.size = 64*KILOBYTE; //@fixme-RTC:171863-use real size + l_info.id = PNOR::ATTR_TMP; + l_info.name = "HBRT Overrides"; - // Attr override sections are optional so just delete error + TRACFCOMP(g_trac_targeting," HBRT: processing overrides from boot"); + l_err = TARGETING::getAttrOverrides(l_info); if (l_err) { - TRACFCOMP(g_trac_targeting," HBRT: error getting ATTR_TMP pnor " - "section. Not applying temp attributes."); - delete l_err; - l_err = NULL; - } - else - { - TRACFCOMP(g_trac_targeting," HBRT: processing temporary " - "overrides"); - l_err = TARGETING::getAttrOverrides(l_info); - if (l_err) - { - TRACFCOMP(g_trac_targeting," HBRT: Failed applyTempOverrides:" - " getting temporary overrides"); - errlCommit( l_err, TARG_COMP_ID ); - } + TRACFCOMP(g_trac_targeting," HBRT: Failed applying overrides"); + errlCommit( l_err, TARG_COMP_ID ); } TRACFCOMP(g_trac_targeting, EXIT_MRK"applyTempOverrides"); diff --git a/src/usr/targeting/runtime/attrrp_rt.C b/src/usr/targeting/runtime/attrrp_rt.C index cf4370f05..4f323e699 100644 --- a/src/usr/targeting/runtime/attrrp_rt.C +++ b/src/usr/targeting/runtime/attrrp_rt.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2013,2016 */ +/* Contributors Listed Below - COPYRIGHT 2013,2017 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -38,12 +38,15 @@ namespace TARGETING { void AttrRP::startup(errlHndl_t& io_taskRetErrl, bool isMpipl) { + TRACFCOMP(g_trac_targeting, "AttrRP::startup"); errlHndl_t l_errl = NULL; do { - TargetingHeader* l_header = reinterpret_cast<TargetingHeader*>( - g_hostInterfaces->get_reserved_mem("ibm,hbrt-target-image",0)); + TargetingHeader* l_header = + reinterpret_cast<TargetingHeader*>( + g_hostInterfaces-> + get_reserved_mem(HBRT_RSVD_MEM__ATTRIBUTES,0)); if ((NULL == l_header) || (l_header->eyeCatcher != PNOR_TARG_EYE_CATCHER)) diff --git a/src/usr/targeting/runtime/test/testtargeting.H b/src/usr/targeting/runtime/test/testtargeting.H index 68ef93603..99c0fbbb4 100644 --- a/src/usr/targeting/runtime/test/testtargeting.H +++ b/src/usr/targeting/runtime/test/testtargeting.H @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2013,2016 */ +/* Contributors Listed Below - COPYRIGHT 2013,2017 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -119,6 +119,35 @@ class TargetingTestSuite : public CxxTest::TestSuite } } + // Verify HBRT is picking up the overrides from the IPL + // Note: must be before testApplyAttrOverrides, because that + // test clears out all of the overrides + void testIplOverrides() + { + using namespace TARGETING; + TRACFCOMP(g_trac_targeting,"testIplOverrides"); + + //See rt_get_targ_override() for setup details about setting + // SYSTEM:ATTR_SCRATCH_INT32_1 = -99 + + TargetService& l_targetService = targetService(); + TARGETING::Target* l_pTarget = NULL; + (void) l_targetService.getTopLevelTarget(l_pTarget); + if (l_pTarget == NULL) + { + TS_FAIL("Top level target handle is NULL"); + } + else + { + ATTR_SCRATCH_INT32_1_type l_val = + l_pTarget->getAttr<TARGETING::ATTR_SCRATCH_INT32_1>(); + if( l_val != -99 ) + { + TS_FAIL("testIplOverrides> SCRATCH_INT32_1=%d, expected %d", l_val, -99 ); + } + } + } + void testApplyAttrOverrides() { using namespace TARGETING; @@ -218,8 +247,18 @@ class TargetingTestSuite : public CxxTest::TestSuite l_attrNewVal,l_attrOverrideVal); break; } - TRACFCOMP(g_trac_targeting,"testApplyAttrOverrides SUCCESS"); + // verify that any previous overrides are not still there + ATTR_SCRATCH_INT32_1_type l_val = + l_pTarget->getAttr<TARGETING::ATTR_SCRATCH_INT32_1>(); + if( l_val == -99 ) + { + TS_FAIL("testApplyAttrOverrides> SCRATCH_INT32_1=%d, expected %d", -99, 0 ); + break; + } + + TRACFCOMP(g_trac_targeting,"testApplyAttrOverrides SUCCESS"); } while (0); } + }; |