evec.c,v

来自「TCP-IP红宝书源代码」· C,V 代码 · 共 455 行

C,V
455
字号
head	1.7;
access;
symbols;
locks
	dls:1.7; strict;
comment	@ * @;


1.7
date	97.09.21.19.29.30;	author dls;	state Dist;
branches;
next	1.6;

1.6
date	94.05.07.19.26.36;	author dls;	state Works;
branches;
next	1.5;

1.5
date	94.05.06.03.12.23;	author dls;	state Works;
branches;
next	1.4;

1.4
date	94.05.01.16.07.01;	author dls;	state Works;
branches;
next	1.3;

1.3
date	94.04.30.04.04.37;	author dls;	state Works;
branches;
next	1.2;

1.2
date	94.04.27.19.46.08;	author dls;	state Works;
branches;
next	1.1;

1.1
date	94.04.26.15.15.20;	author dls;	state Works;
branches;
next	;


desc
@@


1.7
log
@pre-3e code
@
text
@/* evec.c -- initevec, doevec */

#include <conf.h>
#include <i386.h>    
#include <kernel.h>
#include <proc.h>
#include <sem.h>
#include <mem.h>
#include <tty.h>
#include <q.h>
#include <io.h>

/*
 * The girmask is used as a mask for interrupts that don't have a
 * handler set. disable() & restore() are OR-ed with it to get the
 * mask actually used.
 */
short	girmask;

extern struct idt idt[NID];
extern struct segtr idtr;

extern short	defevec[];
extern int	userret();

initevec()
{
	int		i;
	STATWORD	ps;

	for (i=0; i<NID; ++i)
		set_evec(i, (int)defevec[i]);
	/*
	 * "girmask" masks all (bus) interrupts with the default handler.
	 * initially, all, then cleared as handlers are set via set_evec()
	 */
	girmask = 0xfffb;	/* leave bit 2 enabled for IC cascade */

	lidt();
	init8259();
}

/*------------------------------------------------------------------------
 * set_evec - set exception vector to point to an exception handler
 *------------------------------------------------------------------------
 */
int
set_evec(xnum, handler)
unsigned int	xnum;
unsigned long	handler;	/* int value of function pointer */
{
	struct	idt	*pidt;

	pidt = &idt[xnum];
	pidt->igd_loffset = handler;
	pidt->igd_segsel = 0x8;		/* kernel code segment */
	pidt->igd_mbz = 0;
	pidt->igd_type = IGDT_TRAPG;
	pidt->igd_dpl = 0;
	pidt->igd_present = 1;
	pidt->igd_hoffset = handler >> 16;
	if (xnum > 31 && xnum < 48) {
		/* enable the interrupt in the global IR mask */
		xnum -= 32;
		girmask &= ~(1<<xnum);
	}
}

char *inames[17] = {
	"divide by zero",
	"debug exception",
	"NMI interrupt",
	"breakpoint",
	"overflow",
	"bounds check failed",
	"invalid opcode",
	"coprocessor not available",
	"double fault",
	"coprocessor segment overrun",
	"invalid TSS",
	"segment not present",
	"stack fault",
	"general protection violation",
	"page fault",
	"coprocessor error",
};

static long *fp;

trap(inum)
int	inum;
{
	long		*sp, *fp;
	STATWORD 	PS;

	disable(PS);
	asm("movl	%ebp,_fp");
	sp = fp + 15;	/* eflags/CS/eip/ebp/regs/trap#/Xtrap/ebp */
	kprintf("Xinu trap!\n");
	if (inum < 16)
		kprintf("exception %d (%s) currpid %d (%s)\n", inum,
			inames[inum], currpid, proctab[currpid].pname);
	else
		kprintf("exception %d currpid\n", inum);
	kprintf("eflags %X ", *sp--);
	sp--;	/* skip OLD CS */
	kprintf("eip %X ", *sp);
	sp--;
	if (inum == 8 || (inum >= 10 && inum <= 14)) {
		kprintf("error code %08x (%u)\n", *sp, *sp);
		sp--;
	}
	sp--;	/* skip FP for Xint call */
	kprintf("register dump:\n");
	kprintf("eax %08X (%u)\n", *sp, *sp);
	sp--;
	kprintf("ecx %08X (%u)\n", *sp, *sp);
	sp--;
	kprintf("edx %08X (%u)\n", *sp, *sp);
	sp--;
	kprintf("ebx %08X (%u)\n", *sp, *sp);
	sp--;
	kprintf("esp %08X (%u)\n", *sp, *sp);
	sp--;
	kprintf("ebp %08X (%u)\n", *sp, *sp);
	fp = sp;
	sp--;
	kprintf("esi %08X (%u)\n", *sp, *sp);
	sp--;
	kprintf("edi %08X (%u)\n", *sp, *sp);
	sp--;
	control(CONSOLE, TTC_SYNC, 1);
	stacktrace(currpid, CONSOLE);
#ifdef notdef
	kprintf("stack backtrace:\n");
	for (i=0; i<8; ++i) {
		kprintf("%X)  ", esp);
		for (j=0; j<6; ++j)
			kprintf("%08X ", *esp++);
		kprintf("\n");
	}
#endif
	_stop("hit reset to continue\n");
}


