## diffname ss/faultsparc.c 1990/1223 ## diff -e /dev/null /n/bootesdump/1990/1223/sys/src/9/sparc/faultsparc.c 0a #include "u.h" #include "lib.h" #include "mem.h" #include "dat.h" #include "fns.h" #include "ureg.h" #include "errno.h" #define FORMAT(ur) ((((ur)->vo)>>12)&0xF) #define OFFSET(ur) (((ur)->vo)&0xFFF) struct FFrame { ushort ireg0; /* internal register */ ushort ssw; /* special status word */ ushort ipsc; /* instr. pipe stage c */ ushort ipsb; /* instr. pipe stage b */ ulong addr; /* data cycle fault address */ ushort ireg1; /* internal register */ ushort ireg2; /* internal register */ ulong dob; /* data output buffer */ ushort ireg3[4]; /* more stuff */ ulong baddr; /* stage b address */ ushort ireg4[26]; /* more more stuff */ }; /* * SSW bits */ #define RW 0x0040 /* read/write for data cycle */ #define FC 0x8000 /* fault on stage C of instruction pipe */ #define FB 0x4000 /* fault on stage B of instruction pipe */ #define RC 0x2000 /* rerun flag for stage C of instruction pipe */ #define RB 0x1000 /* rerun flag for stage B of instruction pipe */ #define DF 0x0100 /* fault/rerun flag for data cycle */ #define RM 0x0080 /* read-modify-write on data cycle */ #define READ 0x0040 #define WRITE 0x0000 #define SIZ 0x0030 /* size code for data cycle */ #define FC2 0x0004 /* address space for data cycle */ #define FC1 0x0002 #define FC0 0x0001 void fault68020(Ureg *ur, FFrame *f) { ulong addr, badvaddr; int user, read, insyscall; if(u == 0){ dumpregs(ur); panic("fault u==0 pc=%lux", ur->pc); } insyscall = u->p->insyscall; u->p->insyscall = 1; addr = 0; /* set */ if(f->ssw & DF) addr = f->addr; else if(FORMAT(ur) == 0xA){ if(f->ssw & FC) addr = ur->pc+2; else if(f->ssw & FB) addr = ur->pc+4; else panic("prefetch pagefault"); }else if(FORMAT(ur) == 0xB){ if(f->ssw & FC) addr = f->baddr-2; else if(f->ssw & FB) addr = f->baddr; else panic("prefetch pagefault"); }else panic("prefetch format"); addr &= VAMASK; badvaddr = addr; addr &= ~(BY2PG-1); user = !(ur->sr&SUPER); if(f->ssw & DF) read = (f->ssw&READ) && !(f->ssw&RM); else read = f->ssw&(FB|FC); /* print("fault pc=%lux addr=%lux read %d\n", ur->pc, badvaddr, read); /**/ if(fault(addr, read) < 0){ if(user){ pprint("user %s error addr=0x%lux\n", read? "read" : "write", badvaddr); pprint("status=0x%lux pc=0x%lux sp=0x%lux\n", ur->sr, ur->pc, ur->sp); pexit("Suicide", 0); } u->p->state = MMUing; dumpregs(ur); panic("fault: 0x%lux", badvaddr); exit(); } u->p->insyscall = insyscall; } . ## diffname ss/faultsparc.c 1990/1226 ## diff -e /n/bootesdump/1990/1223/sys/src/9/sparc/faultsparc.c /n/bootesdump/1990/1226/sys/src/9/sparc/faultsparc.c 97a } /* * called in sysfile.c */ void evenaddr(ulong addr) { if(addr & 3){ panic("evenaddr"); postnote(u->p, 1, "sys: odd address", NDebug); error(Ebadarg); } . 89c pprint("psr=0x%lux pc=0x%lux sp=0x%lux\n", ur->psr, ur->pc, ur->sp); . 79,84c user = !(ur->psr&PSRSUPER); . 57,76c /* addr &= VAMASK; /**/ . 54a if(getw2(SER) & 0x8000) read = 0; else read = 1; . 50a tbr = ur->tbr&0xFFF; addr = ur->pc; /* assume instr. exception */ if(tbr == (9<<4)) /* data access exception */ addr = getw2(SEVAR); else if(tbr != (1<<4)){ /* should be instruction access exception */ trap(ur); panic("trap returns"); } spllo(); print("fault: %s pc=0x%lux addr %lux\n", excname(ur->tbr), ur->pc, addr); . 49a ulong tbr; . 46c faultsparc(Ureg *ur) . 12,44d 9,10d ## diffname ss/faultsparc.c 1990/1227 ## diff -e /n/bootesdump/1990/1226/sys/src/9/sparc/faultsparc.c /n/bootesdump/1990/1227/sys/src/9/sparc/faultsparc.c 26c print("fault: %s pc=0x%lux addr %lux\n", excname(tbr), ur->pc, addr); . 23c return; . 21c else if(tbr != 1){ /* should be instruction access exception */ . 19c if(tbr == 9) /* data access exception */ . 17c tbr = (ur->tbr&0xFFF)>>4; . ## diffname ss/faultsparc.c 1990/1231 ## diff -e /n/bootesdump/1990/1227/sys/src/9/sparc/faultsparc.c /n/bootesdump/1990/1231/sys/src/9/sparc/faultsparc.c 40c user = !(ur->psr&PSRPSUPER); . 31,34d 26c /* print("fault: %s pc=0x%lux addr %lux %d\n", excname(tbr), ur->pc, addr, read); /**/ . 21c if(getw2(SER) & 0x8000) read = 0; }else if(tbr != 1){ /* should be instr. access exception */ . 19c read = 1; if(tbr == 9){ /* data access exception */ /* * According to the book, this isn't good enough. We'll see. */ . 9d ## diffname ss/faultsparc.c 1991/0110 ## diff -e /n/bootesdump/1990/1231/sys/src/9/sparc/faultsparc.c /n/bootesdump/1991/0110/sys/src/9/sparc/faultsparc.c 54a ck("faultsparc return"); } 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"); . 43a print("death read %lux %d sizes %lux-%lux %lux-%lux, %lux-%lux %lux-%lux\n", addr, read, u->p->seg[SSEG].minva, u->p->seg[SSEG].maxva, u->p->seg[TSEG].minva, u->p->seg[TSEG].maxva, u->p->seg[DSEG].minva, u->p->seg[DSEG].maxva, u->p->seg[BSEG].minva, u->p->seg[BSEG].maxva); . 31c print("fault: %s pc=0x%lux addr %lux %d\n", excname(tbr), ur->pc, addr, read); /**/ ck("faultsparc"); . 8a ck(char *s) { if(u->p->seg[SSEG].o->flag == 0) panic(s); } . ## diffname ss/faultsparc.c 1991/0111 ## diff -e /n/bootesdump/1991/0110/sys/src/9/sparc/faultsparc.c /n/bootesdump/1991/0111/sys/src/9/sparc/faultsparc.c 67d 51,55d 37,38c /* print("fault: %s pc=0x%lux addr %lux %d\n", excname(tbr), ur->pc, addr, read); /**/ . 9,14d ## diffname ss/faultsparc.c 1991/0115 ## diff -e /n/bootesdump/1991/0111/sys/src/9/sparc/faultsparc.c /n/bootesdump/1991/0115/sys/src/9/sparc/faultsparc.c 82d ## diffname ss/faultsparc.c 1991/01151 ## diff -e /n/bootesdump/1991/0115/sys/src/9/sparc/faultsparc.c /n/bootesdump/1991/01151/sys/src/9/sparc/faultsparc.c 54c splhi(); . 36,37d 34c panic("fault u==0 pc=%lux addr=%lux", ur->pc, addr); . 26,28d 13c int user, read; . ## diffname ss/faultsparc.c 1991/0503 ## diff -e /n/bootesdump/1991/0201/sys/src/9/sparc/faultsparc.c /n/bootesdump/1991/0503/sys/src/9/slc/faultsparc.c 28c print("fault: %s pc=0x%lux addr %lux %d\n", excname(tbr), ur->pc, addr, read); /**/ . ## diffname ss/faultsparc.c 1991/0504 ## diff -e /n/bootesdump/1991/0503/sys/src/9/slc/faultsparc.c /n/bootesdump/1991/0504/sys/src/9/slc/faultsparc.c 28d ## diffname ss/faultsparc.c 1991/0711 ## diff -e /n/bootesdump/1991/0504/sys/src/9/slc/faultsparc.c /n/bootesdump/1991/0711/sys/src/9/slc/faultsparc.c 27a print("fault %lux %lux %d\n", ur->pc, addr, read); . ## diffname ss/faultsparc.c 1991/0712 ## diff -e /n/bootesdump/1991/0711/sys/src/9/slc/faultsparc.c /n/bootesdump/1991/0712/sys/src/9/slc/faultsparc.c 28d ## diffname ss/faultsparc.c 1991/0717 ## diff -e /n/bootesdump/1991/0712/sys/src/9/slc/faultsparc.c /n/bootesdump/1991/0717/sys/src/9/slc/faultsparc.c 39,41c sprint(buf, "sys: fault %s pc=0x%lux addr=0x%lux", read? "read" : "write", ur->pc, badvaddr); postnote(u->p, 1, buf, NDebug); notify(ur); return; . 12a char buf[ERRLEN]; . ## diffname ss/faultsparc.c 1991/0926 ## diff -e /n/bootesdump/1991/0717/sys/src/9/slc/faultsparc.c /n/bootesdump/1991/0926/sys/src/9/slc/faultsparc.c 46d ## diffname ss/faultsparc.c 1991/1108 ## diff -e /n/bootesdump/1991/0926/sys/src/9/slc/faultsparc.c /n/bootesdump/1991/1108/sys/src/9/slc/faultsparc.c 43d ## diffname ss/faultsparc.c 1991/1218 ## diff -e /n/bootesdump/1991/1108/sys/src/9/slc/faultsparc.c /n/bootesdump/1991/1218/sys/src/9/slc/faultsparc.c 40,41c sprint(buf, "sys: trap: fault %s addr=0x%lux", read? "read" : "write", badvaddr); . ## diffname ss/faultsparc.c 1992/0111 ## diff -e /n/bootesdump/1991/1218/sys/src/9/slc/faultsparc.c /n/bootesdump/1992/0111/sys/src/9/slc/faultsparc.c 7c #include "../port/error.h" . ## diffname ss/faultsparc.c 1992/0321 ## diff -e /n/bootesdump/1992/0111/sys/src/9/slc/faultsparc.c /n/bootesdump/1992/0321/sys/src/9/slc/faultsparc.c 2c #include "../port/lib.h" . ## diffname ss/faultsparc.c 1992/0704 ## diff -e /n/bootesdump/1992/0321/sys/src/9/slc/faultsparc.c /n/bootesdump/1992/0704/sys/src/9/slc/faultsparc.c 25c ser = getw2(SER); if(ser&(SE_WRITE|SE_PROT)) . 15c ulong tbr, ser; . 8a enum { SE_WRITE = 0x8000, SE_INV = 0x0080, SE_PROT = 0x0040, }; . ## diffname ss/faultsparc.c 1992/0806 ## diff -e /n/bootesdump/1992/0704/sys/src/9/slc/faultsparc.c /n/bootesdump/1992/0806/sys/src/9/slc/faultsparc.c 65c print("interrupt 15 ASER %lux ASEVAR %lux SER %lux\n", getsysspace(ASER), getsysspace(ASEVAR), getsysspace(SER)); . 31,32c addr = getsysspace(SEVAR); ser = getsysspace(SER); . ## diffname ss/faultsparc.c 1992/0812 ## diff -e /n/bootesdump/1992/0807/sys/src/9/slc/faultsparc.c /n/bootesdump/1992/0812/sys/src/9/ss/faultsparc.c 55d ## diffname ss/faultsparc.c 1992/0813 ## diff -e /n/bootesdump/1992/0812/sys/src/9/ss/faultsparc.c /n/bootesdump/1992/0813/sys/src/9/ss/faultsparc.c 40a . ## diffname ss/faultsparc.c 1992/0911 ## diff -e /n/bootesdump/1992/0813/sys/src/9/ss/faultsparc.c /n/bootesdump/1992/0911/sys/src/9/ss/faultsparc.c 35a if(u && strcmp(u->p->text, "rc") == 0) print("fault pc=%lux addr=%lux %d\n", ur->pc, addr, read);/**/ . ## diffname ss/faultsparc.c 1992/0912 ## diff -e /n/bootesdump/1992/0911/sys/src/9/ss/faultsparc.c /n/bootesdump/1992/0912/sys/src/9/ss/faultsparc.c 36c /*if(u && strcmp(u->p->text, "rc") == 0) . ## diffname ss/faultsparc.c 1992/0913 ## diff -e /n/bootesdump/1992/0912/sys/src/9/ss/faultsparc.c /n/bootesdump/1992/0913/sys/src/9/ss/faultsparc.c 44d 36,37c . ## diffname ss/faultsparc.c 1993/0501 # deleted ## diff -e /n/bootesdump/1992/0913/sys/src/9/ss/faultsparc.c /n/fornaxdump/1993/0501/sys/src/brazil/ss/faultsparc.c 1,88d