diff options
Diffstat (limited to 'roms/openbios/arch/x86/exception.c')
-rw-r--r-- | roms/openbios/arch/x86/exception.c | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/roms/openbios/arch/x86/exception.c b/roms/openbios/arch/x86/exception.c new file mode 100644 index 000000000..fa07242c5 --- /dev/null +++ b/roms/openbios/arch/x86/exception.c @@ -0,0 +1,92 @@ +#include "config.h" +#include "libopenbios/bindings.h" +#include "asm/types.h" + + + +/* program counter */ +extern ucell PC; + +extern unsigned char *dict; +extern cell dicthead; +extern ucell *last; + + + +struct eregs { + uint32_t eax, ecx, edx, ebx, esp, ebp, esi, edi; + uint32_t vector; + uint32_t error_code; + uint32_t eip; + uint32_t cs; + uint32_t eflags; +}; + +static const char * const exception_names[]= { + "division by zero", + "single step", + "NMI", + "breakpoint", + "interrupt overflow", + "bound range exceeded", + "invalid opcode", + "device unavailable", + "double fault", + "FPU segment overrun", + "invalid TSS", + "segment not present", + "stack exception", + "general protection fault", + "page fault", + "reserved", + "floating point exception", + "alignment check", + "machine check exception", +}; + +void do_nothing(void); +void do_nothing(void) +{ + printk("Doing nothing\n"); +} + +void x86_exception(struct eregs *info); +void x86_exception(struct eregs *info) +{ + if(info->vector <= 18) { + printk("\nUnexpected Exception: %s", + exception_names[info->vector]); + } else { + printk("\nUnexpected Exception: %d", info->vector); + } + + printk( + " @ %02x:%08lx - Halting\n" + "Code: %d eflags: %08lx\n" + "eax: %08lx ebx: %08lx ecx: %08lx edx: %08lx\n" + "edi: %08lx esi: %08lx ebp: %08lx esp: %08lx\n", + info->cs, (unsigned long)info->eip, + info->error_code, (unsigned long)info->eflags, + (unsigned long)info->eax, (unsigned long)info->ebx, + (unsigned long)info->ecx, (unsigned long)info->edx, + (unsigned long)info->edi, (unsigned long)info->esi, + (unsigned long)info->ebp, (unsigned long)info->esp); + + printk("\ndict=0x%x here=0x%x(dict+0x%x) pc=0x%x(dict+0x%x)\n", + (ucell)dict, (ucell)dict + dicthead, dicthead, PC, PC - (ucell) dict); + printk("dstackcnt=%d rstackcnt=%d\n", + dstackcnt, rstackcnt); + + rstackcnt=0; + dstackcnt=0; + + PC=findword("outer-interpreter"); + + info->eip=(uint32_t)&do_nothing; + +/* + for (;;) + asm("hlt;"); + ; +*/ +} |