// irq_init(): 初始化硬件中断服务 void irq_init(void) { int i; // 硬件中断芯片初始化 init8259(); // 设置 idt 服务程序 idt_setintrgate(IRQBASE + 0, irq0); idt_setintrgate(IRQBASE + 1, irq1); idt_setintrgate(IRQBASE + 2, irq2); idt_setintrgate(IRQBASE + 3, irq3); idt_setintrgate(IRQBASE + 4, irq4); idt_setintrgate(IRQBASE + 5, irq5); idt_setintrgate(IRQBASE + 6, irq6); idt_setintrgate(IRQBASE + 7, irq7); idt_setintrgate(IRQBASE + 8, irq8); idt_setintrgate(IRQBASE + 9, irq9); idt_setintrgate(IRQBASE + 10, irq10); idt_setintrgate(IRQBASE + 11, irq11); idt_setintrgate(IRQBASE + 12, irq12); idt_setintrgate(IRQBASE + 13, irq13); idt_setintrgate(IRQBASE + 14, irq14); idt_setintrgate(IRQBASE + 15, irq15); // 初始化处理函数组,这里是自己赋值 for (i = 0; i < sizeof(irqfun) / sizeof(irqfun[0]); i++) irqfun[i] = (IRQ_FUN)unexpected; //设置系统调用 extern int *systemcall; extern void irq_syscall(void); idt_setusergate(SYSCALL_INT ,irq_syscall); return; }
initevec() { int i; STATWORD ps; #ifdef __COM32__ puts_com32("initevec() begin"); #endif 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 */ #ifdef __COM32__ puts_com32("initevec() set_evec() done\n"); #endif lidt(); #ifdef __COM32__ puts_com32("initevec() lidt() done\n"); #endif init8259(); #ifdef __COM32__ puts_com32("initevec() init8259() done\n"); #endif }
void initevec(void) { int i; /* bzero( idt, sizeof( struct idt ) * 256 ); */ memset( idt, 0, sizeof( struct idt ) * 256 ); for (i=0; i<NID; ++i) set_evec(i, (long)defevec[i]); lidt(); init8259(); set_exception=&set_evec; }
int initevec() { int i; for (i=0; i<NID; ++i) set_evec(i, (long)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(); return(OK); }