diff options
Diffstat (limited to 'drivers/soc/qcom/common_log.c')
-rw-r--r-- | drivers/soc/qcom/common_log.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/drivers/soc/qcom/common_log.c b/drivers/soc/qcom/common_log.c index 1e8744b41e4c..11ca86a4ba41 100644 --- a/drivers/soc/qcom/common_log.c +++ b/drivers/soc/qcom/common_log.c @@ -18,6 +18,7 @@ #include <linux/slab.h> #include <linux/kmemleak.h> #include <linux/async.h> +#include <linux/thread_info.h> #include <soc/qcom/memory_dump.h> #include <soc/qcom/minidump.h> #include <asm/sections.h> @@ -256,6 +257,32 @@ static void __init register_kernel_sections(void) } } +#ifdef CONFIG_QCOM_MINIDUMP +void dump_stack_minidump(u64 sp) +{ + struct md_region ksp_entry, ktsk_entry; + u32 cpu = smp_processor_id(); + + if (sp < KIMAGE_VADDR || sp > -256UL) + sp = current_stack_pointer; + + sp &= ~(THREAD_SIZE - 1); + scnprintf(ksp_entry.name, sizeof(ksp_entry.name), "KSTACK%d", cpu); + ksp_entry.virt_addr = sp; + ksp_entry.phys_addr = virt_to_phys((uintptr_t *)sp); + ksp_entry.size = THREAD_SIZE; + if (msm_minidump_add_region(&ksp_entry)) + pr_err("Failed to add stack of cpu %d in Minidump\n", cpu); + + scnprintf(ktsk_entry.name, sizeof(ktsk_entry.name), "KTASK%d", cpu); + ktsk_entry.virt_addr = (u64)current; + ktsk_entry.phys_addr = virt_to_phys((uintptr_t *)current); + ktsk_entry.size = sizeof(struct task_struct); + if (msm_minidump_add_region(&ktsk_entry)) + pr_err("Failed to add current task %d in Minidump\n", cpu); +} +#endif + static void __init async_common_log_init(void *data, async_cookie_t cookie) { register_kernel_sections(); |