diff options
Diffstat (limited to 'arch/blackfin/kernel/traps.c')
| -rw-r--r-- | arch/blackfin/kernel/traps.c | 39 | 
1 files changed, 28 insertions, 11 deletions
diff --git a/arch/blackfin/kernel/traps.c b/arch/blackfin/kernel/traps.c index 5b0667da8d0..ffe7fb53ecc 100644 --- a/arch/blackfin/kernel/traps.c +++ b/arch/blackfin/kernel/traps.c @@ -673,6 +673,14 @@ static void decode_instruction(unsigned short *address)  			verbose_printk("RTI");  		else if (opcode == 0x0012)  			verbose_printk("RTX"); +		else if (opcode == 0x0013) +			verbose_printk("RTN"); +		else if (opcode == 0x0014) +			verbose_printk("RTE"); +		else if (opcode == 0x0025) +			verbose_printk("EMUEXCPT"); +		else if (opcode == 0x0040 && opcode <= 0x0047) +			verbose_printk("STI R%i", opcode & 7);  		else if (opcode >= 0x0050 && opcode <= 0x0057)  			verbose_printk("JUMP (P%i)", opcode & 7);  		else if (opcode >= 0x0060 && opcode <= 0x0067) @@ -681,6 +689,10 @@ static void decode_instruction(unsigned short *address)  			verbose_printk("CALL (PC+P%i)", opcode & 7);  		else if (opcode >= 0x0080 && opcode <= 0x0087)  			verbose_printk("JUMP (PC+P%i)", opcode & 7); +		else if (opcode >= 0x0090 && opcode <= 0x009F) +			verbose_printk("RAISE 0x%x", opcode & 0xF); +		else if (opcode >= 0x00A0 && opcode <= 0x00AF) +			verbose_printk("EXCPT 0x%x", opcode & 0xF);  		else if ((opcode >= 0x1000 && opcode <= 0x13FF) || (opcode >= 0x1800 && opcode <= 0x1BFF))  			verbose_printk("IF !CC JUMP");  		else if ((opcode >= 0x1400 && opcode <= 0x17ff) || (opcode >= 0x1c00 && opcode <= 0x1fff)) @@ -820,11 +832,8 @@ void show_stack(struct task_struct *task, unsigned long *stack)  	decode_address(buf, (unsigned int)stack);  	printk(KERN_NOTICE " SP: [0x%p] %s\n", stack, buf); -	addr = (unsigned int *)((unsigned int)stack & ~0x3F); -  	/* First thing is to look for a frame pointer */ -	for (addr = (unsigned int *)((unsigned int)stack & ~0xF), i = 0; -		addr < endstack; addr++, i++) { +	for (addr = (unsigned int *)((unsigned int)stack & ~0xF); addr < endstack; addr++) {  		if (*addr & 0x1)  			continue;  		ins_addr = (unsigned short *)*addr; @@ -834,7 +843,8 @@ void show_stack(struct task_struct *task, unsigned long *stack)  		if (fp) {  			/* Let's check to see if it is a frame pointer */ -			while (fp >= (addr - 1) && fp < endstack && fp) +			while (fp >= (addr - 1) && fp < endstack +			       && fp && ((unsigned int) fp & 0x3) == 0)  				fp = (unsigned int *)*fp;  			if (fp == 0 || fp == endstack) {  				fp = addr - 1; @@ -1052,8 +1062,9 @@ void show_regs(struct pt_regs *fp)  	char buf [150];  	struct irqaction *action;  	unsigned int i; -	unsigned long flags; +	unsigned long flags = 0;  	unsigned int cpu = smp_processor_id(); +	unsigned char in_atomic = (bfin_read_IPEND() & 0x10) || in_atomic();  	verbose_printk(KERN_NOTICE "\n" KERN_NOTICE "SEQUENCER STATUS:\t\t%s\n", print_tainted());  	verbose_printk(KERN_NOTICE " SEQSTAT: %08lx  IPEND: %04lx  SYSCFG: %04lx\n", @@ -1073,17 +1084,22 @@ void show_regs(struct pt_regs *fp)  	}  	verbose_printk(KERN_NOTICE "  EXCAUSE   : 0x%lx\n",  		fp->seqstat & SEQSTAT_EXCAUSE); -	for (i = 6; i <= 15 ; i++) { +	for (i = 2; i <= 15 ; i++) {  		if (fp->ipend & (1 << i)) { -			decode_address(buf, bfin_read32(EVT0 + 4*i)); -			verbose_printk(KERN_NOTICE "  physical IVG%i asserted : %s\n", i, buf); +			if (i != 4) { +				decode_address(buf, bfin_read32(EVT0 + 4*i)); +				verbose_printk(KERN_NOTICE "  physical IVG%i asserted : %s\n", i, buf); +			} else +				verbose_printk(KERN_NOTICE "  interrupts disabled\n");  		}  	}  	/* if no interrupts are going off, don't print this out */  	if (fp->ipend & ~0x3F) {  		for (i = 0; i < (NR_IRQS - 1); i++) { -			spin_lock_irqsave(&irq_desc[i].lock, flags); +			if (!in_atomic) +				spin_lock_irqsave(&irq_desc[i].lock, flags); +  			action = irq_desc[i].action;  			if (!action)  				goto unlock; @@ -1096,7 +1112,8 @@ void show_regs(struct pt_regs *fp)  			}  			verbose_printk("\n");  unlock: -			spin_unlock_irqrestore(&irq_desc[i].lock, flags); +			if (!in_atomic) +				spin_unlock_irqrestore(&irq_desc[i].lock, flags);  		}  	}  |