Commit 80f31c8a authored by Mike Frysinger's avatar Mike Frysinger Committed by Bryan Wu

[Blackfin] arch: change the trace buffer control start/stop logic in the exception handlers

To save/restore the trace buffer control so that if we take an exception
after turning off the trace buffer at a higher level we dont inadvertently
turn the trace buffer back on
Signed-off-by: default avatarMike Frysinger <vapier.adi@gmail.com>
Signed-off-by: default avatarBryan Wu <bryan.wu@analog.com>
parent a3acf528
...@@ -121,6 +121,7 @@ ENTRY(_ex_icplb_miss) ...@@ -121,6 +121,7 @@ ENTRY(_ex_icplb_miss)
(R7:6,P5:4) = [sp++]; (R7:6,P5:4) = [sp++];
ASTAT = [sp++]; ASTAT = [sp++];
SAVE_ALL_SYS SAVE_ALL_SYS
DEBUG_HWTRACE_SAVE(p5, r7)
#ifdef CONFIG_MPU #ifdef CONFIG_MPU
R0 = SEQSTAT; R0 = SEQSTAT;
R1 = SP; R1 = SP;
...@@ -132,14 +133,13 @@ ENTRY(_ex_icplb_miss) ...@@ -132,14 +133,13 @@ ENTRY(_ex_icplb_miss)
#else #else
call __cplb_hdr; call __cplb_hdr;
#endif #endif
DEBUG_START_HWTRACE(p5, r7) DEBUG_HWTRACE_RESTORE(p5, r7)
RESTORE_ALL_SYS RESTORE_ALL_SYS
SP = EX_SCRATCH_REG; SP = EX_SCRATCH_REG;
rtx; rtx;
ENDPROC(_ex_icplb_miss) ENDPROC(_ex_icplb_miss)
ENTRY(_ex_syscall) ENTRY(_ex_syscall)
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 */
...@@ -178,7 +178,6 @@ ENTRY(_ex_single_step) ...@@ -178,7 +178,6 @@ ENTRY(_ex_single_step)
ENDPROC(_ex_single_step) ENDPROC(_ex_single_step)
ENTRY(_bfin_return_from_exception) ENTRY(_bfin_return_from_exception)
DEBUG_START_HWTRACE(p5, r7)
#if ANOMALY_05000257 #if ANOMALY_05000257
R7=LC0; R7=LC0;
LC0=R7; LC0=R7;
...@@ -200,10 +199,9 @@ ENTRY(_handle_bad_cplb) ...@@ -200,10 +199,9 @@ 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(p5, r7)
RESTORE_ALL_SYS RESTORE_ALL_SYS
[--sp] = ASTAT; [--sp] = ASTAT;
[--sp] = (R7:6, P5:4); [--sp] = (R7:6,P5:4);
ENTRY(_ex_replaceable) ENTRY(_ex_replaceable)
nop; nop;
...@@ -253,7 +251,6 @@ ENTRY(_ex_trap_c) ...@@ -253,7 +251,6 @@ ENTRY(_ex_trap_c)
R6 = SEQSTAT; R6 = SEQSTAT;
[P5] = R6; [P5] = R6;
DEBUG_START_HWTRACE(p5, r7)
(R7:6,P5:4) = [sp++]; (R7:6,P5:4) = [sp++];
ASTAT = [sp++]; ASTAT = [sp++];
SP = EX_SCRATCH_REG; SP = EX_SCRATCH_REG;
...@@ -382,8 +379,7 @@ ENTRY(_trap) /* Exception: 4th entry into system event table(supervisor mode)*/ ...@@ -382,8 +379,7 @@ ENTRY(_trap) /* Exception: 4th entry into system event table(supervisor mode)*/
sp.h = _exception_stack_top; sp.h = _exception_stack_top;
/* 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(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);
......
...@@ -46,42 +46,47 @@ extern unsigned long software_trace_buff[]; ...@@ -46,42 +46,47 @@ extern unsigned long software_trace_buff[];
#ifdef CONFIG_DEBUG_BFIN_HWTRACE_ON #ifdef CONFIG_DEBUG_BFIN_HWTRACE_ON
#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) \ #define trace_buffer_stop(preg, dreg) \
preg.L = LO(TBUFCTL); \ preg.L = LO(TBUFCTL); \
preg.H = HI(TBUFCTL); \ preg.H = HI(TBUFCTL); \
dreg = 0x1; \ dreg = 0x1; \
[preg] = dreg; [preg] = dreg;
#define trace_buffer_start(preg, dreg) \ #define trace_buffer_init(preg, dreg) \
preg.L = LO(TBUFCTL); \ preg.L = LO(TBUFCTL); \
preg.H = HI(TBUFCTL); \ preg.H = HI(TBUFCTL); \
dreg = BFIN_TRACE_ON; \ dreg = BFIN_TRACE_INIT; \
[preg] = dreg; [preg] = dreg;
#define trace_buffer_init(preg, dreg) \ #define trace_buffer_save(preg, dreg) \
preg.L = LO(TBUFCTL); \ preg.L = LO(TBUFCTL); \
preg.H = HI(TBUFCTL); \ preg.H = HI(TBUFCTL); \
dreg = BFIN_TRACE_INIT; \ dreg = [preg]; \
[sp++] = dreg; \
dreg = 0x1; \
[preg] = dreg;
#define trace_buffer_restore(preg, dreg) \
preg.L = LO(TBUFCTL); \
preg.H = HI(TBUFCTL); \
dreg = [sp--]; \
[preg] = dreg; [preg] = dreg;
#else /* CONFIG_DEBUG_BFIN_HWTRACE_ON */ #else /* CONFIG_DEBUG_BFIN_HWTRACE_ON */
#define trace_buffer_stop(preg, dreg) #define trace_buffer_stop(preg, dreg)
#define trace_buffer_start(preg, dreg)
#define trace_buffer_init(preg, dreg) #define trace_buffer_init(preg, dreg)
#define trace_buffer_save(preg, dreg)
#define trace_buffer_restore(preg, dreg)
#endif /* CONFIG_DEBUG_BFIN_HWTRACE_ON */ #endif /* CONFIG_DEBUG_BFIN_HWTRACE_ON */
#ifdef CONFIG_DEBUG_BFIN_NO_KERN_HWTRACE #ifdef CONFIG_DEBUG_BFIN_NO_KERN_HWTRACE
# define DEBUG_START_HWTRACE(preg, dreg) trace_buffer_start(preg, dreg) # define DEBUG_HWTRACE_SAVE(preg, dreg) trace_buffer_save(preg, dreg)
# define DEBUG_STOP_HWTRACE(preg, dreg) trace_buffer_stop(preg, dreg) # define DEBUG_HWTRACE_RESTORE(preg, dreg) trace_buffer_restore(preg, dreg)
#else #else
# define DEBUG_START_HWTRACE(preg, dreg) # define DEBUG_HWTRACE_SAVE(preg, dreg)
# define DEBUG_STOP_HWTRACE(preg, dreg) # define DEBUG_HWTRACE_RESTORE(preg, dreg)
#endif #endif
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment