plan 9 kernel history: overview | file list | diff list

1990/1212/gnot/fault68020.c (diff list | history)

1990/1212/sys/src/9/gnot/fault68020.c:45,591990/1214/sys/src/9/gnot/fault68020.c:45,52 (short | long)
1990/1212    
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; 
1990/1214    
	ulong addr, badvaddr; 
	int user, read, insyscall; 
1990/1212    
 
	if(u == 0){ 
		dumpregs(ur); 
1990/1214/sys/src/9/gnot/fault68020.c:73,861991/0705/sys/src/9/gnot/fault68020.c:73,89 (short | long)
1990/1212    
			panic("prefetch pagefault"); 
	}else 
		panic("prefetch format"); 
1991/0705    
 
1990/1212    
	addr &= VAMASK; 
	badvaddr = addr; 
	addr &= ~(BY2PG-1); 
	user = !(ur->sr&SUPER); 
1991/0705    
 
1990/1212    
	if(f->ssw & DF) 
		read = (f->ssw&READ) && !(f->ssw&RM); 
	else 
		read = f->ssw&(FB|FC); 
1991/0705    
 
1990/1212    
/* print("fault pc=%lux addr=%lux read %d\n", ur->pc, badvaddr, read); /**/ 
 
	if(fault(addr, read) < 0){ 
1991/0705/sys/src/9/gnot/fault68020.c:89,951991/0710/sys/src/9/gnot/fault68020.c:89,95 (short | long)
1990/1212    
	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); 
1991/0710    
			pprint("status=0x%lux pc=0x%lux sp=0x%lux\n", ur->sr, ur->pc, ur->usp); 
1990/1212    
			pexit("Suicide", 0); 
		} 
		u->p->state = MMUing; 
1991/0710/sys/src/9/gnot/fault68020.c:47,521991/0719/sys/src/9/gnot/fault68020.c:47,53 (short | long)
1990/1212    
{ 
1990/1214    
	ulong addr, badvaddr; 
	int user, read, insyscall; 
1991/0719    
	char buf[ERRLEN]; 
1990/1212    
 
	if(u == 0){ 
		dumpregs(ur); 
1991/0710/sys/src/9/gnot/fault68020.c:88,961991/0719/sys/src/9/gnot/fault68020.c:89,99
1990/1212    
 
	if(fault(addr, read) < 0){ 
		if(user){ 
			pprint("user %s error addr=0x%lux\n", read? "read" : "write", badvaddr); 
1991/0710    
			pprint("status=0x%lux pc=0x%lux sp=0x%lux\n", ur->sr, ur->pc, ur->usp); 
1990/1212    
			pexit("Suicide", 0); 
1991/0719    
			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; 
1990/1212    
		} 
		u->p->state = MMUing; 
		dumpregs(ur); 
1991/0719/sys/src/9/gnot/fault68020.c:95,1011991/0926/sys/src/9/gnot/fault68020.c:95,100 (short | long)
1991/0719    
			notify(ur); 
			return; 
1990/1212    
		} 
		u->p->state = MMUing; 
		dumpregs(ur); 
		panic("fault: 0x%lux", badvaddr); 
		exit(); 
1991/0926/sys/src/9/gnot/fault68020.c:92,971991/1108/sys/src/9/gnot/fault68020.c:92,99 (short | long)
1991/0719    
			sprint(buf, "sys: fault %s pc=0x%lux addr=0x%lux", 
				read? "read" : "write", ur->pc, badvaddr); 
			postnote(u->p, 1, buf, NDebug); 
1991/1108    
			if(u->p->procctl) 
				procctl(u->p); 
1991/0719    
			notify(ur); 
			return; 
1990/1212    
		} 
1991/1108/sys/src/9/gnot/fault68020.c:55,601991/1112/sys/src/9/gnot/fault68020.c:55,61 (short | long)
1990/1212    
	} 
	insyscall = u->p->insyscall; 
	u->p->insyscall = 1; 
1991/1112    
	u->dbgreg = ur; 
1990/1212    
	addr = 0;	/* set */ 
	if(f->ssw & DF) 
		addr = f->addr; 
1991/1108/sys/src/9/gnot/fault68020.c:92,991991/1112/sys/src/9/gnot/fault68020.c:93,98
1991/0719    
			sprint(buf, "sys: fault %s pc=0x%lux addr=0x%lux", 
				read? "read" : "write", ur->pc, badvaddr); 
			postnote(u->p, 1, buf, NDebug); 
1991/1108    
			if(u->p->procctl) 
				procctl(u->p); 
1991/0719    
			notify(ur); 
			return; 
1990/1212    
		} 