doevec(arg)
     int arg;
{
    unsigned short sr;
    unsigned long pc;
    unsigned short vector;
    int evnum;
    char *parg;

    parg = (char *) &arg;

    sr = *((short *) parg);
    pc = *((long  *) (parg+2));
    vector = (*((short *) (parg+6))) & 0x0fff;    /* only low 12 bits */
    
    kprintf("\nXinu Trap!  ");
    kprintf("sr: 0x%x  ", sr);
    kprintf("exception: 0x%x  ", vector);
    kprintf("pc: 0x%lx\n",pc);
    kprintf("Trap definition: ");

    evnum = vector/4;
    if (evnum<32)
	switch(evnum) {
	    case  0: kprintf("RESET0, SHOULDN'T SEE THIS\n"); break;
	    case  1: kprintf("RESET1, SHOULDN'T SEE THIS\n"); break;
	    case  2: kprintf("Bus Error\n"); break;
	    case  3: kprintf("Address Error\n"); break;
	    case  4: kprintf("Illegal instruction\n"); break;
	    case  5: kprintf("Divide by 0\n"); break;
	    case  6: kprintf("CHK,CHK2 software trap\n"); break;
	    case  7: kprintf("cpTRAPcc, TRAPcc, TRAPV software trap\n"); break;
	    case  8: kprintf("Privilege Violation\n"); break;
	    case  9: kprintf("Trace\n"); break;
	    case 10: kprintf("Line 1010 Emulator, illegal instruction\n"); break;
	    case 11: kprintf("Line 1111 Emulator, illegal instruction\n"); break;

	    case 13: kprintf("Coprocessor protocol violation\n"); break;
	    case 14: kprintf("Format Error\n"); break;
	    case 15: kprintf("Uninitialized Interrupt\n"); break;

	    case 24: kprintf("Spurrious Interrupt\n"); break;
	    case 25: kprintf("Level 1 Auto Vector\n"); break;
	    case 26: kprintf("Level 2 Auto Vector\n"); break;
	    case 27: kprintf("Level 3 Auto Vector\n"); break;
	    case 28: kprintf("Level 4 Auto Vector\n"); break;
	    case 29: kprintf("Level 5 Auto Vector (clock)\n"); break;
	    case 30: kprintf("Level 6 Auto Vector (serial line)\n"); break;
	    case 31: kprintf("Level 7 Auto Vector (monitor clock)\n"); break;
	    default: kprintf("Unassigned (reserved)\n"); break;
	  }
    else if (evnum<48)
	kprintf("Trap #%d instruction trap\n",(evnum-32));
    else if (evnum<54)
	kprintf("FPCP trap\n");
    else if (evnum<59)
	kprintf("PMMU trap\n");
    else if (evnum<64)
	kprintf("Unassigned, reserved\n");
    else
	kprintf("User defined vector\n");

    kprintf("\n");
    _stop("bogus doevec call\n");
}
@


1.6
log
@*** empty log message ***
@
text
@d24 1
d28 2
a29 1
	int	i;
d32 1
a32 1
		set_idt(i, (int)defevec[i]);
d35 1
a35 1
	 * initially, all, then cleared as handlers are set via set_idt()
d37 1
a37 1
	girmask = 0xffff;
d43 6
a48 1
set_idt(xnum, handler)
a52 1
	STATWORD	PS;
d88 2
d93 1
d96 3
a99 1
	kprintf("exception %d\n", inum);
