gdb_server, target: Add target_address_bits() 47/4947/3
authorTim Newsome <tim@sifive.com>
Mon, 25 Feb 2019 22:02:30 +0000 (14:02 -0800)
committerMatthias Welwarsky <matthias@welwarsky.de>
Fri, 8 Mar 2019 14:05:19 +0000 (14:05 +0000)
Targets can use this to expose how many address bits there are.
gdb_server uses this to send gdb the appropriate upper limit in the
memory-map. (Before this change the upper limit would only be correct
for 32-bit targets.)

Change-Id: Idb0933255ed53951fcfb05e040674bcdf19441e1
Signed-off-by: Tim Newsome <tim@sifive.com>
Reviewed-on: http://openocd.zylin.com/4947
Tested-by: jenkins
Reviewed-by: Peter Mamonov <pmamonov@gmail.com>
Reviewed-by: Tomas Vanek <vanekt@fbl.cz>
src/server/gdb_server.c
src/target/riscv/riscv.c
src/target/target.c
src/target/target.h
src/target/target_type.h

index 54cf9af..3ade195 100644 (file)
@@ -1921,11 +1921,10 @@ static int gdb_memory_map(struct connection *connection,
        if (ram_start != 0)
                xml_printf(&retval, &xml, &pos, &size,
                        "<memory type=\"ram\" start=\"" TARGET_ADDR_FMT "\" "
-                       "length=\"0x%x\"/>\n",
-                       ram_start, 0-ram_start);
-       /* ELSE a flash chip could be at the very end of the 32 bit address
-        * space, in which case ram_start will be precisely 0
-        */
+                       "length=\"" TARGET_ADDR_FMT "\"/>\n",
+                       ram_start, target_address_max(target) - ram_start + 1);
+       /* ELSE a flash chip could be at the very end of the address space, in
+        * which case ram_start will be precisely 0 */
 
        free(banks);
 
index 02ba380..9a6b938 100644 (file)
@@ -1560,6 +1560,11 @@ const struct command_registration riscv_command_handlers[] = {
        COMMAND_REGISTRATION_DONE
 };
 
+unsigned riscv_address_bits(struct target *target)
+{
+       return riscv_xlen(target);
+}
+
 struct target_type riscv_target = {
        .name = "riscv",
 
@@ -1594,7 +1599,9 @@ struct target_type riscv_target = {
 
        .run_algorithm = riscv_run_algorithm,
 
-       .commands = riscv_command_handlers
+       .commands = riscv_command_handlers,
+
+       .address_bits = riscv_address_bits
 };
 
 /*** RISC-V Interface ***/
index 1f8e0bf..5295dd6 100644 (file)
@@ -1257,6 +1257,22 @@ int target_gdb_fileio_end(struct target *target, int retcode, int fileio_errno,
        return target->type->gdb_fileio_end(target, retcode, fileio_errno, ctrl_c);
 }
 
+target_addr_t target_address_max(struct target *target)
+{
+       unsigned bits = target_address_bits(target);
+       if (sizeof(target_addr_t) * 8 == bits)
+               return (target_addr_t) -1;
+       else
+               return (((target_addr_t) 1) << bits) - 1;
+}
+
+unsigned target_address_bits(struct target *target)
+{
+       if (target->type->address_bits)
+               return target->type->address_bits(target);
+       return 32;
+}
+
 int target_profiling(struct target *target, uint32_t *samples,
                        uint32_t max_num_samples, uint32_t *num_samples, uint32_t seconds)
 {
index 48793da..65494af 100644 (file)
@@ -641,7 +641,17 @@ int target_get_gdb_fileio_info(struct target *target, struct gdb_fileio_info *fi
  */
 int target_gdb_fileio_end(struct target *target, int retcode, int fileio_errno, bool ctrl_c);
 
+/**
+ * Return the highest accessible address for this target.
+ */
+target_addr_t target_address_max(struct target *target);
 
+/**
+ * Return the number of address bits this target supports.
+ *
+ * This routine is a wrapper for target->type->address_bits.
+ */
+unsigned target_address_bits(struct target *target);
 
 /** Return the *name* of this targets current state */
 const char *target_state_name(struct target *target);
index a892891..95745c9 100644 (file)
@@ -284,6 +284,11 @@ struct target_type {
         */
        int (*profiling)(struct target *target, uint32_t *samples,
                        uint32_t max_num_samples, uint32_t *num_samples, uint32_t seconds);
+
+       /* Return the number of address bits this target supports. This will
+        * typically be 32 for 32-bit targets, and 64 for 64-bit targets. If not
+        * implemented, it's assumed to be 32. */
+       unsigned (*address_bits)(struct target *target);
 };
 
 #endif /* OPENOCD_TARGET_TARGET_TYPE_H */