summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAgustina Arzille <avarzille@riseup.net>2017-05-16 04:16:55 -1000
committerAgustina Arzille <avarzille@riseup.net>2017-05-16 04:16:55 -1000
commit4087fd3abb6ed0672cc7e84d42ad226770542757 (patch)
tree32a512e21ab9fefad973cccf1b9aa03fdc670589
parent2d2672dd3729092336b25d955265ca6f46e440f7 (diff)
x86/trap: add the trap_handler_get helper function
-rw-r--r--arch/x86/machine/trap.c19
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();