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

1994/0619/carrera/trap.c (diff list | history)

1994/0617/sys/src/9/carrera/trap.c:283,2881994/0619/sys/src/9/carrera/trap.c:283,296 (short | long | prev | next)
1993/0903    
	} 
} 
 
1994/0619    
struct 
{ 
	ulong cause; 
	ulong devint3; 
	ulong devint4; 
	ulong state; 
}sisr; 
 
1993/0903    
void 
intr(Ureg *ur) 
{ 
1994/0617/sys/src/9/carrera/trap.c:292,3001994/0619/sys/src/9/carrera/trap.c:300,310
1993/0903    
 
	m->intr++; 
	cause &= INTR7|INTR6|INTR5|INTR4|INTR3|INTR2|INTR1|INTR0; 
1994/0617    
                 
1994/0619    
sisr.cause = cause; 
1993/0904    
	if(cause & INTR3) { 
1993/1219    
		devint = IO(uchar, Intcause); 
1994/0619    
sisr.devint3 = devint; 
sisr.state = 0; 
1993/1219    
		switch(devint) { 
		default: 
			panic("unknown devint=#%lux", devint); 
1994/0617/sys/src/9/carrera/trap.c:318,3261994/0619/sys/src/9/carrera/trap.c:328,338
1993/1219    
			break; 
1993/0904    
		} 
		cause &= ~INTR3; 
1994/0619    
sisr.state = 1; 
1993/0904    
	} 
1994/0326    
 
1993/0908    
	if(cause & INTR2) { 
1994/0619    
sisr.state = 2; 
1994/0220    
		isr = IO(ulong, R4030Isr); 
		if(isr) { 
			iprint("R4030 Interrupt\n"); 
1994/0617/sys/src/9/carrera/trap.c:330,3411994/0619/sys/src/9/carrera/trap.c:342,355
1994/0220    
			iprint(" MFA #%lux\n", IO(ulong, R4030Mfa)); 
		} 
1993/0908    
		cause &= ~INTR2; 
1994/0619    
sisr.state = 3; 
1993/0908    
	} 
1994/0326    
 
1993/0904    
	if(cause & INTR4) { 
1993/0905    
		devint = IO(uchar, I386ack); 
1994/0225    
		vec = devint&~0x7; 
1994/0617    
                 
1994/0619    
sisr.devint4 = devint; 
sisr.state = 4; 
1994/0225    
		/* reenable the 8259 interrupt */ 
		if(vec == Int0vec || vec == Int1vec){ 
			EISAOUTB(Int0ctl, EOI); 
1994/0617/sys/src/9/carrera/trap.c:348,3601994/0619/sys/src/9/carrera/trap.c:362,379
1994/0225    
			iprint("i386ACK #%lux\n", devint); 
			break; 
1994/0307    
		case 7: 
1994/0619    
sisr.state = 5; 
1994/0225    
			audiosbintr(); 
1994/0619    
sisr.state = 6; 
1994/0307    
			break; 
		case 13: 
1994/0619    
sisr.state = 7; 
1994/0307    
			audiodmaintr(); 
1994/0619    
sisr.state = 8; 
1994/0225    
			break; 
		} 
1993/0904    
		cause &= ~INTR4; 
1994/0619    
sisr.state = 9; 
1993/0904    
	} 
1994/0326    
 
1993/0904    
	if(cause & INTR7) { 
1994/0617/sys/src/9/carrera/trap.c:490,4991994/0619/sys/src/9/carrera/trap.c:509,519
1993/0903    
		pexit(n->msg, n->flag!=NDebug); 
	} 
	up->svstatus = ur->status; 
1994/0617    
	sp = ur->usp - sizeof(Ureg); 
1994/0619    
	sp = ur->usp & ~(BY2V-1); 
	sp -= sizeof(Ureg); 
1993/0903    
 
1994/0617    
	if(sp&0x3 || !okaddr((ulong)up->notify, BY2WD, 0) 
	|| !okaddr(sp-ERRLEN-3*BY2WD, sizeof(Ureg)+ERRLEN-3*BY2WD, 1)) { 
1994/0619    
	if(!okaddr((ulong)up->notify, BY2WD, 0) || 
	   !okaddr(sp-ERRLEN-3*BY2WD, sizeof(Ureg)+ERRLEN-3*BY2WD, 1)) { 
1993/0903    
		pprint("suicide: bad address or sp in notify\n"); 
		qunlock(&up->debug); 
		pexit("Suicide", 0); 
1994/0617/sys/src/9/carrera/trap.c:506,5141994/0619/sys/src/9/carrera/trap.c:526,538
1993/0903    
	sp -= 3*BY2WD; 
	*(ulong*)(sp+2*BY2WD) = sp+3*BY2WD;	/* arg 2 is string */ 
	up->svr1 = ur->r1;			/* save away r1 */ 
1994/0614    
	ur->r1 = (ulong)up->ureg;		/* arg 1 is ureg* */ 
1994/0617    
	*(ulong*)(sp+1*BY2WD) = (ulong)up->ureg;	/* arg 1 0(FP) is ureg* */ 
	*(ulong*)(sp+0*BY2WD) = 0;		/* arg 0 is pc */ 
1994/0619    
	up->svhr1 = ur->hr1;			/* save away r1 */ 
	ur->r1 = (long)up->ureg;		/* arg 1 is ureg* */ 
	ur->hr1 = 0; 
	if(ur->r1 < 0) 
		ur->hr1 = ~0; 
	((ulong*)sp)[1] = (ulong)up->ureg;	/* arg 1 0(FP) is ureg* */ 
	((ulong*)sp)[0] = 0;			/* arg 0 is pc */ 
1993/0903    
	ur->usp = sp; 
	ur->pc = (ulong)up->notify; 
	up->notified = 1; 
1994/0617/sys/src/9/carrera/trap.c:546,5511994/0619/sys/src/9/carrera/trap.c:570,576
1994/0513    
 
1993/0903    
	memmove(*urp, up->ureg, sizeof(Ureg)); 
	(*urp)->r1 = up->svr1; 
1994/0619    
	(*urp)->hr1 = up->svhr1; 
1993/0903    
	switch(arg0) { 
	case NCONT: 
		if(!okaddr(nur->pc, 1, 0) || !okaddr(nur->usp, BY2WD, 0)){ 
1994/0617/sys/src/9/carrera/trap.c:638,6431994/0619/sys/src/9/carrera/trap.c:663,671
1993/0903    
	splhi(); 
	if(up->scallnr!=RFORK && (up->procctl || up->nnote)){ 
		ur->r1 = ret;			/* load up for noted() */ 
1994/0619    
		ur->hr1 = 0; 
		if(ur->r1 < 0) 
			ur->hr1 = ~0; 
1993/0903    
		if(notify(ur)) 
			return ur->r1; 
	} 


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