diff -drupN a/kernel/panic.c b/kernel/panic.c --- a/kernel/panic.c 2018-08-06 17:23:04.000000000 +0300 +++ b/kernel/panic.c 2022-06-12 05:28:14.000000000 +0300 @@ -24,7 +24,12 @@ #include #include #include +#include +#include +#include +#include #include +#include #define PANIC_TIMER_STEP 100 #define PANIC_BLINK_SPD 18 @@ -40,6 +45,13 @@ int panic_on_warn __read_mostly; int panic_timeout = CONFIG_PANIC_TIMEOUT; EXPORT_SYMBOL_GPL(panic_timeout); +#ifdef CONFIG_SUNXI_DUMP +int sunxi_dump = 1; +#else +int sunxi_dump; +#endif +EXPORT_SYMBOL_GPL(sunxi_dump); + ATOMIC_NOTIFIER_HEAD(panic_notifier_list); EXPORT_SYMBOL(panic_notifier_list); @@ -285,6 +297,27 @@ void panic(const char *fmt, ...) } #endif pr_emerg("---[ end Kernel panic - not syncing: %s\n", buf); + + if (sunxi_dump) { + unsigned int i; + + flush_cache_all(); + sunxi_dump_group_dump(); + + for (i = 0; i < num_possible_cpus(); i++) { + if (i == smp_processor_id()) + continue; + + while (1) { + if (!cpu_online(i)) + break; + mdelay(10); + } + } + pr_emerg("crashdump enter\n"); + arisc_set_crashdump_mode(); + } + local_irq_enable(); for (i = 0; ; i += PANIC_TIMER_STEP) { touch_softlockup_watchdog();