X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fthreads%2Finterrupt.c;h=8e7d575afe7928ac5f22c57c11719e2107dcae50;hb=2f06c82f2c3e67ab8748a743cef1990740cab70e;hp=8173ec11dcc44767c7cd5d02158651e48433eab4;hpb=6c5c6fdfe80bad40c90c19b67f00226610d59a38;p=pintos-anon diff --git a/src/threads/interrupt.c b/src/threads/interrupt.c index 8173ec1..8e7d575 100644 --- a/src/threads/interrupt.c +++ b/src/threads/interrupt.c @@ -1,13 +1,14 @@ -#include "interrupt.h" +#include "threads/interrupt.h" +#include #include #include -#include "intr-stubs.h" -#include "debug.h" -#include "io.h" -#include "lib.h" -#include "mmu.h" -#include "thread.h" -#include "timer.h" +#include +#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" /* Number of x86 interrupts. */ #define INTR_CNT 256 @@ -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; } @@ -91,6 +93,10 @@ intr_init (void) /* Initialize interrupt controller. */ pic_init (); + /* Initialize IDT. */ + for (i = 0; i < INTR_CNT; i++) + idt[i] = make_intr_gate (intr_stubs[i], 0); + /* Load IDT register. */ idtr_operand = make_idtr_operand (sizeof idt - 1, idt); asm volatile ("lidt %0" :: "m" (idtr_operand)); @@ -299,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) { @@ -342,14 +352,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); }