From 90a67bf9d1907a14338cfeda342c4ece39e0d0be Mon Sep 17 00:00:00 2001 From: Sunny Srivastava Date: Tue, 1 Apr 2025 23:51:29 -0500 Subject: [PATCH] Proc data corruption defect Signed-off-by: Sunny Srivastava --- ibm_vpd_app.cpp | 18 ++++++++++++-- impl.cpp | 47 +++++++++++++++++++++++++++++++++++-- impl.hpp | 6 +++-- vpd-manager/editor_impl.cpp | 1 + vpd-parser/ipz_parser.cpp | 1 + 5 files changed, 67 insertions(+), 6 deletions(-) diff --git a/ibm_vpd_app.cpp b/ibm_vpd_app.cpp index cc54074ac..935284879 100644 --- a/ibm_vpd_app.cpp +++ b/ibm_vpd_app.cpp @@ -27,6 +27,7 @@ #include #include #include +#include using namespace std; using namespace openpower::vpd; @@ -932,8 +933,9 @@ std::variant break; } } - + executeCmd("hexdump -C -s 196608 -n 1024 /sys/bus/spi/drivers/at25/spi42.0/eeprom > /tmp/spi42_beforeGetDataInVector.txt"); Binary vpdVector = getVpdDataInVector(js, vpdFilePath); + executeCmd("hexdump -C -s 196608 -n 1024 /sys/bus/spi/drivers/at25/spi42.0/eeprom > /tmp/spi42_afterGetDataInVector.txt"); ParserInterface* parser = ParserFactory::getParser( vpdVector, @@ -998,6 +1000,7 @@ void updateVpdDataOnHw(const std::string& vpdFilePath, nlohmann::json& js, const std::string& recName, const std::string& kwName, const Binary& kwdData) { + std::cout<<"test_ updateVpdDataOnHw called "<(); @@ -1034,6 +1037,7 @@ void updateVpdDataOnHw(const std::string& vpdFilePath, nlohmann::json& js, void restoreSystemVPD(Parsed& vpdMap, const string& objectPath, nlohmann::json& js, bool isBackupOnCache = true) { + std::cout<<"Restore system VPD called"< /tmp/spi42_beforeParse.txt"); variant parseResult; parseResult = parseVpdFile(file, js); + std::cout<<"test_ parsing done, sleeping for 10s to check file content"< /tmp/spi42_afterParse.txt"); + using namespace std::chrono_literals; + std::this_thread::sleep_for(10s); + if (isSystemVpd) { // Get the value of systemVpdBackupPath field from json diff --git a/impl.cpp b/impl.cpp index 1f1cb9e88..872d69913 100644 --- a/impl.cpp +++ b/impl.cpp @@ -76,6 +76,7 @@ RecordOffset Impl::getVtocOffset() const #ifdef IPZ_PARSER int Impl::vhdrEccCheck() { + executeCmd("hexdump -C -s 196608 -n 1024 /sys/bus/spi/drivers/at25/spi42.0/eeprom > /tmp/spi42_beforeHDRECC_IPZ.txt"); int rc = eccStatus::SUCCESS; auto vpdPtr = vpd.cbegin(); @@ -88,6 +89,9 @@ int Impl::vhdrEccCheck() { try { + std::cout<<"Correction HDR ERR"<(&vpd[offsets::VHDR_RECORD]), lengths::VHDR_RECORD_LENGTH); + vpdFileStream.close(); } else { @@ -113,12 +118,14 @@ int Impl::vhdrEccCheck() { rc = eccStatus::FAILED; } + executeCmd("hexdump -C -s 196608 -n 1024 /sys/bus/spi/drivers/at25/spi42.0/eeprom > /tmp/spi42_afterHRDECC_IPZ.txt"); return rc; } int Impl::vtocEccCheck() { + executeCmd("hexdump -C -s 196608 -n 1024 /sys/bus/spi/drivers/at25/spi42.0/eeprom > /tmp/spi42_beforeTOCECC_IPZ.txt"); int rc = eccStatus::SUCCESS; // Use another pointer to get ECC information from VHDR, // actual pointer is pointing to VTOC data @@ -150,12 +157,17 @@ int Impl::vtocEccCheck() { try { + std::cout<<"Correction TOC ERR"<(&vpdPtr[vtocOffset]), vtocLength); + vpdFileStream.close(); } else { @@ -174,7 +186,7 @@ int Impl::vtocEccCheck() { rc = eccStatus::FAILED; } - + executeCmd("hexdump -C -s 196608 -n 1024 /sys/bus/spi/drivers/at25/spi42.0/eeprom > /tmp/spi42_afterTOCECC_IPZ.txt"); return rc; } @@ -193,18 +205,27 @@ int Impl::recordEccCheck(Binary::const_iterator iterator) std::advance(iterator, sizeof(ECCOffset)); auto eccLength = readUInt16LE(iterator); + std::cout<<"recordOffset"<<(int)recordOffset<(&vpdPtr[recordOffset]), recordLength); + + vpdFileStream.close(); } else { @@ -237,6 +264,7 @@ int Impl::recordEccCheck(Binary::const_iterator iterator) } else if (l_status != VPD_ECC_OK) { + std::cout<<"Ecc check failed"< /tmp/spi42_beforeCheckHeader_IPZ.txt"); if (vpd.empty() || (lengths::RECORD_MIN > vpd.size())) { throw(VpdDataException("Malformed VPD")); @@ -271,10 +300,12 @@ void Impl::checkHeader() } #endif } + executeCmd("hexdump -C -s 196608 -n 1024 /sys/bus/spi/drivers/at25/spi42.0/eeprom > /tmp/spi42_afterCheckHeader_IPZ.txt"); } std::size_t Impl::readTOC(Binary::const_iterator& iterator) { + executeCmd("hexdump -C -s 196608 -n 1024 /sys/bus/spi/drivers/at25/spi42.0/eeprom > /tmp/spi42_beforeReadTOC_IPZ.txt"); // The offset to VTOC could be 1 or 2 bytes long RecordOffset vtocOffset = getVtocOffset(); @@ -310,6 +341,7 @@ std::size_t Impl::readTOC(Binary::const_iterator& iterator) std::size_t ptLen = *iterator; // Skip past PT size std::advance(iterator, sizeof(KwSize)); + executeCmd("hexdump -C -s 196608 -n 1024 /sys/bus/spi/drivers/at25/spi42.0/eeprom > /tmp/spi42_afterReadTOC_IPZ.txt"); // length of PT keyword return ptLen; @@ -318,6 +350,7 @@ std::size_t Impl::readTOC(Binary::const_iterator& iterator) internal::OffsetList Impl::readPT(Binary::const_iterator iterator, std::size_t ptLength) { + executeCmd("hexdump -C -s 196608 -n 1024 /sys/bus/spi/drivers/at25/spi42.0/eeprom > /tmp/spi42_beforeReadPT_IPZ.txt"); internal::OffsetList offsets{}; auto end = iterator; @@ -343,9 +376,10 @@ internal::OffsetList Impl::readPT(Binary::const_iterator iterator, try { + executeCmd("hexdump -C -s 196608 -n 1024 /sys/bus/spi/drivers/at25/spi42.0/eeprom > /tmp/spi42_beforeRecordEccCheck_IPZ.txt"); // Verify the ECC for this Record int rc = recordEccCheck(iterator); - + executeCmd("hexdump -C -s 196608 -n 1024 /sys/bus/spi/drivers/at25/spi42.0/eeprom > /tmp/spi42_afterRecordEccCheck_IPZ.txt"); if (rc != eccStatus::SUCCESS) { std::string errorMsg = std::string( @@ -380,11 +414,13 @@ internal::OffsetList Impl::readPT(Binary::const_iterator iterator, sizeof(ECCOffset) + sizeof(ECCLength)); } + executeCmd("hexdump -C -s 196608 -n 1024 /sys/bus/spi/drivers/at25/spi42.0/eeprom > /tmp/spi42_afterReadPT_IPZ.txt"); return offsets; } void Impl::processRecord(std::size_t recordOffset) { + executeCmd("hexdump -C -s 196608 -n 1024 /sys/bus/spi/drivers/at25/spi42.0/eeprom > /tmp/spi42_beforeProcessRecord_IPZ.txt"); // Jump to record name auto nameOffset = recordOffset + sizeof(RecordId) + sizeof(RecordSize) + // Skip past the RT keyword, which contains @@ -415,6 +451,8 @@ void Impl::processRecord(std::size_t recordOffset) // to the parsed vpd output. out.emplace(std::move(name), std::move(kwMap)); + executeCmd("hexdump -C -s 196608 -n 1024 /sys/bus/spi/drivers/at25/spi42.0/eeprom > /tmp/spi42_afterProcessRecord_IPZ.txt"); + #ifndef IPZ_PARSER } #endif @@ -518,6 +556,7 @@ std::string Impl::readKwData(const internal::KeywordInfo& keyword, internal::KeywordMap Impl::readKeywords(Binary::const_iterator iterator) { + executeCmd("hexdump -C -s 196608 -n 1024 /sys/bus/spi/drivers/at25/spi42.0/eeprom > /tmp/spi42_beforeReadKWD_IPZ.txt"); internal::KeywordMap map{}; while (true) { @@ -576,6 +615,8 @@ internal::KeywordMap Impl::readKeywords(Binary::const_iterator iterator) std::advance(iterator, length); } + executeCmd("hexdump -C -s 196608 -n 1024 /sys/bus/spi/drivers/at25/spi42.0/eeprom > /tmp/spi42_afterReadKWD_IPZ.txt"); + return map; } @@ -596,6 +637,8 @@ Store Impl::run() { processRecord(offset); } + + // Return a Store object, which has interfaces to // access parsed VPD by record:keyword return Store(std::move(out)); diff --git a/impl.hpp b/impl.hpp index 280ba3bba..f9c395eb3 100644 --- a/impl.hpp +++ b/impl.hpp @@ -84,8 +84,10 @@ class Impl #endif try { - vpdFileStream.open(vpdFilePath, - std::ios::in | std::ios::out | std::ios::binary); + // executeCmd("hexdump -C -s 196608 -n 1024 /sys/bus/spi/drivers/at25/spi42.0/eeprom > /tmp/spi42_beforeOpeningStream_IPZ.txt"); + /* vpdFileStream.open(vpdFilePath, + std::ios::in | std::ios::out | std::ios::binary);*/ + // executeCmd("hexdump -C -s 196608 -n 1024 /sys/bus/spi/drivers/at25/spi42.0/eeprom > /tmp/spi42_afterOpeningStream_IPZ.txt"); } catch (const std::fstream::failure& fail) { diff --git a/vpd-manager/editor_impl.cpp b/vpd-manager/editor_impl.cpp index 898a92550..a722899f3 100644 --- a/vpd-manager/editor_impl.cpp +++ b/vpd-manager/editor_impl.cpp @@ -593,6 +593,7 @@ static void disableRebootGuard() void EditorImpl::updateKeyword(const Binary& kwdData, uint32_t offset, const bool& updCache) { + std::cout<<"test_ editor update keyword called"< IpzVpdParser::parse() { Impl p(vpd, inventoryPath, vpdFilePath, vpdStartOffset); Store s = p.run(); + executeCmd("hexdump -C -s 196608 -n 1024 /sys/bus/spi/drivers/at25/spi42.0/eeprom > /tmp/spi42_afterallParsingDone_IPZ.txt"); return s; }