blob: 421c67406c18f9364493d8c8ac5239b8b1a3a77d [file] [log] [blame]
Zane Shelley65fefb22021-10-18 15:35:26 -05001#include <assert.h>
2
3#include <hei_main.hpp>
4
5#include <algorithm>
6#include <limits>
7#include <string>
8
9namespace analyzer
10{
11
12//------------------------------------------------------------------------------
13
14bool filterRootCause(const libhei::IsolationData& i_isoData,
15 libhei::Signature& o_rootCause)
16{
17 // We'll need to make a copy of the list so that the original list is
18 // maintained for the log.
19 std::vector<libhei::Signature> list{i_isoData.getSignatureList()};
20
21 // START WORKAROUND
22 // TODO: Filtering should be data driven. Until that support is available,
23 // use the following isolation rules.
24
25 // Special and host attentions are not supported by this user application.
26 auto itr = std::remove_if(list.begin(), list.end(), [&](const auto& t) {
27 return (libhei::ATTN_TYPE_SP_ATTN == t.getAttnType() ||
28 libhei::ATTN_TYPE_HOST_ATTN == t.getAttnType());
29 });
30 list.resize(std::distance(list.begin(), itr));
31
32 // TODO: This is a rudimentary filter that first looks for any recoverable
33 // attention, then any unit checkstop, and then any system checkstop.
34 // This is built on the premise that recoverable errors could be the
35 // root cause of an system checkstop attentions. Fortunately, we
36 // just need to sort the list by the greater attention type value.
37 std::sort(list.begin(), list.end(), [&](const auto& a, const auto& b) {
38 return a.getAttnType() > b.getAttnType();
39 });
40 if (!list.empty())
41 {
42 // The entry at the front of the list will be the root cause.
43 o_rootCause = list.front();
44 return true;
45 }
46
47 // END WORKAROUND
48
49 return false; // default, no active attentions found.
50}
51
52//------------------------------------------------------------------------------
53
54} // namespace analyzer