diff --git a/trap.c b/trap.c
index b35107f40893baa6690edbda1868a84ede67d637..0505c5fc4dea245e73712856c0d2d5cd2b977b59 100644
--- a/trap.c
+++ b/trap.c
@@ -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--;
 }