diff --git a/sys/src/9/kw/trap.c b/sys/src/9/kw/trap.c index f4d2c7756..ebd98db6f 100644 --- a/sys/src/9/kw/trap.c +++ b/sys/src/9/kw/trap.c @@ -214,6 +214,7 @@ intrs(Ureg *ur, int sort) iprint("spurious irq%s interrupt: %8.8lux\n", irq.name, ibits); s = splfhi(); *irq.irq &= ibits; + *irq.irqmask &= ~ibits; splx(s); } } @@ -416,6 +417,9 @@ trap(Ureg *ureg) case PsrMabt: /* prefetch fault */ ldrexvalid = 0; faultarm(ureg, ureg->pc, user, 1); + if(up->nnote == 0 && + (*(u32int*)ureg->pc & ~(0xF<<28)) == 0x01200070) + postnote(up, 1, "sys: breakpoint", NDebug); break; case PsrMabt+1: /* data fault */ ldrexvalid = 0; @@ -479,16 +483,21 @@ trap(Ureg *ureg) break; case PsrMund: /* undefined instruction */ if(user){ - /* look for floating point instructions to interpret */ - x = spllo(); - rv = fpiarm(ureg); - splx(x); - if(rv == 0){ - ldrexvalid = 0; - snprint(buf, sizeof buf, - "undefined instruction: pc %#lux", - ureg->pc); - postnote(up, 1, buf, NDebug); + if(seg(up, ureg->pc, 0) != nil && + (*(u32int*)ureg->pc & ~(0xF<<28)) == 0x01200070) + postnote(up, 1, "sys: breakpoint", NDebug); + else{ + /* look for floating point instructions to interpret */ + x = spllo(); + rv = fpiarm(ureg); + splx(x); + if(rv == 0){ + ldrexvalid = 0; + snprint(buf, sizeof buf, + "undefined instruction: pc %#lux", + ureg->pc); + postnote(up, 1, buf, NDebug); + } } }else{ iprint("undefined instruction: pc %#lux inst %#ux\n", diff --git a/sys/src/libmach/5db.c b/sys/src/libmach/5db.c index c477ec44c..b3d43008c 100644 --- a/sys/src/libmach/5db.c +++ b/sys/src/libmach/5db.c @@ -61,7 +61,7 @@ static int arminstlen(Map*, uvlong); */ Machdata armmach = { - {0x70, 0x00, 0x20, 0xD1}, /* break point */ /* D1200070 */ + {0x70, 0x00, 0x20, 0xE1}, /* break point */ /* E1200070 */ 4, /* break point size */ leswab, /* short to local byte order */ @@ -602,7 +602,7 @@ armcondpass(Map *map, Rgetter rget, uchar cond) case 10: return n == v; case 11: return n != v; case 12: return !z && (n == v); - case 13: return z && (n != v); + case 13: return z || (n != v); case 14: return 1; case 15: return 0; }