Merge tag 'xtensa-next-20130508' of git://github.com/czankel/xtensa-linux
Pull xtensa updates from Chris Zankel: "Support for the latest MMU architecture that allows for a larger accessible memory region, and various bug-fixes" * tag 'xtensa-next-20130508' of git://github.com/czankel/xtensa-linux: xtensa: Switch to asm-generic/linkage.h xtensa: fix redboot load address xtensa: ISS: fix timer_lock usage in rs_open xtensa: disable IRQs while IRQ handler is running xtensa: enable lockdep support xtensa: fix arch_irqs_disabled_flags implementation xtensa: add irq flags trace support xtensa: provide custom CALLER_ADDR* implementations xtensa: add stacktrace support xtensa: clean up stpill_registers xtensa: don't use a7 in simcalls xtensa: don't attempt to use unconfigured timers xtensa: provide default platform_pcibios_init implementation xtensa: remove KCORE_ELF again xtensa: document MMUv3 setup sequence xtensa: add MMU v3 support xtensa: fix ibreakenable register update xtensa: fix oprofile building as module
This commit is contained in:
@@ -11,7 +11,7 @@
|
||||
*
|
||||
* Essentially rewritten for the Xtensa architecture port.
|
||||
*
|
||||
* Copyright (C) 2001 - 2005 Tensilica Inc.
|
||||
* Copyright (C) 2001 - 2013 Tensilica Inc.
|
||||
*
|
||||
* Joe Taylor <joe@tensilica.com, joetylr@yahoo.com>
|
||||
* Chris Zankel <chris@zankel.net>
|
||||
@@ -32,6 +32,7 @@
|
||||
#include <linux/delay.h>
|
||||
#include <linux/hardirq.h>
|
||||
|
||||
#include <asm/stacktrace.h>
|
||||
#include <asm/ptrace.h>
|
||||
#include <asm/timex.h>
|
||||
#include <asm/uaccess.h>
|
||||
@@ -195,7 +196,6 @@ void do_multihit(struct pt_regs *regs, unsigned long exccause)
|
||||
|
||||
/*
|
||||
* IRQ handler.
|
||||
* PS.INTLEVEL is the current IRQ priority level.
|
||||
*/
|
||||
|
||||
extern void do_IRQ(int, struct pt_regs *);
|
||||
@@ -212,18 +212,21 @@ void do_interrupt(struct pt_regs *regs)
|
||||
XCHAL_INTLEVEL6_MASK,
|
||||
XCHAL_INTLEVEL7_MASK,
|
||||
};
|
||||
unsigned level = get_sr(ps) & PS_INTLEVEL_MASK;
|
||||
|
||||
if (WARN_ON_ONCE(level >= ARRAY_SIZE(int_level_mask)))
|
||||
return;
|
||||
|
||||
for (;;) {
|
||||
unsigned intread = get_sr(interrupt);
|
||||
unsigned intenable = get_sr(intenable);
|
||||
unsigned int_at_level = intread & intenable &
|
||||
int_level_mask[level];
|
||||
unsigned int_at_level = intread & intenable;
|
||||
unsigned level;
|
||||
|
||||
if (!int_at_level)
|
||||
for (level = LOCKLEVEL; level > 0; --level) {
|
||||
if (int_at_level & int_level_mask[level]) {
|
||||
int_at_level &= int_level_mask[level];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (level == 0)
|
||||
return;
|
||||
|
||||
/*
|
||||
@@ -404,53 +407,25 @@ void show_regs(struct pt_regs * regs)
|
||||
regs->syscall);
|
||||
}
|
||||
|
||||
static __always_inline unsigned long *stack_pointer(struct task_struct *task)
|
||||
static int show_trace_cb(struct stackframe *frame, void *data)
|
||||
{
|
||||
unsigned long *sp;
|
||||
|
||||
if (!task || task == current)
|
||||
__asm__ __volatile__ ("mov %0, a1\n" : "=a"(sp));
|
||||
else
|
||||
sp = (unsigned long *)task->thread.sp;
|
||||
|
||||
return sp;
|
||||
if (kernel_text_address(frame->pc)) {
|
||||
printk(" [<%08lx>] ", frame->pc);
|
||||
print_symbol("%s\n", frame->pc);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void show_trace(struct task_struct *task, unsigned long *sp)
|
||||
{
|
||||
unsigned long a0, a1, pc;
|
||||
unsigned long sp_start, sp_end;
|
||||
|
||||
if (sp)
|
||||
a1 = (unsigned long)sp;
|
||||
else
|
||||
a1 = (unsigned long)stack_pointer(task);
|
||||
|
||||
sp_start = a1 & ~(THREAD_SIZE-1);
|
||||
sp_end = sp_start + THREAD_SIZE;
|
||||
if (!sp)
|
||||
sp = stack_pointer(task);
|
||||
|
||||
printk("Call Trace:");
|
||||
#ifdef CONFIG_KALLSYMS
|
||||
printk("\n");
|
||||
#endif
|
||||
spill_registers();
|
||||
|
||||
while (a1 > sp_start && a1 < sp_end) {
|
||||
sp = (unsigned long*)a1;
|
||||
|
||||
a0 = *(sp - 4);
|
||||
a1 = *(sp - 3);
|
||||
|
||||
if (a1 <= (unsigned long) sp)
|
||||
break;
|
||||
|
||||
pc = MAKE_PC_FROM_RA(a0, a1);
|
||||
|
||||
if (kernel_text_address(pc)) {
|
||||
printk(" [<%08lx>] ", pc);
|
||||
print_symbol("%s\n", pc);
|
||||
}
|
||||
}
|
||||
walk_stackframe(sp, show_trace_cb, NULL);
|
||||
printk("\n");
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user