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