diff options
Diffstat (limited to 'src/usr/hdat/hdatvpd.C')
-rwxr-xr-x | src/usr/hdat/hdatvpd.C | 84 |
1 files changed, 52 insertions, 32 deletions
diff --git a/src/usr/hdat/hdatvpd.C b/src/usr/hdat/hdatvpd.C index a07996921..9c72c020c 100755 --- a/src/usr/hdat/hdatvpd.C +++ b/src/usr/hdat/hdatvpd.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2016,2017 */ +/* Contributors Listed Below - COPYRIGHT 2016,2019 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -58,6 +58,13 @@ extern trace_desc_t * g_hdatTraceDesc; /*----------------------------------------------------------------------------*/ const uint16_t HDAT_VPD_VERSION = 0x0020; +const uint8_t LX_RECORD_TEMPLATE[] = +{0x84, 0x1C, 0x00, 0x52, 0x54, 0x04, 0x4C, 0x58, + 0x52, 0x30, 0x56, 0x5A, 0x02, 0x30, 0x31, 0x4C, + 0x58, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x50, 0x46, 0x02, 0x00, 0x00, 0x78}; +const uint16_t LX_RECORD_SIZE = 32; +const uint16_t LX_KEYWORD_OFFSET= 18; /** @brief See the prologue in hdatvpd.H */ @@ -118,6 +125,19 @@ iv_kwdSize(0), iv_kwd(NULL) HDAT_DBG("hdatGetAsciiKwd returned kwd size =%d",iv_kwdSize); + char *o_fmtKwd; + uint32_t o_fmtkwdSize; + o_errlHndl = hdatformatAsciiKwd(i_fetchVpd, i_num, theSize, iv_kwd, + iv_kwdSize, o_fmtKwd, o_fmtkwdSize, i_pvpdKeywords); + if( o_fmtKwd != NULL ) + { + delete[] iv_kwd; + iv_kwd = new char [o_fmtkwdSize]; + memcpy(iv_kwd,o_fmtKwd,o_fmtkwdSize); + iv_kwdSize = o_fmtkwdSize; + delete[] o_fmtKwd; + } + if(strcmp(i_eyeCatcher,"IO KID")==0) { using namespace TARGETING; @@ -130,30 +150,23 @@ iv_kwdSize(0), iv_kwd(NULL) //fetching lx data uint64_t l_LXvalue = l_sysTarget->getAttr<ATTR_ASCII_VPD_LX_KEYWORD>(); - char *temp_kwd = new char [iv_kwdSize]; - uint32_t temp_kwdSize = iv_kwdSize; - memcpy(temp_kwd, iv_kwd,iv_kwdSize); - delete[] iv_kwd; - iv_kwdSize +=sizeof(uint64_t); - iv_kwd = new char [iv_kwdSize]; - memcpy(iv_kwd,temp_kwd,temp_kwdSize); - memcpy((void *)(iv_kwd+temp_kwdSize),&l_LXvalue,sizeof(uint64_t)); - theSize[i_num-1] = sizeof(uint64_t); - delete[] temp_kwd; - } - char *o_fmtKwd; - uint32_t o_fmtkwdSize; - o_errlHndl = hdatformatAsciiKwd(i_fetchVpd, i_num, theSize, iv_kwd, - iv_kwdSize, o_fmtKwd, o_fmtkwdSize, i_pvpdKeywords); - if( o_fmtKwd != NULL ) - { + char *temp_lx = new char[LX_RECORD_SIZE]; + memcpy(temp_lx, LX_RECORD_TEMPLATE, LX_RECORD_SIZE); + memcpy((void*)(temp_lx + LX_KEYWORD_OFFSET), &l_LXvalue, sizeof(uint64_t)); + + //append LXR0 record to VINI record + size_t combined_size = iv_kwdSize + LX_RECORD_SIZE; + char * temp_buf = new char[combined_size]; + memcpy(temp_buf,iv_kwd,iv_kwdSize); + memcpy((void *)(temp_buf+iv_kwdSize),temp_lx, LX_RECORD_SIZE); + + delete[] temp_lx; delete[] iv_kwd; - iv_kwd = new char [o_fmtkwdSize]; - memcpy(iv_kwd,o_fmtKwd,o_fmtkwdSize); - iv_kwdSize = o_fmtkwdSize; - delete[] o_fmtKwd; + iv_kwd = temp_buf; + iv_kwdSize = combined_size; } + if (NULL == o_errlHndl) { iv_fru.hdatSlcaIdx = l_slcaIdx; @@ -194,7 +207,10 @@ iv_kwdSize(0), iv_kwd(NULL) TARGETING::TargetHandleList l_targList; PredicateCTM predNode(TARGETING::CLASS_ENC, TARGETING::TYPE_NODE); PredicateHwas predFunctional; - predFunctional.functional(true); + //@TODO:RTC 213229(Remove HDAT hack or Axone) + //crashes below at l_target because the node got deconfigured + //changed from functional to present + predFunctional.present(true); PredicatePostfixExpr nodeCheckExpr; nodeCheckExpr.push(&predNode).push(&predFunctional).And(); @@ -238,16 +254,20 @@ iv_kwdSize(0), iv_kwd(NULL) //fetching lx data uint64_t l_LXvalue = l_sysTarget->getAttr<ATTR_ASCII_VPD_LX_KEYWORD>(); - char *temp_kwd = new char [iv_kwdSize]; - uint32_t temp_kwdSize = iv_kwdSize; - memcpy(temp_kwd, iv_kwd,iv_kwdSize); + char *temp_lx = new char[LX_RECORD_SIZE]; + memcpy(temp_lx, LX_RECORD_TEMPLATE, LX_RECORD_SIZE); + memcpy((void*)(temp_lx + LX_KEYWORD_OFFSET), &l_LXvalue, sizeof(uint64_t)); + + //append LXR0 record to VINI record + size_t combined_size = iv_kwdSize + LX_RECORD_SIZE; + char * temp_buf = new char[combined_size]; + memcpy(temp_buf,iv_kwd,iv_kwdSize); + memcpy((void *)(temp_buf+iv_kwdSize),temp_lx, LX_RECORD_SIZE); + + delete[] temp_lx; delete[] iv_kwd; - iv_kwdSize +=sizeof(uint64_t); - iv_kwd = new char [iv_kwdSize]; - memcpy(iv_kwd,temp_kwd,temp_kwdSize); - memcpy((void *)(iv_kwd+temp_kwdSize),&l_LXvalue,sizeof(uint64_t)); - theSize[i_num-1] = sizeof(uint64_t); - delete[] temp_kwd; + iv_kwd = temp_buf; + iv_kwdSize = combined_size; } if (NULL == o_errlHndl) { |