intr_names[19] = "#XF SIMD Floating-Point Exception";
}
-/* Registers interrupt VEC_NO to invoke HANDLER, which is named
- NAME for debugging purposes. The interrupt handler will be
- invoked with interrupt status set to LEVEL.
+/* Registers interrupt VEC_NO to invoke HANDLER with descriptor
+ privilege level DPL. Names the interrupt NAME for debugging
+ purposes. The interrupt handler will be invoked with
+ interrupt status set to LEVEL. */
+static void
+register_handler (uint8_t vec_no, int dpl, enum intr_level level,
+ intr_handler_func *handler, const char *name)
+{
+ ASSERT (intr_handlers[vec_no] == NULL);
+ if (level == INTR_ON)
+ idt[vec_no] = make_trap_gate (intr_stubs[vec_no], dpl);
+ else
+ idt[vec_no] = make_intr_gate (intr_stubs[vec_no], dpl);
+ intr_handlers[vec_no] = handler;
+ intr_names[vec_no] = name;
+}
+
+/* Registers external interrupt VEC_NO to invoke HANDLER, which
+ is named NAME for debugging purposes. The handler will
+ execute with interrupts disabled. */
+void
+intr_register_ext (uint8_t vec_no, intr_handler_func *handler,
+ const char *name)
+{
+ ASSERT (vec_no >= 0x20 && vec_no <= 0x2f);
+ register_handler (vec_no, 0, INTR_OFF, handler, name);
+}
+
+/* Registers internal interrupt VEC_NO to invoke HANDLER, which
+ is named NAME for debugging purposes. The interrupt handler
+ will be invoked with interrupt status LEVEL.
The handler will have descriptor privilege level DPL, meaning
that it can be invoked intentionally when the processor is in
still cause interrupts with DPL==0 to be invoked. See
[IA32-v3] sections 4.5 and 4.8.1.1 for further discussion. */
void
-intr_register (uint8_t vec_no, int dpl, enum intr_level level,
- intr_handler_func *handler,
- const char *name)
+intr_register_int (uint8_t vec_no, int dpl, enum intr_level level,
+ intr_handler_func *handler, const char *name)
{
- /* Make sure this handler isn't already registered to someone
- else. */
- ASSERT (intr_handlers[vec_no] == NULL);
-
- /* Interrupts generated by external hardware (0x20 <= VEC_NO <=
- 0x2f) should specify INTR_OFF for LEVEL. Otherwise a timer
- interrupt could cause a task switch during interrupt
- handling. Most other interrupts can and should be handled
- with interrupts enabled. */
- ASSERT (vec_no < 0x20 || vec_no > 0x2f || level == INTR_OFF);
-
- if (level == INTR_ON)
- idt[vec_no] = make_trap_gate (intr_stubs[vec_no], dpl);
- else
- idt[vec_no] = make_intr_gate (intr_stubs[vec_no], dpl);
- intr_handlers[vec_no] = handler;
- intr_names[vec_no] = name;
+ ASSERT (vec_no < 0x20 || vec_no > 0x2f);
+ register_handler (vec_no, dpl, level, handler, name);
}
/* Returns true during processing of an external interrupt