sim/m32r: return register sizes after fetch and store
authorAndrew Burgess <andrew.burgess@embecosm.com>
Sun, 13 Sep 2020 20:48:31 +0000 (21:48 +0100)
committerAndrew Burgess <andrew.burgess@embecosm.com>
Fri, 18 Sep 2020 16:26:07 +0000 (17:26 +0100)
The m32r simulator currently always returns -1 for the register size
after both a fetch and a store.  In the fetch case GDB is forgiving of
this, but in the store case GDB treats a return value of -1 as an
error.

This commit updates the m32r simulator to return a valid register size
when fetching or storing a register.  This fixes any GDB test that
writes to a register, which will include any GDB test that makes an
inferior call, for example gdb.base/break.exp.

sim/m32r/ChangeLog:

* m32r.c (m32rbf_register_size): New function.
(m32rbf_fetch_register): Use new function.
(m32rbf_store_register): Likewise.

sim/m32r/ChangeLog
sim/m32r/m32r.c

index 5f1b216cc07b6854eb49e3c60ee2e5794a9943a1..05f478b41db94f2c5940a63cb73ef7a57a128004 100644 (file)
@@ -1,3 +1,9 @@
+2020-09-18  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+       * m32r.c (m32rbf_register_size): New function.
+       (m32rbf_fetch_register): Use new function.
+       (m32rbf_store_register): Likewise.
+
 2017-09-06  John Baldwin  <jhb@FreeBSD.org>
 
        * configure: Regenerate.
index 6187ed1e126585c2db9866d266a4a32f55c1f37c..8936b677bcf087d6568dc2119459bb70a4cf5744 100644 (file)
 #include "cgen-mem.h"
 #include "cgen-ops.h"
 
+/* Return the size of REGNO in bytes.  */
+
+static int
+m32rbf_register_size (int regno)
+{
+  return 4;
+}
+
 /* Decode gdb ctrl register number.  */
 
 int
@@ -48,6 +56,10 @@ m32r_decode_gdb_ctrl_regnum (int gdb_regnum)
 int
 m32rbf_fetch_register (SIM_CPU *current_cpu, int rn, unsigned char *buf, int len)
 {
+  int size = m32rbf_register_size (rn);
+  if (len != size)
+    return -1;
+
   if (rn < 16)
     SETTWI (buf, m32rbf_h_gr_get (current_cpu, rn));
   else
@@ -76,7 +88,7 @@ m32rbf_fetch_register (SIM_CPU *current_cpu, int rn, unsigned char *buf, int len
        return 0;
       }
 
-  return -1; /*FIXME*/
+  return size;
 }
 
 /* The contents of BUF are in target byte order.  */
@@ -84,6 +96,10 @@ m32rbf_fetch_register (SIM_CPU *current_cpu, int rn, unsigned char *buf, int len
 int
 m32rbf_store_register (SIM_CPU *current_cpu, int rn, unsigned char *buf, int len)
 {
+  int size = m32rbf_register_size (rn);
+  if (len != size)
+    return -1;
+
   if (rn < 16)
     m32rbf_h_gr_set (current_cpu, rn, GETTWI (buf));
   else
@@ -121,7 +137,7 @@ m32rbf_store_register (SIM_CPU *current_cpu, int rn, unsigned char *buf, int len
        return 0;
       }
 
-  return -1; /*FIXME*/
+  return size;
 }
 \f
 USI