aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/gdb_server.c9
-rw-r--r--src/target/riscv/riscv.c9
-rw-r--r--src/target/target.c16
-rw-r--r--src/target/target.h10
-rw-r--r--src/target/target_type.h5
5 files changed, 43 insertions, 6 deletions
diff --git a/src/server/gdb_server.c b/src/server/gdb_server.c
index 54cf9aff..3ade195c 100644
--- a/src/server/gdb_server.c
+++ b/src/server/gdb_server.c
@@ -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);
diff --git a/src/target/riscv/riscv.c b/src/target/riscv/riscv.c
index 02ba3805..9a6b9389 100644
--- a/src/target/riscv/riscv.c
+++ b/src/target/riscv/riscv.c
@@ -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 ***/
diff --git a/src/target/target.c b/src/target/target.c
index 1f8e0bfc..5295dd62 100644
--- a/src/target/target.c
+++ b/src/target/target.c
@@ -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)
{
diff --git a/src/target/target.h b/src/target/target.h
index 48793da6..65494afd 100644
--- a/src/target/target.h
+++ b/src/target/target.h
@@ -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);
diff --git a/src/target/target_type.h b/src/target/target_type.h
index a8928911..95745c9e 100644
--- a/src/target/target_type.h
+++ b/src/target/target_type.h
@@ -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 */