summaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorRichard Braun <rbraun@sceen.net>2017-05-23 20:32:30 +0200
committerRichard Braun <rbraun@sceen.net>2017-05-23 20:37:53 +0200
commita323e51f75ee54c9177c1173a3834dfdc7f63dda (patch)
tree38ec7524b58c3e65af5e8bb40e978fca254a9d78 /arch
parente4324d5165d9fd57ae1419d33d9a7680b7cc74a4 (diff)
x86/trap: rework to allow registering trap handlers
Diffstat (limited to 'arch')
-rw-r--r--arch/x86/machine/pic.c6
-rw-r--r--arch/x86/machine/trap.c145
-rw-r--r--arch/x86/machine/trap.h51
-rw-r--r--arch/x86/machine/trap_asm.S531
4 files changed, 616 insertions, 117 deletions
diff --git a/arch/x86/machine/pic.c b/arch/x86/machine/pic.c
index db26a16..412135c 100644
--- a/arch/x86/machine/pic.c
+++ b/arch/x86/machine/pic.c
@@ -57,8 +57,8 @@ pic_setup(void)
io_write_byte(PIC_SLAVE_CMD, PIC_ICW1_INIT | PIC_ICW1_IC4);
/* ICW 2 */
- io_write_byte(PIC_MASTER_IMR, TRAP_PIC_BASE);
- io_write_byte(PIC_SLAVE_IMR, TRAP_PIC_BASE + PIC_NR_INTRS);
+ io_write_byte(PIC_MASTER_IMR, TRAP_INTR_FIRST);
+ io_write_byte(PIC_SLAVE_IMR, TRAP_INTR_FIRST + PIC_NR_INTRS);
/* ICW 3 - Set up cascading */
io_write_byte(PIC_MASTER_IMR, 1 << PIC_SLAVE_INTR);
@@ -96,7 +96,7 @@ pic_spurious_intr(struct trap_frame *frame)
unsigned long intr;
uint8_t isr;
- intr = frame->vector - TRAP_PIC_BASE;
+ intr = frame->vector - TRAP_INTR_FIRST;
assert((intr == PIC_SPURIOUS_INTR)
|| (intr == (PIC_NR_INTRS + PIC_SPURIOUS_INTR)));
diff --git a/arch/x86/machine/trap.c b/arch/x86/machine/trap.c
index aa045a9..3de4fd2 100644
--- a/arch/x86/machine/trap.c
+++ b/arch/x86/machine/trap.c
@@ -19,12 +19,15 @@
* additional configuration and resources to be properly handled.
*/
+#include <stdint.h>
#include <stdio.h>
#include <kern/assert.h>
+#include <kern/atomic.h>
#include <kern/init.h>
#include <kern/macros.h>
#include <kern/param.h>
+#include <kern/spinlock.h>
#include <kern/thread.h>
#include <machine/cpu.h>
#include <machine/lapic.h>
@@ -43,7 +46,6 @@ static struct trap_cpu_data trap_cpu_data __percpu;
* Type for interrupt service routines and trap handler functions.
*/
typedef void (*trap_isr_fn_t)(void);
-typedef void (*trap_handler_fn_t)(struct trap_frame *);
/*
* Trap handler flags.
@@ -59,42 +61,24 @@ struct trap_handler {
};
/*
- * Low level interrupt service routines.
+ * Table of ISR addresses.
*/
-void trap_isr_default(void);
-void trap_isr_divide_error(void);
-void trap_isr_debug(void);
-void trap_isr_nmi(void);
-void trap_isr_breakpoint(void);
-void trap_isr_overflow(void);
-void trap_isr_bound_range(void);
-void trap_isr_invalid_opcode(void);
-void trap_isr_device_not_available(void);
-void trap_isr_double_fault(void);
-void trap_isr_invalid_tss(void);
-void trap_isr_segment_not_present(void);
-void trap_isr_stack_segment_fault(void);
-void trap_isr_general_protection(void);
-void trap_isr_page_fault(void);
-void trap_isr_math_fault(void);
-void trap_isr_alignment_check(void);
-void trap_isr_machine_check(void);
-void trap_isr_simd_fp_exception(void);
-void trap_isr_pic_int7(void);
-void trap_isr_pic_int15(void);
-void trap_isr_xcall(void);
-void trap_isr_thread_schedule(void);
-void trap_isr_cpu_halt(void);
-void trap_isr_lapic_timer(void);
-void trap_isr_lapic_error(void);
-void trap_isr_lapic_spurious(void);
+extern trap_isr_fn_t trap_isr_table[CPU_IDT_SIZE];
/*
* Array of trap handlers.
+ */
+static struct trap_handler trap_handlers[CPU_IDT_SIZE] __read_mostly;
+
+/*
+ * Global trap lock.
+ *
+ * This lock is currently only used to serialize concurrent trap handler
+ * updates.
*
- * The additional entry is the default entry used for unhandled traps.
+ * Interrupts must be disabled when holding this lock.
*/
-static struct trap_handler trap_handlers[CPU_IDT_SIZE + 1] __read_mostly;
+static struct spinlock trap_lock;
static struct trap_handler *
trap_handler_get(unsigned int vector)
@@ -107,17 +91,14 @@ static void __init
trap_handler_init(struct trap_handler *handler, int flags, trap_handler_fn_t fn)
{
handler->flags = flags;
- handler->fn = fn;
+ atomic_store(&handler->fn, fn, ATOMIC_RELAXED);
}
static void __init
-trap_install(unsigned int vector, int flags, trap_isr_fn_t isr,
- trap_handler_fn_t fn)
+trap_install(unsigned int vector, int flags, trap_handler_fn_t fn)
{
- assert(vector < CPU_IDT_SIZE);
-
+ assert(vector < ARRAY_SIZE(trap_handlers));
trap_handler_init(trap_handler_get(vector), flags, fn);
- cpu_idt_set_gate(vector, isr);
}
static void
@@ -175,9 +156,8 @@ trap_double_fault(struct trap_frame *frame)
static void __init
trap_install_double_fault(void)
{
- trap_handler_init(trap_handler_get(TRAP_DF),
- TRAP_HF_INTR, trap_double_fault);
- cpu_idt_set_double_fault(trap_isr_double_fault);
+ trap_install(TRAP_DF, TRAP_HF_INTR, trap_double_fault);
+ cpu_idt_set_double_fault(trap_isr_table[TRAP_DF]);
}
static void
@@ -196,58 +176,50 @@ trap_setup(void)
{
size_t i;
- for (i = 0; i < CPU_IDT_SIZE; i++) {
- trap_install(i, TRAP_HF_INTR, trap_isr_default, trap_default);
+ spinlock_init(&trap_lock);
+
+ for (i = 0; i < ARRAY_SIZE(trap_isr_table); i++) {
+ cpu_idt_set_gate(i, trap_isr_table[i]);
+ }
+
+ for (i = 0; i < ARRAY_SIZE(trap_handlers); i++) {
+ trap_install(i, TRAP_HF_INTR, trap_default);
}
/* Architecture defined traps */
- trap_install(TRAP_DE, 0, trap_isr_divide_error, trap_default);
- trap_install(TRAP_DB, 0, trap_isr_debug, trap_default);
- trap_install(TRAP_NMI, TRAP_HF_INTR, trap_isr_nmi, trap_default);
- trap_install(TRAP_BP, 0, trap_isr_breakpoint, trap_default);
- trap_install(TRAP_OF, 0, trap_isr_overflow, trap_default);
- trap_install(TRAP_BR, 0, trap_isr_bound_range, trap_default);
- trap_install(TRAP_UD, 0, trap_isr_invalid_opcode, trap_default);
- trap_install(TRAP_NM, 0, trap_isr_device_not_available, trap_default);
+ trap_install(TRAP_DE, 0, trap_default);
+ trap_install(TRAP_DB, 0, trap_default);
+ trap_install(TRAP_NMI, TRAP_HF_INTR, trap_default);
+ trap_install(TRAP_BP, 0, trap_default);
+ trap_install(TRAP_OF, 0, trap_default);
+ trap_install(TRAP_BR, 0, trap_default);
+ trap_install(TRAP_UD, 0, trap_default);
+ trap_install(TRAP_NM, 0, trap_default);
trap_install_double_fault();
- trap_install(TRAP_TS, 0, trap_isr_invalid_tss, trap_default);
- trap_install(TRAP_NP, 0, trap_isr_segment_not_present, trap_default);
- trap_install(TRAP_SS, 0, trap_isr_stack_segment_fault, trap_default);
- trap_install(TRAP_GP, 0, trap_isr_general_protection, trap_default);
- trap_install(TRAP_PF, 0, trap_isr_page_fault, trap_default);
- trap_install(TRAP_MF, 0, trap_isr_math_fault, trap_default);
- trap_install(TRAP_AC, 0, trap_isr_alignment_check, trap_default);
- trap_install(TRAP_MC, TRAP_HF_INTR, trap_isr_machine_check, trap_default);
- trap_install(TRAP_XM, 0, trap_isr_simd_fp_exception, trap_default);
-
- /* Basic PIC support */
- trap_install(TRAP_PIC_BASE + 7, TRAP_HF_INTR,
- trap_isr_pic_int7, pic_spurious_intr);
- trap_install(TRAP_PIC_BASE + 15, TRAP_HF_INTR,
- trap_isr_pic_int15, pic_spurious_intr);
+ trap_install(TRAP_TS, 0, trap_default);
+ trap_install(TRAP_NP, 0, trap_default);
+ trap_install(TRAP_SS, 0, trap_default);
+ trap_install(TRAP_GP, 0, trap_default);
+ trap_install(TRAP_PF, 0, trap_default);
+ trap_install(TRAP_MF, 0, trap_default);
+ trap_install(TRAP_AC, 0, trap_default);
+ trap_install(TRAP_MC, TRAP_HF_INTR, trap_default);
+ trap_install(TRAP_XM, 0, trap_default);
/* System defined traps */
- trap_install(TRAP_XCALL, TRAP_HF_INTR,
- trap_isr_xcall, cpu_xcall_intr);
- trap_install(TRAP_THREAD_SCHEDULE, TRAP_HF_INTR,
- trap_isr_thread_schedule, cpu_thread_schedule_intr);
- trap_install(TRAP_CPU_HALT, TRAP_HF_INTR,
- trap_isr_cpu_halt, cpu_halt_intr);
- trap_install(TRAP_LAPIC_TIMER, TRAP_HF_INTR,
- trap_isr_lapic_timer, lapic_timer_intr);
- trap_install(TRAP_LAPIC_ERROR, TRAP_HF_INTR,
- trap_isr_lapic_error, lapic_error_intr);
- trap_install(TRAP_LAPIC_SPURIOUS, TRAP_HF_INTR,
- trap_isr_lapic_spurious, lapic_spurious_intr);
-
- trap_handler_init(trap_handler_get(TRAP_DEFAULT),
- TRAP_HF_INTR, trap_default);
+ trap_install(TRAP_XCALL, TRAP_HF_INTR, cpu_xcall_intr);
+ trap_install(TRAP_THREAD_SCHEDULE, TRAP_HF_INTR, cpu_thread_schedule_intr);
+ trap_install(TRAP_CPU_HALT, TRAP_HF_INTR, cpu_halt_intr);
+ trap_install(TRAP_LAPIC_TIMER, TRAP_HF_INTR, lapic_timer_intr);
+ trap_install(TRAP_LAPIC_ERROR, TRAP_HF_INTR, lapic_error_intr);
+ trap_install(TRAP_LAPIC_SPURIOUS, TRAP_HF_INTR, lapic_spurious_intr);
}
void
trap_main(struct trap_frame *frame)
{
struct trap_handler *handler;
+ trap_handler_fn_t fn;
assert(!cpu_intr_enabled());
@@ -257,7 +229,8 @@ trap_main(struct trap_frame *frame)
thread_intr_enter();
}
- handler->fn(frame);
+ fn = atomic_load(&handler->fn, ATOMIC_RELAXED);
+ fn(frame);
if (handler->flags & TRAP_HF_INTR) {
thread_intr_leave();
@@ -266,6 +239,16 @@ trap_main(struct trap_frame *frame)
assert(!cpu_intr_enabled());
}
+void
+trap_register(unsigned int vector, trap_handler_fn_t handler_fn)
+{
+ unsigned long flags;
+
+ spinlock_lock_intr_save(&trap_lock, &flags);
+ trap_install(vector, TRAP_HF_INTR, handler_fn);
+ spinlock_unlock_intr_restore(&trap_lock, flags);
+}
+
#ifdef __LP64__
void
diff --git a/arch/x86/machine/trap.h b/arch/x86/machine/trap.h
index 2f53f17..7bda9cf 100644
--- a/arch/x86/machine/trap.h
+++ b/arch/x86/machine/trap.h
@@ -24,29 +24,30 @@
/*
* Architecture defined traps.
*/
-#define TRAP_DE 0 /* Divide Error */
-#define TRAP_DB 1 /* Debug */
-#define TRAP_NMI 2 /* NMI Interrupt */
-#define TRAP_BP 3 /* Breakpoint */
-#define TRAP_OF 4 /* Overflow */
-#define TRAP_BR 5 /* BOUND Range Exceeded */
-#define TRAP_UD 6 /* Invalid Opcode (Undefined Opcode) */
-#define TRAP_NM 7 /* Device Not Available (No Math Coprocessor) */
-#define TRAP_DF 8 /* Double Fault */
-#define TRAP_TS 10 /* Invalid TSS */
-#define TRAP_NP 11 /* Segment Not Present */
-#define TRAP_SS 12 /* Stack-Segment Fault */
-#define TRAP_GP 13 /* General Protection */
-#define TRAP_PF 14 /* Page Fault */
-#define TRAP_MF 16 /* x87 FPU Floating-Point Error (Math Fault) */
-#define TRAP_AC 17 /* Alignment Check */
-#define TRAP_MC 18 /* Machine Check */
-#define TRAP_XM 19 /* SIMD Floating-Point Exception */
+#define TRAP_DE 0 /* Divide Error */
+#define TRAP_DB 1 /* Debug */
+#define TRAP_NMI 2 /* NMI Interrupt */
+#define TRAP_BP 3 /* Breakpoint */
+#define TRAP_OF 4 /* Overflow */
+#define TRAP_BR 5 /* BOUND Range Exceeded */
+#define TRAP_UD 6 /* Invalid Opcode (Undefined Opcode) */
+#define TRAP_NM 7 /* Device Not Available (No Math Coprocessor) */
+#define TRAP_DF 8 /* Double Fault */
+#define TRAP_TS 10 /* Invalid TSS */
+#define TRAP_NP 11 /* Segment Not Present */
+#define TRAP_SS 12 /* Stack-Segment Fault */
+#define TRAP_GP 13 /* General Protection */
+#define TRAP_PF 14 /* Page Fault */
+#define TRAP_MF 16 /* x87 FPU Floating-Point Error (Math Fault) */
+#define TRAP_AC 17 /* Alignment Check */
+#define TRAP_MC 18 /* Machine Check */
+#define TRAP_XM 19 /* SIMD Floating-Point Exception */
/*
- * Interrupts reserved for the legacy PIC.
+ * Traps used for handling external interrupts.
*/
-#define TRAP_PIC_BASE 32
+#define TRAP_INTR_FIRST 32
+#define TRAP_INTR_LAST 223
/*
* System defined traps.
@@ -124,6 +125,11 @@ struct trap_frame {
#endif /* __LP64__ */
+/*
+ * Type for trap handler functions.
+ */
+typedef void (*trap_handler_fn_t)(struct trap_frame *);
+
static inline void
trap_test_double_fault(void)
{
@@ -142,6 +148,11 @@ void trap_setup(void);
void trap_main(struct trap_frame *frame);
/*
+ * Register a trap handler.
+ */
+void trap_register(unsigned int vector, trap_handler_fn_t handler_fn);
+
+/*
* Display the content of a trap frame.
*/
void trap_frame_show(struct trap_frame *frame);
diff --git a/arch/x86/machine/trap_asm.S b/arch/x86/machine/trap_asm.S
index 15e8c78..a60bbf0 100644
--- a/arch/x86/machine/trap_asm.S
+++ b/arch/x86/machine/trap_asm.S
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2014 Richard Braun.
+ * Copyright (c) 2012-2017 Richard Braun.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -15,7 +15,9 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include <kern/init.h>
#include <machine/asm.h>
+#include <machine/boot.h>
#include <machine/trap.h>
.text
@@ -172,17 +174,520 @@ TRAP_ERROR(TRAP_AC, trap_isr_alignment_check)
TRAP(TRAP_MC, trap_isr_machine_check)
TRAP(TRAP_XM, trap_isr_simd_fp_exception)
-/* Basic PIC support */
-TRAP(TRAP_PIC_BASE + 7, trap_isr_pic_int7)
-TRAP(TRAP_PIC_BASE + 15, trap_isr_pic_int15)
+/*
+ * Handlers for reserved exceptions.
+ *
+ * These exceptions should normally never occur, but have handlers ready just
+ * in case.
+ */
+TRAP(9, trap_isr_9)
+TRAP(15, trap_isr_15)
+TRAP(20, trap_isr_20)
+TRAP(21, trap_isr_21)
+TRAP(22, trap_isr_22)
+TRAP(23, trap_isr_23)
+TRAP(24, trap_isr_24)
+TRAP(25, trap_isr_25)
+TRAP(26, trap_isr_26)
+TRAP(27, trap_isr_27)
+TRAP(28, trap_isr_28)
+TRAP(29, trap_isr_29)
+TRAP(31, trap_isr_31)
+
+/* Generic trap handlers */
+TRAP(30, trap_isr_30)
+TRAP(32, trap_isr_32)
+TRAP(33, trap_isr_33)
+TRAP(34, trap_isr_34)
+TRAP(35, trap_isr_35)
+TRAP(36, trap_isr_36)
+TRAP(37, trap_isr_37)
+TRAP(38, trap_isr_38)
+TRAP(39, trap_isr_39)
+TRAP(40, trap_isr_40)
+TRAP(41, trap_isr_41)
+TRAP(42, trap_isr_42)
+TRAP(43, trap_isr_43)
+TRAP(44, trap_isr_44)
+TRAP(45, trap_isr_45)
+TRAP(46, trap_isr_46)
+TRAP(47, trap_isr_47)
+TRAP(48, trap_isr_48)
+TRAP(49, trap_isr_49)
+TRAP(50, trap_isr_50)
+TRAP(51, trap_isr_51)
+TRAP(52, trap_isr_52)
+TRAP(53, trap_isr_53)
+TRAP(54, trap_isr_54)
+TRAP(55, trap_isr_55)
+TRAP(56, trap_isr_56)
+TRAP(57, trap_isr_57)
+TRAP(58, trap_isr_58)
+TRAP(59, trap_isr_59)
+TRAP(60, trap_isr_60)
+TRAP(61, trap_isr_61)
+TRAP(62, trap_isr_62)
+TRAP(63, trap_isr_63)
+TRAP(64, trap_isr_64)
+TRAP(65, trap_isr_65)
+TRAP(66, trap_isr_66)
+TRAP(67, trap_isr_67)
+TRAP(68, trap_isr_68)
+TRAP(69, trap_isr_69)
+TRAP(70, trap_isr_70)
+TRAP(71, trap_isr_71)
+TRAP(72, trap_isr_72)
+TRAP(73, trap_isr_73)
+TRAP(74, trap_isr_74)
+TRAP(75, trap_isr_75)
+TRAP(76, trap_isr_76)
+TRAP(77, trap_isr_77)
+TRAP(78, trap_isr_78)
+TRAP(79, trap_isr_79)
+TRAP(80, trap_isr_80)
+TRAP(81, trap_isr_81)
+TRAP(82, trap_isr_82)
+TRAP(83, trap_isr_83)
+TRAP(84, trap_isr_84)
+TRAP(85, trap_isr_85)
+TRAP(86, trap_isr_86)
+TRAP(87, trap_isr_87)
+TRAP(88, trap_isr_88)
+TRAP(89, trap_isr_89)
+TRAP(90, trap_isr_90)
+TRAP(91, trap_isr_91)
+TRAP(92, trap_isr_92)
+TRAP(93, trap_isr_93)
+TRAP(94, trap_isr_94)
+TRAP(95, trap_isr_95)
+TRAP(96, trap_isr_96)
+TRAP(97, trap_isr_97)
+TRAP(98, trap_isr_98)
+TRAP(99, trap_isr_99)
+TRAP(100, trap_isr_100)
+TRAP(101, trap_isr_101)
+TRAP(102, trap_isr_102)
+TRAP(103, trap_isr_103)
+TRAP(104, trap_isr_104)
+TRAP(105, trap_isr_105)
+TRAP(106, trap_isr_106)
+TRAP(107, trap_isr_107)
+TRAP(108, trap_isr_108)
+TRAP(109, trap_isr_109)
+TRAP(110, trap_isr_110)
+TRAP(111, trap_isr_111)
+TRAP(112, trap_isr_112)
+TRAP(113, trap_isr_113)
+TRAP(114, trap_isr_114)
+TRAP(115, trap_isr_115)
+TRAP(116, trap_isr_116)
+TRAP(117, trap_isr_117)
+TRAP(118, trap_isr_118)
+TRAP(119, trap_isr_119)
+TRAP(120, trap_isr_120)
+TRAP(121, trap_isr_121)
+TRAP(122, trap_isr_122)
+TRAP(123, trap_isr_123)
+TRAP(124, trap_isr_124)
+TRAP(125, trap_isr_125)
+TRAP(126, trap_isr_126)
+TRAP(127, trap_isr_127)
+TRAP(128, trap_isr_128)
+TRAP(129, trap_isr_129)
+TRAP(130, trap_isr_130)
+TRAP(131, trap_isr_131)
+TRAP(132, trap_isr_132)
+TRAP(133, trap_isr_133)
+TRAP(134, trap_isr_134)
+TRAP(135, trap_isr_135)
+TRAP(136, trap_isr_136)
+TRAP(137, trap_isr_137)
+TRAP(138, trap_isr_138)
+TRAP(139, trap_isr_139)
+TRAP(140, trap_isr_140)
+TRAP(141, trap_isr_141)
+TRAP(142, trap_isr_142)
+TRAP(143, trap_isr_143)
+TRAP(144, trap_isr_144)
+TRAP(145, trap_isr_145)
+TRAP(146, trap_isr_146)
+TRAP(147, trap_isr_147)
+TRAP(148, trap_isr_148)
+TRAP(149, trap_isr_149)
+TRAP(150, trap_isr_150)
+TRAP(151, trap_isr_151)
+TRAP(152, trap_isr_152)
+TRAP(153, trap_isr_153)
+TRAP(154, trap_isr_154)
+TRAP(155, trap_isr_155)
+TRAP(156, trap_isr_156)
+TRAP(157, trap_isr_157)
+TRAP(158, trap_isr_158)
+TRAP(159, trap_isr_159)
+TRAP(160, trap_isr_160)
+TRAP(161, trap_isr_161)
+TRAP(162, trap_isr_162)
+TRAP(163, trap_isr_163)
+TRAP(164, trap_isr_164)
+TRAP(165, trap_isr_165)
+TRAP(166, trap_isr_166)
+TRAP(167, trap_isr_167)
+TRAP(168, trap_isr_168)
+TRAP(169, trap_isr_169)
+TRAP(170, trap_isr_170)
+TRAP(171, trap_isr_171)
+TRAP(172, trap_isr_172)
+TRAP(173, trap_isr_173)
+TRAP(174, trap_isr_174)
+TRAP(175, trap_isr_175)
+TRAP(176, trap_isr_176)
+TRAP(177, trap_isr_177)
+TRAP(178, trap_isr_178)
+TRAP(179, trap_isr_179)
+TRAP(180, trap_isr_180)
+TRAP(181, trap_isr_181)
+TRAP(182, trap_isr_182)
+TRAP(183, trap_isr_183)
+TRAP(184, trap_isr_184)
+TRAP(185, trap_isr_185)
+TRAP(186, trap_isr_186)
+TRAP(187, trap_isr_187)
+TRAP(188, trap_isr_188)
+TRAP(189, trap_isr_189)
+TRAP(190, trap_isr_190)
+TRAP(191, trap_isr_191)
+TRAP(192, trap_isr_192)
+TRAP(193, trap_isr_193)
+TRAP(194, trap_isr_194)
+TRAP(195, trap_isr_195)
+TRAP(196, trap_isr_196)
+TRAP(197, trap_isr_197)
+TRAP(198, trap_isr_198)
+TRAP(199, trap_isr_199)
+TRAP(200, trap_isr_200)
+TRAP(201, trap_isr_201)
+TRAP(202, trap_isr_202)
+TRAP(203, trap_isr_203)
+TRAP(204, trap_isr_204)
+TRAP(205, trap_isr_205)
+TRAP(206, trap_isr_206)
+TRAP(207, trap_isr_207)
+TRAP(208, trap_isr_208)
+TRAP(209, trap_isr_209)
+TRAP(210, trap_isr_210)
+TRAP(211, trap_isr_211)
+TRAP(212, trap_isr_212)
+TRAP(213, trap_isr_213)
+TRAP(214, trap_isr_214)
+TRAP(215, trap_isr_215)
+TRAP(216, trap_isr_216)
+TRAP(217, trap_isr_217)
+TRAP(218, trap_isr_218)
+TRAP(219, trap_isr_219)
+TRAP(220, trap_isr_220)
+TRAP(221, trap_isr_221)
+TRAP(222, trap_isr_222)
+TRAP(223, trap_isr_223)
+TRAP(224, trap_isr_224)
+TRAP(225, trap_isr_225)
+TRAP(226, trap_isr_226)
+TRAP(227, trap_isr_227)
+TRAP(228, trap_isr_228)
+TRAP(229, trap_isr_229)
+TRAP(230, trap_isr_230)
+TRAP(231, trap_isr_231)
+TRAP(232, trap_isr_232)
+TRAP(233, trap_isr_233)
+TRAP(234, trap_isr_234)
+TRAP(235, trap_isr_235)
+TRAP(236, trap_isr_236)
+TRAP(237, trap_isr_237)
+TRAP(238, trap_isr_238)
+TRAP(239, trap_isr_239)
+TRAP(240, trap_isr_240)
+TRAP(241, trap_isr_241)
+TRAP(242, trap_isr_242)
+TRAP(243, trap_isr_243)
+TRAP(244, trap_isr_244)
+TRAP(245, trap_isr_245)
+TRAP(246, trap_isr_246)
+TRAP(247, trap_isr_247)
+TRAP(248, trap_isr_248)
+TRAP(249, trap_isr_249)
+TRAP(250, trap_isr_250)
+TRAP(251, trap_isr_251)
+TRAP(252, trap_isr_252)
+TRAP(253, trap_isr_253)
+TRAP(254, trap_isr_254)
+TRAP(255, trap_isr_255)
+
+#ifdef __LP64__
+#define TRAP_TABLE_ENTRY(name) .quad name
+#else /* __LP64__ */
+#define TRAP_TABLE_ENTRY(name) .long name
+#endif /* __LP64__ */
-/* System defined traps */
-TRAP(TRAP_XCALL, trap_isr_xcall)
-TRAP(TRAP_THREAD_SCHEDULE, trap_isr_thread_schedule)
-TRAP(TRAP_CPU_HALT, trap_isr_cpu_halt)
-TRAP(TRAP_LAPIC_TIMER, trap_isr_lapic_timer)
-TRAP(TRAP_LAPIC_ERROR, trap_isr_lapic_error)
-TRAP(TRAP_LAPIC_SPURIOUS, trap_isr_lapic_spurious)
+.section INIT_DATA_SECTION
-/* Unhandled traps */
-TRAP(TRAP_DEFAULT, trap_isr_default)
+/*
+ * This table lists all interrupt service routines as installed in the
+ * IDT.
+ */
+ASM_DATA(trap_isr_table)
+TRAP_TABLE_ENTRY(trap_isr_divide_error)
+TRAP_TABLE_ENTRY(trap_isr_debug)
+TRAP_TABLE_ENTRY(trap_isr_nmi)
+TRAP_TABLE_ENTRY(trap_isr_breakpoint)
+TRAP_TABLE_ENTRY(trap_isr_overflow)
+TRAP_TABLE_ENTRY(trap_isr_bound_range)
+TRAP_TABLE_ENTRY(trap_isr_invalid_opcode)
+TRAP_TABLE_ENTRY(trap_isr_device_not_available)
+TRAP_TABLE_ENTRY(trap_isr_double_fault)
+TRAP_TABLE_ENTRY(trap_isr_9)
+TRAP_TABLE_ENTRY(trap_isr_invalid_tss)
+TRAP_TABLE_ENTRY(trap_isr_segment_not_present)
+TRAP_TABLE_ENTRY(trap_isr_stack_segment_fault)
+TRAP_TABLE_ENTRY(trap_isr_general_protection)
+TRAP_TABLE_ENTRY(trap_isr_page_fault)
+TRAP_TABLE_ENTRY(trap_isr_15)
+TRAP_TABLE_ENTRY(trap_isr_math_fault)
+TRAP_TABLE_ENTRY(trap_isr_alignment_check)
+TRAP_TABLE_ENTRY(trap_isr_machine_check)
+TRAP_TABLE_ENTRY(trap_isr_simd_fp_exception)
+TRAP_TABLE_ENTRY(trap_isr_20)
+TRAP_TABLE_ENTRY(trap_isr_21)
+TRAP_TABLE_ENTRY(trap_isr_22)
+TRAP_TABLE_ENTRY(trap_isr_23)
+TRAP_TABLE_ENTRY(trap_isr_24)
+TRAP_TABLE_ENTRY(trap_isr_25)
+TRAP_TABLE_ENTRY(trap_isr_26)
+TRAP_TABLE_ENTRY(trap_isr_27)
+TRAP_TABLE_ENTRY(trap_isr_28)
+TRAP_TABLE_ENTRY(trap_isr_29)
+TRAP_TABLE_ENTRY(trap_isr_30)
+TRAP_TABLE_ENTRY(trap_isr_31)
+TRAP_TABLE_ENTRY(trap_isr_32)
+TRAP_TABLE_ENTRY(trap_isr_33)
+TRAP_TABLE_ENTRY(trap_isr_34)
+TRAP_TABLE_ENTRY(trap_isr_35)
+TRAP_TABLE_ENTRY(trap_isr_36)
+TRAP_TABLE_ENTRY(trap_isr_37)
+TRAP_TABLE_ENTRY(trap_isr_38)
+TRAP_TABLE_ENTRY(trap_isr_39)
+TRAP_TABLE_ENTRY(trap_isr_40)
+TRAP_TABLE_ENTRY(trap_isr_41)
+TRAP_TABLE_ENTRY(trap_isr_42)
+TRAP_TABLE_ENTRY(trap_isr_43)
+TRAP_TABLE_ENTRY(trap_isr_44)
+TRAP_TABLE_ENTRY(trap_isr_45)
+TRAP_TABLE_ENTRY(trap_isr_46)
+TRAP_TABLE_ENTRY(trap_isr_47)
+TRAP_TABLE_ENTRY(trap_isr_48)
+TRAP_TABLE_ENTRY(trap_isr_49)
+TRAP_TABLE_ENTRY(trap_isr_50)
+TRAP_TABLE_ENTRY(trap_isr_51)
+TRAP_TABLE_ENTRY(trap_isr_52)
+TRAP_TABLE_ENTRY(trap_isr_53)
+TRAP_TABLE_ENTRY(trap_isr_54)
+TRAP_TABLE_ENTRY(trap_isr_55)
+TRAP_TABLE_ENTRY(trap_isr_56)
+TRAP_TABLE_ENTRY(trap_isr_57)
+TRAP_TABLE_ENTRY(trap_isr_58)
+TRAP_TABLE_ENTRY(trap_isr_59)
+TRAP_TABLE_ENTRY(trap_isr_60)
+TRAP_TABLE_ENTRY(trap_isr_61)
+TRAP_TABLE_ENTRY(trap_isr_62)
+TRAP_TABLE_ENTRY(trap_isr_63)
+TRAP_TABLE_ENTRY(trap_isr_64)
+TRAP_TABLE_ENTRY(trap_isr_65)
+TRAP_TABLE_ENTRY(trap_isr_66)
+TRAP_TABLE_ENTRY(trap_isr_67)
+TRAP_TABLE_ENTRY(trap_isr_68)
+TRAP_TABLE_ENTRY(trap_isr_69)
+TRAP_TABLE_ENTRY(trap_isr_70)
+TRAP_TABLE_ENTRY(trap_isr_71)
+TRAP_TABLE_ENTRY(trap_isr_72)
+TRAP_TABLE_ENTRY(trap_isr_73)
+TRAP_TABLE_ENTRY(trap_isr_74)
+TRAP_TABLE_ENTRY(trap_isr_75)
+TRAP_TABLE_ENTRY(trap_isr_76)
+TRAP_TABLE_ENTRY(trap_isr_77)
+TRAP_TABLE_ENTRY(trap_isr_78)
+TRAP_TABLE_ENTRY(trap_isr_79)
+TRAP_TABLE_ENTRY(trap_isr_80)
+TRAP_TABLE_ENTRY(trap_isr_81)
+TRAP_TABLE_ENTRY(trap_isr_82)
+TRAP_TABLE_ENTRY(trap_isr_83)
+TRAP_TABLE_ENTRY(trap_isr_84)
+TRAP_TABLE_ENTRY(trap_isr_85)
+TRAP_TABLE_ENTRY(trap_isr_86)
+TRAP_TABLE_ENTRY(trap_isr_87)
+TRAP_TABLE_ENTRY(trap_isr_88)
+TRAP_TABLE_ENTRY(trap_isr_89)
+TRAP_TABLE_ENTRY(trap_isr_90)
+TRAP_TABLE_ENTRY(trap_isr_91)
+TRAP_TABLE_ENTRY(trap_isr_92)
+TRAP_TABLE_ENTRY(trap_isr_93)
+TRAP_TABLE_ENTRY(trap_isr_94)
+TRAP_TABLE_ENTRY(trap_isr_95)
+TRAP_TABLE_ENTRY(trap_isr_96)
+TRAP_TABLE_ENTRY(trap_isr_97)
+TRAP_TABLE_ENTRY(trap_isr_98)
+TRAP_TABLE_ENTRY(trap_isr_99)
+TRAP_TABLE_ENTRY(trap_isr_100)
+TRAP_TABLE_ENTRY(trap_isr_101)
+TRAP_TABLE_ENTRY(trap_isr_102)
+TRAP_TABLE_ENTRY(trap_isr_103)
+TRAP_TABLE_ENTRY(trap_isr_104)
+TRAP_TABLE_ENTRY(trap_isr_105)
+TRAP_TABLE_ENTRY(trap_isr_106)
+TRAP_TABLE_ENTRY(trap_isr_107)
+TRAP_TABLE_ENTRY(trap_isr_108)
+TRAP_TABLE_ENTRY(trap_isr_109)
+TRAP_TABLE_ENTRY(trap_isr_110)
+TRAP_TABLE_ENTRY(trap_isr_111)
+TRAP_TABLE_ENTRY(trap_isr_112)
+TRAP_TABLE_ENTRY(trap_isr_113)
+TRAP_TABLE_ENTRY(trap_isr_114)
+TRAP_TABLE_ENTRY(trap_isr_115)
+TRAP_TABLE_ENTRY(trap_isr_116)
+TRAP_TABLE_ENTRY(trap_isr_117)
+TRAP_TABLE_ENTRY(trap_isr_118)
+TRAP_TABLE_ENTRY(trap_isr_119)
+TRAP_TABLE_ENTRY(trap_isr_120)
+TRAP_TABLE_ENTRY(trap_isr_121)
+TRAP_TABLE_ENTRY(trap_isr_122)
+TRAP_TABLE_ENTRY(trap_isr_123)
+TRAP_TABLE_ENTRY(trap_isr_124)
+TRAP_TABLE_ENTRY(trap_isr_125)
+TRAP_TABLE_ENTRY(trap_isr_126)
+TRAP_TABLE_ENTRY(trap_isr_127)
+TRAP_TABLE_ENTRY(trap_isr_128)
+TRAP_TABLE_ENTRY(trap_isr_129)
+TRAP_TABLE_ENTRY(trap_isr_130)
+TRAP_TABLE_ENTRY(trap_isr_131)
+TRAP_TABLE_ENTRY(trap_isr_132)
+TRAP_TABLE_ENTRY(trap_isr_133)
+TRAP_TABLE_ENTRY(trap_isr_134)
+TRAP_TABLE_ENTRY(trap_isr_135)
+TRAP_TABLE_ENTRY(trap_isr_136)
+TRAP_TABLE_ENTRY(trap_isr_137)
+TRAP_TABLE_ENTRY(trap_isr_138)
+TRAP_TABLE_ENTRY(trap_isr_139)
+TRAP_TABLE_ENTRY(trap_isr_140)
+TRAP_TABLE_ENTRY(trap_isr_141)
+TRAP_TABLE_ENTRY(trap_isr_142)
+TRAP_TABLE_ENTRY(trap_isr_143)
+TRAP_TABLE_ENTRY(trap_isr_144)
+TRAP_TABLE_ENTRY(trap_isr_145)
+TRAP_TABLE_ENTRY(trap_isr_146)
+TRAP_TABLE_ENTRY(trap_isr_147)
+TRAP_TABLE_ENTRY(trap_isr_148)
+TRAP_TABLE_ENTRY(trap_isr_149)
+TRAP_TABLE_ENTRY(trap_isr_150)
+TRAP_TABLE_ENTRY(trap_isr_151)
+TRAP_TABLE_ENTRY(trap_isr_152)
+TRAP_TABLE_ENTRY(trap_isr_153)
+TRAP_TABLE_ENTRY(trap_isr_154)
+TRAP_TABLE_ENTRY(trap_isr_155)
+TRAP_TABLE_ENTRY(trap_isr_156)
+TRAP_TABLE_ENTRY(trap_isr_157)
+TRAP_TABLE_ENTRY(trap_isr_158)
+TRAP_TABLE_ENTRY(trap_isr_159)
+TRAP_TABLE_ENTRY(trap_isr_160)
+TRAP_TABLE_ENTRY(trap_isr_161)
+TRAP_TABLE_ENTRY(trap_isr_162)
+TRAP_TABLE_ENTRY(trap_isr_163)
+TRAP_TABLE_ENTRY(trap_isr_164)
+TRAP_TABLE_ENTRY(trap_isr_165)
+TRAP_TABLE_ENTRY(trap_isr_166)
+TRAP_TABLE_ENTRY(trap_isr_167)
+TRAP_TABLE_ENTRY(trap_isr_168)
+TRAP_TABLE_ENTRY(trap_isr_169)
+TRAP_TABLE_ENTRY(trap_isr_170)
+TRAP_TABLE_ENTRY(trap_isr_171)
+TRAP_TABLE_ENTRY(trap_isr_172)
+TRAP_TABLE_ENTRY(trap_isr_173)
+TRAP_TABLE_ENTRY(trap_isr_174)
+TRAP_TABLE_ENTRY(trap_isr_175)
+TRAP_TABLE_ENTRY(trap_isr_176)
+TRAP_TABLE_ENTRY(trap_isr_177)
+TRAP_TABLE_ENTRY(trap_isr_178)
+TRAP_TABLE_ENTRY(trap_isr_179)
+TRAP_TABLE_ENTRY(trap_isr_180)
+TRAP_TABLE_ENTRY(trap_isr_181)
+TRAP_TABLE_ENTRY(trap_isr_182)
+TRAP_TABLE_ENTRY(trap_isr_183)
+TRAP_TABLE_ENTRY(trap_isr_184)
+TRAP_TABLE_ENTRY(trap_isr_185)
+TRAP_TABLE_ENTRY(trap_isr_186)
+TRAP_TABLE_ENTRY(trap_isr_187)
+TRAP_TABLE_ENTRY(trap_isr_188)
+TRAP_TABLE_ENTRY(trap_isr_189)
+TRAP_TABLE_ENTRY(trap_isr_190)
+TRAP_TABLE_ENTRY(trap_isr_191)
+TRAP_TABLE_ENTRY(trap_isr_192)
+TRAP_TABLE_ENTRY(trap_isr_193)
+TRAP_TABLE_ENTRY(trap_isr_194)
+TRAP_TABLE_ENTRY(trap_isr_195)
+TRAP_TABLE_ENTRY(trap_isr_196)
+TRAP_TABLE_ENTRY(trap_isr_197)
+TRAP_TABLE_ENTRY(trap_isr_198)
+TRAP_TABLE_ENTRY(trap_isr_199)
+TRAP_TABLE_ENTRY(trap_isr_200)
+TRAP_TABLE_ENTRY(trap_isr_201)
+TRAP_TABLE_ENTRY(trap_isr_202)
+TRAP_TABLE_ENTRY(trap_isr_203)
+TRAP_TABLE_ENTRY(trap_isr_204)
+TRAP_TABLE_ENTRY(trap_isr_205)
+TRAP_TABLE_ENTRY(trap_isr_206)
+TRAP_TABLE_ENTRY(trap_isr_207)
+TRAP_TABLE_ENTRY(trap_isr_208)
+TRAP_TABLE_ENTRY(trap_isr_209)
+TRAP_TABLE_ENTRY(trap_isr_210)
+TRAP_TABLE_ENTRY(trap_isr_211)
+TRAP_TABLE_ENTRY(trap_isr_212)
+TRAP_TABLE_ENTRY(trap_isr_213)
+TRAP_TABLE_ENTRY(trap_isr_214)
+TRAP_TABLE_ENTRY(trap_isr_215)
+TRAP_TABLE_ENTRY(trap_isr_216)
+TRAP_TABLE_ENTRY(trap_isr_217)
+TRAP_TABLE_ENTRY(trap_isr_218)
+TRAP_TABLE_ENTRY(trap_isr_219)
+TRAP_TABLE_ENTRY(trap_isr_220)
+TRAP_TABLE_ENTRY(trap_isr_221)
+TRAP_TABLE_ENTRY(trap_isr_222)
+TRAP_TABLE_ENTRY(trap_isr_223)
+TRAP_TABLE_ENTRY(trap_isr_224)
+TRAP_TABLE_ENTRY(trap_isr_225)
+TRAP_TABLE_ENTRY(trap_isr_226)
+TRAP_TABLE_ENTRY(trap_isr_227)
+TRAP_TABLE_ENTRY(trap_isr_228)
+TRAP_TABLE_ENTRY(trap_isr_229)
+TRAP_TABLE_ENTRY(trap_isr_230)
+TRAP_TABLE_ENTRY(trap_isr_231)
+TRAP_TABLE_ENTRY(trap_isr_232)
+TRAP_TABLE_ENTRY(trap_isr_233)
+TRAP_TABLE_ENTRY(trap_isr_234)
+TRAP_TABLE_ENTRY(trap_isr_235)
+TRAP_TABLE_ENTRY(trap_isr_236)
+TRAP_TABLE_ENTRY(trap_isr_237)
+TRAP_TABLE_ENTRY(trap_isr_238)
+TRAP_TABLE_ENTRY(trap_isr_239)
+TRAP_TABLE_ENTRY(trap_isr_240)
+TRAP_TABLE_ENTRY(trap_isr_241)
+TRAP_TABLE_ENTRY(trap_isr_242)
+TRAP_TABLE_ENTRY(trap_isr_243)
+TRAP_TABLE_ENTRY(trap_isr_244)
+TRAP_TABLE_ENTRY(trap_isr_245)
+TRAP_TABLE_ENTRY(trap_isr_246)
+TRAP_TABLE_ENTRY(trap_isr_247)
+TRAP_TABLE_ENTRY(trap_isr_248)
+TRAP_TABLE_ENTRY(trap_isr_249)
+TRAP_TABLE_ENTRY(trap_isr_250)
+TRAP_TABLE_ENTRY(trap_isr_251)
+TRAP_TABLE_ENTRY(trap_isr_252)
+TRAP_TABLE_ENTRY(trap_isr_253)
+TRAP_TABLE_ENTRY(trap_isr_254)
+TRAP_TABLE_ENTRY(trap_isr_255)
+ASM_END(trap_isr_table)