浏览代码

[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>
Mike Frysinger 17 年之前
父节点
当前提交
80f31c8a03
共有 2 个文件被更改,包括 24 次插入23 次删除
  1. 4 8
      arch/blackfin/mach-common/entry.S
  2. 20 15
      include/asm-blackfin/trace.h

+ 4 - 8
arch/blackfin/mach-common/entry.S

@@ -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);
-	DEBUG_STOP_HWTRACE(p5, r7)
+	[--sp] = (R7:6,P5:4);
 	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);

+ 20 - 15
include/asm-blackfin/trace.h

@@ -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_STOP_HWTRACE(preg, dreg) trace_buffer_stop(preg, dreg)
-
+# define DEBUG_HWTRACE_SAVE(preg, dreg)    trace_buffer_save(preg, dreg)
+# define DEBUG_HWTRACE_RESTORE(preg, dreg) trace_buffer_restore(preg, dreg)
 #else
 #else
-# define DEBUG_START_HWTRACE(preg, dreg)
-# define DEBUG_STOP_HWTRACE(preg, dreg)
+# define DEBUG_HWTRACE_SAVE(preg, dreg)
+# define DEBUG_HWTRACE_RESTORE(preg, dreg)
 #endif
 #endif
 
 
 #endif /* __ASSEMBLY__ */
 #endif /* __ASSEMBLY__ */