1991/1112/sys/src/9/gnot/fault68020.c:90,971991/1218/sys/src/9/gnot/fault68020.c:90,97 (short | long)
1990/1212    
 
	if(fault(addr, read) < 0){ 
		if(user){ 
1991/0719    
			sprint(buf, "sys: fault %s pc=0x%lux addr=0x%lux", 
				read? "read" : "write", ur->pc, badvaddr); 
1991/1218    
			sprint(buf, "sys: trap: fault %s addr=0x%lux", 
				read? "read" : "write", badvaddr); 
1991/0719    
			postnote(u->p, 1, buf, NDebug); 
			notify(ur); 
			return; 
1991/1218/sys/src/9/gnot/fault68020.c:4,101992/0111/sys/src/9/gnot/fault68020.c:4,10 (short | long)
Move error.h to ../port. Change errors to actual strings.
rsc Fri Mar 4 12:44:25 2005
1990/1212    
#include	"dat.h" 
#include	"fns.h" 
#include	"ureg.h" 
#include	"errno.h" 
1992/0111    
#include	"../port/error.h" 
1990/1212    
 
#define	FORMAT(ur)	((((ur)->vo)>>12)&0xF) 
#define	OFFSET(ur)	(((ur)->vo)&0xFFF) 
1992/0111/sys/src/9/gnot/fault68020.c:55,611992/0201/sys/src/9/gnot/fault68020.c:55,60 (short | long)
1990/1212    
	} 
	insyscall = u->p->insyscall; 
	u->p->insyscall = 1; 
1991/1112    
	u->dbgreg = ur; 
1990/1212    
	addr = 0;	/* set */ 
	if(f->ssw & DF) 
		addr = f->addr; 
1992/0111/sys/src/9/gnot/fault68020.c:80,851992/0201/sys/src/9/gnot/fault68020.c:79,86
1990/1212    
	badvaddr = addr; 
	addr &= ~(BY2PG-1); 
	user = !(ur->sr&SUPER); 
1992/0201    
	if(user) 
		u->dbgreg = ur; 
1991/0705    
 
1990/1212    
	if(f->ssw & DF) 
		read = (f->ssw&READ) && !(f->ssw&RM); 
1992/0201/sys/src/9/gnot/fault68020.c:1,51992/0321/sys/src/9/gnot/fault68020.c:1,5 (short | long)
Move lib.h to ../port.
rsc Fri Mar 4 12:44:25 2005
1990/1212    
#include	"u.h" 
#include	"lib.h" 
1992/0321    
#include	"../port/lib.h" 
1990/1212    
#include	"mem.h" 
#include	"dat.h" 
#include	"fns.h" 
1992/0321/sys/src/9/gnot/fault68020.c:99,1051992/0812/sys/src/9/gnot/fault68020.c:99,104 (short | long)
1990/1212    
		} 
		dumpregs(ur); 
		panic("fault: 0x%lux", badvaddr); 
		exit(); 
	} 
	u->p->insyscall = insyscall; 
} 
1992/0812/sys/src/9/gnot/fault68020.c:1,1041993/0501/sys/src/9/gnot/fault68020.c:0 (short | long)
Deleted.
rsc Mon Mar 7 10:21:44 2005
1990/1212    
#include	"u.h" 
1992/0321    
#include	"../port/lib.h" 
1990/1212    
#include	"mem.h" 
#include	"dat.h" 
#include	"fns.h" 
#include	"ureg.h" 
1992/0111    
#include	"../port/error.h" 
1990/1212    
                 
#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) 
{ 
1990/1214    
	ulong addr, badvaddr; 
	int user, read, insyscall; 
1991/0719    
	char buf[ERRLEN]; 
1990/1212    
                 
	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"); 
1991/0705    
                 
1990/1212    
	addr &= VAMASK; 
	badvaddr = addr; 
	addr &= ~(BY2PG-1); 
	user = !(ur->sr&SUPER); 
1992/0201    
	if(user) 
		u->dbgreg = ur; 
1991/0705    
                 
1990/1212    
	if(f->ssw & DF) 
		read = (f->ssw&READ) && !(f->ssw&RM); 
	else 
		read = f->ssw&(FB|FC); 
1991/0705    
                 
1990/1212    
/* print("fault pc=%lux addr=%lux read %d\n", ur->pc, badvaddr, read); /**/ 
                 
	if(fault(addr, read) < 0){ 
		if(user){ 
1991/1218    
			sprint(buf, "sys: trap: fault %s addr=0x%lux", 
				read? "read" : "write", badvaddr); 
1991/0719    
			postnote(u->p, 1, buf, NDebug); 
			notify(ur); 
			return; 
1990/1212    
		} 
		dumpregs(ur); 
		panic("fault: 0x%lux", badvaddr); 
	} 
	u->p->insyscall = insyscall; 
} 


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)