| plan 9 kernel history: overview | file list | diff list |
1994/0619/carrera/trap.c (diff list | history)
| 1993/0903/sys/src/9/carrera/trap.c:278,289 – 1993/0904/sys/src/9/carrera/trap.c:278,323 (short | long) | ||
| 1993/0903 | void intr(Ureg *ur) { | |
| 1993/0904 | uchar devint; | |
| 1993/0903 | ulong cause = ur->cause; m->intr++; cause &= INTR7|INTR6|INTR5|INTR4|INTR3|INTR2|INTR1|INTR0; | |
| 1993/0904 | if(cause & INTR3) { devint = *(uchar*)Intcause; switch(devint) { default: panic("unknown devint=#%lux", devint); case 0x28: /* Serial 1 */ NS16552intr(0); break; case 0x24: /* Serial 2 */ NS16552intr(1); break; case 0x14: etherintr(); break; } cause &= ~INTR3; } if(cause & INTR4) { devint = *(uchar*)I386ack; iprint("i386ack=#%lux\n", devint); cause &= ~INTR4; } if(cause & INTR7) { clock(ur); cause &= ~INTR7; } if(cause) { iprint("cause %lux\n", cause); exit(1); } | |
| 1993/0903 | } char* | |
| 1993/0903/sys/src/9/carrera/trap.c:512,538 – 1993/0904/sys/src/9/carrera/trap.c:546,576 | ||
| 1993/0903 | up->nerrlab = 0; sp = ur->sp; ret = -1; | |
| 1993/0904 | if(waserror()) goto error; | |
| 1993/0903 |
| |
| 1993/0904 | if(up->scallnr >= sizeof systab/sizeof systab[0]){ pprint("bad sys call %d pc %lux\n", up->scallnr, ur->pc); postnote(up, 1, "sys: bad sys call", NDebug); error(Ebadarg); } | |
| 1993/0903 |
| |
| 1993/0904 | if(sp & (BY2WD-1)){ pprint("odd sp in sys call pc %lux sp %lux\n", ur->pc, ur->sp); postnote(up, 1, "sys: odd stack", NDebug); error(Ebadarg); | |
| 1993/0903 | } | |
| 1993/0904 | if(sp<(USTKTOP-BY2PG) || sp>(USTKTOP-sizeof(Sargs))) validaddr(sp, sizeof(Sargs), 0); up->s = *((Sargs*)(sp+BY2WD)); up->psstate = sysctab[up->scallnr]; ret = (*systab[up->scallnr])(up->s.args); poperror(); error: | |
| 1993/0903 | ur->pc += 4; up->nerrlab = 0; up->psstate = 0; | |
| 1993/0904/sys/src/9/carrera/trap.c:205,210 – 1993/0905/sys/src/9/carrera/trap.c:205,211 (short | long) | ||
| 1993/0903 | kernfault(ur, ecode); if(!user && (ur->badvaddr & KSEGM) == KSEG3) { | |
| 1993/0905 | iprint("kf %lux %lux\n", ur->pc, ur->r31); | |
| 1993/0903 | kfault(ur->badvaddr); break; } | |
| 1993/0904/sys/src/9/carrera/trap.c:285,291 – 1993/0905/sys/src/9/carrera/trap.c:286,292 | ||
| 1993/0903 | cause &= INTR7|INTR6|INTR5|INTR4|INTR3|INTR2|INTR1|INTR0; | |
| 1993/0904 | if(cause & INTR3) { | |
| 1993/0905 | devint = IO(uchar, Intcause); | |
| 1993/0904 | switch(devint) { default: panic("unknown devint=#%lux", devint); | |
| 1993/0904/sys/src/9/carrera/trap.c:304,310 – 1993/0905/sys/src/9/carrera/trap.c:305,311 | ||
| 1993/0904 | } if(cause & INTR4) { | |
| 1993/0905 | devint = IO(uchar, I386ack); | |
| 1993/0904 | iprint("i386ack=#%lux\n", devint); cause &= ~INTR4; } | |
| 1993/0905/sys/src/9/carrera/trap.c:204,211 – 1993/0906/sys/src/9/carrera/trap.c:204,210 (short | long) | ||
| 1993/0903 | if(up == 0) kernfault(ur, ecode); | |
| 1993/0905 |
| |
| 1993/0906 | if(!user && (ur->badvaddr & KMAPMASK) == KMAPADDR) { | |
| 1993/0903 | kfault(ur->badvaddr); break; } | |
| 1993/0905/sys/src/9/carrera/trap.c:392,398 – 1993/0906/sys/src/9/carrera/trap.c:391,397 | ||
| 1993/0903 | l = &ur->status; for(i=0; i<sizeof regname/sizeof(char*); i+=2, l+=2) | |
| 1993/0906 | print("%s\t0x%.8lux\t%s\t0x%.8lux\n", regname[i], l[0], regname[i+1], l[1]); | |
| 1993/0903 | } int | |
| 1993/0906/sys/src/9/carrera/trap.c:244,250 – 1993/0907/sys/src/9/carrera/trap.c:244,250 (short | long) | ||
| 1993/0903 | postnote(up, 1, buf, NDebug); break; } | |
| 1993/0907 | print("kernel %s pc=%lux\n", excname[ecode], ur->pc); | |
| 1993/0903 | dumpregs(ur); dumpstack(); if(m->machno == 0) | |
| 1993/0906/sys/src/9/carrera/trap.c:285,304 – 1993/0907/sys/src/9/carrera/trap.c:285,311 | ||
| 1993/0903 | cause &= INTR7|INTR6|INTR5|INTR4|INTR3|INTR2|INTR1|INTR0; | |
| 1993/0904 | if(cause & INTR3) { | |
| 1993/0905 |
| |
| 1993/0904 |
| |
| 1993/0907 | for(;;) { devint = IO(uchar, Intcause); if(devint == 0) break; switch(devint) { default: panic("unknown devint=#%lux", devint); | |
| 1993/0904 |
| |
| 1993/0907 | case 0x28: /* Serial 1 */ NS16552intr(0); break; case 0x24: /* Serial 2 */ NS16552intr(1); break; case 0x14: etherintr(); break; case 0x1C: kbdintr(); break; } | |
| 1993/0904 | } cause &= ~INTR3; } | |
| 1993/0907/sys/src/9/carrera/trap.c:309,315 – 1993/0908/sys/src/9/carrera/trap.c:309,322 (short | long) | ||
| 1993/0904 | } cause &= ~INTR3; } | |
| 1993/0908 | if(cause & INTR2) { iprint("R4030 Interrupt\n"); iprint(" ISR #%lux\n", IO(ulong, R4030Isr)); iprint(" ET #%lux\n", IO(ulong, R4030Et)); iprint(" RFA #%lux\n", IO(ulong, R4030Rfa)); iprint(" MFA #%lux\n", IO(ulong, R4030Mfa)); cause &= ~INTR2; } | |
| 1993/0904 | if(cause & INTR4) { | |
| 1993/0905 | devint = IO(uchar, I386ack); | |
| 1993/0904 | iprint("i386ack=#%lux\n", devint); | |
| 1993/0908/sys/src/9/carrera/trap.c:368,376 – 1993/0918/sys/src/9/carrera/trap.c:368,376 (short | long) | ||
| 1993/0903 | kernfault(Ureg *ur, int code) { print("panic: kfault %s badvaddr=0x%lux\n", excname[code], ur->badvaddr); | |
| 1993/0918 | kpteprint(ur); | |
| 1993/0903 | panic("kfault"); } | |
| 1993/0918/sys/src/9/carrera/trap.c:613,618 – 1993/0930/sys/src/9/carrera/trap.c:613,619 (short | long) | ||
| 1993/0903 | memmove(cur, ur, sizeof(Ureg)); cur->pc += 4; | |
| 1993/0930 | cur->status |= CU0; | |
| 1993/0903 | /* Things from bottom of syscall we never got to execute */ p->psstate = 0; | |
| 1993/0930/sys/src/9/carrera/trap.c:305,310 – 1993/1001/sys/src/9/carrera/trap.c:305,313 (short | long) | ||
| 1993/0907 | case 0x1C: kbdintr(); break; | |
| 1993/1001 | case 0x20: mouseintr(); break; | |
| 1993/0907 | } | |
| 1993/0904 | } cause &= ~INTR3; | |
| 1993/1001/sys/src/9/carrera/trap.c:370,378 – 1993/1005/sys/src/9/carrera/trap.c:370,378 (short | long) | ||
| 1993/0903 | void kernfault(Ureg *ur, int code) { | |
| 1993/1005 | print("kfault %s badvaddr=0x%lux\n", excname[code], ur->badvaddr); print("UP=0x%lux SR=0x%lux PC=0x%lux R31=%lux SP=0x%lux\n", up, ur->status, ur->pc, ur->r31, ur->sp); | |
| 1993/0918 | kpteprint(ur); | |
| 1993/0903 | panic("kfault"); } | |
| 1993/1001/sys/src/9/carrera/trap.c:471,476 – 1993/1005/sys/src/9/carrera/trap.c:471,477 | ||
| 1993/0903 | *(ulong*)(sp+2*BY2WD) = sp+3*BY2WD; /* arg 2 is string */ up->svr1 = ur->r1; /* save away r1 */ ur->r1 = (ulong)up->ureg; /* arg 1 is ureg* */ | |
| 1993/1005 | *(ulong*)(sp+1*BY2WD) = (ulong)u->ureg; /* arg 1 0(FP) is ureg* */ | |
| 1993/0903 | *(ulong*)(sp+0*BY2WD) = 0; /* arg 0 is pc */ ur->usp = sp; ur->pc = (ulong)up->notify; | |
| 1993/1005/sys/src/9/carrera/trap.c:471,477 – 1993/1006/sys/src/9/carrera/trap.c:471,477 (short | long) | ||
| 1993/0903 | *(ulong*)(sp+2*BY2WD) = sp+3*BY2WD; /* arg 2 is string */ up->svr1 = ur->r1; /* save away r1 */ ur->r1 = (ulong)up->ureg; /* arg 1 is ureg* */ | |
| 1993/1005 |
| |
| 1993/1006 | *(ulong*)(sp+1*BY2WD) = (ulong)up->ureg; /* arg 1 0(FP) is ureg* */ | |
| 1993/0903 | *(ulong*)(sp+0*BY2WD) = 0; /* arg 0 is pc */ ur->usp = sp; ur->pc = (ulong)up->notify; | |
| 1993/1006/sys/src/9/carrera/trap.c:205,211 – 1993/1013/sys/src/9/carrera/trap.c:205,211 (short | long) | ||
| 1993/0903 | kernfault(ur, ecode); | |
| 1993/0906 | if(!user && (ur->badvaddr & KMAPMASK) == KMAPADDR) { | |
| 1993/0903 |
| |
| 1993/1013 | kfault(ur); | |
| 1993/0903 | break; } | |
| 1993/1013/sys/src/9/carrera/trap.c:406,411 – 1993/1015/sys/src/9/carrera/trap.c:406,412 (short | long) | ||
| 1993/0903 | else print("registers for kernel\n"); | |
| 1993/1015 | ||
| 1993/0903 | l = &ur->status; for(i=0; i<sizeof regname/sizeof(char*); i+=2, l+=2) | |
| 1993/0906 | print("%s\t0x%.8lux\t%s\t0x%.8lux\n", regname[i], l[0], regname[i+1], l[1]); | |
| 1993/1015/sys/src/9/carrera/trap.c:681,683 – 1993/1022/sys/src/9/carrera/trap.c:681,694 (short | long) | ||
| 1993/0903 | memmove(pureg, uva, n); xp->status = status; } | |
| 1993/1022 | /* Give enough context in the ureg to produce a kernel stack for * a sleeping process */ void setkernur(Ureg *xp, Proc *p) { xp->pc = p->sched.pc; xp->sp = p->sched.sp; xp->r31 = (ulong)sched; } | |
| 1993/1022/sys/src/9/carrera/trap.c:201,206 – 1993/1209/sys/src/9/carrera/trap.c:201,213 (short | long) | ||
| 1993/0903 | case CTLBM: case CTLBL: case CTLBS: | |
| 1993/1209 | { ((ulong*)0xA0090000)[0] = ur->pc; ((ulong*)0xA0090000)[1] = ur->badvaddr; ((ulong*)0xA0090000)[2] = ur->cause; ((ulong*)0xA0090000)[3] = 0x12345678; ((ulong*)0xA0090000)[4] = 0x87654321; } | |
| 1993/0903 | if(up == 0) kernfault(ur, ecode); | |
| 1993/1209/sys/src/9/carrera/trap.c:201,213 – 1993/1212/sys/src/9/carrera/trap.c:201,206 (short | long) | ||
| 1993/0903 | case CTLBM: case CTLBL: case CTLBS: | |
| 1993/1209 |
| |
| 1993/0903 | if(up == 0) kernfault(ur, ecode); | |
| 1993/1209/sys/src/9/carrera/trap.c:299,305 – 1993/1212/sys/src/9/carrera/trap.c:292,297 | ||
| 1993/0907 | switch(devint) { default: panic("unknown devint=#%lux", devint); | |
| 1993/0904 | ||
| 1993/0907 | case 0x28: /* Serial 1 */ NS16552intr(0); break; | |
| 1993/1209/sys/src/9/carrera/trap.c:329,335 – 1993/1212/sys/src/9/carrera/trap.c:321,327 | ||
| 1993/0908 | } | |
| 1993/0904 | if(cause & INTR4) { | |
| 1993/0905 | devint = IO(uchar, I386ack); | |
| 1993/0904 |
| |
| 1993/1212 | iprint("i386ACK #%lux\n", devint); | |
| 1993/0904 | cause &= ~INTR4; } | |
| 1993/1212/sys/src/9/carrera/trap.c:617,623 – 1993/1217/sys/src/9/carrera/trap.c:617,622 (short | long) | ||
| 1993/0903 | memmove(cur, ur, sizeof(Ureg)); cur->pc += 4; | |
| 1993/0930 |
| |
| 1993/0903 | /* Things from bottom of syscall we never got to execute */ p->psstate = 0; | |
| 1993/1217/sys/src/9/carrera/trap.c:238,243 – 1993/1219/sys/src/9/carrera/trap.c:238,246 (short | long) | ||
| 1993/0903 | Default: default: | |
| 1993/1219 | ((ulong*)0xA0020000)[7] = 0x87654321; ((void(*)(void))0xA001C020)(); | |
| 1993/0903 | if(user) { spllo(); sprint(buf, "sys: %s", excname[ecode]); | |
| 1993/1217/sys/src/9/carrera/trap.c:278,284 – 1993/1219/sys/src/9/carrera/trap.c:281,287 | ||
| 1993/0903 | void intr(Ureg *ur) { | |
| 1993/0904 |
| |
| 1993/1219 | static uchar devint; | |
| 1993/0903 | ulong cause = ur->cause; m->intr++; | |
| 1993/1217/sys/src/9/carrera/trap.c:285,313 – 1993/1219/sys/src/9/carrera/trap.c:288,312 | ||
| 1993/0903 | cause &= INTR7|INTR6|INTR5|INTR4|INTR3|INTR2|INTR1|INTR0; | |
| 1993/0904 | if(cause & INTR3) { | |
| 1993/0907 |
| |
| 1993/1001 |
| |
| 1993/0907 |
| |
| 1993/1219 | devint = IO(uchar, Intcause); switch(devint) { default: panic("unknown devint=#%lux", devint); case 0x28: /* Serial 1 */ NS16552intr(0); break; case 0x24: /* Serial 2 */ NS16552intr(1); break; case 0x14: etherintr(); break; case 0x1C: kbdintr(); break; case 0x20: mouseintr(); break; | |
| 1993/0904 | } cause &= ~INTR3; } | |
| 1993/1219/sys/src/9/carrera/trap.c:238,244 – 1993/1220/sys/src/9/carrera/trap.c:238,244 (short | long) | ||
| 1993/0903 | Default: default: | |
| 1993/1219 |
| |
| 1993/1220 | ((ulong*)0x80020000)[7] = 0x87654321; | |
| 1993/1219 | ((void(*)(void))0xA001C020)(); | |
| 1993/0903 | if(user) { | |
| 1993/1220/sys/src/9/carrera/trap.c:238,246 – 1993/1222/sys/src/9/carrera/trap.c:238,243 (short | long) | ||
| 1993/0903 | Default: default: | |
| 1993/1220 |
| |
| 1993/1219 |
| |
| 1993/0903 | if(user) { spllo(); sprint(buf, "sys: %s", excname[ecode]); | |
| 1993/1222/sys/src/9/carrera/trap.c:172,177 – 1993/1229/sys/src/9/carrera/trap.c:172,186 (short | long) | ||
| 1993/0903 | int user, cop, x, fpchk; char buf[2*ERRLEN], buf1[ERRLEN], *fpexcep; | |
| 1993/1229 | /* * Retry failed probes of legal addresses from tstbadvaddr * workaround for the R4400 >2.3 */ if(m->vaddrtst) { m->vaddrtst = 0; return; } | |
| 1993/0903 | ecode = (ur->cause>>2)&EXCMASK; user = ur->status&KUSER; | |
| 1993/1229/sys/src/9/carrera/trap.c:329,335 – 1994/0115/sys/src/9/carrera/trap.c:329,334 (short | long) | ||
| 1993/1212 | iprint("i386ACK #%lux\n", devint); | |
| 1993/0904 | cause &= ~INTR4; } | |
| 1994/0115/sys/src/9/carrera/trap.c:614,620 – 1994/0209/sys/src/9/carrera/trap.c:614,620 (short | long) | ||
| 1993/0903 | { Ureg *cur; | |
| 1994/0209 | p->sched.sp = (ulong)p->kstack+KSTACK-UREGSIZE; | |
| 1993/0903 | p->sched.pc = (ulong)forkret; cur = (Ureg*)(p->sched.sp+2*BY2WD); | |
| 1994/0209/sys/src/9/carrera/trap.c:412,418 – 1994/0210/sys/src/9/carrera/trap.c:412,422 (short | long) | ||
| 1993/1015 | ||
| 1993/0903 | l = &ur->status; for(i=0; i<sizeof regname/sizeof(char*); i+=2, l+=2) | |
| 1994/0210 | /* | |
| 1993/0906 | print("%s\t0x%.8lux\t%s\t0x%.8lux\n", regname[i], l[0], regname[i+1], l[1]); | |
| 1994/0210 | */ print("%s 0x%.8lux %s 0x%.8lux ", regname[i], l[0], regname[i+1], l[1]); | |
| 1993/0903 | } int | |
| 1994/0210/sys/src/9/carrera/trap.c:289,294 – 1994/0220/sys/src/9/carrera/trap.c:289,295 (short | long) | ||
| 1993/0903 | { | |
| 1993/1219 | static uchar devint; | |
| 1993/0903 | ulong cause = ur->cause; | |
| 1994/0220 | ulong isr; | |
| 1993/0903 | m->intr++; cause &= INTR7|INTR6|INTR5|INTR4|INTR3|INTR2|INTR1|INTR0; | |
| 1994/0210/sys/src/9/carrera/trap.c:317,327 – 1994/0220/sys/src/9/carrera/trap.c:318,335 | ||
| 1993/0904 | cause &= ~INTR3; } | |
| 1993/0908 | if(cause & INTR2) { | |
| 1994/0220 | isr = IO(ulong, R4030Isr); if(isr & (1<<5)) { audiointr(); isr &= ~(1<<5); } if(isr) { iprint("R4030 Interrupt\n"); iprint(" ISR #%lux\n", IO(ulong, R4030Isr)); iprint(" ET #%lux\n", IO(ulong, R4030Et)); iprint(" RFA #%lux\n", IO(ulong, R4030Rfa)); iprint(" MFA #%lux\n", IO(ulong, R4030Mfa)); } | |
| 1993/0908 | cause &= ~INTR2; } | |
| 1993/0904 | if(cause & INTR4) { | |
| 1994/0220/sys/src/9/carrera/trap.c:289,295 – 1994/0225/sys/src/9/carrera/trap.c:289,295 (short | long) | ||
| 1993/0903 | { | |
| 1993/1219 | static uchar devint; | |
| 1993/0903 | ulong cause = ur->cause; | |
| 1994/0220 |
| |
| 1994/0225 | ulong isr, vec; | |
| 1993/0903 | m->intr++; cause &= INTR7|INTR6|INTR5|INTR4|INTR3|INTR2|INTR1|INTR0; | |
| 1994/0220/sys/src/9/carrera/trap.c:319,326 – 1994/0225/sys/src/9/carrera/trap.c:319,327 | ||
| 1993/0904 | } | |
| 1993/0908 | if(cause & INTR2) { | |
| 1994/0220 | isr = IO(ulong, R4030Isr); | |
| 1994/0225 | ||
| 1994/0220 | if(isr & (1<<5)) { | |
| 1994/0225 | audiodmaintr(); | |
| 1994/0220 | isr &= ~(1<<5); } if(isr) { | |
| 1994/0220/sys/src/9/carrera/trap.c:334,340 – 1994/0225/sys/src/9/carrera/trap.c:335,356 | ||
| 1993/0908 | } | |
| 1993/0904 | if(cause & INTR4) { | |
| 1993/0905 | devint = IO(uchar, I386ack); | |
| 1993/1212 |
| |
| 1994/0225 | vec = devint&~0x7; /* reenable the 8259 interrupt */ if(vec == Int0vec || vec == Int1vec){ EISAOUTB(Int0ctl, EOI); if(vec == Int1vec) EISAOUTB(Int1ctl, EOI); } switch(devint) { default: iprint("i386ACK #%lux\n", devint); break; case 5: audiosbintr(); break; } | |
| 1993/0904 | cause &= ~INTR4; } if(cause & INTR7) { | |
| Too many diffs (26 > 25). Stopping. | ||