11a4f0e70SCaleb Palmer #include <stdio.h> 21a4f0e70SCaleb Palmer 31a4f0e70SCaleb Palmer #include <analyzer/analyzer_main.hpp> 41a4f0e70SCaleb Palmer #include <analyzer/plugins/plugin.hpp> 51a4f0e70SCaleb Palmer #include <analyzer/ras-data/ras-data-parser.hpp> 61a4f0e70SCaleb Palmer #include <hei_util.hpp> 71a4f0e70SCaleb Palmer #include <util/pdbg.hpp> 81a4f0e70SCaleb Palmer #include <util/trace.hpp> 91a4f0e70SCaleb Palmer 101a4f0e70SCaleb Palmer #include "gtest/gtest.h" 111a4f0e70SCaleb Palmer 121a4f0e70SCaleb Palmer namespace analyzer 131a4f0e70SCaleb Palmer { 141a4f0e70SCaleb Palmer // Forward reference of filterRootCause 151a4f0e70SCaleb Palmer bool filterRootCause(AnalysisType i_type, 161a4f0e70SCaleb Palmer const libhei::IsolationData& i_isoData, 171a4f0e70SCaleb Palmer libhei::Signature& o_rootCause, 181a4f0e70SCaleb Palmer const RasDataParser& i_rasData); 191a4f0e70SCaleb Palmer } // namespace analyzer 201a4f0e70SCaleb Palmer 211a4f0e70SCaleb Palmer using namespace analyzer; 221a4f0e70SCaleb Palmer 231a4f0e70SCaleb Palmer static const auto eqCoreFir = static_cast<libhei::NodeId_t>( 241a4f0e70SCaleb Palmer libhei::hash<libhei::NodeId_t>("EQ_CORE_FIR")); 251a4f0e70SCaleb Palmer 261a4f0e70SCaleb Palmer static const auto rdfFir = 271a4f0e70SCaleb Palmer static_cast<libhei::NodeId_t>(libhei::hash<libhei::NodeId_t>("RDFFIR")); 281a4f0e70SCaleb Palmer 2951f8202cSCaleb Palmer static const auto mc_dstl_fir = static_cast<libhei::NodeId_t>( 3051f8202cSCaleb Palmer libhei::hash<libhei::NodeId_t>("MC_DSTL_FIR")); 3151f8202cSCaleb Palmer 321a4f0e70SCaleb Palmer TEST(RootCauseFilter, Filter1) 331a4f0e70SCaleb Palmer { 341a4f0e70SCaleb Palmer pdbg_targets_init(nullptr); 351a4f0e70SCaleb Palmer 3651f8202cSCaleb Palmer RasDataParser rasData{}; 3751f8202cSCaleb Palmer 3851f8202cSCaleb Palmer // Test 1: Test a checkstop with a UE root cause on an OCMB 3951f8202cSCaleb Palmer 401a4f0e70SCaleb Palmer // Checkstop signature on the proc 411a4f0e70SCaleb Palmer auto proc0 = util::pdbg::getTrgt("/proc0"); 421a4f0e70SCaleb Palmer libhei::Chip procChip0{proc0, P10_20}; 431a4f0e70SCaleb Palmer 441a4f0e70SCaleb Palmer // EQ_CORE_FIR[14]: ME = 0 checkstop 451a4f0e70SCaleb Palmer libhei::Signature checkstopSig{procChip0, eqCoreFir, 0, 14, 46*adda0540SZane Shelley libhei::ATTN_TYPE_CHIP_CS}; 471a4f0e70SCaleb Palmer 4851f8202cSCaleb Palmer // MC_DSTL_FIR[1]: AFU initiated Recoverable Attn on Subchannel A 4951f8202cSCaleb Palmer libhei::Signature reAttnSig{procChip0, mc_dstl_fir, 0, 1, 5051f8202cSCaleb Palmer libhei::ATTN_TYPE_RECOVERABLE}; 5151f8202cSCaleb Palmer 521a4f0e70SCaleb Palmer // Root cause signature on the ocmb 531a4f0e70SCaleb Palmer auto ocmb0 = 541a4f0e70SCaleb Palmer util::pdbg::getTrgt("proc0/pib/perv12/mc0/mi0/mcc0/omi0/ocmb0"); 551a4f0e70SCaleb Palmer libhei::Chip ocmbChip0{ocmb0, EXPLORER_20}; 561a4f0e70SCaleb Palmer 571a4f0e70SCaleb Palmer // RDFFIR[14]: Mainline read UE 581a4f0e70SCaleb Palmer libhei::Signature ueSig{ocmbChip0, rdfFir, 0, 14, 591a4f0e70SCaleb Palmer libhei::ATTN_TYPE_RECOVERABLE}; 601a4f0e70SCaleb Palmer 611a4f0e70SCaleb Palmer // Add the signatures to the isolation data 621a4f0e70SCaleb Palmer libhei::IsolationData isoData{}; 631a4f0e70SCaleb Palmer isoData.addSignature(checkstopSig); 6451f8202cSCaleb Palmer isoData.addSignature(reAttnSig); 651a4f0e70SCaleb Palmer isoData.addSignature(ueSig); 661a4f0e70SCaleb Palmer 671a4f0e70SCaleb Palmer libhei::Signature rootCause; 681a4f0e70SCaleb Palmer bool attnFound = filterRootCause(AnalysisType::SYSTEM_CHECKSTOP, isoData, 691a4f0e70SCaleb Palmer rootCause, rasData); 701a4f0e70SCaleb Palmer EXPECT_TRUE(attnFound); 711a4f0e70SCaleb Palmer EXPECT_EQ(ueSig.toUint32(), rootCause.toUint32()); 7251f8202cSCaleb Palmer 7351f8202cSCaleb Palmer // Test 2: Test a checkstop with an unknown RE attn on an OCMB 7451f8202cSCaleb Palmer 7551f8202cSCaleb Palmer // Add the signatures to the isolation data 7651f8202cSCaleb Palmer isoData.flush(); 7751f8202cSCaleb Palmer isoData.addSignature(checkstopSig); 7851f8202cSCaleb Palmer isoData.addSignature(reAttnSig); 7951f8202cSCaleb Palmer 8051f8202cSCaleb Palmer attnFound = filterRootCause(AnalysisType::SYSTEM_CHECKSTOP, isoData, 8151f8202cSCaleb Palmer rootCause, rasData); 8251f8202cSCaleb Palmer EXPECT_TRUE(attnFound); 8351f8202cSCaleb Palmer EXPECT_EQ(reAttnSig.toUint32(), rootCause.toUint32()); 8451f8202cSCaleb Palmer 8551f8202cSCaleb Palmer // Test 3: Test a checkstop with an unknown UCS attn on an OCMB 8651f8202cSCaleb Palmer 8751f8202cSCaleb Palmer // MC_DSTL_FIR[0]: AFU initiated Checkstop on Subchannel A 8851f8202cSCaleb Palmer libhei::Signature ucsAttnSig{procChip0, mc_dstl_fir, 0, 0, 8951f8202cSCaleb Palmer libhei::ATTN_TYPE_UNIT_CS}; 9051f8202cSCaleb Palmer 9151f8202cSCaleb Palmer isoData.flush(); 9251f8202cSCaleb Palmer isoData.addSignature(checkstopSig); 9351f8202cSCaleb Palmer isoData.addSignature(ucsAttnSig); 9451f8202cSCaleb Palmer 9551f8202cSCaleb Palmer attnFound = filterRootCause(AnalysisType::SYSTEM_CHECKSTOP, isoData, 9651f8202cSCaleb Palmer rootCause, rasData); 9751f8202cSCaleb Palmer EXPECT_TRUE(attnFound); 9851f8202cSCaleb Palmer EXPECT_EQ(ucsAttnSig.toUint32(), rootCause.toUint32()); 9951f8202cSCaleb Palmer 10051f8202cSCaleb Palmer // Test 4: Test a checkstop with a non-root cause recoverable from an OCMB 10151f8202cSCaleb Palmer 10251f8202cSCaleb Palmer // RDFFIR[42]: SCOM recoverable register parity error 10351f8202cSCaleb Palmer libhei::Signature reSig{ocmbChip0, rdfFir, 0, 42, 10451f8202cSCaleb Palmer libhei::ATTN_TYPE_RECOVERABLE}; 10551f8202cSCaleb Palmer 10651f8202cSCaleb Palmer isoData.flush(); 10751f8202cSCaleb Palmer isoData.addSignature(checkstopSig); 10851f8202cSCaleb Palmer isoData.addSignature(reAttnSig); 10951f8202cSCaleb Palmer isoData.addSignature(reSig); 11051f8202cSCaleb Palmer 11151f8202cSCaleb Palmer attnFound = filterRootCause(AnalysisType::SYSTEM_CHECKSTOP, isoData, 11251f8202cSCaleb Palmer rootCause, rasData); 11351f8202cSCaleb Palmer EXPECT_TRUE(attnFound); 11451f8202cSCaleb Palmer EXPECT_EQ(checkstopSig.toUint32(), rootCause.toUint32()); 1151a4f0e70SCaleb Palmer } 116