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 29*51f8202cSCaleb Palmer static const auto mc_dstl_fir = static_cast<libhei::NodeId_t>( 30*51f8202cSCaleb Palmer libhei::hash<libhei::NodeId_t>("MC_DSTL_FIR")); 31*51f8202cSCaleb Palmer 321a4f0e70SCaleb Palmer TEST(RootCauseFilter, Filter1) 331a4f0e70SCaleb Palmer { 341a4f0e70SCaleb Palmer pdbg_targets_init(nullptr); 351a4f0e70SCaleb Palmer 36*51f8202cSCaleb Palmer RasDataParser rasData{}; 37*51f8202cSCaleb Palmer 38*51f8202cSCaleb Palmer // Test 1: Test a checkstop with a UE root cause on an OCMB 39*51f8202cSCaleb 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, 461a4f0e70SCaleb Palmer libhei::ATTN_TYPE_CHECKSTOP}; 471a4f0e70SCaleb Palmer 48*51f8202cSCaleb Palmer // MC_DSTL_FIR[1]: AFU initiated Recoverable Attn on Subchannel A 49*51f8202cSCaleb Palmer libhei::Signature reAttnSig{procChip0, mc_dstl_fir, 0, 1, 50*51f8202cSCaleb Palmer libhei::ATTN_TYPE_RECOVERABLE}; 51*51f8202cSCaleb 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); 64*51f8202cSCaleb 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()); 72*51f8202cSCaleb Palmer 73*51f8202cSCaleb Palmer // Test 2: Test a checkstop with an unknown RE attn on an OCMB 74*51f8202cSCaleb Palmer 75*51f8202cSCaleb Palmer // Add the signatures to the isolation data 76*51f8202cSCaleb Palmer isoData.flush(); 77*51f8202cSCaleb Palmer isoData.addSignature(checkstopSig); 78*51f8202cSCaleb Palmer isoData.addSignature(reAttnSig); 79*51f8202cSCaleb Palmer 80*51f8202cSCaleb Palmer attnFound = filterRootCause(AnalysisType::SYSTEM_CHECKSTOP, isoData, 81*51f8202cSCaleb Palmer rootCause, rasData); 82*51f8202cSCaleb Palmer EXPECT_TRUE(attnFound); 83*51f8202cSCaleb Palmer EXPECT_EQ(reAttnSig.toUint32(), rootCause.toUint32()); 84*51f8202cSCaleb Palmer 85*51f8202cSCaleb Palmer // Test 3: Test a checkstop with an unknown UCS attn on an OCMB 86*51f8202cSCaleb Palmer 87*51f8202cSCaleb Palmer // MC_DSTL_FIR[0]: AFU initiated Checkstop on Subchannel A 88*51f8202cSCaleb Palmer libhei::Signature ucsAttnSig{procChip0, mc_dstl_fir, 0, 0, 89*51f8202cSCaleb Palmer libhei::ATTN_TYPE_UNIT_CS}; 90*51f8202cSCaleb Palmer 91*51f8202cSCaleb Palmer isoData.flush(); 92*51f8202cSCaleb Palmer isoData.addSignature(checkstopSig); 93*51f8202cSCaleb Palmer isoData.addSignature(ucsAttnSig); 94*51f8202cSCaleb Palmer 95*51f8202cSCaleb Palmer attnFound = filterRootCause(AnalysisType::SYSTEM_CHECKSTOP, isoData, 96*51f8202cSCaleb Palmer rootCause, rasData); 97*51f8202cSCaleb Palmer EXPECT_TRUE(attnFound); 98*51f8202cSCaleb Palmer EXPECT_EQ(ucsAttnSig.toUint32(), rootCause.toUint32()); 99*51f8202cSCaleb Palmer 100*51f8202cSCaleb Palmer // Test 4: Test a checkstop with a non-root cause recoverable from an OCMB 101*51f8202cSCaleb Palmer 102*51f8202cSCaleb Palmer // RDFFIR[42]: SCOM recoverable register parity error 103*51f8202cSCaleb Palmer libhei::Signature reSig{ocmbChip0, rdfFir, 0, 42, 104*51f8202cSCaleb Palmer libhei::ATTN_TYPE_RECOVERABLE}; 105*51f8202cSCaleb Palmer 106*51f8202cSCaleb Palmer isoData.flush(); 107*51f8202cSCaleb Palmer isoData.addSignature(checkstopSig); 108*51f8202cSCaleb Palmer isoData.addSignature(reAttnSig); 109*51f8202cSCaleb Palmer isoData.addSignature(reSig); 110*51f8202cSCaleb Palmer 111*51f8202cSCaleb Palmer attnFound = filterRootCause(AnalysisType::SYSTEM_CHECKSTOP, isoData, 112*51f8202cSCaleb Palmer rootCause, rasData); 113*51f8202cSCaleb Palmer EXPECT_TRUE(attnFound); 114*51f8202cSCaleb Palmer EXPECT_EQ(checkstopSig.toUint32(), rootCause.toUint32()); 1151a4f0e70SCaleb Palmer } 116