mako: debug: porting lge crash handler
Change-Id: I913d372131a25bb9c0d90680f5e96cebb8883055
diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c
index a9582f9..fdb2add 100644
--- a/arch/arm/kernel/process.c
+++ b/arch/arm/kernel/process.c
@@ -412,6 +412,12 @@
unsigned long flags;
char buf[64];
+#ifdef CONFIG_LGE_CRASH_HANDLER
+#ifdef CONFIG_CPU_CP15_MMU
+ unsigned int c1, c2;
+#endif
+ set_crash_store_enable();
+#endif
printk("CPU: %d %s (%s %.*s)\n",
raw_smp_processor_id(), print_tainted(),
init_utsname()->release,
@@ -419,7 +425,11 @@
init_utsname()->version);
print_symbol("PC is at %s\n", instruction_pointer(regs));
print_symbol("LR is at %s\n", regs->ARM_lr);
+#ifdef CONFIG_LGE_CRASH_HANDLER
+ printk("pc : <%08lx> lr : <%08lx> psr: %08lx\n"
+#else
printk("pc : [<%08lx>] lr : [<%08lx>] psr: %08lx\n"
+#endif
"sp : %08lx ip : %08lx fp : %08lx\n",
regs->ARM_pc, regs->ARM_lr, regs->ARM_cpsr,
regs->ARM_sp, regs->ARM_ip, regs->ARM_fp);
@@ -432,6 +442,9 @@
printk("r3 : %08lx r2 : %08lx r1 : %08lx r0 : %08lx\n",
regs->ARM_r3, regs->ARM_r2,
regs->ARM_r1, regs->ARM_r0);
+#ifdef CONFIG_LGE_CRASH_HANDLER
+ set_crash_store_disable();
+#endif
flags = regs->ARM_cpsr;
buf[0] = flags & PSR_N_BIT ? 'N' : 'n';
@@ -459,11 +472,18 @@
: "=r" (transbase), "=r" (dac));
snprintf(buf, sizeof(buf), " Table: %08x DAC: %08x",
transbase, dac);
+#if defined(CONFIG_CPU_CP15_MMU) && defined(CONFIG_LGE_CRASH_HANDLER)
+ c1 = transbase;
+ c2 = dac;
+#endif
}
#endif
asm("mrc p15, 0, %0, c1, c0\n" : "=r" (ctrl));
printk("Control: %08x%s\n", ctrl, buf);
+#if defined(CONFIG_CPU_CP15_MMU) && defined(CONFIG_LGE_CRASH_HANDLER)
+ lge_save_ctx(regs, ctrl, c1, c2);
+#endif
}
#endif
diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c
index 63d402f..ff5d873 100644
--- a/arch/arm/kernel/traps.c
+++ b/arch/arm/kernel/traps.c
@@ -39,6 +39,10 @@
static const char *handler[]= { "prefetch abort", "data abort", "address exception", "interrupt" };
+#ifdef CONFIG_LGE_CRASH_HANDLER
+static int first_call_chain = 0;
+static int first_die = 1;
+#endif
void *vectors_page;
#ifdef CONFIG_DEBUG_USER
@@ -57,7 +61,14 @@
void dump_backtrace_entry(unsigned long where, unsigned long from, unsigned long frame)
{
#ifdef CONFIG_KALLSYMS
+#ifdef CONFIG_LGE_CRASH_HANDLER
+ if (first_call_chain)
+ set_crash_store_enable();
+#endif
printk("[<%08lx>] (%pS) from [<%08lx>] (%pS)\n", where, (void *)where, from, (void *)from);
+#ifdef CONFIG_LGE_CRASH_HANDLER
+ set_crash_store_disable();
+#endif
#else
printk("Function entered at [<%08lx>] from [<%08lx>]\n", where, from);
#endif
@@ -239,9 +250,22 @@
static int die_counter;
int ret;
+#ifdef CONFIG_LGE_CRASH_HANDLER
+ if (first_die) {
+ first_call_chain = 1;
+ first_die = 0;
+ }
+ set_kernel_crash_magic_number();
+ set_crash_store_enable();
+#endif
+
printk(KERN_EMERG "Internal error: %s: %x [#%d]" S_PREEMPT S_SMP
S_ISA "\n", str, err, ++die_counter);
+#ifdef CONFIG_LGE_CRASH_HANDLER
+ set_crash_store_disable();
+#endif
+
/* trap and error numbers are mostly meaningless on ARM */
ret = notify_die(DIE_OOPS, str, regs, err, tsk->thread.trap_no, SIGSEGV);
if (ret == NOTIFY_STOP)
@@ -257,6 +281,9 @@
THREAD_SIZE + (unsigned long)task_stack_page(tsk));
dump_backtrace(regs, tsk);
dump_instr(KERN_EMERG, regs);
+#ifdef CONFIG_LGE_CRASH_HANDLER
+ first_call_chain = 0;
+#endif
}
return ret;