aboutsummaryrefslogtreecommitdiffstats
path: root/arch/blackfin/mach-common
diff options
context:
space:
mode:
authorMike Frysinger <michael.frysinger@analog.com>2007-08-05 05:03:59 -0400
committerBryan Wu <bryan.wu@analog.com>2007-08-05 05:03:59 -0400
commitf0b5d12f2b3226c85258519d7725e63d9daf5e90 (patch)
treed64fdcf65cb5f647b544ece5f1727af5153c0a3d /arch/blackfin/mach-common
parent0174dd59bb5f343e8981b5ea7a3dc782fad5b644 (diff)
Blackfin arch: allow people to select the feature that is unavailable to the kernel
- allow people to select the feature that is unavailable to the kernel: NMI, JTAG, or CYCLES. - change default NMI handler to simply dump hardware trace buffer. - remove default NMI handler completely as calling into kernel code is not safe move example handler to wiki so people dont haphazardly copy and paste this stuff thinking its safe Signed-off-by: Mike Frysinger <michael.frysinger@analog.com> Signed-off-by: Bryan Wu <bryan.wu@analog.com>
Diffstat (limited to 'arch/blackfin/mach-common')
-rw-r--r--arch/blackfin/mach-common/entry.S18
-rw-r--r--arch/blackfin/mach-common/interrupt.S28
-rw-r--r--arch/blackfin/mach-common/ints-priority-dc.c6
-rw-r--r--arch/blackfin/mach-common/ints-priority-sc.c6
4 files changed, 31 insertions, 27 deletions
diff --git a/arch/blackfin/mach-common/entry.S b/arch/blackfin/mach-common/entry.S
index ab278a72f282..2188f81c6456 100644
--- a/arch/blackfin/mach-common/entry.S
+++ b/arch/blackfin/mach-common/entry.S
@@ -58,6 +58,14 @@
58 58
59#include <asm/mach-common/context.S> 59#include <asm/mach-common/context.S>
60 60
61#if defined(CONFIG_BFIN_SCRATCH_REG_RETN)
62# define EX_SCRATCH_REG RETN
63#elif defined(CONFIG_BFIN_SCRATCH_REG_RETE)
64# define EX_SCRATCH_REG RETE
65#else
66# define EX_SCRATCH_REG CYCLES
67#endif
68
61#ifdef CONFIG_EXCPT_IRQ_SYSC_L1 69#ifdef CONFIG_EXCPT_IRQ_SYSC_L1
62.section .l1.text 70.section .l1.text
63#else 71#else
@@ -93,7 +101,7 @@ ENTRY(_ex_icplb)
93 call __cplb_hdr; 101 call __cplb_hdr;
94 DEBUG_START_HWTRACE(p5, r7) 102 DEBUG_START_HWTRACE(p5, r7)
95 RESTORE_ALL_SYS 103 RESTORE_ALL_SYS
96 SP = RETN; 104 SP = EX_SCRATCH_REG;
97 rtx; 105 rtx;
98ENDPROC(_ex_icplb) 106ENDPROC(_ex_icplb)
99 107
@@ -102,7 +110,7 @@ ENTRY(_ex_syscall)
102 (R7:6,P5:4) = [sp++]; 110 (R7:6,P5:4) = [sp++];
103 ASTAT = [sp++]; 111 ASTAT = [sp++];
104 raise 15; /* invoked by TRAP #0, for sys call */ 112 raise 15; /* invoked by TRAP #0, for sys call */
105 sp = retn; 113 sp = EX_SCRATCH_REG;
106 rtx 114 rtx
107ENDPROC(_ex_syscall) 115ENDPROC(_ex_syscall)
108 116
@@ -145,7 +153,7 @@ _return_from_exception:
145#endif 153#endif
146 (R7:6,P5:4) = [sp++]; 154 (R7:6,P5:4) = [sp++];
147 ASTAT = [sp++]; 155 ASTAT = [sp++];
148 sp = retn; 156 sp = EX_SCRATCH_REG;
149 rtx; 157 rtx;
150ENDPROC(_ex_soft_bp) 158ENDPROC(_ex_soft_bp)
151 159
@@ -204,7 +212,7 @@ ENTRY(_ex_trap_c)
204 DEBUG_START_HWTRACE(p5, r7) 212 DEBUG_START_HWTRACE(p5, r7)
205 (R7:6,P5:4) = [sp++]; 213 (R7:6,P5:4) = [sp++];
206 ASTAT = [sp++]; 214 ASTAT = [sp++];
207 SP = RETN; 215 SP = EX_SCRATCH_REG;
208 raise 5; 216 raise 5;
209 rtx; 217 rtx;
210ENDPROC(_ex_trap_c) 218ENDPROC(_ex_trap_c)
@@ -279,7 +287,7 @@ ENTRY(_trap) /* Exception: 4th entry into system event table(supervisor mode)*/
279 * covered by a CPLB. Switch to an exception stack; use RETN as a 287 * covered by a CPLB. Switch to an exception stack; use RETN as a
280 * scratch register (for want of a better option). 288 * scratch register (for want of a better option).
281 */ 289 */
282 retn = sp; 290 EX_SCRATCH_REG = sp;
283 sp.l = _exception_stack_top; 291 sp.l = _exception_stack_top;
284 sp.h = _exception_stack_top; 292 sp.h = _exception_stack_top;
285 /* Try to deal with syscalls quickly. */ 293 /* Try to deal with syscalls quickly. */
diff --git a/arch/blackfin/mach-common/interrupt.S b/arch/blackfin/mach-common/interrupt.S
index 1d5ba5e3d91c..c6b32fe0f6e9 100644
--- a/arch/blackfin/mach-common/interrupt.S
+++ b/arch/blackfin/mach-common/interrupt.S
@@ -177,27 +177,15 @@ ENTRY(_evt_ivhw)
177 jump .Lcommon_restore_context; 177 jump .Lcommon_restore_context;
178#endif 178#endif
179 179
180/* interrupt routine for evt2 - 2. This is NMI. */ 180/* Interrupt routine for evt2 (NMI).
181ENTRY(_evt_evt2) 181 * We don't actually use this, so just return.
182 SAVE_CONTEXT 182 * For inner circle type details, please see:
183#ifdef CONFIG_FRAME_POINTER 183 * http://docs.blackfin.uclinux.org/doku.php?id=linux:nmi
184 fp = 0; 184 */
185#endif 185ENTRY(_evt_nmi)
186#if ANOMALY_05000283 186.weak _evt_nmi
187 cc = r7 == r7;
188 p5.h = 0xffc0;
189 p5.l = 0x0014;
190 if cc jump 1f;
191 r7.l = W[p5];
1921:
193#endif
194 r0 = IRQ_NMI;
195 r1 = sp;
196 SP += -12;
197 call _asm_do_IRQ;
198 SP += 12;
199 RESTORE_CONTEXT
200 rtn; 187 rtn;
188ENDPROC(_evt_nmi)
201 189
202/* interrupt routine for core timer - 6 */ 190/* interrupt routine for core timer - 6 */
203ENTRY(_evt_timer) 191ENTRY(_evt_timer)
diff --git a/arch/blackfin/mach-common/ints-priority-dc.c b/arch/blackfin/mach-common/ints-priority-dc.c
index 684d306ab6bb..2db3546fc874 100644
--- a/arch/blackfin/mach-common/ints-priority-dc.c
+++ b/arch/blackfin/mach-common/ints-priority-dc.c
@@ -362,7 +362,11 @@ void __init init_exception_vectors(void)
362{ 362{
363 SSYNC(); 363 SSYNC();
364 364
365 bfin_write_EVT2(evt_evt2); 365 /* cannot program in software:
366 * evt0 - emulation (jtag)
367 * evt1 - reset
368 */
369 bfin_write_EVT2(evt_nmi);
366 bfin_write_EVT3(trap); 370 bfin_write_EVT3(trap);
367 bfin_write_EVT5(evt_ivhw); 371 bfin_write_EVT5(evt_ivhw);
368 bfin_write_EVT6(evt_timer); 372 bfin_write_EVT6(evt_timer);
diff --git a/arch/blackfin/mach-common/ints-priority-sc.c b/arch/blackfin/mach-common/ints-priority-sc.c
index a2016af65eb0..d3b7672b2b94 100644
--- a/arch/blackfin/mach-common/ints-priority-sc.c
+++ b/arch/blackfin/mach-common/ints-priority-sc.c
@@ -721,7 +721,11 @@ void __init init_exception_vectors(void)
721{ 721{
722 SSYNC(); 722 SSYNC();
723 723
724 bfin_write_EVT2(evt_evt2); 724 /* cannot program in software:
725 * evt0 - emulation (jtag)
726 * evt1 - reset
727 */
728 bfin_write_EVT2(evt_nmi);
725 bfin_write_EVT3(trap); 729 bfin_write_EVT3(trap);
726 bfin_write_EVT5(evt_ivhw); 730 bfin_write_EVT5(evt_ivhw);
727 bfin_write_EVT6(evt_timer); 731 bfin_write_EVT6(evt_timer);