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

2000/0125/alphapc/trap.c (diff list | history)

2000/0108/sys/src/9/alphapc/trap.c:35,892000/0125/sys/src/9/alphapc/trap.c:35,40 (short | long | prev | next)
1999/0415    
	arch->intrenable(irq, f, a, tbdf); 
} 
 
void 
trap(Ureg *ur) 
{ 
	char buf[ERRLEN]; 
	int user, x; 
                 
1999/0701    
	m->intrts = fastticks(nil); 
1999/0415    
	user = ur->status&UMODE; 
                 
	if(user){ 
		up = m->proc; 
		up->dbgreg = ur; 
	} 
	switch ((int)ur->type) { 
	case 1:	/* arith */ 
		fptrap(ur); 
		break; 
	case 2:	/* bad instr or FEN */ 
		illegal(ur); 
		break; 
	case 3:	/* intr */ 
		intr(ur); 
		break; 
	case 4:	/* memory fault */ 
		if(up == 0) 
			kernfault(ur, (ulong)ur->a1); 
                 
		x = up->insyscall; 
		up->insyscall = 1; 
		spllo(); 
		faultalpha(ur); 
		up->insyscall = x; 
		break; 
	case 6:	/* alignment fault */ 
		ur->pc -= 4; 
		sprint(buf, "trap: unaligned addr 0x%lux", (ulong)ur->a0); 
		fataltrap(ur, buf); 
		break; 
	default:	/* cannot happen */ 
		panic("bad trap type %d", (int)ur->type); 
		break; 
	} 
                 
1999/0515    
	if(user && (up->procctl || up->nnote)){ 
		splhi(); 
		notify(ur); 
1999/0415    
	} 
} 
                 
typedef struct Mcheck Mcheck; 
struct Mcheck 
{ 
2000/0108/sys/src/9/alphapc/trap.c:149,1812000/0125/sys/src/9/alphapc/trap.c:100,189
1999/0415    
} 
 
void 
intr(Ureg *ur) 
2000/0125    
trap(Ureg *ur) 
1999/0415    
{ 
	m->intr++; 
	switch ((int)ur->a0) { 
	case 0:	/* interprocessor */ 
		panic("interprocessor intr"); 
2000/0125    
	char buf[ERRLEN]; 
	int user, x; 
 
	m->intrts = fastticks(nil); 
	user = ur->status&UMODE; 
 
	if(user){ 
		up = m->proc; 
		up->dbgreg = ur; 
	} 
	switch ((int)ur->type) { 
	case 1:	/* arith */ 
		fptrap(ur); 
1999/0415    
		break; 
	case 1:	/* clock */ 
		clock(ur); 
2000/0125    
	case 2:	/* bad instr or FEN */ 
		illegal(ur); 
1999/0415    
		break; 
	case 2:	/* machine check */ 
		mcheck((void*)(KZERO|(ulong)ur->a2)); 
2000/0125    
 
	case 3:	/* intr */ 
		m->intr++; 
		switch ((int)ur->a0) { 
		case 0:	/* interprocessor */ 
			panic("interprocessor intr"); 
			break; 
		case 1:	/* clock */ 
			clock(ur); 
			break; 
		case 2:	/* machine check */ 
			mcheck((void*)(KZERO|(ulong)ur->a2)); 
			break; 
		case 3:	/* device */ 
			arch->intr(ur); 
			/*  
			 *  preemptive scheduling.  to limit stack depth, 
			 *  make sure process has a chance to return from 
			 *  the current interrupt before being preempted a 
			 *  second time. 
			 */ 
			if(up && up->state == Running) 
			if(anyhigher()) 
			if(up->preempted == 0) 
			if(!active.exiting){ 
				up->preempted = 1; 
				sched(); 
				splhi(); 
				up->preempted = 0; 
				return; 
			} 
			break; 
		case 4:	/* perf counter */ 
			panic("perf count"); 
			break; 
		default: 
			panic("bad intr"); 
			break; 
		} 
1999/0415    
		break; 
	case 3:	/* device */ 
		arch->intr(ur); 
2000/0125    
 
	case 4:	/* memory fault */ 
		if(up == 0) 
			kernfault(ur, (ulong)ur->a1); 
 
		x = up->insyscall; 
		up->insyscall = 1; 
		spllo(); 
		faultalpha(ur); 
		up->insyscall = x; 
1999/0415    
		break; 
	case 4:	/* perf counter */ 
		panic("perf count"); 
2000/0125    
	case 6:	/* alignment fault */ 
		ur->pc -= 4; 
		sprint(buf, "trap: unaligned addr 0x%lux", (ulong)ur->a0); 
		fataltrap(ur, buf); 
1999/0415    
		break; 
	default: 
		panic("bad intr"); 
2000/0125    
	default:	/* cannot happen */ 
		panic("bad trap type %d", (int)ur->type); 
1999/0415    
		break; 
	} 
 
	/* preemptive scheduling */ 
	if(up && up->state == Running && anyhigher()) 
		sched(); 
2000/0125    
	if(user && (up->procctl || up->nnote)){ 
		splhi(); 
		notify(ur); 
	} 
1999/0415    
} 
 
void 
2000/0108/sys/src/9/alphapc/trap.c:250,2552000/0125/sys/src/9/alphapc/trap.c:258,265
1999/0415    
		el = sl + KSTACK; 
	} 
	if(l > el || l < sl){ 
2000/0125    
		iprint("dumpstack: l %lux sl %lux el %lux m %lux up %lux\n", 
			l, sl, el, m, up); 
1999/0415    
		el = (ulong)m+BY2PG; 
		sl = el-KSTACK; 
	} 


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