diff options
-rw-r--r-- | src/usr/hdat/hdatiohub.C | 4 | ||||
-rwxr-xr-x | src/usr/hdat/hdatvpd.C | 79 |
2 files changed, 49 insertions, 34 deletions
diff --git a/src/usr/hdat/hdatiohub.C b/src/usr/hdat/hdatiohub.C index c2f5d7eea..ea0a3ff54 100644 --- a/src/usr/hdat/hdatiohub.C +++ b/src/usr/hdat/hdatiohub.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2016,2018 */ +/* Contributors Listed Below - COPYRIGHT 2016,2019 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -54,7 +54,6 @@ vpdData mvpdData[] = { PVPD::VINI, PVPD::B4 }, { PVPD::VINI, PVPD::B7 }, { PVPD::VINI, PVPD::PF }, - { PVPD::VINI, PVPD::LX }, }; const HdatKeywordInfo l_pvpdKeywords[] = @@ -74,7 +73,6 @@ const HdatKeywordInfo l_pvpdKeywords[] = { PVPD::B4, "B4" }, { PVPD::B7, "B7" }, { PVPD::PF, "PF" }, - { PVPD::LX, "LX" }, }; extern trace_desc_t *g_trac_hdat; diff --git a/src/usr/hdat/hdatvpd.C b/src/usr/hdat/hdatvpd.C index a07996921..8a76bf842 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; @@ -238,16 +251,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) { |