Beispiel #1
0
void show_error(const char* message, va_list list)
{
	fprintf(stderr, "ASSERTION ERROR: ");
	vfprintf(stderr, message, list);
	printtrace(0);
 	abort();
}
Beispiel #2
0
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;
    }
}