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

1991/0703/pc/trap.c (diff list | history)

pc/trap.c on 1991/0613
1991/0613    
#include	"u.h" 
#include	"lib.h" 
#include	"mem.h" 
#include	"dat.h" 
#include	"fns.h" 
#include	"io.h" 
1991/0703    
#include	"ureg.h" 
1991/0613    
 
/* 
1991/0614    
 *  trap/interrupt gates 
1991/0613    
 */ 
1991/0703    
Segdesc ilt[256]; 
void	(*ivec[256])(void*); 
 
void 
sethvec(int v, void (*r)(void), int type) 
1991/0613    
{ 
1991/0703    
	ilt[v].d0 = ((ulong)r)&0xFFFF|(KESEL<<16); 
	ilt[v].d1 = ((ulong)r)&0xFFFF0000|SEGP|SEGPL(3)|type; 
} 
1991/0614    
 
1991/0703    
void 
setvec(int v, void (*r)(void*), int type) 
{ 
	ilt[v].d1 &= ~SEGTYPE; 
	ilt[v].d1 |= type; 
	ivec[v] = r; 
} 
 
1991/0614    
/* 
1991/0703    
 *  set up the interrupt/trap gates 
1991/0614    
 */ 
1991/0703    
void 
trapinit(void) 
{ 
	int i; 
1991/0614    
 
1991/0703    
	/* 
	 *  set the standard traps 
	 */ 
	sethvec(0, intr0, SEGTG); 
	sethvec(1, intr1, SEGTG); 
	sethvec(2, intr2, SEGTG); 
	sethvec(3, intr3, SEGTG); 
	sethvec(4, intr4, SEGTG); 
	sethvec(5, intr5, SEGTG); 
	sethvec(6, intr6, SEGTG); 
	sethvec(7, intr7, SEGTG); 
	sethvec(8, intr8, SEGTG); 
	sethvec(9, intr9, SEGTG); 
	sethvec(10, intr10, SEGTG); 
	sethvec(11, intr11, SEGTG); 
	sethvec(12, intr12, SEGTG); 
	sethvec(13, intr13, SEGTG); 
	sethvec(14, intr14, SEGTG); 
	sethvec(15, intr15, SEGTG); 
	sethvec(16, intr16, SEGTG); 
 
	/* 
	 *  set all others to unknown 
	 */ 
	for(i = 17; i < 256; i++) 
		sethvec(i, intrbad, SEGIG); 
 
	/* 
	 *  tell the hardware where the table is (and how long) 
	 */ 
	lidt(ilt, sizeof(ilt)); 
} 
 
 
1991/0614    
/* 
1991/0703    
 *  All traps 
1991/0614    
 */ 
1991/0703    
trap(Ureg *ur) 
1991/0614    
{ 
1991/0703    
	print("trap %lux\n", ur->trap); 
	print(" edi %lux\n", ur->edi); 
	print(" esi %lux\n", ur->esi); 
	print(" ebp %lux\n", ur->ebp); 
	print(" esp %lux\n", ur->esp); 
	print(" ebx %lux\n", ur->ebx); 
	print(" edx %lux\n", ur->edx); 
	print(" ecx %lux\n", ur->ecx); 
	print(" eax %lux\n", ur->eax); 
	print(" ds %lux\n", ur->ds); 
	print(" trap %lux\n", ur->trap); 
	print(" ecode %lux\n", ur->ecode); 
	print(" eip %lux\n", ur->eip); 
	print(" cs %lux\n", ur->cs); 
	print(" eflags %lux\n", ur->eflags); 
	print(" oesp %lux\n", ur->oesp); 
	print(" ss %lux\n", ur->ss); 
	delay(500); 
	if(ur->trap>=256 || ivec[ur->trap] == 0) 
		panic("bad trap type %d\n", ur->trap); 
 
	(*ivec[ur->trap])(ur); 
1991/0614    
} 


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