summaryrefslogtreecommitdiffstats
path: root/src/usr/targeting
diff options
context:
space:
mode:
Diffstat (limited to 'src/usr/targeting')
-rw-r--r--src/usr/targeting/attrPlatOverride.C11
-rwxr-xr-xsrc/usr/targeting/attrrp.C152
-rwxr-xr-xsrc/usr/targeting/common/xmltohb/target_types.xml12
-rw-r--r--src/usr/targeting/runtime/attrPlatOverride_rt.C70
-rw-r--r--src/usr/targeting/runtime/attrrp_rt.C9
-rw-r--r--src/usr/targeting/runtime/test/testtargeting.H43
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);
}
+
};
OpenPOWER on IntegriCloud