## diffname gnot/fault68020.c 1990/1212
## diff -e /dev/null /n/bootesdump/1990/1212/sys/src/9/68020/fault68020.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, mmuvirt, mmuphys, n, badvaddr;
Seg *s;
PTE *opte, *pte, *npte;
Orig *o;
char *l;
Page *pg;
KMap *k, *k1;
int zeroed = 0, head = 1;
int i, 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 gnot/fault68020.c 1990/1214
## diff -e /n/bootesdump/1990/1212/sys/src/9/68020/fault68020.c /n/bootesdump/1990/1214/sys/src/9/68020/fault68020.c
48,56c
ulong addr, badvaddr;
int user, read, insyscall;
.
## diffname gnot/fault68020.c 1991/0705
## diff -e /n/bootesdump/1991/0201/sys/src/9/68020/fault68020.c /n/bootesdump/1991/0705/sys/src/9/gnot/fault68020.c
83a
.
79a
.
75a
.
## diffname gnot/fault68020.c 1991/0710
## diff -e /n/bootesdump/1991/0705/sys/src/9/gnot/fault68020.c /n/bootesdump/1991/0710/sys/src/9/gnot/fault68020.c
92c
pprint("status=0x%lux pc=0x%lux sp=0x%lux\n", ur->sr, ur->pc, ur->usp);
.
## diffname gnot/fault68020.c 1991/0719
## diff -e /n/bootesdump/1991/0710/sys/src/9/gnot/fault68020.c /n/bootesdump/1991/0719/sys/src/9/gnot/fault68020.c
91,93c
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;
.
49a
char buf[ERRLEN];
.
## diffname gnot/fault68020.c 1991/0926
## diff -e /n/bootesdump/1991/0719/sys/src/9/gnot/fault68020.c /n/bootesdump/1991/0926/sys/src/9/gnot/fault68020.c
98d
## diffname gnot/fault68020.c 1991/1108
## diff -e /n/bootesdump/1991/0926/sys/src/9/gnot/fault68020.c /n/bootesdump/1991/1108/sys/src/9/gnot/fault68020.c
94a
if(u->p->procctl)
procctl(u->p);
.
## diffname gnot/fault68020.c 1991/1112
## diff -e /n/bootesdump/1991/1108/sys/src/9/gnot/fault68020.c /n/bootesdump/1991/1112/sys/src/9/gnot/fault68020.c
95,96d
57a
u->dbgreg = ur;
.
## diffname gnot/fault68020.c 1991/1218
## diff -e /n/bootesdump/1991/1112/sys/src/9/gnot/fault68020.c /n/bootesdump/1991/1218/sys/src/9/gnot/fault68020.c
93,94c
sprint(buf, "sys: trap: fault %s addr=0x%lux",
read? "read" : "write", badvaddr);
.
## diffname gnot/fault68020.c 1992/0111
## diff -e /n/bootesdump/1991/1218/sys/src/9/gnot/fault68020.c /n/bootesdump/1992/0111/sys/src/9/gnot/fault68020.c
7c
#include "../port/error.h"
.
## diffname gnot/fault68020.c 1992/0201
## diff -e /n/bootesdump/1992/0111/sys/src/9/gnot/fault68020.c /n/bootesdump/1992/0201/sys/src/9/gnot/fault68020.c
82a
if(user)
u->dbgreg = ur;
.
58d
## diffname gnot/fault68020.c 1992/0321
## diff -e /n/bootesdump/1992/0201/sys/src/9/gnot/fault68020.c /n/bootesdump/1992/0321/sys/src/9/gnot/fault68020.c
2c
#include "../port/lib.h"
.
## diffname gnot/fault68020.c 1992/0812
## diff -e /n/bootesdump/1992/0321/sys/src/9/gnot/fault68020.c /n/bootesdump/1992/0812/sys/src/9/gnot/fault68020.c
102d
## diffname gnot/fault68020.c 1993/0501 # deleted
## diff -e /n/bootesdump/1992/0812/sys/src/9/gnot/fault68020.c /n/fornaxdump/1993/0501/sys/src/brazil/gnot/fault68020.c
1,104d
|