@ -32,6 +32,41 @@ DECLARE_GLOBAL_DATA_PTR;
" pushl $ " # x " \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 )
{
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 {
u16 base_low ;
u16 selector ;
@ -228,111 +270,10 @@ void irq_llsr(struct irq_regs *regs)
* Order Number : 253665 - 02 9U S , November 2008
* Table 6 - 1. Exceptions and Interrupts
*/
switch ( regs - > irq_id ) {
case 0x00 :
printf ( " Divide Error (Division by zero) \n " ) ;
dump_regs ( regs ) ;
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 :
if ( regs - > irq_id < 32 ) {
/* Architecture defined exception */
do_exception ( regs ) ;
} else {
/* Hardware or User IRQ */
do_irq ( regs - > irq_id ) ;
}