mirror of
https://github.com/torvalds/linux.git
synced 2024-11-12 07:01:57 +00:00
Blackfin arch: Fix bug - when expanding the trace buffer, it does not print out the decoded instruction.
as pointed out by Michael McTernan in the forums, when expanding the trace buffer, it does not print out the decoded instruction. Signed-off-by: Robin Getz <rgetz@blackfin.uclinux.org> Signed-off-by: Bryan Wu <cooloney@kernel.org>
This commit is contained in:
parent
56f5f59052
commit
d3d0ac23a3
@ -601,12 +601,55 @@ bool get_instruction(unsigned short *val, unsigned short *address)
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* decode the instruction if we are printing out the trace, as it
|
||||
* makes things easier to follow, without running it through objdump
|
||||
* These are the normal instructions which cause change of flow, which
|
||||
* would be at the source of the trace buffer
|
||||
*/
|
||||
void decode_instruction(unsigned short *address)
|
||||
{
|
||||
unsigned short opcode;
|
||||
|
||||
if (get_instruction(&opcode, address)) {
|
||||
if (opcode == 0x0010)
|
||||
printk("RTS");
|
||||
else if (opcode == 0x0011)
|
||||
printk("RTI");
|
||||
else if (opcode == 0x0012)
|
||||
printk("RTX");
|
||||
else if (opcode >= 0x0050 && opcode <= 0x0057)
|
||||
printk("JUMP (P%i)", opcode & 7);
|
||||
else if (opcode >= 0x0060 && opcode <= 0x0067)
|
||||
printk("CALL (P%i)", opcode & 7);
|
||||
else if (opcode >= 0x0070 && opcode <= 0x0077)
|
||||
printk("CALL (PC+P%i)", opcode & 7);
|
||||
else if (opcode >= 0x0080 && opcode <= 0x0087)
|
||||
printk("JUMP (PC+P%i)", opcode & 7);
|
||||
else if ((opcode >= 0x1000 && opcode <= 0x13FF) || (opcode >= 0x1800 && opcode <= 0x1BFF))
|
||||
printk("IF !CC JUMP");
|
||||
else if ((opcode >= 0x1400 && opcode <= 0x17ff) || (opcode >= 0x1c00 && opcode <= 0x1fff))
|
||||
printk("IF CC JUMP");
|
||||
else if (opcode >= 0x2000 && opcode <= 0x2fff)
|
||||
printk("JUMP.S");
|
||||
else if (opcode >= 0xe080 && opcode <= 0xe0ff)
|
||||
printk("LSETUP");
|
||||
else if (opcode >= 0xe200 && opcode <= 0xe2ff)
|
||||
printk("JUMP.L");
|
||||
else if (opcode >= 0xe300 && opcode <= 0xe3ff)
|
||||
printk("CALL pcrel");
|
||||
else
|
||||
printk("0x%04x", opcode);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void dump_bfin_trace_buffer(void)
|
||||
{
|
||||
#ifdef CONFIG_DEBUG_BFIN_HWTRACE_ON
|
||||
int tflags, i = 0;
|
||||
char buf[150];
|
||||
unsigned short val = 0, *addr;
|
||||
unsigned short *addr;
|
||||
#ifdef CONFIG_DEBUG_BFIN_HWTRACE_EXPAND
|
||||
int j, index;
|
||||
#endif
|
||||
@ -615,6 +658,10 @@ void dump_bfin_trace_buffer(void)
|
||||
|
||||
printk(KERN_NOTICE "Hardware Trace:\n");
|
||||
|
||||
#ifdef CONFIG_DEBUG_BFIN_HWTRACE_EXPAND
|
||||
printk(KERN_NOTICE "WARNING: Expanded trace turned on - can not trace exceptions\n");
|
||||
#endif
|
||||
|
||||
if (likely(bfin_read_TBUFSTAT() & TBUFCNT)) {
|
||||
for (; bfin_read_TBUFSTAT() & TBUFCNT; i++) {
|
||||
decode_address(buf, (unsigned long)bfin_read_TBUF());
|
||||
@ -622,45 +669,14 @@ void dump_bfin_trace_buffer(void)
|
||||
addr = (unsigned short *)bfin_read_TBUF();
|
||||
decode_address(buf, (unsigned long)addr);
|
||||
printk(KERN_NOTICE " Source : %s ", buf);
|
||||
if (get_instruction(&val, addr)) {
|
||||
if (val == 0x0010)
|
||||
printk("RTS");
|
||||
else if (val == 0x0011)
|
||||
printk("RTI");
|
||||
else if (val == 0x0012)
|
||||
printk("RTX");
|
||||
else if (val >= 0x0050 && val <= 0x0057)
|
||||
printk("JUMP (P%i)", val & 7);
|
||||
else if (val >= 0x0060 && val <= 0x0067)
|
||||
printk("CALL (P%i)", val & 7);
|
||||
else if (val >= 0x0070 && val <= 0x0077)
|
||||
printk("CALL (PC+P%i)", val & 7);
|
||||
else if (val >= 0x0080 && val <= 0x0087)
|
||||
printk("JUMP (PC+P%i)", val & 7);
|
||||
else if ((val >= 0x1000 && val <= 0x13FF) ||
|
||||
(val >= 0x1800 && val <= 0x1BFF))
|
||||
printk("IF !CC JUMP");
|
||||
else if ((val >= 0x1400 && val <= 0x17ff) ||
|
||||
(val >= 0x1c00 && val <= 0x1fff))
|
||||
printk("IF CC JUMP");
|
||||
else if (val >= 0x2000 && val <= 0x2fff)
|
||||
printk("JUMP.S");
|
||||
else if (val >= 0xe080 && val <= 0xe0ff)
|
||||
printk("LSETUP");
|
||||
else if (val >= 0xe200 && val <= 0xe2ff)
|
||||
printk("JUMP.L");
|
||||
else if (val >= 0xe300 && val <= 0xe3ff)
|
||||
printk("CALL pcrel");
|
||||
else
|
||||
printk("0x%04x", val);
|
||||
}
|
||||
decode_instruction(addr);
|
||||
printk("\n");
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DEBUG_BFIN_HWTRACE_EXPAND
|
||||
if (trace_buff_offset)
|
||||
index = trace_buff_offset/4 - 1;
|
||||
index = trace_buff_offset / 4;
|
||||
else
|
||||
index = EXPAND_LEN;
|
||||
|
||||
@ -672,7 +688,9 @@ void dump_bfin_trace_buffer(void)
|
||||
if (index < 0 )
|
||||
index = EXPAND_LEN;
|
||||
decode_address(buf, software_trace_buff[index]);
|
||||
printk(KERN_NOTICE " Source : %s\n", buf);
|
||||
printk(KERN_NOTICE " Source : %s ", buf);
|
||||
decode_instruction((unsigned short *)software_trace_buff[index]);
|
||||
printk("\n");
|
||||
index -= 1;
|
||||
if (index < 0)
|
||||
index = EXPAND_LEN;
|
||||
|
Loading…
Reference in New Issue
Block a user