#include #include #include #include #include #define Extern extern #include "acid.h" extern void i386excep(void); extern void i386fpprint(int); extern int i386foll(ulong, ulong*); extern void i386printins(Map *, char, int); extern void i386printdas(Map *, int); extern void i386regfix(Reglist*); static char *excname[] = { [0] "divide error", [1] "debug exception", [4] "overflow", [5] "bounds check", [6] "invalid opcode", [7] "math coprocessor emulation", [8] "double fault", [9] "math coprocessor overrun", [10] "invalid TSS", [11] "segment not present", [12] "stack exception", [13] "general protection violation", [14] "page fault", [16] "math coprocessor error", [24] "clock", [25] "keyboard", [27] "modem status", [28] "serial line status", [30] "floppy disk", [36] "mouse", [37] "math coprocessor", [38] "hard disk", [64] "system call", }; Machdata i386mach = { {0xCC, 0, 0, 0}, /* break point: INT 3 */ 1, /* break point size */ 0, /* init */ leswab, /* convert short to local byte order */ leswal, /* convert long to local byte order */ ctrace, /* print C traceback */ findframe, /* frame finder */ 0, /* print fp registers */ i386regfix, /* grab registers */ 0, /* restore registers */ i386excep, /* print exception */ 0, /* breakpoint fixup */ 0, /* single precision float printer */ 0, /* double precision float printer */ i386foll, /* following addresses */ i386printins, /* print instruction */ 0, /* dissembler */ }; void i386regfix(Reglist *rp) { Lsym *l; while(rp->rname) { l = look(rp->rname); if(l == 0) print("lost register %s\n", rp->rname); else l->v->ival = mach->kbase+rp->roffs; rp++; } machdata->rsnarf = 0; /* Only need to fix once */ } void i386excep(void) { ulong c; static char buf[32]; c = strc.cause; if(c > 64 || excname[c] == 0) { sprint(buf, "exception %d", c); strc.excep = buf; } else strc.excep = excname[c]; }