aboutsummaryrefslogtreecommitdiffstats
path: root/arch/blackfin
diff options
context:
space:
mode:
authorSonic Zhang <sonic.zhang@analog.com>2008-08-05 06:28:26 -0400
committerBryan Wu <cooloney@kernel.org>2008-08-05 06:28:26 -0400
commitd6a29891369827317659b7833170d2f5f0c7b97f (patch)
treed93efcc44012c838e8b8f13466c06ee4be20df6d /arch/blackfin
parentfe5aeb93024791a5aa69741015db33093198ff47 (diff)
Blackfin arch: Fix bugs - Make kgdb code apparent to app debugging.
- Skip single step if global interrupt disable bit is set. - Extend bernds' patch r4673 to skip single step in any interrupt entry that interrupts the code which is under single stepping. Bernds' patch only allow user space single stepping. Singed-off-by: Sonic Zhang <sonic.zhang@analog.com> Signed-off-by: Bryan Wu <cooloney@kernel.org>
Diffstat (limited to 'arch/blackfin')
-rw-r--r--arch/blackfin/mach-common/entry.S8
1 files changed, 5 insertions, 3 deletions
diff --git a/arch/blackfin/mach-common/entry.S b/arch/blackfin/mach-common/entry.S
index 3db2f4df261b..4bd971e81f1f 100644
--- a/arch/blackfin/mach-common/entry.S
+++ b/arch/blackfin/mach-common/entry.S
@@ -163,6 +163,8 @@ ENTRY(_ex_single_step)
163 p5.l = lo(IPEND); 163 p5.l = lo(IPEND);
164 p5.h = hi(IPEND); 164 p5.h = hi(IPEND);
165 r6 = [p5]; 165 r6 = [p5];
166 cc = bittst(r6, 4);
167 if cc jump _bfin_return_from_exception;
166 cc = bittst(r6, 5); 168 cc = bittst(r6, 5);
167 if cc jump _bfin_return_from_exception; 169 if cc jump _bfin_return_from_exception;
168 170
@@ -186,10 +188,9 @@ ENTRY(_ex_single_step)
186 if cc jump .Ldo_single_step; 188 if cc jump .Ldo_single_step;
187 r6 += -1; 189 r6 += -1;
188 cc = r6 < r7; 190 cc = r6 < r7;
189 if cc jump _bfin_return_from_exception; 191 if cc jump 1f;
190.Ldo_single_step: 192.Ldo_single_step:
191#endif 193#else
192
193 /* If we were in user mode, do the single step normally. */ 194 /* If we were in user mode, do the single step normally. */
194 p5.l = lo(IPEND); 195 p5.l = lo(IPEND);
195 p5.h = hi(IPEND); 196 p5.h = hi(IPEND);
@@ -198,6 +199,7 @@ ENTRY(_ex_single_step)
198 r7 = r7 & r6; 199 r7 = r7 & r6;
199 cc = r7 == 0; 200 cc = r7 == 0;
200 if !cc jump 1f; 201 if !cc jump 1f;
202#endif
201 203
202 /* Single stepping only a single instruction, so clear the trace 204 /* Single stepping only a single instruction, so clear the trace
203 * bit here. */ 205 * bit here. */