diff options
author | Richard Braun <rbraun@sceen.net> | 2017-05-23 20:32:30 +0200 |
---|---|---|
committer | Richard Braun <rbraun@sceen.net> | 2017-05-23 20:37:53 +0200 |
commit | a323e51f75ee54c9177c1173a3834dfdc7f63dda (patch) | |
tree | 38ec7524b58c3e65af5e8bb40e978fca254a9d78 /arch | |
parent | e4324d5165d9fd57ae1419d33d9a7680b7cc74a4 (diff) |
x86/trap: rework to allow registering trap handlers
Diffstat (limited to 'arch')
-rw-r--r-- | arch/x86/machine/pic.c | 6 | ||||
-rw-r--r-- | arch/x86/machine/trap.c | 145 | ||||
-rw-r--r-- | arch/x86/machine/trap.h | 51 | ||||
-rw-r--r-- | arch/x86/machine/trap_asm.S | 531 |
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) |