aboutsummaryrefslogtreecommitdiff
path: root/drivers/misc/mediatek/aee/mrdump/mrdump_arm.c
blob: 376dbc1842b208985059f105cfb8ac47bd7cd8a9 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <linux/bug.h>
#include <linux/mm.h>
#include <linux/module.h>
#include <asm/ptrace.h>
#include "mrdump_private.h"

void mrdump_save_current_backtrace(struct pt_regs *regs)
{
	asm volatile("stmia %1, {r0 - r15}\n\t"
		     "mrs %0, cpsr\n"
		     : "=r"(regs->uregs[16])
		     : "r" (regs)
		     : "memory");
}

void mrdump_print_crash(struct pt_regs *regs)
{
	unsigned int fp, mode;
	int ok = 1;

	__show_regs(regs);

	/* Print current backtrace */
	printk("Backtrace: ");
	fp = regs->ARM_fp;
	mode = processor_mode(regs);

	if (!fp) {
		printk("no frame pointer");
		ok = 0;
	} else if ((fp < PAGE_OFFSET) || ((high_memory != NULL) && (fp > (unsigned long) high_memory))) {
		printk("invalid frame pointer 0x%08x", fp);
		ok = 0;
	}
	printk("\n");

	if (ok)
		c_backtrace(fp, mode);
}