}
insyscall = up->insyscall;
up->insyscall = 1;
- n = fault(va, read);
+ n = fault(va, ureg->pc, read);
if(n < 0){
if(!user){
dumpregs(ureg);
switch (irqno) {
case 56:
case 57:
- iprint(" (I²C)");
+ iprint(" (Iâ\81²C)");
break;
case 83:
case 86:
rem, up, ureg, ureg->pc);
}
- user = (ureg->psr & PsrMask) == PsrMusr;
- if(user){
- up->dbgreg = ureg;
- cycles(&up->kentry);
- }
-
+ user = kenter(ureg);
/*
* All interrupts/exceptions should be resumed at ureg->pc-4,
* except for Data Abort which resumes at ureg->pc-8.
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\n",
- ureg->pc);
+ if(seg(up, ureg->pc, 0) != nil &&
+ *(u32int*)ureg->pc == 0xD1200070){
+ snprint(buf, sizeof buf, "sys: breakpoint");
postnote(up, 1, buf, 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\n",
+ ureg->pc);
+ postnote(up, 1, buf, NDebug);
+ }
}
}else{
if (ureg->pc & 3) {
Ureg ureg;
ureg.pc = getcallerpc(&fn);
- ureg.sp = PTR2UINT(&fn);
+ ureg.sp = (uintptr)&fn;
fn(&ureg);
}