x86: Simplify architecture defined exception handling in irq_llsr()
Instead of using switch..case for architecture defined exceptions, simply unify the handling by printing a message of exception name, followed by registers dump then halt the CPU. With this unification, it also fixes the wrong exception numbers for #MF/#AC/#MC/#XM which should be 16/17/18/19 not 15/16/17/18. Signed-off-by: Bin Meng <bmeng.cn@gmail.com> Acked-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
013cf483c9
commit
3ccd49cab4
@ -32,6 +32,41 @@ DECLARE_GLOBAL_DATA_PTR;
|
|||||||
"pushl $"#x"\n" \
|
"pushl $"#x"\n" \
|
||||||
"jmp irq_common_entry\n"
|
"jmp irq_common_entry\n"
|
||||||
|
|
||||||
|
static char *exceptions[] = {
|
||||||
|
"Divide Error",
|
||||||
|
"Debug",
|
||||||
|
"NMI Interrupt",
|
||||||
|
"Breakpoint",
|
||||||
|
"Overflow",
|
||||||
|
"BOUND Range Exceeded",
|
||||||
|
"Invalid Opcode (Undefined Opcode)",
|
||||||
|
"Device Not Avaiable (No Math Coprocessor)",
|
||||||
|
"Double Fault",
|
||||||
|
"Coprocessor Segment Overrun",
|
||||||
|
"Invalid TSS",
|
||||||
|
"Segment Not Present",
|
||||||
|
"Stack Segment Fault",
|
||||||
|
"Gerneral Protection",
|
||||||
|
"Page Fault",
|
||||||
|
"Reserved",
|
||||||
|
"x87 FPU Floating-Point Error",
|
||||||
|
"Alignment Check",
|
||||||
|
"Machine Check",
|
||||||
|
"SIMD Floating-Point Exception",
|
||||||
|
"Virtualization Exception",
|
||||||
|
"Reserved",
|
||||||
|
"Reserved",
|
||||||
|
"Reserved",
|
||||||
|
"Reserved",
|
||||||
|
"Reserved",
|
||||||
|
"Reserved",
|
||||||
|
"Reserved",
|
||||||
|
"Reserved",
|
||||||
|
"Reserved",
|
||||||
|
"Reserved",
|
||||||
|
"Reserved"
|
||||||
|
};
|
||||||
|
|
||||||
static void dump_regs(struct irq_regs *regs)
|
static void dump_regs(struct irq_regs *regs)
|
||||||
{
|
{
|
||||||
unsigned long cs, eip, eflags;
|
unsigned long cs, eip, eflags;
|
||||||
@ -112,6 +147,13 @@ static void dump_regs(struct irq_regs *regs)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void do_exception(struct irq_regs *regs)
|
||||||
|
{
|
||||||
|
printf("%s\n", exceptions[regs->irq_id]);
|
||||||
|
dump_regs(regs);
|
||||||
|
hang();
|
||||||
|
}
|
||||||
|
|
||||||
struct idt_entry {
|
struct idt_entry {
|
||||||
u16 base_low;
|
u16 base_low;
|
||||||
u16 selector;
|
u16 selector;
|
||||||
@ -228,111 +270,10 @@ void irq_llsr(struct irq_regs *regs)
|
|||||||
* Order Number: 253665-029US, November 2008
|
* Order Number: 253665-029US, November 2008
|
||||||
* Table 6-1. Exceptions and Interrupts
|
* Table 6-1. Exceptions and Interrupts
|
||||||
*/
|
*/
|
||||||
switch (regs->irq_id) {
|
if (regs->irq_id < 32) {
|
||||||
case 0x00:
|
/* Architecture defined exception */
|
||||||
printf("Divide Error (Division by zero)\n");
|
do_exception(regs);
|
||||||
dump_regs(regs);
|
} else {
|
||||||
hang();
|
|
||||||
break;
|
|
||||||
case 0x01:
|
|
||||||
printf("Debug Interrupt (Single step)\n");
|
|
||||||
dump_regs(regs);
|
|
||||||
break;
|
|
||||||
case 0x02:
|
|
||||||
printf("NMI Interrupt\n");
|
|
||||||
dump_regs(regs);
|
|
||||||
break;
|
|
||||||
case 0x03:
|
|
||||||
printf("Breakpoint\n");
|
|
||||||
dump_regs(regs);
|
|
||||||
break;
|
|
||||||
case 0x04:
|
|
||||||
printf("Overflow\n");
|
|
||||||
dump_regs(regs);
|
|
||||||
hang();
|
|
||||||
break;
|
|
||||||
case 0x05:
|
|
||||||
printf("BOUND Range Exceeded\n");
|
|
||||||
dump_regs(regs);
|
|
||||||
hang();
|
|
||||||
break;
|
|
||||||
case 0x06:
|
|
||||||
printf("Invalid Opcode (UnDefined Opcode)\n");
|
|
||||||
dump_regs(regs);
|
|
||||||
hang();
|
|
||||||
break;
|
|
||||||
case 0x07:
|
|
||||||
printf("Device Not Available (No Math Coprocessor)\n");
|
|
||||||
dump_regs(regs);
|
|
||||||
hang();
|
|
||||||
break;
|
|
||||||
case 0x08:
|
|
||||||
printf("Double fault\n");
|
|
||||||
dump_regs(regs);
|
|
||||||
hang();
|
|
||||||
break;
|
|
||||||
case 0x09:
|
|
||||||
printf("Co-processor segment overrun\n");
|
|
||||||
dump_regs(regs);
|
|
||||||
hang();
|
|
||||||
break;
|
|
||||||
case 0x0a:
|
|
||||||
printf("Invalid TSS\n");
|
|
||||||
dump_regs(regs);
|
|
||||||
break;
|
|
||||||
case 0x0b:
|
|
||||||
printf("Segment Not Present\n");
|
|
||||||
dump_regs(regs);
|
|
||||||
hang();
|
|
||||||
break;
|
|
||||||
case 0x0c:
|
|
||||||
printf("Stack Segment Fault\n");
|
|
||||||
dump_regs(regs);
|
|
||||||
hang();
|
|
||||||
break;
|
|
||||||
case 0x0d:
|
|
||||||
printf("General Protection\n");
|
|
||||||
dump_regs(regs);
|
|
||||||
break;
|
|
||||||
case 0x0e:
|
|
||||||
printf("Page fault\n");
|
|
||||||
dump_regs(regs);
|
|
||||||
hang();
|
|
||||||
break;
|
|
||||||
case 0x0f:
|
|
||||||
printf("Floating-Point Error (Math Fault)\n");
|
|
||||||
dump_regs(regs);
|
|
||||||
break;
|
|
||||||
case 0x10:
|
|
||||||
printf("Alignment check\n");
|
|
||||||
dump_regs(regs);
|
|
||||||
break;
|
|
||||||
case 0x11:
|
|
||||||
printf("Machine Check\n");
|
|
||||||
dump_regs(regs);
|
|
||||||
break;
|
|
||||||
case 0x12:
|
|
||||||
printf("SIMD Floating-Point Exception\n");
|
|
||||||
dump_regs(regs);
|
|
||||||
break;
|
|
||||||
case 0x13:
|
|
||||||
case 0x14:
|
|
||||||
case 0x15:
|
|
||||||
case 0x16:
|
|
||||||
case 0x17:
|
|
||||||
case 0x18:
|
|
||||||
case 0x19:
|
|
||||||
case 0x1a:
|
|
||||||
case 0x1b:
|
|
||||||
case 0x1c:
|
|
||||||
case 0x1d:
|
|
||||||
case 0x1e:
|
|
||||||
case 0x1f:
|
|
||||||
printf("Reserved Exception\n");
|
|
||||||
dump_regs(regs);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
/* Hardware or User IRQ */
|
/* Hardware or User IRQ */
|
||||||
do_irq(regs->irq_id);
|
do_irq(regs->irq_id);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user