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