X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=sim%2Ferc32%2Ffunc.c;h=4743aadf04c676cca919596d130da79ddc68c330;hb=3922b302645fda04da42a5279399578ae2f6206c;hp=479c5eeadbab34fc7c8411084900db99c174a65e;hpb=510d27512cb053e8a9f8c622a5f86840be8c21ac;p=deliverable%2Fbinutils-gdb.git diff --git a/sim/erc32/func.c b/sim/erc32/func.c index 479c5eeadb..4743aadf04 100644 --- a/sim/erc32/func.c +++ b/sim/erc32/func.c @@ -1,23 +1,20 @@ -/* - * func.c, misc simulator functions. This file is part of SIS. - * - * SIS, SPARC instruction simulator V1.8 Copyright (C) 1995 Jiri Gaisler, - * European Space Agency - * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, see . - * - */ +/* This file is part of SIS (SPARC instruction simulator) + + Copyright (C) 1995-2020 Free Software Foundation, Inc. + Contributed by Jiri Gaisler, European Space Agency + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #include "config.h" #include @@ -30,10 +27,8 @@ #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; @@ -184,18 +179,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; } @@ -787,15 +774,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"); @@ -809,22 +796,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('.'); } @@ -839,11 +829,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"); @@ -1041,6 +1034,7 @@ bfd_load (const char *fname) asection *section; bfd *pbfd; const bfd_arch_info_type *arch; + int i; pbfd = bfd_openr(fname, 0); @@ -1054,25 +1048,17 @@ bfd_load (const char *fname) } 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) { - if (bfd_get_section_flags(pbfd, section) & SEC_ALLOC) { + if (bfd_section_flags (section) & SEC_ALLOC) { bfd_vma section_address; unsigned long section_size; const char *section_name; - section_name = bfd_get_section_name(pbfd, section); + section_name = bfd_section_name (section); - section_address = bfd_get_section_vma(pbfd, section); + section_address = bfd_section_vma (section); /* * Adjust sections from a.out files, since they don't carry their * addresses with. @@ -1093,22 +1079,19 @@ bfd_load (const char *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); } } } - section_size = bfd_section_size(pbfd, section); + section_size = bfd_section_size (section); if (sis_verbose) printf("\nsection %s at 0x%08lx (0x%lx bytes)", section_name, section_address, section_size); /* Text, data or lit */ - if (bfd_get_section_flags(pbfd, section) & SEC_LOAD) { + if (bfd_section_flags (section) & SEC_LOAD) { file_ptr fptr; fptr = 0; @@ -1121,7 +1104,8 @@ bfd_load (const char *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;