X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fthreads%2Finterrupt.c;h=c886cc9d709ab71a3c4bc870eb758ea92321b1a5;hb=5f1b986185717577aac1922544cb3a7b1a56b632;hp=d248d7200b71173a3d43c941ff60f094bb773f34;hpb=f2f8875638593bd5365cfd6a5ba7c9578e52322f;p=pintos-anon diff --git a/src/threads/interrupt.c b/src/threads/interrupt.c index d248d72..c886cc9 100644 --- a/src/threads/interrupt.c +++ b/src/threads/interrupt.c @@ -3,6 +3,7 @@ #include #include #include +#include "threads/flags.h" #include "threads/intr-stubs.h" #include "threads/io.h" #include "threads/mmu.h" @@ -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) {