gdb_server, target: Add target_address_bits()
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>reverse-resume-order
parent
85ba2dc4c6
commit
57e30102ea
|
@ -1921,11 +1921,10 @@ static int gdb_memory_map(struct connection *connection,
|
||||||
if (ram_start != 0)
|
if (ram_start != 0)
|
||||||
xml_printf(&retval, &xml, &pos, &size,
|
xml_printf(&retval, &xml, &pos, &size,
|
||||||
"<memory type=\"ram\" start=\"" TARGET_ADDR_FMT "\" "
|
"<memory type=\"ram\" start=\"" TARGET_ADDR_FMT "\" "
|
||||||
"length=\"0x%x\"/>\n",
|
"length=\"" TARGET_ADDR_FMT "\"/>\n",
|
||||||
ram_start, 0-ram_start);
|
ram_start, target_address_max(target) - ram_start + 1);
|
||||||
/* ELSE a flash chip could be at the very end of the 32 bit address
|
/* ELSE a flash chip could be at the very end of the address space, in
|
||||||
* space, in which case ram_start will be precisely 0
|
* which case ram_start will be precisely 0 */
|
||||||
*/
|
|
||||||
|
|
||||||
free(banks);
|
free(banks);
|
||||||
|
|
||||||
|
|
|
@ -1560,6 +1560,11 @@ const struct command_registration riscv_command_handlers[] = {
|
||||||
COMMAND_REGISTRATION_DONE
|
COMMAND_REGISTRATION_DONE
|
||||||
};
|
};
|
||||||
|
|
||||||
|
unsigned riscv_address_bits(struct target *target)
|
||||||
|
{
|
||||||
|
return riscv_xlen(target);
|
||||||
|
}
|
||||||
|
|
||||||
struct target_type riscv_target = {
|
struct target_type riscv_target = {
|
||||||
.name = "riscv",
|
.name = "riscv",
|
||||||
|
|
||||||
|
@ -1594,7 +1599,9 @@ struct target_type riscv_target = {
|
||||||
|
|
||||||
.run_algorithm = riscv_run_algorithm,
|
.run_algorithm = riscv_run_algorithm,
|
||||||
|
|
||||||
.commands = riscv_command_handlers
|
.commands = riscv_command_handlers,
|
||||||
|
|
||||||
|
.address_bits = riscv_address_bits
|
||||||
};
|
};
|
||||||
|
|
||||||
/*** RISC-V Interface ***/
|
/*** RISC-V Interface ***/
|
||||||
|
|
|
@ -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);
|
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,
|
int target_profiling(struct target *target, uint32_t *samples,
|
||||||
uint32_t max_num_samples, uint32_t *num_samples, uint32_t seconds)
|
uint32_t max_num_samples, uint32_t *num_samples, uint32_t seconds)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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);
|
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 */
|
/** Return the *name* of this targets current state */
|
||||||
const char *target_state_name(struct target *target);
|
const char *target_state_name(struct target *target);
|
||||||
|
|
|
@ -284,6 +284,11 @@ struct target_type {
|
||||||
*/
|
*/
|
||||||
int (*profiling)(struct target *target, uint32_t *samples,
|
int (*profiling)(struct target *target, uint32_t *samples,
|
||||||
uint32_t max_num_samples, uint32_t *num_samples, uint32_t seconds);
|
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 */
|
#endif /* OPENOCD_TARGET_TARGET_TYPE_H */
|
||||||
|
|
Loading…
Reference in New Issue