diff options
| -rw-r--r-- | trap.c | 65 | 
1 files changed, 34 insertions, 31 deletions
| @@ -18,10 +18,9 @@ tvinit(void)  {    int i; -  for(i = 0; i < 256; i++){ -    SETGATE(idt[i], 1, SEG_KCODE << 3, vectors[i], 0); -  } -  SETGATE(idt[T_SYSCALL], 1, SEG_KCODE << 3, vectors[T_SYSCALL], 3); +  for(i = 0; i < 256; i++) +    SETGATE(idt[i], 0, SEG_KCODE << 3, vectors[i], 0); +  SETGATE(idt[T_SYSCALL], 0, SEG_KCODE << 3, vectors[T_SYSCALL], 3);  }  void @@ -34,9 +33,9 @@ void  trap(struct trapframe *tf)  {    int v = tf->trapno; +  struct proc *cp = curproc[cpu()];    if(v == T_SYSCALL){ -    struct proc *cp = curproc[cpu()];      if(cp->killed)        proc_exit();      cp->tf = tf; @@ -46,9 +45,15 @@ trap(struct trapframe *tf)      return;    } -  if(v == (IRQ_OFFSET + IRQ_TIMER)){ -    struct proc *cp = curproc[cpu()]; +  // Increment nlock to make sure interrupts stay off +  // during interrupt handler.  Must decrement before +  // returning. +  cpus[cpu()].nlock++; + +  switch(v){ +  case IRQ_OFFSET + IRQ_TIMER:      lapic_timerintr(); +    cpus[cpu()].nlock--;      if(cp){        // Force process exit if it has been killed        // and the interrupt came from user space. @@ -63,36 +68,34 @@ trap(struct trapframe *tf)          yield();      }      return; -  } -  if(v == IRQ_OFFSET + IRQ_IDE){ +  case IRQ_OFFSET + IRQ_IDE:      ide_intr(); -    cli(); // prevent a waiting interrupt from overflowing stack      lapic_eoi(); -    return; -  } - -  if(v == IRQ_OFFSET + IRQ_KBD){ +    break; +   +  case IRQ_OFFSET + IRQ_KBD:      kbd_intr(); -    cli(); // prevent a waiting interrupt from overflowing stack      lapic_eoi(); -    return; -  } - -  if(v == IRQ_OFFSET + IRQ_SPURIOUS){ +    break; +   +  case IRQ_OFFSET + IRQ_SPURIOUS:      cprintf("spurious interrupt from cpu %d eip %x\n", cpu(), tf->eip); -    return;  // no eoi for this one. -  } - -  if(curproc[cpu()]) { -    // assume process caused unexpected trap, -    // for example by dividing by zero or dereferencing a bad pointer -    cprintf("pid %d: unhandled trap %d on cpu %d eip %x -- kill proc\n", -            curproc[cpu()]->pid, v, cpu(), tf->eip); -    proc_exit(); +    break; +     +  default: +    if(curproc[cpu()]) { +      // assume process caused unexpected trap, +      // for example by dividing by zero or dereferencing a bad pointer +      cprintf("pid %d: unhandled trap %d on cpu %d eip %x -- kill proc\n", +              curproc[cpu()]->pid, v, cpu(), tf->eip); +      proc_exit(); +    } +     +    // otherwise it's our mistake +    cprintf("unexpected trap %d from cpu %d eip %x\n", v, cpu(), tf->eip); +    panic("trap");    } -  // otherwise it's our mistake -  cprintf("unexpected trap %d from cpu %d eip %x\n", v, cpu(), tf->eip); -  panic("trap"); +  cpus[cpu()].nlock--;  } | 
