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,121990/1231/sys/src/9/ss/faultsparc.c:6,11 (short | long | prev | next)
1990/1223    
#include	"ureg.h" 
#include	"errno.h" 
 
                 
void 
1990/1226    
faultsparc(Ureg *ur) 
1990/1223    
{ 
1990/1227/sys/src/9/ss/faultsparc.c:16,431990/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    
	if(tbr == 9)			/* data access exception */ 
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    
	else if(tbr != 1){		/* should be instruction access exception */ 
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    
print("fault: %s pc=0x%lux addr %lux\n", excname(tbr), ur->pc, addr); 
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    
	if(getw2(SER) & 0x8000) 
		read = 0; 
	else 
		read = 1; 
1990/1223    
	insyscall = u->p->insyscall; 
	u->p->insyscall = 1; 
1990/1226    
/*	addr &= VAMASK; /**/ 
1990/1223    
	badvaddr = addr; 
	addr &= ~(BY2PG-1); 
1990/1226    
	user = !(ur->psr&PSRSUPER); 
1990/1231    
	user = !(ur->psr&PSRPSUPER); 
1990/1223    
 
	if(fault(addr, read) < 0){ 
		if(user){ 


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