[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>

authored by Mike Frysinger and committed by Bryan Wu 80f31c8a a3acf528

+24 -23
+4 -8
arch/blackfin/mach-common/entry.S
··· 121 121 (R7:6,P5:4) = [sp++]; 122 122 ASTAT = [sp++]; 123 123 SAVE_ALL_SYS 124 + DEBUG_HWTRACE_SAVE(p5, r7) 124 125 #ifdef CONFIG_MPU 125 126 R0 = SEQSTAT; 126 127 R1 = SP; ··· 133 132 #else 134 133 call __cplb_hdr; 135 134 #endif 136 - DEBUG_START_HWTRACE(p5, r7) 135 + DEBUG_HWTRACE_RESTORE(p5, r7) 137 136 RESTORE_ALL_SYS 138 137 SP = EX_SCRATCH_REG; 139 138 rtx; 140 139 ENDPROC(_ex_icplb_miss) 141 140 142 141 ENTRY(_ex_syscall) 143 - DEBUG_START_HWTRACE(p5, r7) 144 142 (R7:6,P5:4) = [sp++]; 145 143 ASTAT = [sp++]; 146 144 raise 15; /* invoked by TRAP #0, for sys call */ ··· 178 178 ENDPROC(_ex_single_step) 179 179 180 180 ENTRY(_bfin_return_from_exception) 181 - DEBUG_START_HWTRACE(p5, r7) 182 181 #if ANOMALY_05000257 183 182 R7=LC0; 184 183 LC0=R7; ··· 199 200 * need to make a CPLB exception look like a normal exception 200 201 */ 201 202 202 - DEBUG_START_HWTRACE(p5, r7) 203 203 RESTORE_ALL_SYS 204 204 [--sp] = ASTAT; 205 - [--sp] = (R7:6, P5:4); 205 + [--sp] = (R7:6,P5:4); 206 206 207 207 ENTRY(_ex_replaceable) 208 208 nop; ··· 251 253 R6 = SEQSTAT; 252 254 [P5] = R6; 253 255 254 - DEBUG_START_HWTRACE(p5, r7) 255 256 (R7:6,P5:4) = [sp++]; 256 257 ASTAT = [sp++]; 257 258 SP = EX_SCRATCH_REG; ··· 379 382 sp.h = _exception_stack_top; 380 383 /* Try to deal with syscalls quickly. */ 381 384 [--sp] = ASTAT; 382 - [--sp] = (R7:6, P5:4); 383 - DEBUG_STOP_HWTRACE(p5, r7) 385 + [--sp] = (R7:6,P5:4); 384 386 r7 = SEQSTAT; /* reason code is in bit 5:0 */ 385 387 r6.l = lo(SEQSTAT_EXCAUSE); 386 388 r6.h = hi(SEQSTAT_EXCAUSE);
+20 -15
include/asm-blackfin/trace.h
··· 46 46 47 47 #ifdef CONFIG_DEBUG_BFIN_HWTRACE_ON 48 48 49 - #define TRACE_BUFFER_START(preg, dreg) trace_buffer_start(preg, dreg) 50 - #define TRACE_BUFFER_STOP(preg, dreg) trace_buffer_stop(preg, dreg) 51 - 52 49 #define trace_buffer_stop(preg, dreg) \ 53 50 preg.L = LO(TBUFCTL); \ 54 51 preg.H = HI(TBUFCTL); \ 55 52 dreg = 0x1; \ 56 - [preg] = dreg; 57 - 58 - #define trace_buffer_start(preg, dreg) \ 59 - preg.L = LO(TBUFCTL); \ 60 - preg.H = HI(TBUFCTL); \ 61 - dreg = BFIN_TRACE_ON; \ 62 53 [preg] = dreg; 63 54 64 55 #define trace_buffer_init(preg, dreg) \ ··· 58 67 dreg = BFIN_TRACE_INIT; \ 59 68 [preg] = dreg; 60 69 70 + #define trace_buffer_save(preg, dreg) \ 71 + preg.L = LO(TBUFCTL); \ 72 + preg.H = HI(TBUFCTL); \ 73 + dreg = [preg]; \ 74 + [sp++] = dreg; \ 75 + dreg = 0x1; \ 76 + [preg] = dreg; 77 + 78 + #define trace_buffer_restore(preg, dreg) \ 79 + preg.L = LO(TBUFCTL); \ 80 + preg.H = HI(TBUFCTL); \ 81 + dreg = [sp--]; \ 82 + [preg] = dreg; 83 + 61 84 #else /* CONFIG_DEBUG_BFIN_HWTRACE_ON */ 62 85 63 86 #define trace_buffer_stop(preg, dreg) 64 - #define trace_buffer_start(preg, dreg) 65 87 #define trace_buffer_init(preg, dreg) 88 + #define trace_buffer_save(preg, dreg) 89 + #define trace_buffer_restore(preg, dreg) 66 90 67 91 #endif /* CONFIG_DEBUG_BFIN_HWTRACE_ON */ 68 92 69 93 #ifdef CONFIG_DEBUG_BFIN_NO_KERN_HWTRACE 70 - # define DEBUG_START_HWTRACE(preg, dreg) trace_buffer_start(preg, dreg) 71 - # define DEBUG_STOP_HWTRACE(preg, dreg) trace_buffer_stop(preg, dreg) 72 - 94 + # define DEBUG_HWTRACE_SAVE(preg, dreg) trace_buffer_save(preg, dreg) 95 + # define DEBUG_HWTRACE_RESTORE(preg, dreg) trace_buffer_restore(preg, dreg) 73 96 #else 74 - # define DEBUG_START_HWTRACE(preg, dreg) 75 - # define DEBUG_STOP_HWTRACE(preg, dreg) 97 + # define DEBUG_HWTRACE_SAVE(preg, dreg) 98 + # define DEBUG_HWTRACE_RESTORE(preg, dreg) 76 99 #endif 77 100 78 101 #endif /* __ASSEMBLY__ */