X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=sim%2Ferc32%2Ffunc.c;h=9297e07e53dd364056aba5e1b4a64fa94030f0e4;hb=00923338dec84505addaf9cdeca2e9c844757824;hp=69d5ebaa703a37f98a2af0df9c40d6867c5a042e;hpb=9c5f41df36176d86afa65fc9b69b8fd6f6044547;p=deliverable%2Fbinutils-gdb.git diff --git a/sim/erc32/func.c b/sim/erc32/func.c index 69d5ebaa70..9297e07e53 100644 --- a/sim/erc32/func.c +++ b/sim/erc32/func.c @@ -28,11 +28,10 @@ #include "sis.h" #include #include "sim-config.h" - +#include #define VAL(x) strtoul(x,(char **)NULL,0) -extern int current_target_byte_order; struct disassemble_info dinfo; struct pstate sregs; extern struct estate ebase; @@ -79,22 +78,25 @@ batch(sregs, fname) char *fname; { FILE *fp; - char lbuf[1024]; + char *lbuf = NULL; + size_t len = 0; + size_t slen; if ((fp = fopen(fname, "r")) == NULL) { fprintf(stderr, "couldn't open batch file %s\n", fname); - return (0); + return 0; } - while (!feof(fp)) { - lbuf[0] = 0; - fgets(lbuf, 1023, fp); - if ((strlen(lbuf) > 0) && (lbuf[strlen(lbuf) - 1] == '\n')) - lbuf[strlen(lbuf) - 1] = 0; - printf("sis> %s\n", lbuf); - exec_cmd(sregs, lbuf); + while (getline(&lbuf, &len, fp) > -1) { + slen = strlen(lbuf); + if (slen && (lbuf[slen - 1] == '\n')) { + lbuf[slen - 1] = 0; + printf("sis> %s\n", lbuf); + exec_cmd(sregs, lbuf); + } } + free(lbuf); fclose(fp); - return (1); + return 1; } void @@ -180,18 +182,10 @@ get_regi(struct pstate * sregs, int32 reg, char *buf) default:break; } } - if (current_target_byte_order == BIG_ENDIAN) { - buf[0] = (rval >> 24) & 0x0ff; - buf[1] = (rval >> 16) & 0x0ff; - buf[2] = (rval >> 8) & 0x0ff; - buf[3] = rval & 0x0ff; - } - else { - buf[3] = (rval >> 24) & 0x0ff; - buf[2] = (rval >> 16) & 0x0ff; - buf[1] = (rval >> 8) & 0x0ff; - buf[0] = rval & 0x0ff; - } + buf[0] = (rval >> 24) & 0x0ff; + buf[1] = (rval >> 16) & 0x0ff; + buf[2] = (rval >> 8) & 0x0ff; + buf[3] = rval & 0x0ff; } @@ -371,23 +365,22 @@ limcalc (freq) lim = -1; } } - return (lim); + return lim; } - + int -exec_cmd(sregs, cmd) - char *cmd; - struct pstate *sregs; +exec_cmd(struct pstate *sregs, const char *cmd) { char *cmd1, *cmd2; int32 stat; uint32 len, i, clen, j; static uint32 daddr = 0; - char *cmdsave; + char *cmdsave, *cmdsave2 = NULL; stat = OK; cmdsave = strdup(cmd); - if ((cmd1 = strtok(cmd, " \t")) != NULL) { + cmdsave2 = strdup (cmd); + if ((cmd1 = strtok (cmdsave2, " \t")) != NULL) { clen = strlen(cmd1); if (strncmp(cmd1, "bp", clen) == 0) { for (i = 0; i < sregs->bptnum; i++) { @@ -553,7 +546,9 @@ exec_cmd(sregs, cmd) sim_halt(); } else if (strncmp(cmd1, "shell", clen) == 0) { if ((cmd1 = strtok(NULL, " \t\n\r")) != NULL) { - system(&cmdsave[clen]); + if (system(&cmdsave[clen])) { + /* Silence unused return value warning. */ + } } } else if (strncmp(cmd1, "step", clen) == 0) { stat = run_sim(sregs, 1, 1); @@ -602,9 +597,11 @@ exec_cmd(sregs, cmd) } else printf("syntax error\n"); } + if (cmdsave2 != NULL) + free(cmdsave2); if (cmdsave != NULL) free(cmdsave); - return (stat); + return stat; } @@ -642,8 +639,8 @@ show_stat(sregs) sregs->nbranch; #endif - printf("\n Cycles : %9d\n\r", ebase.simtime - sregs->simstart); - printf(" Instructions : %9d\n", sregs->ninst); + printf("\n Cycles : %9" PRIu64 "\n\r", ebase.simtime - sregs->simstart); + printf(" Instructions : %9" PRIu64 "\n", sregs->ninst); #ifdef STAT printf(" integer : %9.2f %%\n", 100.0 * (float) iinst / (float) sregs->ninst); @@ -743,7 +740,7 @@ disp_fpu(sregs) printf("\n"); } printf("\n"); - return (OK); + return OK; } static void @@ -780,15 +777,15 @@ disp_ctrl(sregs) struct pstate *sregs; { - unsigned char i[4]; + uint32 i; printf("\n psr: %08X wim: %08X tbr: %08X y: %08X\n", sregs->psr, sregs->wim, sregs->tbr, sregs->y); - sis_memory_read(sregs->pc, i, 4); - printf("\n pc: %08X = %02X%02X%02X%02X ", sregs->pc,i[0],i[1],i[2],i[3]); + sis_memory_read (sregs->pc, (char *) &i, 4); + printf ("\n pc: %08X = %08X ", sregs->pc, i); print_insn_sparc_sis(sregs->pc, &dinfo); - sis_memory_read(sregs->npc, i, 4); - printf("\n npc: %08X = %02X%02X%02X%02X ",sregs->npc,i[0],i[1],i[2],i[3]); + sis_memory_read (sregs->npc, (char *) &i, 4); + printf ("\n npc: %08X = %08X ", sregs->npc, i); print_insn_sparc_sis(sregs->npc, &dinfo); if (sregs->err_mode) printf("\n IU in error mode"); @@ -802,22 +799,25 @@ disp_mem(addr, len) { uint32 i; - unsigned char data[4]; + union { + unsigned char u8[4]; + uint32 u32; + } data; uint32 mem[4], j; char *p; for (i = addr & ~3; i < ((addr + len) & ~3); i += 16) { printf("\n %8X ", i); for (j = 0; j < 4; j++) { - sis_memory_read((i + (j * 4)), data, 4); - printf("%02x%02x%02x%02x ", data[0],data[1],data[2],data[3]); - mem[j] = *((int *) &data); + sis_memory_read ((i + (j * 4)), data.u8, 4); + printf ("%08x ", data.u32); + mem[j] = data.u32; } printf(" "); p = (char *) mem; for (j = 0; j < 16; j++) { - if (isprint(p[j])) - putchar(p[j]); + if (isprint (p[j ^ EBT])) + putchar (p[j ^ EBT]); else putchar('.'); } @@ -832,11 +832,14 @@ dis_mem(addr, len, info) struct disassemble_info *info; { uint32 i; - unsigned char data[4]; + union { + unsigned char u8[4]; + uint32 u32; + } data; for (i = addr & -3; i < ((addr & -3) + (len << 2)); i += 4) { - sis_memory_read(i, data, 4); - printf(" %08x %02x%02x%02x%02x ", i, data[0],data[1],data[2],data[3]); + sis_memory_read (i, data.u8, 4); + printf (" %08x %08x ", i, data.u32); print_insn_sparc_sis(i, info); if (i >= 0xfffffffc) break; printf("\n"); @@ -944,7 +947,7 @@ advance_time(sregs) uint32 now() { - return(ebase.simtime); + return ebase.simtime; } @@ -976,7 +979,7 @@ wait_for_irq() } } sregs.pwdtime += ebase.simtime - endtime; - return (ebase.simtime - endtime); + return ebase.simtime - endtime; } int @@ -986,12 +989,12 @@ check_bpt(sregs) int32 i; if ((sregs->bphit) || (sregs->annul)) - return (0); + return 0; for (i = 0; i < (int32) sregs->bptnum; i++) { if (sregs->pc == sregs->bpts[i]) - return (BPT_HIT); + return BPT_HIT; } - return (0); + return 0; } void @@ -1029,33 +1032,25 @@ sys_halt() #define LOAD_ADDRESS 0 int -bfd_load(fname) - char *fname; +bfd_load (const char *fname) { asection *section; bfd *pbfd; const bfd_arch_info_type *arch; + int i; pbfd = bfd_openr(fname, 0); if (pbfd == NULL) { printf("open of %s failed\n", fname); - return (-1); + return -1; } if (!bfd_check_format(pbfd, bfd_object)) { printf("file %s doesn't seem to be an object file\n", fname); - return (-1); + return -1; } arch = bfd_get_arch_info (pbfd); - if (bfd_little_endian (pbfd) || arch->mach == bfd_mach_sparc_sparclite_le) - current_target_byte_order = LITTLE_ENDIAN; - else - current_target_byte_order = BIG_ENDIAN; - if (sis_verbose) - printf("file %s is %s-endian.\n", fname, - current_target_byte_order == BIG_ENDIAN ? "big" : "little"); - if (sis_verbose) printf("loading %s:", fname); for (section = pbfd->sections; section; section = section->next) { @@ -1087,10 +1082,7 @@ bfd_load(fname) sizeof (marker)); if (strncmp (marker.signature, "DaTa", 4) == 0) { - if (current_target_byte_order == BIG_ENDIAN) - section_address = bfd_getb32 (marker.sdata); - else - section_address = bfd_getl32 (marker.sdata); + section_address = bfd_getb32 (marker.sdata); } } } @@ -1115,7 +1107,8 @@ bfd_load(fname) bfd_get_section_contents(pbfd, section, buffer, fptr, count); - sis_memory_write(section_address, buffer, count); + for (i = 0; i < count; i++) + sis_memory_write ((section_address + i) ^ EBT, &buffer[i], 1); section_address += count; fptr += count; @@ -1129,7 +1122,7 @@ bfd_load(fname) if (sis_verbose) printf("\n"); - return(bfd_get_start_address (pbfd)); + return bfd_get_start_address (pbfd); } double get_time (void) @@ -1140,5 +1133,5 @@ double get_time (void) gettimeofday (&tm, NULL); usec = ((double) tm.tv_sec) * 1E6 + ((double) tm.tv_usec); - return (usec / 1E6); + return usec / 1E6; }