summaryrefslogtreecommitdiffstats
path: root/qemu/roms/openbios/arch/x86/exception.c
diff options
context:
space:
mode:
Diffstat (limited to 'qemu/roms/openbios/arch/x86/exception.c')
-rw-r--r--qemu/roms/openbios/arch/x86/exception.c92
1 files changed, 92 insertions, 0 deletions
diff --git a/qemu/roms/openbios/arch/x86/exception.c b/qemu/roms/openbios/arch/x86/exception.c
new file mode 100644
index 000000000..fa07242c5
--- /dev/null
+++ b/qemu/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;");
+ ;
+*/
+}