diff options
Diffstat (limited to 'arch/mn10300/kernel/traps.c')
-rw-r--r-- | arch/mn10300/kernel/traps.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/arch/mn10300/kernel/traps.c b/arch/mn10300/kernel/traps.c index 716a221df2f9..c924a1dd3323 100644 --- a/arch/mn10300/kernel/traps.c +++ b/arch/mn10300/kernel/traps.c | |||
@@ -45,8 +45,13 @@ | |||
45 | #error "INTERRUPT_VECTOR_BASE not aligned to 16MiB boundary!" | 45 | #error "INTERRUPT_VECTOR_BASE not aligned to 16MiB boundary!" |
46 | #endif | 46 | #endif |
47 | 47 | ||
48 | #ifdef CONFIG_SMP | ||
49 | struct pt_regs *___frame[NR_CPUS]; /* current frame pointer */ | ||
50 | EXPORT_SYMBOL(___frame); | ||
51 | #else /* CONFIG_SMP */ | ||
48 | struct pt_regs *__frame; /* current frame pointer */ | 52 | struct pt_regs *__frame; /* current frame pointer */ |
49 | EXPORT_SYMBOL(__frame); | 53 | EXPORT_SYMBOL(__frame); |
54 | #endif /* CONFIG_SMP */ | ||
50 | 55 | ||
51 | int kstack_depth_to_print = 24; | 56 | int kstack_depth_to_print = 24; |
52 | 57 | ||
@@ -221,11 +226,14 @@ void show_registers_only(struct pt_regs *regs) | |||
221 | printk(KERN_EMERG "threadinfo=%p task=%p)\n", | 226 | printk(KERN_EMERG "threadinfo=%p task=%p)\n", |
222 | current_thread_info(), current); | 227 | current_thread_info(), current); |
223 | 228 | ||
224 | if ((unsigned long) current >= 0x90000000UL && | 229 | if ((unsigned long) current >= PAGE_OFFSET && |
225 | (unsigned long) current < 0x94000000UL) | 230 | (unsigned long) current < (unsigned long)high_memory) |
226 | printk(KERN_EMERG "Process %s (pid: %d)\n", | 231 | printk(KERN_EMERG "Process %s (pid: %d)\n", |
227 | current->comm, current->pid); | 232 | current->comm, current->pid); |
228 | 233 | ||
234 | #ifdef CONFIG_SMP | ||
235 | printk(KERN_EMERG "CPUID: %08x\n", CPUID); | ||
236 | #endif | ||
229 | printk(KERN_EMERG "CPUP: %04hx\n", CPUP); | 237 | printk(KERN_EMERG "CPUP: %04hx\n", CPUP); |
230 | printk(KERN_EMERG "TBR: %08x\n", TBR); | 238 | printk(KERN_EMERG "TBR: %08x\n", TBR); |
231 | printk(KERN_EMERG "DEAR: %08x\n", DEAR); | 239 | printk(KERN_EMERG "DEAR: %08x\n", DEAR); |
@@ -521,8 +529,12 @@ void __init set_intr_stub(enum exception_code code, void *handler) | |||
521 | { | 529 | { |
522 | unsigned long addr; | 530 | unsigned long addr; |
523 | u8 *vector = (u8 *)(CONFIG_INTERRUPT_VECTOR_BASE + code); | 531 | u8 *vector = (u8 *)(CONFIG_INTERRUPT_VECTOR_BASE + code); |
532 | unsigned long flags; | ||
524 | 533 | ||
525 | addr = (unsigned long) handler - (unsigned long) vector; | 534 | addr = (unsigned long) handler - (unsigned long) vector; |
535 | |||
536 | flags = arch_local_cli_save(); | ||
537 | |||
526 | vector[0] = 0xdc; /* JMP handler */ | 538 | vector[0] = 0xdc; /* JMP handler */ |
527 | vector[1] = addr; | 539 | vector[1] = addr; |
528 | vector[2] = addr >> 8; | 540 | vector[2] = addr >> 8; |
@@ -532,6 +544,8 @@ void __init set_intr_stub(enum exception_code code, void *handler) | |||
532 | vector[6] = 0xcb; | 544 | vector[6] = 0xcb; |
533 | vector[7] = 0xcb; | 545 | vector[7] = 0xcb; |
534 | 546 | ||
547 | arch_local_irq_restore(flags); | ||
548 | |||
535 | #ifndef CONFIG_MN10300_CACHE_SNOOP | 549 | #ifndef CONFIG_MN10300_CACHE_SNOOP |
536 | mn10300_dcache_flush_inv(); | 550 | mn10300_dcache_flush_inv(); |
537 | mn10300_icache_inv(); | 551 | mn10300_icache_inv(); |