| plan 9 kernel history: overview | file list | diff list |
2000/0125/alphapc/trap.c (diff list | history)
| 2000/0108/sys/src/9/alphapc/trap.c:35,89 – 2000/0125/sys/src/9/alphapc/trap.c:35,40 (short | long | prev | next) | ||
| 1999/0415 | arch->intrenable(irq, f, a, tbdf); } | |
| 1999/0701 |
| |
| 1999/0415 |
| |
| 1999/0515 |
| |
| 1999/0415 |
| |
| 2000/0108/sys/src/9/alphapc/trap.c:149,181 – 2000/0125/sys/src/9/alphapc/trap.c:100,189 | ||
| 1999/0415 | } void | |
| 2000/0125 | trap(Ureg *ur) | |
| 1999/0415 | { | |
| 2000/0125 | char buf[ERRLEN]; int user, x; m->intrts = fastticks(nil); user = ur->status&UMODE; if(user){ up = m->proc; up->dbgreg = ur; } switch ((int)ur->type) { case 1: /* arith */ fptrap(ur); | |
| 1999/0415 | break; | |
| 2000/0125 | case 2: /* bad instr or FEN */ illegal(ur); | |
| 1999/0415 | break; | |
| 2000/0125 | case 3: /* intr */ m->intr++; switch ((int)ur->a0) { case 0: /* interprocessor */ panic("interprocessor intr"); break; case 1: /* clock */ clock(ur); break; case 2: /* machine check */ mcheck((void*)(KZERO|(ulong)ur->a2)); break; case 3: /* device */ arch->intr(ur); /* * preemptive scheduling. to limit stack depth, * make sure process has a chance to return from * the current interrupt before being preempted a * second time. */ if(up && up->state == Running) if(anyhigher()) if(up->preempted == 0) if(!active.exiting){ up->preempted = 1; sched(); splhi(); up->preempted = 0; return; } break; case 4: /* perf counter */ panic("perf count"); break; default: panic("bad intr"); break; } | |
| 1999/0415 | break; | |
| 2000/0125 | case 4: /* memory fault */ if(up == 0) kernfault(ur, (ulong)ur->a1); x = up->insyscall; up->insyscall = 1; spllo(); faultalpha(ur); up->insyscall = x; | |
| 1999/0415 | break; | |
| 2000/0125 | case 6: /* alignment fault */ ur->pc -= 4; sprint(buf, "trap: unaligned addr 0x%lux", (ulong)ur->a0); fataltrap(ur, buf); | |
| 1999/0415 | break; | |
| 2000/0125 | default: /* cannot happen */ panic("bad trap type %d", (int)ur->type); | |
| 1999/0415 | break; } | |
| 2000/0125 | if(user && (up->procctl || up->nnote)){ splhi(); notify(ur); } | |
| 1999/0415 | } void | |
| 2000/0108/sys/src/9/alphapc/trap.c:250,255 – 2000/0125/sys/src/9/alphapc/trap.c:258,265 | ||
| 1999/0415 | el = sl + KSTACK; } if(l > el || l < sl){ | |
| 2000/0125 | iprint("dumpstack: l %lux sl %lux el %lux m %lux up %lux\n", l, sl, el, m, up); | |
| 1999/0415 | el = (ulong)m+BY2PG; sl = el-KSTACK; } | |