summaryrefslogtreecommitdiffstats
path: root/src/usr/targeting/attrrp.C
diff options
context:
space:
mode:
Diffstat (limited to 'src/usr/targeting/attrrp.C')
-rwxr-xr-xsrc/usr/targeting/attrrp.C67
1 files changed, 67 insertions, 0 deletions
diff --git a/src/usr/targeting/attrrp.C b/src/usr/targeting/attrrp.C
index 2536f2769..28ffe8133 100755
--- a/src/usr/targeting/attrrp.C
+++ b/src/usr/targeting/attrrp.C
@@ -41,6 +41,7 @@
#include <vmmconst.h>
#include <targeting/adapters/assertadapter.H>
#include <targeting/common/targreasoncodes.H>
+#include <targeting/targplatreasoncodes.H>
#include <targeting/attrrp.H>
#include <targeting/common/trace.H>
#include <targeting/common/attributeTank.H>
@@ -650,6 +651,11 @@ namespace TARGETING
return Singleton<AttrRP>::instance()._save(io_addr);
}
+ errlHndl_t AttrRP::save( uint8_t* i_dest, size_t& io_size )
+ {
+ // Call save on singleton instance.
+ return Singleton<AttrRP>::instance()._save(i_dest,io_size);
+ }
uint64_t AttrRP::maxSize( )
{
@@ -711,6 +717,67 @@ namespace TARGETING
return region;
}
+ errlHndl_t AttrRP::_save( uint8_t* i_dest, size_t& io_size )
+ {
+ TRACFCOMP( g_trac_targeting, ENTER_MRK"AttrRP::_save: i_dest=%p, io_size=%ld", i_dest, io_size );
+ errlHndl_t l_err = nullptr;
+ uint8_t* pointer = i_dest;
+ uint64_t l_totalSize = 0;
+ uint64_t l_maxSize = io_size;
+ uint64_t l_filledSize = 0;
+
+ // Copy content.
+ for (size_t i = 0; i < iv_sectionCount; ++i)
+ {
+ l_totalSize += iv_sections[i].size;
+ if (l_totalSize <= l_maxSize)
+ {
+ l_filledSize = l_totalSize;
+ memcpy(pointer,
+ reinterpret_cast<void*>(iv_sections[i].vmmAddress),
+ iv_sections[i].size);
+
+ pointer = &pointer[ALIGN_PAGE(iv_sections[i].size)];
+ }
+ else
+ {
+ // Need a larger buffer
+ TRACFCOMP( g_trac_targeting, ERR_MRK"AttrRP::_save - max size %d exceeded, missing section %d, size %d",
+ io_size,i, iv_sections[i].size);
+ }
+ }
+
+ if (l_totalSize > io_size)
+ {
+ // Need to increase size of the buffer
+ /*@
+ * @errortype
+ * @moduleid TARG_MOD_SAVE_ATTR_TANK
+ * @reasoncode TARG_SPACE_OVERRUN
+ * @userdata1 Maximum Available size
+ * @userdata2 Required size
+ *
+ * @devdesc Size of attribute data exceeds available
+ * buffer space
+ *
+ * @custdesc Internal firmware error applying
+ * custom configuration settings
+ */
+ l_err = new ErrlEntry(ERRL_SEV_UNRECOVERABLE,
+ TARG_MOD_SAVE_ATTR_TANK,
+ TARG_SPACE_OVERRUN,
+ io_size,
+ l_totalSize,
+ true /*SW Error */);
+ }
+
+ io_size = l_filledSize;
+
+ TRACFCOMP(g_trac_targeting, EXIT_MRK"AttrRP::_save: i_dest=%p, io_size=%ld, size needed=%ld", i_dest, io_size, l_totalSize );
+ return l_err;
+ }
+
+
errlHndl_t AttrRP::_saveOverrides( uint8_t* i_dest, size_t& io_size )
{
OpenPOWER on IntegriCloud