From da3a66e5ca77e7c0c33957631800f237f05bafcb Mon Sep 17 00:00:00 2001 From: Andrew Cagney Date: Thu, 4 Sep 1997 10:10:02 +0000 Subject: [PATCH] Replace memory model with one from sim/common directory. --- sim/v850/ChangeLog | 40 ++++++ sim/v850/Makefile.in | 2 + sim/v850/configure | 18 +-- sim/v850/configure.in | 2 +- sim/v850/interp.c | 310 +++++------------------------------------- sim/v850/sim-main.h | 24 ++-- sim/v850/simops.c | 140 +++++++++++++++---- 7 files changed, 213 insertions(+), 323 deletions(-) diff --git a/sim/v850/ChangeLog b/sim/v850/ChangeLog index 73ee049f3b..d0e10adca8 100644 --- a/sim/v850/ChangeLog +++ b/sim/v850/ChangeLog @@ -1,3 +1,43 @@ +Thu Sep 4 18:11:37 1997 Andrew Cagney + + * simops.c (fetch_argv): New function, fetch a arg vector from + simulator memory. + + * configure.in: Check for fork, execve, execv. + * configure: Regenerate. + + * interp.c (sim_store_register, sim_fetch_register): Use H2T_4 and + T2H_4 for byte swapping. + + * sim-main.h, interp.c (get_word, get_half, get_byte, put_word, + put_half, put_byte): Delete. + + * Makefile.in (SIM_OBJS): Add sim-memopt.o module. + + * sim-main.h (load_mem, store_mem): Redefine as macros. + (IMEM, IMEM_IMMED): New macros - fetch instructions. + + * simops.c (OP_10007E0): For SYS_read, SYS_write, SYS_open + transfer data via a buffer. + (fetch_str): New function, fetch string from memory. + + * Makefile.in (SIM_OBJS): Add sim-hrw.o module. + + * interp.c (sim_open): Establish memory maps using sim-memopt.c + via sim_do_command. + (sim_do_command): Print error if memory-map command is used. Call + sim_args_command. + (map): Delete, replaced by sim-core. + (sim_memory_init): Delete, replaced by sim-core. + (sim_set_memory_map): Delete, replaced by sim-memopt. + (load_mem): Delete, replaced by sim-core. + (store_mem): Delete, replaced by sim-core. + (sim_write): Delete, replaced by sim-hrw. + (sim_read): Delete, replaced by sim-hrw. + + * sim-main.h (struct sim_state): Remove memory members, using + sim-core.c + Wed Sep 3 10:18:55 1997 Andrew Cagney * sim-main.h: Replace SIM_HAVE_FLATMEM with mem ptr. diff --git a/sim/v850/Makefile.in b/sim/v850/Makefile.in index 7f5f222b92..f067eb68e4 100644 --- a/sim/v850/Makefile.in +++ b/sim/v850/Makefile.in @@ -25,8 +25,10 @@ SIM_OBJS = interp.o table.o simops.o \ sim-endian.o \ sim-events.o \ sim-hload.o \ + sim-hrw.o \ sim-io.o \ sim-load.o \ + sim-memopt.o \ sim-module.o \ sim-options.o \ sim-profile.o \ diff --git a/sim/v850/configure b/sim/v850/configure index 4853d8bd13..b4e7d53685 100755 --- a/sim/v850/configure +++ b/sim/v850/configure @@ -1460,7 +1460,7 @@ fi -for ac_func in time +for ac_func in time chmod utime fork execve execv chown do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 echo "configure:1467: checking for $ac_func" >&5 @@ -1509,10 +1509,9 @@ if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then cat >> confdefs.h <&6 -utime fi done @@ -1520,17 +1519,17 @@ for ac_hdr in unistd.h stdlib.h string.h strings.h utime.h time.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:1524: checking for $ac_hdr" >&5 +echo "configure:1523: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1534: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:1533: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* @@ -1660,7 +1659,7 @@ done ac_given_srcdir=$srcdir ac_given_INSTALL="$INSTALL" -trap 'rm -fr `echo "Makefile.sim:Makefile.in Make-common.sim:../common/Make-common.in config.h:config.in" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 +trap 'rm -fr `echo "Makefile.sim:Makefile.in Make-common.sim:../common/Make-common.in .gdbinit:../common/gdbinit.in config.h:config.in" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 EOF cat >> $CONFIG_STATUS <> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then @@ -1979,7 +1978,8 @@ cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF -case "x$CONFIG_FILES" in xMakefile*) +case "x$CONFIG_FILES" in + xMakefile*) echo "Merging Makefile.sim+Make-common.sim into Makefile ..." rm -f Makesim1.tmp Makesim2.tmp Makefile sed -n -e '/^## COMMON_PRE_/,/^## End COMMON_PRE_/ p' Makesim1.tmp diff --git a/sim/v850/configure.in b/sim/v850/configure.in index 1eb128f70b..002493b5c7 100644 --- a/sim/v850/configure.in +++ b/sim/v850/configure.in @@ -9,7 +9,7 @@ SIM_AC_OPTION_ENDIAN(LITTLE_ENDIAN) SIM_AC_OPTION_HOSTENDIAN SIM_AC_OPTION_WARNINGS -AC_CHECK_FUNCS(time, chmod, utime) +AC_CHECK_FUNCS(time chmod utime fork execve execv chown) AC_CHECK_HEADERS(unistd.h stdlib.h string.h strings.h utime.h time.h) SIM_AC_OUTPUT diff --git a/sim/v850/interp.c b/sim/v850/interp.c index 03dec9c8e9..49b299665e 100644 --- a/sim/v850/interp.c +++ b/sim/v850/interp.c @@ -155,249 +155,6 @@ lookup_hash (sd, ins) return (h); } -/* FIXME These would more efficient to use than load_mem/store_mem, - but need to be changed to use the memory map. */ - -uint8 -get_byte (x) - uint8 *x; -{ - return *x; -} - -uint16 -get_half (x) - uint8 *x; -{ - uint8 *a = x; - return (a[1] << 8) + (a[0]); -} - -uint32 -get_word (x) - uint8 *x; -{ - uint8 *a = x; - return (a[3]<<24) + (a[2]<<16) + (a[1]<<8) + (a[0]); -} - -void -put_byte (addr, data) - uint8 *addr; - uint8 data; -{ - uint8 *a = addr; - a[0] = data; -} - -void -put_half (addr, data) - uint8 *addr; - uint16 data; -{ - uint8 *a = addr; - a[0] = data & 0xff; - a[1] = (data >> 8) & 0xff; -} - -void -put_word (addr, data) - uint8 *addr; - uint32 data; -{ - uint8 *a = addr; - a[0] = data & 0xff; - a[1] = (data >> 8) & 0xff; - a[2] = (data >> 16) & 0xff; - a[3] = (data >> 24) & 0xff; -} - -uint8 * -map (addr) - SIM_ADDR addr; -{ - /* Mask down to 24 bits. */ - addr &= 0xffffff; - - if (addr < 0x100000) - { - /* "Mirror" the addresses below 1MB. */ - addr = addr & (simulator->rom_size - 1); - return (uint8 *) (simulator->mem) + addr; - } - else if (addr < simulator->low_end) - { - /* chunk is just after the rom */ - addr = addr - 0x100000 + simulator->rom_size; - return (uint8 *) (simulator->mem) + addr; - } - else if (addr >= simulator->high_start) - { - /* If in the peripheral I/O region, mirror 1K region across 4K, - and similarly if in the internal RAM region. */ - if (addr >= 0xfff000) - addr &= 0xfff3ff; - else if (addr >= 0xffe000) - addr &= 0xffe3ff; - addr = addr - simulator->high_start + simulator->high_base; - return (uint8 *) (simulator->mem) + addr; - } - else - { - sim_io_eprintf (simulator, "segmentation fault: access address: %lx not below %lx or above %lx [ep = %lx]\n", - (long) addr, - (long) simulator->low_end, - (long) simulator->high_start, - State.regs[30]); - - /* Signal a memory error. */ - State.exception = SIGSEGV; - /* Point to a location not in main memory - renders invalid - addresses harmless until we get back to main insn loop. */ - return (uint8 *) &(State.dummy_mem); - } -} - -uint32 -load_mem (addr, len) - SIM_ADDR addr; - int len; -{ - uint8 *p = map (addr); - - switch (len) - { - case 1: - return p[0]; - case 2: - return p[1] << 8 | p[0]; - case 4: - return p[3] << 24 | p[2] << 16 | p[1] << 8 | p[0]; - default: - abort (); - } -} - -void -store_mem (addr, len, data) - SIM_ADDR addr; - int len; - uint32 data; -{ - uint8 *p = map (addr); - - switch (len) - { - case 1: - p[0] = data; - return; - case 2: - p[0] = data; - p[1] = data >> 8; - return; - case 4: - p[0] = data; - p[1] = data >> 8; - p[2] = data >> 16; - p[3] = data >> 24; - return; - default: - abort (); - } -} - -static void -sim_memory_init (SIM_DESC sd) -{ - int totsize; - - if (sd->mem) - zfree (sd->mem); - - totsize = (simulator->rom_size - + (sd->low_end - 0x100000) - + (0x1000000 - sd->high_start)); - - sd->high_base = sd->rom_size + (sd->low_end - 0x100000); - - sd->mem = zalloc (totsize); - if (!sd->mem) - { - sim_io_error (sd, "Allocation of main memory failed."); - } -} - -static int -sim_parse_number (str, rest) - char *str, **rest; -{ - if (str[0] == '0' && str[1] == 'x') - return strtoul (str, rest, 16); - else if (str[0] == '0') - return strtoul (str, rest, 16); - else - return strtoul (str, rest, 10); -} - -static void -sim_set_memory_map (sd, spec) - SIM_DESC sd; - char *spec; -{ - char *reststr, *nreststr; - SIM_ADDR new_low_end, new_high_start; - - new_low_end = sd->low_end; - new_high_start = sd->high_start; - if (! strncmp (spec, "hole=", 5)) - { - new_low_end = sim_parse_number (spec + 5, &reststr); - if (new_low_end < 0x100000) - { - sim_io_printf (sd, "Low end must be at least 0x100000\n"); - return; - } - if (*reststr == ',') - { - ++reststr; - new_high_start = sim_parse_number (reststr, &nreststr); - /* FIXME Check high_start also */ - } - sim_io_printf (sd, "Hole goes from 0x%x to 0x%x\n", - new_low_end, new_high_start); - } - else - { - sim_io_printf (sd, "Invalid specification for memory map, must be `hole=[,]'\n"); - } - - if (new_low_end != sd->low_end || new_high_start != sd->high_start) - { - sd->low_end = new_low_end; - sd->high_start = new_high_start; - sim_io_printf (sd, "Reconfiguring memory (old contents will be lost)\n"); - sim_memory_init (sd); - } -} - -/* Parse a number in hex, octal, or decimal form. */ - -int -sim_write (sd, addr, buffer, size) - SIM_DESC sd; - SIM_ADDR addr; - unsigned char *buffer; - int size; -{ - int i; - - for (i = 0; i < size; i++) - store_mem (addr + i, 1, buffer[i]); - - return size; -} - - SIM_DESC sim_open (kind, cb, abfd, argv) SIM_OPEN_KIND kind; @@ -405,6 +162,7 @@ sim_open (kind, cb, abfd, argv) struct _bfd *abfd; char **argv; { + char *buf; SIM_DESC sd = sim_state_alloc (kind, cb); struct simops *s; struct hash_entry *h; @@ -412,16 +170,23 @@ sim_open (kind, cb, abfd, argv) /* for compatibility */ simulator = sd; - sd->rom_size = V850_ROM_SIZE; - sd->low_end = V850_LOW_END; - sd->high_start = V850_HIGH_START; - - /* Allocate memory */ - sim_memory_init (sd); - if (sim_pre_argv_init (sd, argv[0]) != SIM_RC_OK) return 0; + /* Allocate core managed memory */ + /* "Mirror" the ROM addresses below 1MB. */ + asprintf (&buf, "memory region 0,0x100000,0x%lx", V850_ROM_SIZE); + sim_do_command (sd, buf); + free (buf); + /* Chunk of ram adjacent to rom */ + asprintf (&buf, "memory region 0x100000,0x%lx", V850_LOW_END - 0x100000); + sim_do_command (sd, buf); + free (buf); + /* peripheral I/O region - mirror 1K across 4k (0x1000) */ + sim_do_command (sd, "memory region 0xfff000,0x1000,1024"); + /* similarly if in the internal RAM region */ + sim_do_command (sd, "memory region 0xffe000,0x1000,1024"); + /* getopt will print the error message so we just have to exit if this fails. FIXME: Hmmm... in the case of gdb we need getopt to call print_filtered. */ @@ -718,7 +483,7 @@ sim_fetch_register (sd, rn, memory) int rn; unsigned char *memory; { - put_word (memory, State.regs[rn]); + *(unsigned32*)memory = H2T_4 (State.regs[rn]); } void @@ -727,22 +492,20 @@ sim_store_register (sd, rn, memory) int rn; unsigned char *memory; { - State.regs[rn] = get_word (memory); + State.regs[rn] = T2H_4 (*(unsigned32*)memory); } -int -sim_read (sd, addr, buffer, size) - SIM_DESC sd; - SIM_ADDR addr; - unsigned char *buffer; - int size; +static int +sim_parse_number (str, rest) + char *str, **rest; { - int i; - for (i = 0; i < size; i++) - buffer[i] = load_mem (addr + i, 1); - - return size; -} + if (str[0] == '0' && str[1] == 'x') + return strtoul (str, rest, 16); + else if (str[0] == '0') + return strtoul (str, rest, 16); + else + return strtoul (str, rest, 10); +} int current_intgen_number = 1; @@ -890,24 +653,13 @@ sim_do_command (sd, cmd) char *mm_cmd = "memory-map"; char *int_cmd = "interrupt"; - if (! strncmp (cmd, mm_cmd, strlen (mm_cmd)) - && strchr (" ", cmd[strlen(mm_cmd)])) - sim_set_memory_map (sd, cmd + strlen(mm_cmd) + 1); + if (strncmp (cmd, mm_cmd, strlen (mm_cmd) == 0)) + sim_io_eprintf (sd, "`memory-map' command replaced by `sim memory'\n"); else if (! strncmp (cmd, int_cmd, strlen (int_cmd)) && strchr (" ", cmd[strlen(int_cmd)])) sim_set_interrupt (sd, cmd + strlen(int_cmd) + 1); - else if (! strcmp (cmd, "help")) - { - sim_io_printf (sd, "V850 simulator commands:\n\n"); - sim_io_printf (sd, "interrupt add { pc | time } -- Set up an interrupt generator\n"); - sim_io_printf (sd, "interrupt remove -- Remove an existing interrupt generator\n"); - sim_io_printf (sd, "interrupt info -- List all the interrupt generators\n"); - sim_io_printf (sd, "memory-map hole=, -- Set the memory map to have a hole between and \n"); - sim_io_printf (sd, "\n"); - } - else - sim_io_printf (sd, "\"%s\" is not a valid V850 simulator command.\n", - cmd); + else if (sim_args_command (sd, cmd) != SIM_RC_OK) + sim_io_eprintf (sd, "Unknown command `%s'\n", cmd); } diff --git a/sim/v850/sim-main.h b/sim/v850/sim-main.h index 95838babe6..f38ef1c6da 100644 --- a/sim/v850/sim-main.h +++ b/sim/v850/sim-main.h @@ -43,11 +43,13 @@ struct sim_state { #else #define STATE_CPU(sd,n) (&(sd)->cpu[0]) #endif +#if 0 SIM_ADDR rom_size; SIM_ADDR low_end; SIM_ADDR high_start; SIM_ADDR high_base; void *mem; +#endif sim_state_base base; }; @@ -158,14 +160,18 @@ extern struct simops Simops[]; /* Function declarations. */ -uint32 get_word PARAMS ((uint8 *)); -uint16 get_half PARAMS ((uint8 *)); -uint8 get_byte PARAMS ((uint8 *)); -void put_word PARAMS ((uint8 *, uint32)); -void put_half PARAMS ((uint8 *, uint16)); -void put_byte PARAMS ((uint8 *, uint8)); +#define IMEM(EA) \ +sim_core_read_aligned_2 (STATE_CPU (sd, 0), \ + PC, sim_core_execute_map, (EA)) + +#define IMEM_IMMED(EA,N) \ +sim_core_read_aligned_2 (STATE_CPU (sd, 0), \ + PC, sim_core_execute_map, (EA) + (N) * 4) -extern uint32 load_mem PARAMS ((SIM_ADDR addr, int len)); -extern void store_mem PARAMS ((SIM_ADDR addr, int len, uint32 data)); +#define load_mem(ADDR,LEN) \ +sim_core_read_unaligned_##LEN (STATE_CPU (simulator, 0), \ + PC, sim_core_read_map, (ADDR)) -extern uint8 *map PARAMS ((SIM_ADDR addr)); +#define store_mem(ADDR,LEN,DATA) \ +sim_core_write_unaligned_##LEN (STATE_CPU (simulator, 0), \ + PC, sim_core_write_map, (ADDR), (DATA)) diff --git a/sim/v850/simops.c b/sim/v850/simops.c index 29149c6482..4926910b8b 100644 --- a/sim/v850/simops.c +++ b/sim/v850/simops.c @@ -9,6 +9,10 @@ #ifdef HAVE_TIME_H #include +#endif + +#ifdef HAVE_UNISTD_H +#include #endif /* FIXME - should be including a version of syscall.h that does not @@ -16,6 +20,8 @@ #include "../../libgloss/v850/sys/syscall.h" #include "bfd.h" +#include "libiberty.h" + #include #if !defined(__GO32__) && !defined(_WIN32) #include @@ -589,6 +595,50 @@ Multiply64 (boolean sign, unsigned long op0) return; } + +/* Read a null terminated string from memory, return in a buffer */ +static char * +fetch_str (sd, addr) + SIM_DESC sd; + address_word addr; +{ + char *buf; + int nr = 0; + while (sim_core_read_1 (STATE_CPU (sd, 0), + PC, sim_core_read_map, addr + nr) != 0) + nr++; + buf = NZALLOC (char, nr + 1); + sim_read (simulator, addr, buf, nr); + return buf; +} + +/* Read a null terminated argument vector from memory, return in a + buffer */ +static char ** +fetch_argv (sd, addr) + SIM_DESC sd; + address_word addr; +{ + int max_nr = 64; + int nr = 0; + char **buf = xmalloc (max_nr * sizeof (char*)); + while (1) + { + unsigned32 a = sim_core_read_4 (STATE_CPU (sd, 0), + PC, sim_core_read_map, addr + nr * 4); + if (a == 0) break; + buf[nr] = fetch_str (sd, a); + nr ++; + if (nr == max_nr - 1) + { + max_nr += 50; + buf = xrealloc (buf, max_nr * sizeof (char*)); + } + } + buf[nr] = 0; + return buf; +} + /* sld.b */ int @@ -2226,7 +2276,7 @@ OP_10007E0 () switch (FUNC) { -#if !defined(__GO32__) && !defined(_WIN32) +#ifdef HAVE_FORK #ifdef SYS_fork case SYS_fork: RETVAL = fork (); @@ -2234,20 +2284,33 @@ OP_10007E0 () #endif #endif -#if !defined(__GO32__) && !defined(_WIN32) +#ifdef HAVE_EXECVE #ifdef SYS_execv case SYS_execve: - RETVAL = execve (MEMPTR (PARM1), (char **) MEMPTR (PARM2), - (char **)MEMPTR (PARM3)); - break; + { + char *path = fetch_str (simulator, PARM1); + char **argv = fetch_argv (simulator, PARM2); + char **envp = fetch_argv (simulator, PARM3); + RETVAL = execve (path, argv, envp); + zfree (path); + freeargv (argv); + freeargv (envp); + break; + } #endif #endif -#if !defined(__GO32__) && !defined(_WIN32) +#if HAVE_EXECV #ifdef SYS_execv case SYS_execv: - RETVAL = execve (MEMPTR (PARM1), (char **) MEMPTR (PARM2), NULL); - break; + { + char *path = fetch_str (simulator, PARM1); + char **argv = fetch_argv (simulator, PARM2); + RETVAL = execv (path, argv); + zfree (path); + freeargv (argv); + break; + } #endif #endif @@ -2283,17 +2346,27 @@ OP_10007E0 () #ifdef SYS_read case SYS_read: - RETVAL = sim_io_read (simulator, PARM1, MEMPTR (PARM2), PARM3); - break; + { + char *buf = zalloc (PARM3); + RETVAL = sim_io_read (simulator, PARM1, buf, PARM3); + sim_write (simulator, PARM2, buf, PARM3); + zfree (buf); + break; + } #endif #ifdef SYS_write case SYS_write: - if (PARM1 == 1) - RETVAL = sim_io_write_stdout (simulator, MEMPTR (PARM2), PARM3); - else - RETVAL = sim_io_write (simulator, PARM1, MEMPTR (PARM2), PARM3); - break; + { + char *buf = zalloc (PARM3); + sim_read (simulator, PARM2, buf, PARM3); + if (PARM1 == 1) + RETVAL = sim_io_write_stdout (simulator, buf, PARM3); + else + RETVAL = sim_io_write (simulator, PARM1, buf, PARM3); + zfree (buf); + break; + } #endif #ifdef SYS_lseek @@ -2310,8 +2383,12 @@ OP_10007E0 () #ifdef SYS_open case SYS_open: - RETVAL = sim_io_open (simulator, MEMPTR (PARM1), PARM2); - break; + { + char *buf = fetch_str (simulator, PARM1); + RETVAL = sim_io_open (simulator, buf, PARM2); + zfree (buf); + break; + } #endif #ifdef SYS_exit @@ -2332,9 +2409,11 @@ OP_10007E0 () { struct stat host_stat; reg_t buf; + char *path = fetch_str (simulator, PARM1); - RETVAL = stat (MEMPTR (PARM1), &host_stat); + RETVAL = stat (path, &host_stat); + zfree (path); buf = PARM2; /* Just wild-assed guesses. */ @@ -2354,18 +2433,26 @@ OP_10007E0 () #endif #endif -#if !defined(__GO32__) && !defined(_WIN32) +#ifdef HAVE_CHOWN #ifdef SYS_chown case SYS_chown: - RETVAL = chown (MEMPTR (PARM1), PARM2, PARM3); + { + char *path = fetch_str (simulator, PARM1); + RETVAL = chown (path, PARM2, PARM3); + zfree (path); + } break; #endif #endif -#ifdef SYS_chmod #if HAVE_CHMOD +#ifdef SYS_chmod case SYS_chmod: - RETVAL = chmod (MEMPTR (PARM1), PARM2); + { + char *path = fetch_str (simulator, PARM1); + RETVAL = chmod (path, PARM2); + zfree (path); + } break; #endif #endif @@ -2416,9 +2503,12 @@ OP_10007E0 () #ifdef SYS_utime #if HAVE_UTIME case SYS_utime: - /* Cast the second argument to void *, to avoid type mismatch - if a prototype is present. */ - RETVAL = utime (MEMPTR (PARM1), (void *) MEMPTR (PARM2)); + { + /* Cast the second argument to void *, to avoid type mismatch + if a prototype is present. */ + sim_io_error (simulator, "Utime not supported"); + /* RETVAL = utime (path, (void *) MEMPTR (PARM2)); */ + } break; #endif #endif -- 2.34.1