d101 33
a133 1
		kprintf("(%s)\n", inames[inum]);
d135 8
a142 1
disable(PS);
a143 1
#endif
@


1.5
log
@*** empty log message ***
@
text
@d13 7
a28 1
kprintf("initevec\n");
d31 6
d56 5
d91 1
d94 1
@


1.4
log
@*** empty log message ***
@
text
@d22 1
d68 2
d74 1
@


1.3
log
@,
@
text
@d4 1
a11 3
#include <sunromvec.h>
#include <cpu.addrs.h>    
#include <i386.h>    
d14 1
a14 4
extern struct {
	unsigned int	len : 16;
	unsigned long	addr : 32;
} idtr;
d64 1
a64 1
trap(inum, x)
d68 1
a68 1
	kprintf("exception %d x %d\n", inum, x);
@


1.2
log
@*** empty log message ***
@
text
@d21 1
a21 7
int	Xint0(), Xint1(), Xint2(), Xint3(), Xint4(), Xint5(), Xint6();
int	Xint7(), Xint8(), Xint9(), Xint10(), Xint11(), Xint12(), Xint13();
int	Xint14(), Xint15(), Xint16(), Xint17(), Xint18(), Xint19(), Xint20();
int	Xint21(), Xint22(), Xint23(), Xint24(), Xint25(), Xint26(), Xint27();
int	Xint28(), Xint29(), Xint30(), Xint31(), Xint32(), Xint33(), Xint34();
int	Xint35(), Xint36(), Xint37(), Xint38(), Xint39(), Xint40(), Xint41();
int	Xint42(), Xint43(), Xint44(), Xint45(), Xint46(), Xint47();
a22 2
#define	SIDT(i)	set_idt(i, Xint/**/i)

d25 1
a25 1
	int	i, off, res;
d27 2
a28 18
kprintf("idt limit %d, idt %X\n", idtr.len, idtr.addr);
kprintf("real idt %X\n", idt);
#ifdef notdef
	SIDT(0);  SIDT(1);  SIDT(2);  SIDT(3);  SIDT(4);  SIDT(5);
	SIDT(6);  SIDT(7);  SIDT(8);  SIDT(9);  SIDT(10); SIDT(11);
	SIDT(12); SIDT(13); SIDT(14); SIDT(15); SIDT(16); SIDT(17);
	SIDT(18); SIDT(19); SIDT(20); SIDT(21); SIDT(22); SIDT(23);
	SIDT(24); SIDT(25); SIDT(26); SIDT(27); SIDT(28); SIDT(29);
	SIDT(30); SIDT(31); SIDT(32); SIDT(33); SIDT(34); SIDT(35);
	SIDT(36); SIDT(37); SIDT(38); SIDT(39); SIDT(40); SIDT(41);
	SIDT(42); SIDT(43); SIDT(44); SIDT(45); SIDT(46); SIDT(47);
#endif
	res = (int)Xint1 - (int)Xint0;
	off = (int)Xint0;
kprintf("Xint0 %X, Xint1 %X  Xint2 %X\n", Xint0, Xint1, Xint2);
kprintf("off %X res %d\n", off, res);
	for (i=0; i<NID; ++i, off += res)
		set_idt(i, off);
d30 1
d69 1
a69 1
trap(inum)
d73 1
a73 1
	kprintf("exception %d\n", inum);
a143 21
}

int
prints()
{
	struct idt	*pidt;
	char		*p;
	int	i;

	kprintf("idtr %X len %d base %X\n", &idtr, idtr.len, idtr.addr);
	p = (char *)idt;
	for (i=0; i<9; ++i) {
		kprintf("%d) %02x", i, *p++);
		kprintf(" %02x", *p++);
		kprintf(" %02x", *p++);
		kprintf(" %02x", *p++);
		kprintf(" %02x", *p++);
		kprintf(" %02x", *p++);
		kprintf(" %02x", *p++);
		kprintf(" %02x\n", *p++);
	}
@


1.1
log
@Initial revision
@
text
@a14 1
/* the 386 exception vector */    
d21 7
a27 1
char *origevec;
d29 1
d33 1
a33 1
	int	Xtrap(), i;
d37 16
a52 2
	for (i=0; i<NID; ++i)
		set_idt(i, Xtrap);
d73 21
a93 1
trap()
d95 5
a99 1
kprintf("in trap\n");
@

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?