Make processes responsible for loading themselves.
[pintos-anon] / src / threads / interrupt.c
index d248d7200b71173a3d43c941ff60f094bb773f34..8e7d575afe7928ac5f22c57c11719e2107dcae50 100644 (file)
@@ -3,6 +3,7 @@
 #include <inttypes.h>
 #include <stdint.h>
 #include <stdio.h>
+#include "threads/flags.h"
 #include "threads/intr-stubs.h"
 #include "threads/io.h"
 #include "threads/mmu.h"
@@ -68,6 +69,7 @@ enum intr_level
 intr_enable (void) 
 {
   enum intr_level old_level = intr_get_level ();
+  ASSERT (!intr_context ());
   asm volatile ("sti");
   return old_level;
 }
@@ -93,7 +95,7 @@ intr_init (void)
 
   /* Initialize IDT. */
   for (i = 0; i < INTR_CNT; i++)
-    idt[i] = make_trap_gate (intr_stubs[i], 0);
+    idt[i] = make_intr_gate (intr_stubs[i], 0);
 
   /* Load IDT register. */
   idtr_operand = make_idtr_operand (sizeof idt - 1, idt);
@@ -303,6 +305,10 @@ intr_handler (struct intr_frame *frame)
   bool external;
   intr_handler_func *handler;
 
+  /* External interrupts are special.
+     We only handle one at a time (so interrupts must be off)
+     and they need to be acknowledged on the PIC (see below).
+     An external interrupt handler cannot sleep. */
   external = frame->vec_no >= 0x20 && frame->vec_no < 0x30;
   if (external) 
     {