diff --git a/include/linux/kernel.h b/include/linux/kernel.h index f6f94e54ab96..f03f598ae2ae 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h @@ -323,6 +323,7 @@ static inline void might_fault(void) { } #endif extern struct atomic_notifier_head panic_notifier_list; +extern void (*vendor_panic_cb)(u64 sp); extern long (*panic_blink)(int state); __printf(1, 2) void panic(const char *fmt, ...) __noreturn __cold; diff --git a/kernel/panic.c b/kernel/panic.c index 8138a676fb7d..cbcfbbfb95fa 100644 --- a/kernel/panic.c +++ b/kernel/panic.c @@ -47,9 +47,11 @@ int panic_timeout = CONFIG_PANIC_TIMEOUT; EXPORT_SYMBOL_GPL(panic_timeout); ATOMIC_NOTIFIER_HEAD(panic_notifier_list); - EXPORT_SYMBOL(panic_notifier_list); +void (*vendor_panic_cb)(u64 sp); +EXPORT_SYMBOL_GPL(vendor_panic_cb); + static long no_blink(int state) { return 0; @@ -177,6 +179,8 @@ void panic(const char *fmt, ...) va_start(args, fmt); vsnprintf(buf, sizeof(buf), fmt, args); va_end(args); + if (vendor_panic_cb) + vendor_panic_cb(0); pr_emerg("Kernel panic - not syncing: %s\n", buf); #ifdef CONFIG_DEBUG_BUGVERBOSE /*