|
|
1.1 root 1: #include "config.h"
2: #include "libopenbios/bindings.h"
3: #include "asm/types.h"
4:
5:
6:
7: /* program counter */
8: extern ucell PC;
9:
10: extern unsigned char *dict;
11: extern cell dicthead;
12: extern ucell *last;
13:
14:
15:
16: struct eregs {
17: uint32_t eax, ecx, edx, ebx, esp, ebp, esi, edi;
18: uint32_t vector;
19: uint32_t error_code;
20: uint32_t eip;
21: uint32_t cs;
22: uint32_t eflags;
23: };
24:
25: static const char * const exception_names[]= {
26: "division by zero",
27: "single step",
28: "NMI",
29: "breakpoint",
30: "interrupt overflow",
31: "bound range exceeded",
32: "invalid opcode",
33: "device unavailable",
34: "double fault",
35: "FPU segment overrun",
36: "invalid TSS",
37: "segment not present",
38: "stack exception",
39: "general protection fault",
40: "page fault",
41: "reserved",
42: "floating point exception",
43: "alignment check",
44: "machine check exception",
45: };
46:
47: void do_nothing(void);
48: void do_nothing(void)
49: {
50: printk("Doing nothing\n");
51: }
52:
53: void x86_exception(struct eregs *info);
54: void x86_exception(struct eregs *info)
55: {
56: if(info->vector <= 18) {
57: printk("\nUnexpected Exception: %s",
58: exception_names[info->vector]);
59: } else {
60: printk("\nUnexpected Exception: %d", info->vector);
61: }
62:
63: printk(
64: " @ %02x:%08lx - Halting\n"
65: "Code: %d eflags: %08lx\n"
66: "eax: %08lx ebx: %08lx ecx: %08lx edx: %08lx\n"
67: "edi: %08lx esi: %08lx ebp: %08lx esp: %08lx\n",
68: info->cs, (unsigned long)info->eip,
69: info->error_code, (unsigned long)info->eflags,
70: (unsigned long)info->eax, (unsigned long)info->ebx,
71: (unsigned long)info->ecx, (unsigned long)info->edx,
72: (unsigned long)info->edi, (unsigned long)info->esi,
73: (unsigned long)info->ebp, (unsigned long)info->esp);
74:
75: printk("\ndict=0x%x here=0x%x(dict+0x%x) pc=0x%x(dict+0x%x)\n",
76: (ucell)dict, (ucell)dict + dicthead, dicthead, PC, PC - (ucell) dict);
77: printk("dstackcnt=%d rstackcnt=%d\n",
78: dstackcnt, rstackcnt);
79:
80: rstackcnt=0;
81: dstackcnt=0;
82:
83: PC=findword("outer-interpreter");
84:
85: info->eip=(uint32_t)&do_nothing;
86:
87: /*
88: for (;;)
89: asm("hlt;");
90: ;
91: */
92: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.