void show_error(const char* message, va_list list) { fprintf(stderr, "ASSERTION ERROR: "); vfprintf(stderr, message, list); printtrace(0); abort(); }
void tracetrap(regcontext_t *REGS) { u_char *addr; int n; char buf[100]; if ((R_EFLAGS & PSL_VM) == 0) return; addr = (u_char *)MAKEPTR(R_CS, R_IP); n = i386dis(R_CS, R_IP, addr, buf, 0); printtrace(REGS, buf); /* XXX */ R_EFLAGS |= PSL_T; return; /* XXX */ switch (addr[0]) { case REPNZ: case REPZ: tracetype = 2; iaddr = (u_char *)MAKEPTR(R_CS, R_IP + n); break; case PUSHF: tracetype = 4; saddr = (u_short *)MAKEPTR(R_SS, R_SP - 2); break; case POPF: tracetype = 3; saddr = (u_short *)MAKEPTR(R_SS, R_SP + 0); break; case IRET: tracetype = 3; saddr = (u_short *)MAKEPTR(R_SS, R_SP + 4); #if 0 printf("IRET: %04x %04x %04x\n", ((u_short *)MAKEPTR(R_SS, R_SP))[0], ((u_short *)MAKEPTR(R_SS, R_SP))[1], ((u_short *)MAKEPTR(R_SS, R_SP))[2]); #endif break; case OPSIZ: switch (addr[1]) { case PUSHF: tracetype = 4; saddr = (u_short *)MAKEPTR(R_SS, R_SP - 4); break; case POPF: tracetype = 3; saddr = (u_short *)MAKEPTR(R_SS, R_SP + 0); break; case IRET: tracetype = 3; saddr = (u_short *)MAKEPTR(R_SS, R_SP + 8); break; default: tracetype = 1; break; } default: tracetype = 1; break; } switch (tracetype) { case 1: case 4: if (R_EFLAGS & PSL_T) tracetype = 0; else R_EFLAGS |= PSL_T; break; case 2: if (*iaddr == TRACETRAP) tracetype = 0; else { ibyte = *iaddr; *iaddr = TRACETRAP; } break; case 3: R_EFLAGS |= PSL_T; if (*saddr & PSL_T) tracetype = 0; else *saddr |= PSL_T; break; } }