[MIPS] lockdep: Add STACKTRACE_SUPPORT and enable LOCKDEP_SUPPORT
Implement stacktrace interface by using unwind_stack() and enable lockdep support in Kconfig. Signed-off-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp> Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
This commit is contained in:
committed by
Ralf Baechle
parent
eae6c0da9d
commit
1df0f0ff7e
@ -41,6 +41,7 @@
|
||||
#include <asm/mmu_context.h>
|
||||
#include <asm/watch.h>
|
||||
#include <asm/types.h>
|
||||
#include <asm/stacktrace.h>
|
||||
|
||||
extern asmlinkage void handle_int(void);
|
||||
extern asmlinkage void handle_tlbm(void);
|
||||
@ -92,16 +93,14 @@ static void show_raw_backtrace(unsigned long reg29)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_KALLSYMS
|
||||
static int raw_show_trace;
|
||||
int raw_show_trace;
|
||||
static int __init set_raw_show_trace(char *str)
|
||||
{
|
||||
raw_show_trace = 1;
|
||||
return 1;
|
||||
}
|
||||
__setup("raw_show_trace", set_raw_show_trace);
|
||||
|
||||
extern unsigned long unwind_stack(struct task_struct *task, unsigned long *sp,
|
||||
unsigned long pc, unsigned long ra);
|
||||
#endif
|
||||
|
||||
static void show_backtrace(struct task_struct *task, struct pt_regs *regs)
|
||||
{
|
||||
@ -121,9 +120,6 @@ static void show_backtrace(struct task_struct *task, struct pt_regs *regs)
|
||||
} while (pc);
|
||||
printk("\n");
|
||||
}
|
||||
#else
|
||||
#define show_backtrace(task, r) show_raw_backtrace((r)->regs[29]);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* This routine abuses get_user()/put_user() to reference pointers
|
||||
@ -158,28 +154,6 @@ static void show_stacktrace(struct task_struct *task, struct pt_regs *regs)
|
||||
show_backtrace(task, regs);
|
||||
}
|
||||
|
||||
static __always_inline void prepare_frametrace(struct pt_regs *regs)
|
||||
{
|
||||
__asm__ __volatile__(
|
||||
".set push\n\t"
|
||||
".set noat\n\t"
|
||||
#ifdef CONFIG_64BIT
|
||||
"1: dla $1, 1b\n\t"
|
||||
"sd $1, %0\n\t"
|
||||
"sd $29, %1\n\t"
|
||||
"sd $31, %2\n\t"
|
||||
#else
|
||||
"1: la $1, 1b\n\t"
|
||||
"sw $1, %0\n\t"
|
||||
"sw $29, %1\n\t"
|
||||
"sw $31, %2\n\t"
|
||||
#endif
|
||||
".set pop\n\t"
|
||||
: "=m" (regs->cp0_epc),
|
||||
"=m" (regs->regs[29]), "=m" (regs->regs[31])
|
||||
: : "memory");
|
||||
}
|
||||
|
||||
void show_stack(struct task_struct *task, unsigned long *sp)
|
||||
{
|
||||
struct pt_regs regs;
|
||||
@ -206,11 +180,6 @@ void dump_stack(void)
|
||||
{
|
||||
struct pt_regs regs;
|
||||
|
||||
/*
|
||||
* Remove any garbage that may be in regs (specially func
|
||||
* addresses) to avoid show_raw_backtrace() to report them
|
||||
*/
|
||||
memset(®s, 0, sizeof(regs));
|
||||
prepare_frametrace(®s);
|
||||
show_backtrace(current, ®s);
|
||||
}
|
||||
|
Reference in New Issue
Block a user