diff options
| author | rsc <rsc> | 2006-09-07 16:53:16 +0000 | 
|---|---|---|
| committer | rsc <rsc> | 2006-09-07 16:53:16 +0000 | 
| commit | 0b75a8e8bea4f4c8230daae8d81eda04c19e622c (patch) | |
| tree | e091b079155c18619ff5add30fd45e8b1dca0245 | |
| parent | 5a71f9330162dd9f8a302c3ed1fa33539acdfdec (diff) | |
| download | xv6-labs-0b75a8e8bea4f4c8230daae8d81eda04c19e622c.tar.gz xv6-labs-0b75a8e8bea4f4c8230daae8d81eda04c19e622c.tar.bz2 xv6-labs-0b75a8e8bea4f4c8230daae8d81eda04c19e622c.zip | |
no recursive interrupts
| -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--;  } | 
