[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: Mike Frysinger <vapier.adi@gmail.com> Signed-off-by: Bryan Wu <bryan.wu@analog.com>
This commit is contained in:
parent
a3acf52885
commit
80f31c8a03
|
@ -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)
|
||||||
#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)
|
||||||
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)
|
||||||
* 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)
|
||||||
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)*/
|
||||||
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[];
|
||||||
|
|
||||||
#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) \
|
|
||||||
preg.L = LO(TBUFCTL); \
|
|
||||||
preg.H = HI(TBUFCTL); \
|
|
||||||
dreg = BFIN_TRACE_ON; \
|
|
||||||
[preg] = dreg;
|
|
||||||
|
|
||||||
#define trace_buffer_init(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_INIT; \
|
dreg = BFIN_TRACE_INIT; \
|
||||||
[preg] = dreg;
|
[preg] = dreg;
|
||||||
|
|
||||||
|
#define trace_buffer_save(preg, dreg) \
|
||||||
|
preg.L = LO(TBUFCTL); \
|
||||||
|
preg.H = HI(TBUFCTL); \
|
||||||
|
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;
|
||||||
|
|
||||||
#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__ */
|
||||||
|
|
Loading…
Reference in New Issue