1 #include "registration.hpp" 2 3 #include <fmt/format.h> 4 extern "C" 5 { 6 #include <libpdbg.h> 7 } 8 #include <phosphor-logging/log.hpp> 9 10 namespace openpower 11 { 12 namespace phal 13 { 14 using namespace phosphor::logging; 15 16 /** 17 * @brief Stop instruction executions on all functional threads in the 18 * host processors. 19 * This procedure is used to stop all threads in the system in 20 * attempt best case approach. Like issue processor level stopall 21 * chip-op with ignore hardware error mode. Since this function 22 * is used in power-off/error path, ignore the internal error now. 23 */ 24 void threadStopAll(void) 25 { 26 // Set pdbg back-end to sbefifo. 27 pdbg_set_backend(PDBG_BACKEND_SBEFIFO, NULL); 28 29 // initialize the pdbg. 30 pdbg_targets_init(NULL); 31 32 struct pdbg_target* pibTarget; 33 34 pdbg_for_each_class_target("pib", pibTarget) 35 { 36 // probe pib traget. 37 pdbg_target_probe(pibTarget); 38 } 39 40 // Issue system level thread stop 41 if (thread_stop_all() < 0) 42 { 43 log<level::ERR>("Failed to stop all threads"); 44 return; 45 } 46 log<level::INFO>("Processor thread stopall completed"); 47 } 48 49 REGISTER_PROCEDURE("threadStopAll", threadStopAll) 50 51 } // namespace phal 52 } // namespace openpower 53