#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"
{
uint32_t flags;
- asm ("pushfl; popl %0" : "=g" (flags));
+ asm volatile ("pushfl; popl %0" : "=g" (flags));
return flags & FLAG_IF ? INTR_ON : INTR_OFF;
}
intr_enable (void)
{
enum intr_level old_level = intr_get_level ();
+ ASSERT (!intr_context ());
asm volatile ("sti");
return old_level;
}
/* 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);
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";
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)
{