| plan 9 kernel history: overview | file list | diff list |
1991/01151/ss/trap.c (diff list | history)
| 1991/0115/sys/src/9/ss/trap.c:53,99 – 1991/01151/sys/src/9/ss/trap.c:53,147 (short | long | prev | next) | ||
| 1990/1223 | void trap(Ureg *ur) { | |
| 1991/01151 | int user, x; | |
| 1990/1223 | char buf[64]; | |
| 1990/1227 | ulong tbr; | |
| 1990/1223 | ||
| 1990/1227 |
| |
| 1991/0110 |
| |
| 1990/1231 |
| |
| 1990/1227 |
| |
| 1990/1231 |
| |
| 1990/1227 |
| |
| 1991/0115 |
| |
| 1990/1227 | ||
| 1990/1226 |
| |
| 1991/01151 | if(u) | |
| 1990/1223 | u->p->pc = ur->pc; /* BUG */ | |
| 1990/1227 |
| |
| 1991/0115 |
| |
| 1990/1223 |
| |
| 1991/01151 | user = !(ur->psr&PSRPSUPER); tbr = (ur->tbr&0xFFF)>>4; if(tbr > 16){ /* interrupt */ if(u && u->p->state==Running){ if(u->p->fpstate == FPactive) { savefpregs(&u->fpsave); u->p->fpstate = FPinactive; ur->psr &= ~PSREF; } } switch(tbr-16){ case 15: /* asynch mem err */ faultasync(ur); break; case 14: /* counter 1 */ clock(ur); break; case 12: /* keyboard and mouse */ duartintr(); break; case 5: /* lance */ lanceintr(); break; default: goto Error; } | |
| 1990/1223 | }else{ | |
| 1990/1227 |
| |
| 1990/1223 |
| |
| 1990/1226 |
| |
| 1990/1223 |
| |
| 1991/01151 | switch(tbr){ case 1: /* instr. access */ case 9: /* data access */ if(u && u->p->fpstate==FPactive) { savefpregs(&u->fpsave); u->p->fpstate = FPinactive; ur->psr &= ~PSREF; } if(u){ x = u->p->insyscall; u->p->insyscall = 1; faultsparc(ur); u->p->insyscall = x; }else faultsparc(ur); goto Return; case 4: /* floating point disabled */ if(u && u->p){ if(u->p->fpstate == FPinit) restfpregs(&initfp); else if(u->p->fpstate == FPinactive) restfpregs(&u->fpsave); else break; u->p->fpstate = FPactive; ur->psr |= PSREF; return; } break; case 8: /* floating point exception */ clearfpintr(); break; default: break; } if(user){ spllo(); sprint(buf, "sys: trap: pc=0x%lux %s", ur->pc, excname(tbr)); if(tbr == 8) sprint(buf+strlen(buf), " FSR %lux", u->fpsave.fsr); postnote(u->p, 1, buf, NDebug); }else{ Error: print("kernel trap: %s pc=0x%lux\n", excname(tbr), ur->pc); dumpregs(ur); for(;;); } if(user && u->nnote) notify(ur); | |
| 1990/1223 | } | |
| 1991/0112 |
| |
| 1990/1223 |
| |
| 1991/01151 | Return: if(user && u && u->p->fpstate == FPinactive) { restfpregs(&u->fpsave); u->p->fpstate = FPactive; ur->psr |= PSREF; } | |
| 1990/1223 | } void | |
| 1991/0115/sys/src/9/ss/trap.c:272,290 – 1991/01151/sys/src/9/ss/trap.c:320,335 | ||
| 1990/1223 | u->p->pc = ur->pc; | |
| 1990/1226 | if(ur->psr & PSRPSUPER) | |
| 1990/1223 | panic("recursive system call"); | |
| 1990/1226 |
| |
| 1991/01151 | ||
| 1990/1223 | /* * since the system call interface does not | |
| 1991/01151 | * guarantee anything about registers, | |
| 1990/1223 | */ | |
| 1991/01151 | if(u->p->fpstate == FPactive) { | |
| 1990/1223 | u->p->fpstate = FPinit; | |
| 1991/01151 | ur->psr &= ~PSREF; | |
| 1990/1223 | } | |
| 1990/1226 |
| |
| 1991/01151 | ||
| 1990/1223 | spllo(); | |
| 1990/1226 | r7 = ur->r7; | |
| 1990/1223 | sp = ur->usp; | |