diff options
-rw-r--r-- | arch/x86/machine/trap.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/arch/x86/machine/trap.c b/arch/x86/machine/trap.c index 9a2fe151..c938f0f4 100644 --- a/arch/x86/machine/trap.c +++ b/arch/x86/machine/trap.c @@ -90,6 +90,13 @@ void trap_isr_lapic_spurious(void); */ static struct trap_handler trap_handlers[CPU_IDT_SIZE + 1] __read_mostly; +static struct trap_handler * +trap_handler_get(unsigned int vector) +{ + assert(vector < ARRAY_SIZE(trap_handlers)); + return &trap_handlers[vector]; +} + static void __init trap_handler_init(struct trap_handler *handler, int flags, trap_handler_fn_t fn) { @@ -103,7 +110,7 @@ trap_install(unsigned int vector, int flags, trap_isr_fn_t isr, { assert(vector < CPU_IDT_SIZE); - trap_handler_init(&trap_handlers[vector], flags, fn); + trap_handler_init(trap_handler_get(vector), flags, fn); cpu_idt_set_gate(vector, isr); } @@ -162,7 +169,8 @@ trap_double_fault(struct trap_frame *frame) static void __init trap_install_double_fault(void) { - trap_handler_init(&trap_handlers[TRAP_DF], TRAP_HF_INTR, trap_double_fault); + trap_handler_init(trap_handler_get(TRAP_DF), + TRAP_HF_INTR, trap_double_fault); cpu_idt_set_double_fault(trap_isr_double_fault); } @@ -226,7 +234,8 @@ trap_setup(void) trap_install(TRAP_LAPIC_SPURIOUS, TRAP_HF_INTR, trap_isr_lapic_spurious, lapic_spurious_intr); - trap_handler_init(&trap_handlers[TRAP_DEFAULT], TRAP_HF_INTR, trap_default); + trap_handler_init(trap_handler_get(TRAP_DEFAULT), + TRAP_HF_INTR, trap_default); } void @@ -234,9 +243,9 @@ trap_main(struct trap_frame *frame) { struct trap_handler *handler; - assert(frame->vector < ARRAY_SIZE(trap_handlers)); + assert(!cpu_intr_enabled()); - handler = &trap_handlers[frame->vector]; + handler = trap_handler_get(frame->vector); if (handler->flags & TRAP_HF_INTR) { thread_intr_enter(); |