sim: switch sim_{read,write} APIs to 64-bit all the time [PR sim/7504]
authorMike Frysinger <vapier@gentoo.org>
Fri, 11 Nov 2022 18:15:32 +0000 (01:15 +0700)
committerMike Frysinger <vapier@gentoo.org>
Fri, 23 Dec 2022 00:29:24 +0000 (19:29 -0500)
We've been using SIM_ADDR which has always been 32-bit.  This means
the upper 32-bit address range in 64-bit sims is inaccessible.  Use
64-bit addresses all the time since we want the APIs to be stable
regardless of the active arch backend (which can be 32 or 64-bit).

The length is also 64-bit because it's completely feasible to have
a program that is larger than 4 GiB in size/image/runtime.  Forcing
the caller to manually chunk those accesses up into 4 GiB at a time
doesn't seem useful to anyone.

Bug: https://sourceware.org/PR7504

14 files changed:
include/sim/sim.h
sim/arm/wrapper.c
sim/avr/interp.c
sim/common/sim-hrw.c
sim/common/sim-utils.h
sim/cris/sim-if.c
sim/d10v/interp.c
sim/erc32/interf.c
sim/h8300/compile.c
sim/m32c/gdb-if.c
sim/ppc/sim_calls.c
sim/rl78/gdb-if.c
sim/rx/gdb-if.c
sim/sh/interp.c

index 20a667cab7d35a4b56af420412891e30be7c8bf3..468a63bbc201441db7cc57037e535c401184f0f5 100644 (file)
@@ -20,6 +20,8 @@
 #ifndef SIM_SIM_H
 #define SIM_SIM_H 1
 
