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

1991/01151/ss/trap.c (diff list | history)

1991/0115/sys/src/9/ss/trap.c:53,991991/01151/sys/src/9/ss/trap.c:53,147 (short | long | prev | next)
1990/1223    
void 
trap(Ureg *ur) 
{ 
	int user; 
1991/01151    
	int user, x; 
1990/1223    
	char buf[64]; 
1990/1227    
	ulong tbr; 
1990/1223    
 
1990/1227    
	tbr = (ur->tbr&0xFFF)>>4; 
1991/0110    
	if(tbr == 16+15){			/* interrupt 14: counter 1 */ 
		faultasync(ur); 
		return; 
	} 
1990/1231    
	if(tbr == 16+14){			/* interrupt 14: counter 1 */ 
1990/1227    
		clock(ur); 
1990/1231    
		return; 
	} 
	if(tbr == 16+12){			/* interrupt 12: keyboard and mouse */ 
		duartintr(); 
		return; 
	} 
	if(tbr == 16+5){			/* interrupt 5: lance */ 
		lanceintr(); 
1990/1227    
		return; 
	} 
1991/0115    
	if(tbr == 8)				/* floating point exception */ 
		clearfpintr(); 
1990/1227    
                 
1990/1226    
	user = !(ur->psr&PSRPSUPER); 
                 
/*	if(u) 
1991/01151    
	if(u) 
1990/1223    
		u->p->pc = ur->pc;		/* BUG */ 
	if(user){ 
1990/1227    
		sprint(buf, "sys: trap: pc=0x%lux %s", ur->pc, excname(tbr)); 
1991/0115    
		if(tbr == 8) 
			sprint(buf+strlen(buf), " FSR %lux", getfsr()); 
1990/1223    
		postnote(u->p, 1, buf, NDebug); 
1991/01151    
	user = !(ur->psr&PSRPSUPER); 
	tbr = (ur->tbr&0xFFF)>>4; 
	if(tbr > 16){			/* interrupt */ 
		if(u && u->p->state==Running){ 
			if(u->p->fpstate == FPactive) { 
				savefpregs(&u->fpsave); 
				u->p->fpstate = FPinactive; 
				ur->psr &= ~PSREF; 
			} 
		} 
		switch(tbr-16){ 
		case 15:			/* asynch mem err */ 
			faultasync(ur); 
			break; 
		case 14:			/* counter 1 */ 
			clock(ur); 
			break; 
		case 12:			/* keyboard and mouse */ 
			duartintr(); 
			break; 
		case 5:				/* lance */ 
			lanceintr(); 
			break; 
		default: 
			goto Error; 
		} 
1990/1223    
	}else{ 
1990/1227    
		print("kernel trap: %s pc=0x%lux\n", excname(tbr), ur->pc); 
1990/1223    
		dumpregs(ur); 
1990/1226    
for(;;); 
1990/1223    
		exit(); 
1991/01151    
		switch(tbr){ 
		case 1:				/* instr. access */ 
		case 9:				/* data access */ 
			if(u && u->p->fpstate==FPactive) { 
				savefpregs(&u->fpsave); 
				u->p->fpstate = FPinactive; 
				ur->psr &= ~PSREF; 
			} 
			if(u){ 
				x = u->p->insyscall; 
				u->p->insyscall = 1; 
				faultsparc(ur); 
				u->p->insyscall = x; 
			}else 
				faultsparc(ur); 
			goto Return; 
		case 4:				/* floating point disabled */ 
			if(u && u->p){ 
				if(u->p->fpstate == FPinit) 
					restfpregs(&initfp); 
				else if(u->p->fpstate == FPinactive) 
					restfpregs(&u->fpsave); 
				else 
					break; 
				u->p->fpstate = FPactive; 
				ur->psr |= PSREF; 
				return; 
			} 
			break; 
		case 8:				/* floating point exception */ 
			clearfpintr(); 
			break; 
		default: 
			break; 
		} 
		if(user){ 
			spllo(); 
			sprint(buf, "sys: trap: pc=0x%lux %s", ur->pc, excname(tbr)); 
			if(tbr == 8) 
				sprint(buf+strlen(buf), " FSR %lux", u->fpsave.fsr); 
			postnote(u->p, 1, buf, NDebug); 
		}else{ 
    Error: 
			print("kernel trap: %s pc=0x%lux\n", excname(tbr), ur->pc); 
			dumpregs(ur); 
			for(;;); 
		} 
		if(user && u->nnote) 
			notify(ur); 
1990/1223    
	} 
1991/0112    
	if(user && u->nnote) 
1990/1223    
		notify(ur); 
1991/01151    
    Return: 
	if(user && u && u->p->fpstate == FPinactive) { 
		restfpregs(&u->fpsave); 
		u->p->fpstate = FPactive; 
		ur->psr |= PSREF; 
	} 
1990/1223    
} 
 
void 
1991/0115/sys/src/9/ss/trap.c:272,2901991/01151/sys/src/9/ss/trap.c:320,335
1990/1223    
	u->p->pc = ur->pc; 
1990/1226    
	if(ur->psr & PSRPSUPER) 
1990/1223    
		panic("recursive system call"); 
1990/1226    
#ifdef asdf 
1991/01151    
 
1990/1223    
	/* 
	 * since the system call interface does not 
	 * guarantee anything about registers, but the fpcr is more than 
	 * just a register...  BUG 
1991/01151    
	 * guarantee anything about registers, 
1990/1223    
	 */ 
	fpsave(&u->fpsave); 
	if(u->p->fpstate==FPactive || u->fpsave.type){ 
		fprestore(&initfp); 
1991/01151    
	if(u->p->fpstate == FPactive) { 
1990/1223    
		u->p->fpstate = FPinit; 
		m->fpstate = FPinit; 
1991/01151    
		ur->psr &= ~PSREF; 
1990/1223    
	} 
1990/1226    
#endif 
1991/01151    
 
1990/1223    
	spllo(); 
1990/1226    
	r7 = ur->r7; 
1990/1223    
	sp = ur->usp; 


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