Add some more correctness assertions to free().
[pintos-anon] / src / threads / interrupt.c
index 4c7ec9e41e19c5a09428d1601b8eb2b325d07581..c886cc9d709ab71a3c4bc870eb758ea92321b1a5 100644 (file)
@@ -1,13 +1,14 @@
-#include "interrupt.h"
+#include "threads/interrupt.h"
+#include <debug.h>
 #include <inttypes.h>
 #include <stdint.h>
-#include "intr-stubs.h"
-#include "io.h"
-#include "mmu.h"
-#include "thread.h"
+#include <stdio.h>
+#include "threads/flags.h"
+#include "threads/intr-stubs.h"
+#include "threads/io.h"
+#include "threads/mmu.h"
+#include "threads/thread.h"
 #include "devices/timer.h"
-#include "lib/debug.h"
-#include "lib/lib.h"
 
 /* Number of x86 interrupts. */
 #define INTR_CNT 256
@@ -50,7 +51,7 @@ intr_get_level (void)
 {
   uint32_t flags;
   
-  asm ("pushfl; popl %0" : "=g" (flags));
+  asm volatile ("pushfl; popl %0" : "=g" (flags));
 
   return flags & FLAG_IF ? INTR_ON : INTR_OFF;
 }
@@ -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);
@@ -116,6 +118,7 @@ intr_init (void)
   intr_names[11] = "#NP Segment Not Present";
   intr_names[12] = "#SS Stack Fault Exception";
   intr_names[13] = "#GP General Protection Exception";
+  intr_names[14] = "#PF Page-Fault Exception";
   intr_names[16] = "#MF x87 FPU Floating-Point Error";
   intr_names[17] = "#AC Alignment Check Exception";
   intr_names[18] = "#MC Machine-Check Exception";
@@ -303,6 +306,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) 
     {
@@ -346,14 +353,14 @@ intr_dump_frame (const struct intr_frame *f)
   asm ("movl %%cr2, %0" : "=r" (cr2));
   asm ("movl %%ss, %0" : "=r" (ss));
 
-  printk ("Interrupt %#04x (%s) at eip=%p\n",
+  printf ("Interrupt %#04x (%s) at eip=%p\n",
           f->vec_no, intr_names[f->vec_no], f->eip);
-  printk (" cr2=%08"PRIx32" error=%08"PRIx32"\n", cr2, f->error_code);
-  printk (" eax=%08"PRIx32" ebx=%08"PRIx32" ecx=%08"PRIx32" edx=%08"PRIx32"\n",
+  printf (" cr2=%08"PRIx32" error=%08"PRIx32"\n", cr2, f->error_code);
+  printf (" eax=%08"PRIx32" ebx=%08"PRIx32" ecx=%08"PRIx32" edx=%08"PRIx32"\n",
           f->eax, f->ebx, f->ecx, f->edx);
-  printk (" esi=%08"PRIx32" edi=%08"PRIx32" esp=%08"PRIx32" ebp=%08"PRIx32"\n",
+  printf (" esi=%08"PRIx32" edi=%08"PRIx32" esp=%08"PRIx32" ebp=%08"PRIx32"\n",
           f->esi, f->edi, (uint32_t) f->esp, f->ebp);
-  printk (" cs=%04"PRIx16" ds=%04"PRIx16" es=%04"PRIx16" ss=%04"PRIx16"\n",
+  printf (" cs=%04"PRIx16" ds=%04"PRIx16" es=%04"PRIx16" ss=%04"PRIx16"\n",
           f->cs, f->ds, f->es, f->cs != SEL_KCSEG ? f->ss : ss);
 }