Skip to content

Commit

Permalink
Blackfin arch: Clean up trace buffer handling, No major functional ch…
Browse files Browse the repository at this point in the history
…anges.

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>
  • Loading branch information
Robin Getz authored and Bryan Wu committed Jun 21, 2007
1 parent 29440a2 commit 669b792
Show file tree
Hide file tree
Showing 9 changed files with 97 additions and 43 deletions.
14 changes: 11 additions & 3 deletions arch/blackfin/kernel/setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,17 @@ void __init setup_arch(char **cmdline_p)
/* this give a chance to get printk() working before crash. */
#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)
/* we need to initialize the Flashrom device here since we might
* do things with flash early on in the boot
Expand Down Expand Up @@ -397,9 +408,6 @@ void __init setup_arch(char **cmdline_p)
_bfin_swrst = bfin_read_SWRST();
#endif

printk(KERN_INFO "Hardware Trace Enabled\n");
bfin_write_TBUFCTL(0x03);

/* Copy atomic sequences to their fixed location, and sanity check that
these locations are the ones that we advertise to userspace. */
memcpy((void *)FIXED_CODE_START, &fixed_code_start,
Expand Down
11 changes: 1 addition & 10 deletions arch/blackfin/kernel/traps.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
#include <asm/blackfin.h>
#include <asm/uaccess.h>
#include <asm/irq_handler.h>
#include <asm/trace.h>
#include <linux/interrupt.h>
#include <linux/module.h>
#include <linux/kallsyms.h>
Expand Down Expand Up @@ -131,16 +132,6 @@ static int printk_address(unsigned long 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)
{
int j, sig = 0;
Expand Down
5 changes: 5 additions & 0 deletions arch/blackfin/mach-bf533/head.S
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
#include <linux/linkage.h>
#include <linux/init.h>
#include <asm/blackfin.h>
#include <asm/trace.h>
#if CONFIG_BFIN_KERNEL_CLOCK
#include <asm/mach/mem_init.h>
#endif
Expand Down Expand Up @@ -96,6 +97,10 @@ ENTRY(__start)
M2 = r0;
M3 = r0;

trace_buffer_start(p0,r0);
P0 = R1;
R0 = R1;

#if CONFIG_DEBUG_KERNEL_START

/*
Expand Down
6 changes: 6 additions & 0 deletions arch/blackfin/mach-bf537/head.S
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@
#include <linux/linkage.h>
#include <linux/init.h>
#include <asm/blackfin.h>
#include <asm/trace.h>

#if CONFIG_BFIN_KERNEL_CLOCK
#include <asm/mach/mem_init.h>
#endif
Expand Down Expand Up @@ -93,6 +95,10 @@ ENTRY(__start)
M2 = r0;
M3 = r0;

trace_buffer_start(p0,r0);
P0 = R1;
R0 = R1;

/* Turn off the icache */
p0.l = (IMEM_CONTROL & 0xFFFF);
p0.h = (IMEM_CONTROL >> 16);
Expand Down
5 changes: 5 additions & 0 deletions arch/blackfin/mach-bf548/head.S
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@

#include <linux/linkage.h>
#include <asm/blackfin.h>
#include <asm/trace.h>
#if CONFIG_BFIN_KERNEL_CLOCK
#include <asm/mach/mem_init.h>
#endif
Expand Down Expand Up @@ -91,6 +92,10 @@ ENTRY(__stext)
M2 = r0;
M3 = r0;

trace_buffer_start(p0,r0);
P0 = R1;
R0 = R1;

/* Turn off the icache */
p0.l = (IMEM_CONTROL & 0xFFFF);
p0.h = (IMEM_CONTROL >> 16);
Expand Down
6 changes: 6 additions & 0 deletions arch/blackfin/mach-bf561/head.S
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@
#include <linux/linkage.h>
#include <linux/init.h>
#include <asm/blackfin.h>
#include <asm/trace.h>

#if CONFIG_BFIN_KERNEL_CLOCK
#include <asm/mach/mem_init.h>
#endif
Expand Down Expand Up @@ -93,6 +95,10 @@ ENTRY(__start)
M2 = r0;
M3 = r0;

trace_buffer_start(p0,r0);
P0 = R1;
R0 = R1;

/* Turn off the icache */
p0.l = (IMEM_CONTROL & 0xFFFF);
p0.h = (IMEM_CONTROL >> 16);
Expand Down
33 changes: 7 additions & 26 deletions arch/blackfin/mach-common/entry.S
Original file line number Diff line number Diff line change
Expand Up @@ -54,29 +54,10 @@
#include <asm/errno.h>
#include <asm/thread_info.h> /* TIF_NEED_RESCHED */
#include <asm/asm-offsets.h>
#include <asm/trace.h>

#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
.section .l1.text
#else
Expand Down Expand Up @@ -110,7 +91,7 @@ ENTRY(_ex_icplb)
ASTAT = [sp++];
SAVE_ALL_SYS
call __cplb_hdr;
DEBUG_START_HWTRACE
DEBUG_START_HWTRACE(p5, r7)
RESTORE_ALL_SYS
SP = RETN;
rtx;
Expand All @@ -128,7 +109,7 @@ ENTRY(_ex_spinlock)
ENDPROC(_ex_spinlock)

ENTRY(_ex_syscall)
DEBUG_START_HWTRACE
DEBUG_START_HWTRACE(p5, r7)
(R7:6,P5:4) = [sp++];
ASTAT = [sp++];
raise 15; /* invoked by TRAP #0, for sys call */
Expand Down Expand Up @@ -186,7 +167,7 @@ ENTRY(_ex_single_step)
if !cc jump _ex_trap_c;

_return_from_exception:
DEBUG_START_HWTRACE
DEBUG_START_HWTRACE(p5, r7)
#ifdef ANOMALY_05000257
R7=LC0;
LC0=R7;
Expand All @@ -208,7 +189,7 @@ ENTRY(_handle_bad_cplb)
* need to make a CPLB exception look like a normal exception
*/

DEBUG_START_HWTRACE
DEBUG_START_HWTRACE(p5, r7)
RESTORE_ALL_SYS
[--sp] = ASTAT;
[--sp] = (R7:6, P5:4);
Expand Down Expand Up @@ -251,7 +232,7 @@ ENTRY(_ex_trap_c)
R6 = SEQSTAT;
[P5] = R6;

DEBUG_START_HWTRACE
DEBUG_START_HWTRACE(p5, r7)
(R7:6,P5:4) = [sp++];
ASTAT = [sp++];
SP = RETN;
Expand Down Expand Up @@ -335,7 +316,7 @@ ENTRY(_trap) /* Exception: 4th entry into system event table(supervisor mode)*/
/* Try to deal with syscalls quickly. */
[--sp] = ASTAT;
[--sp] = (R7:6, P5:4);
DEBUG_STOP_HWTRACE
DEBUG_STOP_HWTRACE(p5, r7)
r7 = SEQSTAT; /* reason code is in bit 5:0 */
r6.l = lo(SEQSTAT_EXCAUSE);
r6.h = hi(SEQSTAT_EXCAUSE);
Expand Down
8 changes: 4 additions & 4 deletions arch/blackfin/mach-common/interrupt.S
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
#include <linux/linkage.h>
#include <asm/entry.h>
#include <asm/asm-offsets.h>
#include <asm/trace.h>

#include <asm/mach-common/context.S>

Expand Down Expand Up @@ -170,10 +171,9 @@ ENTRY(_evt_ivhw)
r7.l = W[p5];
1:
#endif
p0.l = lo(TBUFCTL);
p0.h = hi(TBUFCTL);
r0 = 1;
[p0] = r0;

trace_buffer_stop(p0, r0);

r0 = IRQ_HWERR;
r1 = sp;

Expand Down
52 changes: 52 additions & 0 deletions include/asm-blackfin/trace.h
Original file line number Diff line number Diff line change
@@ -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_ */

0 comments on commit 669b792

Please sign in to comment.