#define stack_words_per_line 4
#define ESP_BEFORE_EXCEPTION(regs) ((unsigned long *)regs->rsp)
+static void do_trap(struct cpu_user_regs *regs);
+static void do_reserved_trap(struct cpu_user_regs *regs);
+
+void (* const exception_table[TRAP_nr])(struct cpu_user_regs *regs) = {
+ [TRAP_divide_error] = do_trap,
+ [TRAP_debug] = do_debug,
+ [TRAP_nmi] = (void *)do_nmi,
+ [TRAP_int3] = do_int3,
+ [TRAP_overflow] = do_trap,
+ [TRAP_bounds] = do_trap,
+ [TRAP_invalid_op] = do_invalid_op,
+ [TRAP_no_device] = do_device_not_available,
+ [TRAP_double_fault] = do_reserved_trap,
+ [TRAP_copro_seg] = do_reserved_trap,
+ [TRAP_invalid_tss] = do_trap,
+ [TRAP_no_segment] = do_trap,
+ [TRAP_stack_error] = do_trap,
+ [TRAP_gp_fault] = do_general_protection,
+ [TRAP_page_fault] = do_page_fault,
+ [TRAP_spurious_int] = do_reserved_trap,
+ [TRAP_copro_error] = do_trap,
+ [TRAP_alignment_check] = do_trap,
+ [TRAP_machine_check] = (void *)do_machine_check,
+ [TRAP_simd_error] = do_trap,
+ [TRAP_virtualisation ...
+ (ARRAY_SIZE(exception_table) - 1)] = do_reserved_trap,
+};
+
static void show_code(const struct cpu_user_regs *regs)
{
unsigned char insns_before[8] = {}, insns_after[16] = {};
(regs->eflags & X86_EFLAGS_IF) ? "" : ", IN INTERRUPT CONTEXT");
}
-void do_reserved_trap(struct cpu_user_regs *regs)
+static void do_reserved_trap(struct cpu_user_regs *regs)
{
unsigned int trapnr = regs->entry_vector;
panic("FATAL RESERVED TRAP %#x: %s", trapnr, trapstr(trapnr));
}
-void do_trap(struct cpu_user_regs *regs)
+static void do_trap(struct cpu_user_regs *regs)
{
struct vcpu *curr = current;
unsigned int trapnr = regs->entry_vector;
GLOBAL(trap_nop)
iretq
-
-
-.section .rodata, "a", @progbits
-
-ENTRY(exception_table)
- .quad do_trap
- .quad do_debug
- .quad do_nmi
- .quad do_int3
- .quad do_trap
- .quad do_trap
- .quad do_invalid_op
- .quad do_device_not_available
- .quad do_reserved_trap /* double_fault - has its own entry. */
- .quad do_reserved_trap /* coproc_seg_overrun - Intel 387 only. */
- .quad do_trap
- .quad do_trap
- .quad do_trap
- .quad do_general_protection
- .quad do_page_fault
- .quad do_reserved_trap /* Default PIC spurious irq - architecturally reserved. */
- .quad do_trap
- .quad do_trap
- .quad do_machine_check
- .quad do_trap
- .rept TRAP_nr - ((. - exception_table) / 8)
- .quad do_reserved_trap /* Architecturally reserved exceptions. */
- .endr
- .size exception_table, . - exception_table
-
/* Table of automatically generated entry points. One per vector. */
.section .init.rodata, "a", @progbits
GLOBAL(autogen_entrypoints)