/* * Copyright 1993,1994,1995 Emin Gun Sirer * MIPSI - Mips Instruction Set Simulator. */ #include #include #include #include #include #include "config.h" #include "main.h" #include "mem.h" extern jmp_buf toplevel; extern void copy_to_buffer(char *destbuff, mem_addr src, unsigned size) { /* copy contents of simulated memory into a buffer */ int i; for (i = 0; i < size; i++) { destbuff[i] = *((char *)mem_address(src+i, C_READ)); } } extern void copy_from_buffer(char *srcbuff, mem_addr dest, unsigned size) { /* copy contents of a buffer into simulated memory */ int i; for (i = 0; i < size; i++) { *((char *)mem_address(dest+i, C_WRITE)) = srcbuff[i]; } } extern void error(EType serious, char *fmt, ...) { char endchar; va_list args; va_start(args, fmt); vfprintf(stderr, fmt, args); if(((endchar = fmt[strlen(fmt) - 1]) != ' ') && (endchar != '\n')) fprintf(stderr,"\n"); va_end(args); switch(serious) { case Fatal: exit(1); case TopLevel: longjmp(toplevel, 1); case Benign: return; } } extern void traceout(char *fmt, ...) { va_list args; if(systrace) { va_start(args, fmt); vfprintf(stdout, fmt, args); fflush(stdout); va_end(args); } } extern void *galloc(int size) { void *t; if((t = (void *)malloc(size)) == NULL) error(Fatal, "mipsi: malloc(%d) failed\n", size); return t; } extern void *grealloc(void *p, int size) { void *t; if((t = (void *)realloc(p,size)) == NULL) error(Fatal, "mipsi: realloc(%d) failed\n", size); return t; } extern char *strsave(char *s) { char *p = (char *) galloc(strlen(s)+1); strcpy(p, s); return p; } /* * returns 0 if t matches s upto upto c characters and if * there is more to t, then t must match s */ extern int strprefix(char *s, char *t, int c) { while((c > 0) && (*s != '\0') && (*t != '\0') && (*s == *t)) s++, t++, --c; return (c == 0) ? ((*t == '\0') ? 0: strcmp(s,t)) : *s - *t; } extern void dumpregs(int regs) { int n; printf("------------------------------------------------------------\n"); if(regs & GENREGS) { for(n=0; n < 32; n += 4) printf("R[%d] = 0x%0x\tR[%d] = 0x%0x\tR[%d] = 0x%0x\tR[%d] = 0x%0x\n", n, R[n], n+1, R[n+1], n+2, R[n+2], n+3, R[n+3]); } if(regs & FPREGS) { printf("Floating point regs (float)\n"); for(n=0; n < 32; n += 4) printf("FR[%2d] = %2.5f\tR[%2d] = %2.5f\tR[%2d] = %2.5f\tR[%2d] = %2.5f\n", n, FGR[n], n+1, FGR[n+1], n+2, FGR[n+2], n+3, FGR[n+3]); printf("Floating point regs (double)\n"); for(n=0; n < 16; n += 4) printf("FR[%2d] = %2.5f\tR[%2d] = %2.5f\tR[%2d] = %2.5f\tR[%2d] = %2.5f\n", 2*n,FPR[n], 2*(n+1),FPR[n+1], 2*(n+2),FPR[n+2], 2*(n+3),FPR[n+3]); } printf("------------------------------------------------------------\n"); }