| plan 9 kernel history: overview | file list | diff list |
1990/1231/ss/faultsparc.c (diff list | history)
| 1990/1227/sys/src/9/ss/faultsparc.c:6,12 – 1990/1231/sys/src/9/ss/faultsparc.c:6,11 (short | long | prev | next) | ||
| 1990/1223 | #include "ureg.h" #include "errno.h" | |
| 1990/1226 | faultsparc(Ureg *ur) | |
| 1990/1223 | { | |
| 1990/1227/sys/src/9/ss/faultsparc.c:16,43 – 1990/1231/sys/src/9/ss/faultsparc.c:15,44 | ||
| 1990/1223 | ||
| 1990/1227 | tbr = (ur->tbr&0xFFF)>>4; | |
| 1990/1226 | addr = ur->pc; /* assume instr. exception */ | |
| 1990/1227 |
| |
| 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/1227 |
| |
| 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(); | |
| 1990/1227 |
| |
| 1990/1231 | /* 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); } | |
| 1990/1226 |
| |
| 1990/1223 | insyscall = u->p->insyscall; u->p->insyscall = 1; | |
| 1990/1226 | /* addr &= VAMASK; /**/ | |
| 1990/1223 | badvaddr = addr; addr &= ~(BY2PG-1); | |
| 1990/1226 |
| |
| 1990/1231 | user = !(ur->psr&PSRPSUPER); | |
| 1990/1223 | if(fault(addr, read) < 0){ if(user){ | |