xref: /openbmc/openpower-hw-diags/cli.cpp (revision e4f5dbef747fb2a95768ba4fcf6286f559056bd7)
172feadcfSBen Tyner #include <attn/attn_config.hpp>
272feadcfSBen Tyner 
37212d21dSBen Tyner #include <algorithm>
47212d21dSBen Tyner #include <string>
57212d21dSBen Tyner 
67212d21dSBen Tyner /** @brief Search the command line arguments for an option */
77212d21dSBen Tyner bool getCliOption(char** i_begin, char** i_end, const std::string& i_option)
87212d21dSBen Tyner {
97212d21dSBen Tyner     return (i_end != std::find(i_begin, i_end, i_option));
107212d21dSBen Tyner }
117212d21dSBen Tyner 
127212d21dSBen Tyner /** @brief Search the command line arguments for a setting value */
137212d21dSBen Tyner char* getCliSetting(char** i_begin, char** i_end, const std::string& i_setting)
147212d21dSBen Tyner {
157212d21dSBen Tyner     char** value = std::find(i_begin, i_end, i_setting);
167212d21dSBen Tyner     return (value != i_end && ++value != i_end) ? *value : 0;
177212d21dSBen Tyner }
187212d21dSBen Tyner 
197212d21dSBen Tyner /** @brief Parse command line for configuration flags */
2072feadcfSBen Tyner void parseConfig(char** i_begin, char** i_end, attn::Config* o_config)
217212d21dSBen Tyner {
227212d21dSBen Tyner     char* setting;
237212d21dSBen Tyner 
247212d21dSBen Tyner     // --all on/off takes precedence over individual settings
257212d21dSBen Tyner     setting = getCliSetting(i_begin, i_end, "--all");
267212d21dSBen Tyner     if (nullptr != setting)
277212d21dSBen Tyner     {
287212d21dSBen Tyner         if (std::string("off") == setting)
297212d21dSBen Tyner         {
3072feadcfSBen Tyner             o_config->clearFlagAll();
317212d21dSBen Tyner         }
327212d21dSBen Tyner 
337212d21dSBen Tyner         if (std::string("on") == setting)
347212d21dSBen Tyner         {
3572feadcfSBen Tyner             o_config->setFlagAll();
367212d21dSBen Tyner         }
377212d21dSBen Tyner     }
387212d21dSBen Tyner     // Parse individual options
397212d21dSBen Tyner     else
407212d21dSBen Tyner     {
417212d21dSBen Tyner         setting = getCliSetting(i_begin, i_end, "--vital");
42d3cda742SBen Tyner         if (nullptr != setting)
43d3cda742SBen Tyner         {
447212d21dSBen Tyner             if (std::string("off") == setting)
457212d21dSBen Tyner             {
4672feadcfSBen Tyner                 o_config->clearFlag(attn::enVital);
477212d21dSBen Tyner             }
487212d21dSBen Tyner             if (std::string("on") == setting)
497212d21dSBen Tyner             {
5072feadcfSBen Tyner                 o_config->setFlag(attn::enVital);
517212d21dSBen Tyner             }
52d3cda742SBen Tyner         }
537212d21dSBen Tyner 
547212d21dSBen Tyner         setting = getCliSetting(i_begin, i_end, "--checkstop");
55d3cda742SBen Tyner         if (nullptr != setting)
56d3cda742SBen Tyner         {
577212d21dSBen Tyner             if (std::string("off") == setting)
587212d21dSBen Tyner             {
5972feadcfSBen Tyner                 o_config->clearFlag(attn::enCheckstop);
607212d21dSBen Tyner             }
617212d21dSBen Tyner             if (std::string("on") == setting)
627212d21dSBen Tyner             {
6372feadcfSBen Tyner                 o_config->setFlag(attn::enCheckstop);
647212d21dSBen Tyner             }
65d3cda742SBen Tyner         }
667212d21dSBen Tyner 
677212d21dSBen Tyner         setting = getCliSetting(i_begin, i_end, "--terminate");
68d3cda742SBen Tyner         if (nullptr != setting)
69d3cda742SBen Tyner         {
707212d21dSBen Tyner             if (std::string("off") == setting)
717212d21dSBen Tyner             {
7272feadcfSBen Tyner                 o_config->clearFlag(attn::enTerminate);
737212d21dSBen Tyner             }
747212d21dSBen Tyner             if (std::string("on") == setting)
757212d21dSBen Tyner             {
7672feadcfSBen Tyner                 o_config->setFlag(attn::enTerminate);
777212d21dSBen Tyner             }
78d3cda742SBen Tyner         }
797212d21dSBen Tyner 
807212d21dSBen Tyner         setting = getCliSetting(i_begin, i_end, "--breakpoints");
81d3cda742SBen Tyner         if (nullptr != setting)
82d3cda742SBen Tyner         {
837212d21dSBen Tyner             if (std::string("off") == setting)
847212d21dSBen Tyner             {
8572feadcfSBen Tyner                 o_config->clearFlag(attn::enBreakpoints);
867212d21dSBen Tyner             }
877212d21dSBen Tyner             if (std::string("on") == setting)
887212d21dSBen Tyner             {
8972feadcfSBen Tyner                 o_config->setFlag(attn::enBreakpoints);
907212d21dSBen Tyner             }
917212d21dSBen Tyner         }
92*e4f5dbefSBen Tyner 
93*e4f5dbefSBen Tyner         // This option determines whether we service a TI or breakpoint in the
94*e4f5dbefSBen Tyner         // case where we cannot retrieve the TI info succesfully. The default
95*e4f5dbefSBen Tyner         // setting of this is "clear" meaning handle TI by default. This
96*e4f5dbefSBen Tyner         // flag is not affected by the set/clear all command line option.
97*e4f5dbefSBen Tyner         if (true == getCliOption(i_begin, i_end, "--defaultbreakpoint"))
98*e4f5dbefSBen Tyner         {
99*e4f5dbefSBen Tyner             o_config->setFlag(attn::dfltBreakpoint);
100*e4f5dbefSBen Tyner         }
1017212d21dSBen Tyner     }
102d3cda742SBen Tyner }
103