+#include <stdint.h>
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -163,14 +165,14 @@ SIM_RC sim_create_inferior (SIM_DESC sd, struct bfd *abfd,
    at virtual address MEM and store in BUF.  Result is number of bytes
    read, or zero if error.  */
 
-int sim_read (SIM_DESC sd, SIM_ADDR mem, void *buf, int length);
+uint64_t sim_read (SIM_DESC sd, uint64_t mem, void *buf, uint64_t length);
 
 
 /* Store LENGTH bytes from BUF into the simulated program's
    memory. Store bytes starting at virtual address MEM. Result is
    number of bytes write, or zero if error.  */
 
-int sim_write (SIM_DESC sd, SIM_ADDR mem, const void *buf, int length);
+uint64_t sim_write (SIM_DESC sd, uint64_t mem, const void *buf, uint64_t length);
 
 
 /* Fetch register REGNO storing its raw (target endian) value in the
index 2c5253fc74660b5dff5b6e91fdeb0d95e68377d2..7b1153298f1dc23718ca88e720b1f286296a022a 100644 (file)
@@ -150,13 +150,13 @@ ARMul_ConsolePrint (ARMul_State * state,
     }
 }
 
-int
+uint64_t
 sim_write (SIM_DESC sd ATTRIBUTE_UNUSED,
-          SIM_ADDR addr,
+          uint64_t addr,
           const void * buffer,
-          int size)
+          uint64_t size)
 {
-  int i;
+  uint64_t i;
   const unsigned char * data = buffer;
 
   init ();
@@ -167,13 +167,13 @@ sim_write (SIM_DESC sd ATTRIBUTE_UNUSED,
   return size;
 }
 
-int
+uint64_t
 sim_read (SIM_DESC sd ATTRIBUTE_UNUSED,
-         SIM_ADDR addr,
+         uint64_t addr,
          void * buffer,
-         int size)
+         uint64_t size)
 {
-  int i;
+  uint64_t i;
   unsigned char * data = buffer;
 
   init ();
index 3acf09b15ada46922b48343ee4be4a1af9477526..b72da53630801023ff6a27d709caaeaf48eb1b68 100644 (file)
@@ -1529,8 +1529,8 @@ sim_engine_run (SIM_DESC sd,
     }
 }
 
-int
-sim_write (SIM_DESC sd, SIM_ADDR addr, const void *buffer, int size)
+uint64_t
+sim_write (SIM_DESC sd, uint64_t addr, const void *buffer, uint64_t size)
 {
   int osize = size;
 
@@ -1566,8 +1566,8 @@ sim_write (SIM_DESC sd, SIM_ADDR addr, const void *buffer, int size)
     return 0;
 }
 
-int
-sim_read (SIM_DESC sd, SIM_ADDR addr, void *buffer, int size)
+uint64_t
+sim_read (SIM_DESC sd, uint64_t addr, void *buffer, uint64_t size)
 {
   int osize = size;
 
index 2596019e6e5c2abe4d829572808c2dfa8c0d0e79..091ff5bade5b30bea873193f65bc82c9f8fe286d 100644 (file)
@@ -26,16 +26,16 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 /* Generic implementation of sim_read that works with simulators
    modeling real hardware */
 
-int
-sim_read (SIM_DESC sd, SIM_ADDR mem, void *buffer, int length)
+uint64_t
+sim_read (SIM_DESC sd, uint64_t mem, void *buffer, uint64_t length)
 {
   SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
   return sim_core_read_buffer (sd, NULL, read_map,
                               buffer, mem, length);
 }
 
-int
-sim_write (SIM_DESC sd, SIM_ADDR mem, const void *buffer, int length)
+uint64_t
+sim_write (SIM_DESC sd, uint64_t mem, const void *buffer, uint64_t length)
 {
   SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
   return sim_core_write_buffer (sd, NULL, write_map,
index cd8aca9f4016dce30c77779834e19e9949bc2624..b34ee94236e652d12efca8a94711429fe677face 100644 (file)
@@ -63,8 +63,8 @@ SIM_RC sim_analyze_program (SIM_DESC sd, const char *prog_name,
    This is still accommodated for backward compatibility reasons. */
 
 typedef struct host_callback_struct host_callback;
-typedef int sim_write_fn (SIM_DESC sd, SIM_ADDR mem,
-                         const void *buf, int length);
+typedef uint64_t sim_write_fn (SIM_DESC sd, uint64_t mem,
+                              const void *buf, uint64_t length);
 struct bfd *sim_load_file (SIM_DESC sd, const char *myname,
                           host_callback *callback, const char *prog,
                           struct bfd *prog_bfd, int verbose_p,
index a952a27fc520a9f6a654dc16cd2685850bc88933..47862edf4f5a8ae7721b576bd0a45513d104aa23 100644 (file)
@@ -485,8 +485,8 @@ aux_ent_entry (struct bfd *ebfd)
 /* Helper for cris_handle_interpreter: like sim_write, but load at
    interp_load_addr offset.  */
 
-static int
-cris_write_interp (SIM_DESC sd, SIM_ADDR mem, const void *buf, int length)
+static uint64_t
+cris_write_interp (SIM_DESC sd, uint64_t mem, const void *buf, uint64_t length)
 {
   return sim_write (sd, mem + interp_load_addr, buf, length);
 }
index f83fa6678ad3a11893a38103ec6ffd748545bc53..ae8b6707ed4bc7492db743ddfdc704b807e5e3b5 100644 (file)
@@ -664,9 +664,9 @@ map_memory (SIM_DESC sd, SIM_CPU *cpu, unsigned phys_addr)
 
 static int
 xfer_mem (SIM_DESC sd,
-         SIM_ADDR virt,
+         address_word virt,
          unsigned char *buffer,
-         int size,
+         uint64_t size,
          int write_p)
 {
   uint8_t *memory;
@@ -705,8 +705,8 @@ xfer_mem (SIM_DESC sd,
 }
 
 
-int
-sim_write (SIM_DESC sd, SIM_ADDR addr, const void *buffer, int size)
+uint64_t
+sim_write (SIM_DESC sd, uint64_t addr, const void *buffer, uint64_t size)
 {
   /* FIXME: this should be performing a virtual transfer */
   /* FIXME: We cast the const away, but it's safe because xfer_mem only reads
@@ -714,8 +714,8 @@ sim_write (SIM_DESC sd, SIM_ADDR addr, const void *buffer, int size)
   return xfer_mem (sd, addr, (void *) buffer, size, 1);
 }
 
-int
-sim_read (SIM_DESC sd, SIM_ADDR addr, void *buffer, int size)
+uint64_t
+sim_read (SIM_DESC sd, uint64_t addr, void *buffer, uint64_t size)
 {
   /* FIXME: this should be performing a virtual transfer */
   return xfer_mem (sd, addr, buffer, size, 0);
index e88e5ed3ab8ac5b638aaad052962e60023aed391..fdd3f0f6b402d5e1124fb0c2c72855e6eb19115b 100644 (file)
@@ -329,8 +329,8 @@ sim_fetch_register(SIM_DESC sd, int regno, void *buf, int length)
     return -1;
 }
 
-int
-sim_write (SIM_DESC sd, SIM_ADDR mem, const void *buffer, int length)
+uint64_t
+sim_write (SIM_DESC sd, uint64_t mem, const void *buffer, uint64_t length)
 {
     int i, len;
     const unsigned char *data = buffer;
@@ -341,8 +341,8 @@ sim_write (SIM_DESC sd, SIM_ADDR mem, const void *buffer, int length)
     return length;
 }
 
-int
-sim_read (SIM_DESC sd, SIM_ADDR mem, void *buffer, int length)
+uint64_t
+sim_read (SIM_DESC sd, uint64_t mem, void *buffer, uint64_t length)
 {
     int i, len;
     unsigned char *data = buffer;
index 261e904577f4b25e5fcf36680e8c6e87befd3b85..077bc6dff0971bb4813953304ff605c50518840b 100644 (file)
@@ -4340,8 +4340,8 @@ sim_engine_run (SIM_DESC sd,
     }
 }
 
-int
-sim_write (SIM_DESC sd, SIM_ADDR addr, const void *buffer, int size)
+uint64_t
+sim_write (SIM_DESC sd, uint64_t addr, const void *buffer, uint64_t size)
 {
   sim_cpu *cpu = STATE_CPU (sd, 0);
   int i;
@@ -4362,8 +4362,8 @@ sim_write (SIM_DESC sd, SIM_ADDR addr, const void *buffer, int size)
   return i;
 }
 
-int
-sim_read (SIM_DESC sd, SIM_ADDR addr, void *buffer, int size)
+uint64_t
+sim_read (SIM_DESC sd, uint64_t addr, void *buffer, uint64_t size)
 {
   sim_cpu *cpu = STATE_CPU (sd, 0);
 
index b065bdca5b1e70c51d7be9a75f5fe3867152a218..f75052bfe28d573160b7714eeb1ee77a75d5bdf6 100644 (file)
@@ -158,8 +158,8 @@ sim_create_inferior (SIM_DESC sd, struct bfd * abfd,
   return SIM_RC_OK;
 }
 
-int
-sim_read (SIM_DESC sd, SIM_ADDR mem, void *buf, int length)
+uint64_t
+sim_read (SIM_DESC sd, uint64_t mem, void *buf, uint64_t length)
 {
   check_desc (sd);
 
@@ -171,8 +171,8 @@ sim_read (SIM_DESC sd, SIM_ADDR mem, void *buf, int length)
   return length;
 }
 
-int
-sim_write (SIM_DESC sd, SIM_ADDR mem, const void *buf, int length)
+uint64_t
+sim_write (SIM_DESC sd, uint64_t mem, const void *buf, uint64_t length)
 {
   check_desc (sd);
 
index 6ca6c2ce2c244443259b4ebcffa7d40a8794791d..88544457c6e5af2e7772443eb967205f3e45ff3b 100644 (file)
@@ -124,25 +124,27 @@ sim_load (SIM_DESC sd, const char *prog, bfd *abfd, int from_tty)
 }
 
 
-int
-sim_read (SIM_DESC sd, SIM_ADDR mem, void *buf, int length)
+uint64_t
+sim_read (SIM_DESC sd, uint64_t mem, void *buf, uint64_t length)
 {
   int result = psim_read_memory(simulator, MAX_NR_PROCESSORS,
                                buf, mem, length);
-  TRACE(trace_gdb, ("sim_read(mem=0x%lx, buf=%p, length=%d) = %d\n",
-                   (long)mem, buf, length, result));
+  TRACE(trace_gdb,
+       ("sim_read(mem=0x%" PRIx64 ", buf=%p, length=%" PRIx64 ") = %d\n",
+        mem, buf, length, result));
   return result;
 }
 
 
-int
-sim_write (SIM_DESC sd, SIM_ADDR mem, const void *buf, int length)
+uint64_t
+sim_write (SIM_DESC sd, uint64_t mem, const void *buf, uint64_t length)
 {
   int result = psim_write_memory(simulator, MAX_NR_PROCESSORS,
                                 buf, mem, length,
                                 1/*violate_ro*/);
-  TRACE(trace_gdb, ("sim_write(mem=0x%lx, buf=%p, length=%d) = %d\n",
-                   (long)mem, buf, length, result));
+  TRACE(trace_gdb,
+       ("sim_write(mem=0x%" PRIx64 ", buf=%p, length=%" PRIx64 ") = %d\n",
+        mem, buf, length, result));
   return result;
 }
 
index cc76a7d91313ad58e4edff12e21c0830c28c22a0..3b3a7ae17b917564434a31e994cdc510423d7a04 100644 (file)
@@ -204,8 +204,8 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd,
 
 /* Read memory.  */
 
-int
-sim_read (SIM_DESC sd, SIM_ADDR mem, void *buf, int length)
+uint64_t
+sim_read (SIM_DESC sd, uint64_t mem, void *buf, uint64_t length)
 {
   check_desc (sd);
 
@@ -220,8 +220,8 @@ sim_read (SIM_DESC sd, SIM_ADDR mem, void *buf, int length)
 
 /* Write memory.  */
 
-int
-sim_write (SIM_DESC sd, SIM_ADDR mem, const void *buf, int length)
+uint64_t
+sim_write (SIM_DESC sd, uint64_t mem, const void *buf, uint64_t length)
 {
   check_desc (sd);
 
index 70f84c184bc38aaa167e3950c847f4272c6cf852..caa7ddbcb3257b42370495f85830636d3ab646cf 100644 (file)
@@ -225,8 +225,8 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd,
   return SIM_RC_OK;
 }
 
-int
-sim_read (SIM_DESC sd, SIM_ADDR mem, void *buffer, int length)
+uint64_t
+sim_read (SIM_DESC sd, uint64_t mem, void *buffer, uint64_t length)
 {
   int i;
   unsigned char *data = buffer;
@@ -251,8 +251,8 @@ sim_read (SIM_DESC sd, SIM_ADDR mem, void *buffer, int length)
   return length;
 }
 
-int
-sim_write (SIM_DESC sd, SIM_ADDR mem, const void *buffer, int length)
+uint64_t
+sim_write (SIM_DESC sd, uint64_t mem, const void *buffer, uint64_t length)
 {
   int i;
   const unsigned char *data = buffer;
index e0cbc7fc6d9b8a48b485658492ea08e36490d317..7784ca7aa40fcd98199772d18ec3f6a6851238f2 100644 (file)
@@ -1873,8 +1873,8 @@ sim_resume (SIM_DESC sd, int step, int siggnal)
   signal (SIGFPE, prev_fpe);
 }
 
-int
-sim_write (SIM_DESC sd, SIM_ADDR addr, const void *buffer, int size)
+uint64_t
+sim_write (SIM_DESC sd, uint64_t addr, const void *buffer, uint64_t size)
 {
   int i;
   const unsigned char *data = buffer;
@@ -1888,8 +1888,8 @@ sim_write (SIM_DESC sd, SIM_ADDR addr, const void *buffer, int size)
   return size;
 }
 
-int
-sim_read (SIM_DESC sd, SIM_ADDR addr, void *buffer, int size)
+uint64_t
+sim_read (SIM_DESC sd, uint64_t addr, void *buffer, uint64_t size)
 {
   int i;
   unsigned char *data = buffer;