summaryrefslogtreecommitdiff
path: root/sys/src/9/omap/trap.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@gmx.de>2013-01-25 14:48:57 +0100
committercinap_lenrek <cinap_lenrek@gmx.de>2013-01-25 14:48:57 +0100
commit180e04ee41f988e707078620bae65d598c91314c (patch)
tree2fe41ce2cdd1610a89c62f9f68475794f4d989dc /sys/src/9/omap/trap.c
parent358f72266a774d291c3b9c569b29152ca5595ee7 (diff)
omap: fix breakpoint instruction trap handling (from sources)
Diffstat (limited to 'sys/src/9/omap/trap.c')
-rw-r--r--sys/src/9/omap/trap.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/sys/src/9/omap/trap.c b/sys/src/9/omap/trap.c
index 2a97b71c5..7fab7c778 100644
--- a/sys/src/9/omap/trap.c
+++ b/sys/src/9/omap/trap.c
@@ -493,7 +493,23 @@ trap(Ureg *ureg)
break;
case PsrMabt: /* prefetch fault */
ldrexvalid = 0;
- faultarm(ureg, ureg->pc, user, 1);
+ x = ifsrget();
+ fsr = (x>>7) & 0x8 | x & 0x7;
+ switch(fsr){
+ case 0x02: /* instruction debug event (BKPT) */
+ if(user){
+ snprint(buf, sizeof buf, "sys: breakpoint");
+ postnote(up, 1, buf, NDebug);
+ }else{
+ iprint("kernel bkpt: pc %#lux inst %#ux\n",
+ ureg->pc, *(u32int*)ureg->pc);
+ panic("kernel bkpt");
+ }
+ break;
+ default:
+ faultarm(ureg, ureg->pc, user, 1);
+ break;
+ }
break;
case PsrMabt+1: /* data fault */
ldrexvalid = 0;