blob: c8f97ca57a41c0df1b8e441002091c4c97e09541 [file] [log] [blame]
Ben Tyner87eabc62020-05-14 17:56:54 -05001#include <libpdbg.h>
2
Ben Tyner0205f3b2020-02-24 10:24:47 -06003#include <analyzer/analyzer_main.hpp>
Ben Tyner8c2f8b22020-03-27 10:39:31 -05004#include <boost/interprocess/ipc/message_queue.hpp>
Ben Tyner7212d212020-03-31 09:44:41 -05005#include <cli.hpp>
Ben Tyner8c2f8b22020-03-27 10:39:31 -05006#include <listener.hpp>
Ben Tyner0205f3b2020-02-24 10:24:47 -06007
8/**
9 * @brief Attention handler application main()
10 *
11 * This is the main interface to the hardware diagnostics application. This
12 * application will either be loaded as a daemon for monitoring the attention
13 * gpio or it will be loaded as an application to analyze hardware and
Zane Shelley611b3442021-11-19 16:02:01 -060014 * diagnose hardware error conditions.
Ben Tyner0205f3b2020-02-24 10:24:47 -060015 *
Ben Tyner8c2f8b22020-03-27 10:39:31 -050016 * Usage:
17 * --analyze: Analyze the hardware
18 * --start: Start the attention handler
19 * --stop: Stop the attention handler
20 * --all <on|off>: All attention handling
21 * --vital <on|off>: Vital attention handling
22 * --checkstop <on|off>: Checkstop attention handling
23 * --terminate <on|off>: Terminate Immiediately attention handling
24 * --breakpoints <on|off>: Breakpoint attention handling
Ben Tyner0205f3b2020-02-24 10:24:47 -060025 *
Ben Tyner8c2f8b22020-03-27 10:39:31 -050026 * Example: openpower-hw-diags --start --vital off
Ben Tyner0205f3b2020-02-24 10:24:47 -060027 *
28 * @return 0 = success
29 */
30int main(int argc, char* argv[])
31{
Ben Tynerb1ebfcb2020-05-08 18:52:48 -050032 int rc = RC_SUCCESS; // assume success
Ben Tyner0205f3b2020-02-24 10:24:47 -060033
Ben Tyner8c2f8b22020-03-27 10:39:31 -050034 using namespace boost::interprocess;
Ben Tyner3fb52e52020-03-31 10:10:07 -050035
Ben Tyner8c2f8b22020-03-27 10:39:31 -050036 if (argc == 1)
Ben Tyner0205f3b2020-02-24 10:24:47 -060037 {
Ben Tyner8c2f8b22020-03-27 10:39:31 -050038 printf("openpower-hw-diags <options>\n");
39 printf("options:\n");
40 printf(" --analyze: Analyze the hardware\n");
41 printf(" --start: Start the attention handler\n");
42 printf(" --stop: Stop the attention handler\n");
43 printf(" --all <on|off>: All attention handling\n");
44 printf(" --vital <on|off>: Vital attention handling\n");
45 printf(" --checkstop <on|off>: Checkstop attention handling\n");
46 printf(" --terminate <on|off>: Terminate Immediately attention "
47 "handling\n");
48 printf(" --breakpoints <on|off>: Breakpoint attention handling\n");
Ben Tyner0205f3b2020-02-24 10:24:47 -060049 }
Ben Tyner0205f3b2020-02-24 10:24:47 -060050 else
51 {
Ben Tyner87eabc62020-05-14 17:56:54 -050052 // Pdbg targets should only be initialized once according to
53 // libpdbg documentation. Initializing them here will make sure
54 // they are initialized for the attention handler, invocation of
55 // the analyzer via attention handler and direct invocation of
56 // the analyzer via command line (--analyze).
57
58 pdbg_targets_init(nullptr); // nullptr == use default fdt
Ben Tyner8c2f8b22020-03-27 10:39:31 -050059
60 // Either analyze (application mode) or daemon mode
61 if (true == getCliOption(argv, argv + argc, "--analyze"))
Ben Tyner0205f3b2020-02-24 10:24:47 -060062 {
Zane Shelleyebff0d32021-11-21 10:52:07 -060063 // Analyze the host hardware.
64 // TODO: At the moment, we'll only do MANUAL analysis (no service
65 // actions). It may be possible in the future to allow command
66 // line options to change the analysis type, if needed.
67
Zane Shelley611b3442021-11-19 16:02:01 -060068 attn::DumpParameters dumpParameters;
Zane Shelleyebff0d32021-11-21 10:52:07 -060069 analyzer::analyzeHardware(analyzer::AnalysisType::MANUAL,
70 dumpParameters);
Ben Tyner0205f3b2020-02-24 10:24:47 -060071 }
Ben Tyner8c2f8b22020-03-27 10:39:31 -050072 // daemon mode
73 else
74 {
Ben Tynerd70033a2020-06-09 15:59:29 -050075 // Handle pending attentions
76 attn::Config attnConfig;
77 attn::attnHandler(&attnConfig);
78
Ben Tyner8c2f8b22020-03-27 10:39:31 -050079 // assume listener is not running
80 bool listenerStarted = false;
Patrick Williams27dd6362023-05-10 07:51:20 -050081 bool newListener = false;
Ben Tyner0205f3b2020-02-24 10:24:47 -060082
Ben Tyner8c2f8b22020-03-27 10:39:31 -050083 pthread_t ptidListener; // handle to listener thread
84
85 // see if listener is already started
86 listenerStarted = listenerMqExists();
87
88 // listener is not running so start it
89 if (false == listenerStarted)
90 {
91 // create listener thread
92 if (0 ==
93 pthread_create(&ptidListener, NULL, &threadListener, NULL))
94 {
95 listenerStarted = true;
Patrick Williams27dd6362023-05-10 07:51:20 -050096 newListener = true;
Ben Tyner8c2f8b22020-03-27 10:39:31 -050097 }
98 else
99 {
100 rc = 1;
101 }
102 }
103
104 // listener was running or just started
105 if (true == listenerStarted)
106 {
107 // If we created a new listener this instance of
108 // openpower-hw-diags will become our daemon (it will not exit
109 // until stopped).
110 if (true == newListener)
111 {
112 bool listenerReady = false;
113
114 // It may take some time for the listener to become ready,
115 // we will wait until the message queue has been created
116 // before starting to communicate with our daemon.
117 while (false == listenerReady)
118 {
119 usleep(500);
120 listenerReady = listenerMqExists();
121 }
122 }
123
124 // send cmd line to listener thread
125 if (argc != sendCmdLine(argc, argv))
126 {
127 rc = 1;
128 }
129
130 // if this is a new listener let it run until "stopped"
131 if (true == newListener)
132 {
133 pthread_join(ptidListener, NULL);
134 }
135 }
136 }
137 }
Ben Tyner0205f3b2020-02-24 10:24:47 -0600138 return rc;
139}