| plan 9 kernel history: overview | file list | diff list |
1994/0619/carrera/trap.c (diff list | history)
| 1994/0617/sys/src/9/carrera/trap.c:283,288 – 1994/0619/sys/src/9/carrera/trap.c:283,296 (short | long | prev | next) | ||
| 1993/0903 | } } | |
| 1994/0619 | struct { ulong cause; ulong devint3; ulong devint4; ulong state; }sisr; | |
| 1993/0903 | void intr(Ureg *ur) { | |
| 1994/0617/sys/src/9/carrera/trap.c:292,300 – 1994/0619/sys/src/9/carrera/trap.c:300,310 | ||
| 1993/0903 | m->intr++; cause &= INTR7|INTR6|INTR5|INTR4|INTR3|INTR2|INTR1|INTR0; | |
| 1994/0617 | ||
| 1994/0619 | sisr.cause = cause; | |
| 1993/0904 | if(cause & INTR3) { | |
| 1993/1219 | devint = IO(uchar, Intcause); | |
| 1994/0619 | sisr.devint3 = devint; sisr.state = 0; | |
| 1993/1219 | switch(devint) { default: panic("unknown devint=#%lux", devint); | |
| 1994/0617/sys/src/9/carrera/trap.c:318,326 – 1994/0619/sys/src/9/carrera/trap.c:328,338 | ||
| 1993/1219 | break; | |
| 1993/0904 | } cause &= ~INTR3; | |
| 1994/0619 | sisr.state = 1; | |
| 1993/0904 | } | |
| 1994/0326 | ||
| 1993/0908 | if(cause & INTR2) { | |
| 1994/0619 | sisr.state = 2; | |
| 1994/0220 | isr = IO(ulong, R4030Isr); if(isr) { iprint("R4030 Interrupt\n"); | |
| 1994/0617/sys/src/9/carrera/trap.c:330,341 – 1994/0619/sys/src/9/carrera/trap.c:342,355 | ||
| 1994/0220 | iprint(" MFA #%lux\n", IO(ulong, R4030Mfa)); } | |
| 1993/0908 | cause &= ~INTR2; | |
| 1994/0619 | sisr.state = 3; | |
| 1993/0908 | } | |
| 1994/0326 | ||
| 1993/0904 | if(cause & INTR4) { | |
| 1993/0905 | devint = IO(uchar, I386ack); | |
| 1994/0225 | vec = devint&~0x7; | |
| 1994/0617 | ||
| 1994/0619 | sisr.devint4 = devint; sisr.state = 4; | |
| 1994/0225 | /* reenable the 8259 interrupt */ if(vec == Int0vec || vec == Int1vec){ EISAOUTB(Int0ctl, EOI); | |
| 1994/0617/sys/src/9/carrera/trap.c:348,360 – 1994/0619/sys/src/9/carrera/trap.c:362,379 | ||
| 1994/0225 | iprint("i386ACK #%lux\n", devint); break; | |
| 1994/0307 | case 7: | |
| 1994/0619 | sisr.state = 5; | |
| 1994/0225 | audiosbintr(); | |
| 1994/0619 | sisr.state = 6; | |
| 1994/0307 | break; case 13: | |
| 1994/0619 | sisr.state = 7; | |
| 1994/0307 | audiodmaintr(); | |
| 1994/0619 | sisr.state = 8; | |
| 1994/0225 | break; } | |
| 1993/0904 | cause &= ~INTR4; | |
| 1994/0619 | sisr.state = 9; | |
| 1993/0904 | } | |
| 1994/0326 | ||
| 1993/0904 | if(cause & INTR7) { | |
| 1994/0617/sys/src/9/carrera/trap.c:490,499 – 1994/0619/sys/src/9/carrera/trap.c:509,519 | ||
| 1993/0903 | pexit(n->msg, n->flag!=NDebug); } up->svstatus = ur->status; | |
| 1994/0617 |
| |
| 1994/0619 | sp = ur->usp & ~(BY2V-1); sp -= sizeof(Ureg); | |
| 1993/0903 | ||
| 1994/0617 |
| |
| 1994/0619 | if(!okaddr((ulong)up->notify, BY2WD, 0) || !okaddr(sp-ERRLEN-3*BY2WD, sizeof(Ureg)+ERRLEN-3*BY2WD, 1)) { | |
| 1993/0903 | pprint("suicide: bad address or sp in notify\n"); qunlock(&up->debug); pexit("Suicide", 0); | |
| 1994/0617/sys/src/9/carrera/trap.c:506,514 – 1994/0619/sys/src/9/carrera/trap.c:526,538 | ||
| 1993/0903 | sp -= 3*BY2WD; *(ulong*)(sp+2*BY2WD) = sp+3*BY2WD; /* arg 2 is string */ up->svr1 = ur->r1; /* save away r1 */ | |
| 1994/0614 |
| |
| 1994/0617 |
| |
| 1994/0619 | up->svhr1 = ur->hr1; /* save away r1 */ ur->r1 = (long)up->ureg; /* arg 1 is ureg* */ ur->hr1 = 0; if(ur->r1 < 0) ur->hr1 = ~0; ((ulong*)sp)[1] = (ulong)up->ureg; /* arg 1 0(FP) is ureg* */ ((ulong*)sp)[0] = 0; /* arg 0 is pc */ | |
| 1993/0903 | ur->usp = sp; ur->pc = (ulong)up->notify; up->notified = 1; | |
| 1994/0617/sys/src/9/carrera/trap.c:546,551 – 1994/0619/sys/src/9/carrera/trap.c:570,576 | ||
| 1994/0513 | ||
| 1993/0903 | memmove(*urp, up->ureg, sizeof(Ureg)); (*urp)->r1 = up->svr1; | |
| 1994/0619 | (*urp)->hr1 = up->svhr1; | |
| 1993/0903 | switch(arg0) { case NCONT: if(!okaddr(nur->pc, 1, 0) || !okaddr(nur->usp, BY2WD, 0)){ | |
| 1994/0617/sys/src/9/carrera/trap.c:638,643 – 1994/0619/sys/src/9/carrera/trap.c:663,671 | ||
| 1993/0903 | splhi(); if(up->scallnr!=RFORK && (up->procctl || up->nnote)){ ur->r1 = ret; /* load up for noted() */ | |
| 1994/0619 | ur->hr1 = 0; if(ur->r1 < 0) ur->hr1 = ~0; | |
| 1993/0903 | if(notify(ur)) return ur->r1; } | |