Blackfin arch: Clean up trace buffer handling, No major functional changes.
Turns on trace earlier, so crashes at kernel start should print out a trace, making things easier to debug. Signed-off-by: Robin Getz <robin.getz@analog.com> Signed-off-by: Mike Frysinger <michael.frysinger@analog.com> Signed-off-by: Bryan Wu <bryan.wu@analog.com>
This commit is contained in:
parent
29440a2b4c
commit
669b792c77
|
@ -194,6 +194,17 @@ void __init setup_arch(char **cmdline_p)
|
||||||
/* this give a chance to get printk() working before crash. */
|
/* this give a chance to get printk() working before crash. */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
printk(KERN_INFO "Hardware Trace ");
|
||||||
|
if (bfin_read_TBUFCTL() & 0x1 )
|
||||||
|
printk("Active ");
|
||||||
|
else
|
||||||
|
printk("Off ");
|
||||||
|
if (bfin_read_TBUFCTL() & 0x2)
|
||||||
|
printk("and Enabled\n");
|
||||||
|
else
|
||||||
|
printk("and Disabled\n");
|
||||||
|
|
||||||
|
|
||||||
#if defined(CONFIG_CHR_DEV_FLASH) || defined(CONFIG_BLK_DEV_FLASH)
|
#if defined(CONFIG_CHR_DEV_FLASH) || defined(CONFIG_BLK_DEV_FLASH)
|
||||||
/* we need to initialize the Flashrom device here since we might
|
/* we need to initialize the Flashrom device here since we might
|
||||||
* do things with flash early on in the boot
|
* do things with flash early on in the boot
|
||||||
|
@ -397,9 +408,6 @@ void __init setup_arch(char **cmdline_p)
|
||||||
_bfin_swrst = bfin_read_SWRST();
|
_bfin_swrst = bfin_read_SWRST();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
printk(KERN_INFO "Hardware Trace Enabled\n");
|
|
||||||
bfin_write_TBUFCTL(0x03);
|
|
||||||
|
|
||||||
/* Copy atomic sequences to their fixed location, and sanity check that
|
/* Copy atomic sequences to their fixed location, and sanity check that
|
||||||
these locations are the ones that we advertise to userspace. */
|
these locations are the ones that we advertise to userspace. */
|
||||||
memcpy((void *)FIXED_CODE_START, &fixed_code_start,
|
memcpy((void *)FIXED_CODE_START, &fixed_code_start,
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
#include <asm/blackfin.h>
|
#include <asm/blackfin.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <asm/irq_handler.h>
|
#include <asm/irq_handler.h>
|
||||||
|
#include <asm/trace.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/kallsyms.h>
|
#include <linux/kallsyms.h>
|
||||||
|
@ -131,16 +132,6 @@ static int printk_address(unsigned long address)
|
||||||
return printk("[<0x%p>]", (void*)address);
|
return printk("[<0x%p>]", (void*)address);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define trace_buffer_save(x) \
|
|
||||||
do { \
|
|
||||||
(x) = bfin_read_TBUFCTL(); \
|
|
||||||
bfin_write_TBUFCTL((x) & ~TBUFEN); \
|
|
||||||
} while (0)
|
|
||||||
#define trace_buffer_restore(x) \
|
|
||||||
do { \
|
|
||||||
bfin_write_TBUFCTL((x)); \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
asmlinkage void trap_c(struct pt_regs *fp)
|
asmlinkage void trap_c(struct pt_regs *fp)
|
||||||
{
|
{
|
||||||
int j, sig = 0;
|
int j, sig = 0;
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <asm/blackfin.h>
|
#include <asm/blackfin.h>
|
||||||
|
#include <asm/trace.h>
|
||||||
#if CONFIG_BFIN_KERNEL_CLOCK
|
#if CONFIG_BFIN_KERNEL_CLOCK
|
||||||
#include <asm/mach/mem_init.h>
|
#include <asm/mach/mem_init.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -96,6 +97,10 @@ ENTRY(__start)
|
||||||
M2 = r0;
|
M2 = r0;
|
||||||
M3 = r0;
|
M3 = r0;
|
||||||
|
|
||||||
|
trace_buffer_start(p0,r0);
|
||||||
|
P0 = R1;
|
||||||
|
R0 = R1;
|
||||||
|
|
||||||
#if CONFIG_DEBUG_KERNEL_START
|
#if CONFIG_DEBUG_KERNEL_START
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -30,6 +30,8 @@
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <asm/blackfin.h>
|
#include <asm/blackfin.h>
|
||||||
|
#include <asm/trace.h>
|
||||||
|
|
||||||
#if CONFIG_BFIN_KERNEL_CLOCK
|
#if CONFIG_BFIN_KERNEL_CLOCK
|
||||||
#include <asm/mach/mem_init.h>
|
#include <asm/mach/mem_init.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -93,6 +95,10 @@ ENTRY(__start)
|
||||||
M2 = r0;
|
M2 = r0;
|
||||||
M3 = r0;
|
M3 = r0;
|
||||||
|
|
||||||
|
trace_buffer_start(p0,r0);
|
||||||
|
P0 = R1;
|
||||||
|
R0 = R1;
|
||||||
|
|
||||||
/* Turn off the icache */
|
/* Turn off the icache */
|
||||||
p0.l = (IMEM_CONTROL & 0xFFFF);
|
p0.l = (IMEM_CONTROL & 0xFFFF);
|
||||||
p0.h = (IMEM_CONTROL >> 16);
|
p0.h = (IMEM_CONTROL >> 16);
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
|
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
#include <asm/blackfin.h>
|
#include <asm/blackfin.h>
|
||||||
|
#include <asm/trace.h>
|
||||||
#if CONFIG_BFIN_KERNEL_CLOCK
|
#if CONFIG_BFIN_KERNEL_CLOCK
|
||||||
#include <asm/mach/mem_init.h>
|
#include <asm/mach/mem_init.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -91,6 +92,10 @@ ENTRY(__stext)
|
||||||
M2 = r0;
|
M2 = r0;
|
||||||
M3 = r0;
|
M3 = r0;
|
||||||
|
|
||||||
|
trace_buffer_start(p0,r0);
|
||||||
|
P0 = R1;
|
||||||
|
R0 = R1;
|
||||||
|
|
||||||
/* Turn off the icache */
|
/* Turn off the icache */
|
||||||
p0.l = (IMEM_CONTROL & 0xFFFF);
|
p0.l = (IMEM_CONTROL & 0xFFFF);
|
||||||
p0.h = (IMEM_CONTROL >> 16);
|
p0.h = (IMEM_CONTROL >> 16);
|
||||||
|
|
|
@ -30,6 +30,8 @@
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <asm/blackfin.h>
|
#include <asm/blackfin.h>
|
||||||
|
#include <asm/trace.h>
|
||||||
|
|
||||||
#if CONFIG_BFIN_KERNEL_CLOCK
|
#if CONFIG_BFIN_KERNEL_CLOCK
|
||||||
#include <asm/mach/mem_init.h>
|
#include <asm/mach/mem_init.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -93,6 +95,10 @@ ENTRY(__start)
|
||||||
M2 = r0;
|
M2 = r0;
|
||||||
M3 = r0;
|
M3 = r0;
|
||||||
|
|
||||||
|
trace_buffer_start(p0,r0);
|
||||||
|
P0 = R1;
|
||||||
|
R0 = R1;
|
||||||
|
|
||||||
/* Turn off the icache */
|
/* Turn off the icache */
|
||||||
p0.l = (IMEM_CONTROL & 0xFFFF);
|
p0.l = (IMEM_CONTROL & 0xFFFF);
|
||||||
p0.h = (IMEM_CONTROL >> 16);
|
p0.h = (IMEM_CONTROL >> 16);
|
||||||
|
|
|
@ -54,29 +54,10 @@
|
||||||
#include <asm/errno.h>
|
#include <asm/errno.h>
|
||||||
#include <asm/thread_info.h> /* TIF_NEED_RESCHED */
|
#include <asm/thread_info.h> /* TIF_NEED_RESCHED */
|
||||||
#include <asm/asm-offsets.h>
|
#include <asm/asm-offsets.h>
|
||||||
|
#include <asm/trace.h>
|
||||||
|
|
||||||
#include <asm/mach-common/context.S>
|
#include <asm/mach-common/context.S>
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_BFIN_NO_KERN_HWTRACE
|
|
||||||
/*
|
|
||||||
* TODO: this should be proper save/restore, but for now
|
|
||||||
* we'll just cheat and use 0x1/0x13
|
|
||||||
*/
|
|
||||||
# define DEBUG_START_HWTRACE \
|
|
||||||
P5.l = LO(TBUFCTL); \
|
|
||||||
P5.h = HI(TBUFCTL); \
|
|
||||||
R7 = 0x13; \
|
|
||||||
[P5] = R7;
|
|
||||||
# define DEBUG_STOP_HWTRACE \
|
|
||||||
P5.l = LO(TBUFCTL); \
|
|
||||||
P5.h = HI(TBUFCTL); \
|
|
||||||
R7 = 0x01; \
|
|
||||||
[P5] = R7;
|
|
||||||
#else
|
|
||||||
# define DEBUG_START_HWTRACE
|
|
||||||
# define DEBUG_STOP_HWTRACE
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef CONFIG_EXCPT_IRQ_SYSC_L1
|
#ifdef CONFIG_EXCPT_IRQ_SYSC_L1
|
||||||
.section .l1.text
|
.section .l1.text
|
||||||
#else
|
#else
|
||||||
|
@ -110,7 +91,7 @@ ENTRY(_ex_icplb)
|
||||||
ASTAT = [sp++];
|
ASTAT = [sp++];
|
||||||
SAVE_ALL_SYS
|
SAVE_ALL_SYS
|
||||||
call __cplb_hdr;
|
call __cplb_hdr;
|
||||||
DEBUG_START_HWTRACE
|
DEBUG_START_HWTRACE(p5, r7)
|
||||||
RESTORE_ALL_SYS
|
RESTORE_ALL_SYS
|
||||||
SP = RETN;
|
SP = RETN;
|
||||||
rtx;
|
rtx;
|
||||||
|
@ -128,7 +109,7 @@ ENTRY(_ex_spinlock)
|
||||||
ENDPROC(_ex_spinlock)
|
ENDPROC(_ex_spinlock)
|
||||||
|
|
||||||
ENTRY(_ex_syscall)
|
ENTRY(_ex_syscall)
|
||||||
DEBUG_START_HWTRACE
|
DEBUG_START_HWTRACE(p5, r7)
|
||||||
(R7:6,P5:4) = [sp++];
|
(R7:6,P5:4) = [sp++];
|
||||||
ASTAT = [sp++];
|
ASTAT = [sp++];
|
||||||
raise 15; /* invoked by TRAP #0, for sys call */
|
raise 15; /* invoked by TRAP #0, for sys call */
|
||||||
|
@ -186,7 +167,7 @@ ENTRY(_ex_single_step)
|
||||||
if !cc jump _ex_trap_c;
|
if !cc jump _ex_trap_c;
|
||||||
|
|
||||||
_return_from_exception:
|
_return_from_exception:
|
||||||
DEBUG_START_HWTRACE
|
DEBUG_START_HWTRACE(p5, r7)
|
||||||
#ifdef ANOMALY_05000257
|
#ifdef ANOMALY_05000257
|
||||||
R7=LC0;
|
R7=LC0;
|
||||||
LC0=R7;
|
LC0=R7;
|
||||||
|
@ -208,7 +189,7 @@ ENTRY(_handle_bad_cplb)
|
||||||
* need to make a CPLB exception look like a normal exception
|
* need to make a CPLB exception look like a normal exception
|
||||||
*/
|
*/
|
||||||
|
|
||||||
DEBUG_START_HWTRACE
|
DEBUG_START_HWTRACE(p5, r7)
|
||||||
RESTORE_ALL_SYS
|
RESTORE_ALL_SYS
|
||||||
[--sp] = ASTAT;
|
[--sp] = ASTAT;
|
||||||
[--sp] = (R7:6, P5:4);
|
[--sp] = (R7:6, P5:4);
|
||||||
|
@ -251,7 +232,7 @@ ENTRY(_ex_trap_c)
|
||||||
R6 = SEQSTAT;
|
R6 = SEQSTAT;
|
||||||
[P5] = R6;
|
[P5] = R6;
|
||||||
|
|
||||||
DEBUG_START_HWTRACE
|
DEBUG_START_HWTRACE(p5, r7)
|
||||||
(R7:6,P5:4) = [sp++];
|
(R7:6,P5:4) = [sp++];
|
||||||
ASTAT = [sp++];
|
ASTAT = [sp++];
|
||||||
SP = RETN;
|
SP = RETN;
|
||||||
|
@ -335,7 +316,7 @@ ENTRY(_trap) /* Exception: 4th entry into system event table(supervisor mode)*/
|
||||||
/* Try to deal with syscalls quickly. */
|
/* Try to deal with syscalls quickly. */
|
||||||
[--sp] = ASTAT;
|
[--sp] = ASTAT;
|
||||||
[--sp] = (R7:6, P5:4);
|
[--sp] = (R7:6, P5:4);
|
||||||
DEBUG_STOP_HWTRACE
|
DEBUG_STOP_HWTRACE(p5, r7)
|
||||||
r7 = SEQSTAT; /* reason code is in bit 5:0 */
|
r7 = SEQSTAT; /* reason code is in bit 5:0 */
|
||||||
r6.l = lo(SEQSTAT_EXCAUSE);
|
r6.l = lo(SEQSTAT_EXCAUSE);
|
||||||
r6.h = hi(SEQSTAT_EXCAUSE);
|
r6.h = hi(SEQSTAT_EXCAUSE);
|
||||||
|
|
|
@ -34,6 +34,7 @@
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
#include <asm/entry.h>
|
#include <asm/entry.h>
|
||||||
#include <asm/asm-offsets.h>
|
#include <asm/asm-offsets.h>
|
||||||
|
#include <asm/trace.h>
|
||||||
|
|
||||||
#include <asm/mach-common/context.S>
|
#include <asm/mach-common/context.S>
|
||||||
|
|
||||||
|
@ -170,10 +171,9 @@ ENTRY(_evt_ivhw)
|
||||||
r7.l = W[p5];
|
r7.l = W[p5];
|
||||||
1:
|
1:
|
||||||
#endif
|
#endif
|
||||||
p0.l = lo(TBUFCTL);
|
|
||||||
p0.h = hi(TBUFCTL);
|
trace_buffer_stop(p0, r0);
|
||||||
r0 = 1;
|
|
||||||
[p0] = r0;
|
|
||||||
r0 = IRQ_HWERR;
|
r0 = IRQ_HWERR;
|
||||||
r1 = sp;
|
r1 = sp;
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
/*
|
||||||
|
* Common header file for blackfin family of processors.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _BLACKFIN_TRACE_
|
||||||
|
#define _BLACKFIN_TRACE_
|
||||||
|
|
||||||
|
#ifndef __ASSEMBLY__
|
||||||
|
/* Trace Macros for C files */
|
||||||
|
|
||||||
|
#define trace_buffer_save(x) \
|
||||||
|
do { \
|
||||||
|
(x) = bfin_read_TBUFCTL(); \
|
||||||
|
bfin_write_TBUFCTL((x) & ~TBUFEN); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define trace_buffer_restore(x) \
|
||||||
|
do { \
|
||||||
|
bfin_write_TBUFCTL((x)); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#else
|
||||||
|
/* Trace Macros for Assembly files */
|
||||||
|
|
||||||
|
#define TRACE_BUFFER_START(preg, dreg) trace_buffer_start(preg, dreg)
|
||||||
|
#define TRACE_BUFFER_STOP(preg, dreg) trace_buffer_stop(preg, dreg)
|
||||||
|
|
||||||
|
#define trace_buffer_stop(preg, dreg) \
|
||||||
|
preg.L = LO(TBUFCTL); \
|
||||||
|
preg.H = HI(TBUFCTL); \
|
||||||
|
dreg = 0x1; \
|
||||||
|
[preg] = dreg;
|
||||||
|
|
||||||
|
#define trace_buffer_start(preg, dreg) \
|
||||||
|
preg.L = LO(TBUFCTL); \
|
||||||
|
preg.H = HI(TBUFCTL); \
|
||||||
|
dreg = 0x13; \
|
||||||
|
[preg] = dreg;
|
||||||
|
|
||||||
|
#ifdef CONFIG_DEBUG_BFIN_NO_KERN_HWTRACE
|
||||||
|
# define DEBUG_START_HWTRACE(preg, dreg) trace_buffer_start(preg, dreg)
|
||||||
|
# define DEBUG_STOP_HWTRACE(preg, dreg) trace_buffer_stop(preg, dreg)
|
||||||
|
|
||||||
|
#else
|
||||||
|
# define DEBUG_START_HWTRACE(preg, dreg)
|
||||||
|
# define DEBUG_STOP_HWTRACE(preg, dreg)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __ASSEMBLY__ */
|
||||||
|
|
||||||
|
#endif /* _BLACKFIN_TRACE_ */
|
Loading…
Reference in New Issue