Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / openbios / arch / x86 / exception.c
diff --git a/qemu/roms/openbios/arch/x86/exception.c b/qemu/roms/openbios/arch/x86/exception.c
new file mode 100644 (file)
index 0000000..fa07242
--- /dev/null
@@ -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;");
+               ;
+*/
+}