1 #include "types.h" 2 #include "param.h" 3 #include "mmu.h" 4 #include "proc.h" 5 #include "defs.h" 6 #include "x86.h" 7 #include "traps.h" 8 9 struct Gatedesc idt[256]; 10 struct Pseudodesc idt_pd = { 0, sizeof(idt) - 1, (unsigned) &idt }; 11 extern unsigned vectors[]; /* vectors.S, array of 256 entry point addresses */ 12 13 extern void trapenter(); 14 extern void trapenter1(); 15 16 void 17 tvinit() 18 { 19 int i; 20 21 for(i = 0; i < 256; i++){ 22 SETGATE(idt[i], 1, SEG_KCODE << 3, vectors[i], 0); 23 } 24 SETGATE(idt[T_SYSCALL], T_SYSCALL, SEG_KCODE << 3, vectors[48], 3); 25 } 26 27 void 28 idtinit() 29 { 30 asm volatile("lidt %0" : : "g" (idt_pd.pd_lim)); 31 } 32 33 void 34 trap(struct Trapframe *tf) 35 { 36 int v = tf->tf_trapno; 37 38 if(tf->tf_cs == 0x8 && kernel_lock == cpu()) 39 cprintf("cpu %d: trap %d from %x:%x with lock=%d\n", 40 cpu(), v, tf->tf_cs, tf->tf_eip, kernel_lock); 41 42 acquire_spinlock(&kernel_lock); // released in trapret in trapasm.S 43 44 if(v == T_SYSCALL){ 45 struct proc *cp = curproc[cpu()]; 46 if(cp == 0) 47 panic("syscall with no proc"); 48 cp->tf = tf; 49 syscall(); 50 if(cp != curproc[cpu()]) 51 panic("trap ret wrong curproc"); 52 if(cp->state != RUNNING) 53 panic("trap ret but not RUNNING"); 54 if(tf != cp->tf) 55 panic("trap ret wrong tf"); 56 if(read_esp() < (unsigned)cp->kstack || read_esp() >= (unsigned)cp->kstack + KSTACKSIZE) 57 panic("trap ret esp wrong"); 58 return; 59 } 60 61 if(v == (IRQ_OFFSET + IRQ_TIMER)){ 62 lapic_timerintr(); 63 return; 64 } 65 if(v == (IRQ_OFFSET + IRQ_IDE)){ 66 ide_intr(); 67 return; 68 } 69 70 71 // XXX probably ought to lgdt on trap return 72 73 return; 74 } 75