diff options
-rw-r--r-- | core/opal-dump.c | 7 | ||||
-rw-r--r-- | hw/sbe-p9.c | 4 | ||||
-rw-r--r-- | include/opal-dump.h | 3 |
3 files changed, 14 insertions, 0 deletions
diff --git a/core/opal-dump.c b/core/opal-dump.c index 9ca01e5..bb90c45 100644 --- a/core/opal-dump.c +++ b/core/opal-dump.c @@ -16,6 +16,7 @@ #define pr_fmt(fmt) "DUMP: " fmt +#include <cpu.h> #include <device.h> #include <mem-map.h> #include <mem_region.h> @@ -328,6 +329,12 @@ static int64_t opal_mpipl_register_tag(enum opal_mpipl_tags tag, return rc; } +void opal_mpipl_save_crashing_pir(void) +{ + mpipl_metadata->crashing_pir = this_cpu()->pir; + prlog(PR_NOTICE, "Crashing PIR = 0x%x\n", this_cpu()->pir); +} + void opal_mpipl_init(void) { void *mdst_base = (void *)MDST_TABLE_BASE; diff --git a/hw/sbe-p9.c b/hw/sbe-p9.c index a9810a1..5c63ec1 100644 --- a/hw/sbe-p9.c +++ b/hw/sbe-p9.c @@ -40,6 +40,7 @@ #include <errorlog.h> #include <lock.h> #include <opal.h> +#include <opal-dump.h> #include <sbe-p9.h> #include <skiboot.h> #include <timebase.h> @@ -951,6 +952,9 @@ void p9_sbe_terminate(void) if (!dt_find_by_path(opal_node, "dump")) return; + /* Save crashing CPU details */ + opal_mpipl_save_crashing_pir(); + /* * Send S0 interrupt to all SBE. Sequence: * - S0 interrupt on secondary chip SBE diff --git a/include/opal-dump.h b/include/opal-dump.h index e115382..866d11a 100644 --- a/include/opal-dump.h +++ b/include/opal-dump.h @@ -121,4 +121,7 @@ struct mpipl_metadata { /* init opal dump */ extern void opal_mpipl_init(void); +/* Save metadata before triggering MPIPL */ +void opal_mpipl_save_crashing_pir(void); + #endif /* __OPAL_DUMP_H */ |