## 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
|