| plan 9 kernel history: overview | file list | diff list |
1991/0115/ss/faultsparc.c (diff list | history)
| ss/faultsparc.c on 1990/1223 | ||
| 1990/1223 | #include "u.h" #include "lib.h" #include "mem.h" #include "dat.h" #include "fns.h" #include "ureg.h" #include "errno.h" void | |
| 1990/1226 | faultsparc(Ureg *ur) | |
| 1990/1223 | { ulong addr, badvaddr; int user, read, insyscall; | |
| 1990/1226 | ulong tbr; | |
| 1990/1223 | ||
| 1990/1227 | tbr = (ur->tbr&0xFFF)>>4; | |
| 1990/1226 | addr = ur->pc; /* assume instr. exception */ | |
| 1990/1231 | read = 1; if(tbr == 9){ /* data access exception */ /* * According to the book, this isn't good enough. We'll see. */ | |
| 1990/1226 | addr = getw2(SEVAR); | |
| 1990/1231 | if(getw2(SER) & 0x8000) read = 0; }else if(tbr != 1){ /* should be instr. access exception */ | |
| 1990/1226 | trap(ur); | |
| 1990/1227 | return; | |
| 1990/1226 | } spllo(); | |
| 1991/0111 | /* print("fault: %s pc=0x%lux addr %lux %d\n", excname(tbr), ur->pc, addr, read); /**/ | |
| 1990/1223 | if(u == 0){ dumpregs(ur); panic("fault u==0 pc=%lux", ur->pc); } insyscall = u->p->insyscall; u->p->insyscall = 1; | |
| 1990/1226 | /* addr &= VAMASK; /**/ | |
| 1990/1223 | badvaddr = addr; addr &= ~(BY2PG-1); | |
| 1990/1231 | user = !(ur->psr&PSRPSUPER); | |
| 1990/1223 | if(fault(addr, read) < 0){ if(user){ pprint("user %s error addr=0x%lux\n", read? "read" : "write", badvaddr); | |
| 1990/1226 | pprint("psr=0x%lux pc=0x%lux sp=0x%lux\n", ur->psr, ur->pc, ur->sp); | |
| 1990/1223 | pexit("Suicide", 0); } u->p->state = MMUing; dumpregs(ur); panic("fault: 0x%lux", badvaddr); exit(); } u->p->insyscall = insyscall; | |
| 1991/0110 | } void faultasync(Ureg *ur) { int user; print("interrupt 15 ASER %lux ASEVAR %lux SER %lux\n", getw2(ASER), getw2(ASEVAR), getw2(SER)); dumpregs(ur); /* * Clear interrupt by toggling low bit of interrupt register */ *intrreg &= ~1; *intrreg |= 1; user = !(ur->psr&PSRPSUPER); if(user) pexit("Suicide", 0); panic("interrupt 15"); | |
| 1990/1226 | } /* * called in sysfile.c */ void evenaddr(ulong addr) { if(addr & 3){ postnote(u->p, 1, "sys: odd address", NDebug); error(Ebadarg); } | |
| 1990/1223 | } | |