forked from auracaster/openocd
target: Add 64-bit target address support
Define a target_addr_t type to support 32-bit and 64-bit addresses at the same time. Also define matching TARGET_PRI*ADDR format macros as well as a convenient TARGET_ADDR_FMT. In targets that are 32-bit (avr32, nds32, arm7/9/11, fm4, xmc1000) be least invasive by leaving the formatting unchanged apart from the type; for generic code adopt TARGET_ADDR_FMT as unified address format. Don't silently change gdb formatting here, leave that to later. Add COMMAND_PARSE_ADDRESS() macro to abstract the address type. Implement it using its own parse_target_addr() function, in the hopes of catching pointer type mismatches better. Add '--disable-target64' configure option to revert to previous 32-bit target address behavior. Change-Id: I2e91d205862ceb14f94b3e72a7e99ee0373a85d5 Signed-off-by: Dongxue Zhang <elta.era@gmail.com> Signed-off-by: David Ung <david.ung.42@gmail.com> [AF: Default to enabling (Paul Fertser), rename macros, simplify] Signed-off-by: Andreas Färber <afaerber@suse.de> Signed-off-by: Matthias Welwarsky <matthias.welwarsky@sysgo.com>
This commit is contained in:
committed by
Matthias Welwarsky
parent
0ecee83266
commit
47b8cf8420
@@ -42,7 +42,7 @@ static const char * const watchpoint_rw_strings[] = {
|
||||
static int bpwp_unique_id;
|
||||
|
||||
int breakpoint_add_internal(struct target *target,
|
||||
uint32_t address,
|
||||
target_addr_t address,
|
||||
uint32_t length,
|
||||
enum breakpoint_type type)
|
||||
{
|
||||
@@ -60,7 +60,7 @@ int breakpoint_add_internal(struct target *target,
|
||||
* breakpoint" ... check all the parameters before
|
||||
* succeeding.
|
||||
*/
|
||||
LOG_DEBUG("Duplicate Breakpoint address: 0x%08" PRIx32 " (BP %" PRIu32 ")",
|
||||
LOG_DEBUG("Duplicate Breakpoint address: " TARGET_ADDR_FMT " (BP %" PRIu32 ")",
|
||||
address, breakpoint->unique_id);
|
||||
return ERROR_OK;
|
||||
}
|
||||
@@ -98,7 +98,7 @@ fail:
|
||||
return retval;
|
||||
}
|
||||
|
||||
LOG_DEBUG("added %s breakpoint at 0x%8.8" PRIx32 " of length 0x%8.8x, (BPID: %" PRIu32 ")",
|
||||
LOG_DEBUG("added %s breakpoint at " TARGET_ADDR_FMT " of length 0x%8.8x, (BPID: %" PRIu32 ")",
|
||||
breakpoint_type_strings[(*breakpoint_p)->type],
|
||||
(*breakpoint_p)->address, (*breakpoint_p)->length,
|
||||
(*breakpoint_p)->unique_id);
|
||||
@@ -159,7 +159,7 @@ int context_breakpoint_add_internal(struct target *target,
|
||||
}
|
||||
|
||||
int hybrid_breakpoint_add_internal(struct target *target,
|
||||
uint32_t address,
|
||||
target_addr_t address,
|
||||
uint32_t asid,
|
||||
uint32_t length,
|
||||
enum breakpoint_type type)
|
||||
@@ -180,7 +180,7 @@ int hybrid_breakpoint_add_internal(struct target *target,
|
||||
asid, breakpoint->unique_id);
|
||||
return -1;
|
||||
} else if ((breakpoint->address == address) && (breakpoint->asid == 0)) {
|
||||
LOG_DEBUG("Duplicate Breakpoint IVA: 0x%08" PRIx32 " (BP %" PRIu32 ")",
|
||||
LOG_DEBUG("Duplicate Breakpoint IVA: " TARGET_ADDR_FMT " (BP %" PRIu32 ")",
|
||||
address, breakpoint->unique_id);
|
||||
return -1;
|
||||
|
||||
@@ -208,7 +208,7 @@ int hybrid_breakpoint_add_internal(struct target *target,
|
||||
return retval;
|
||||
}
|
||||
LOG_DEBUG(
|
||||
"added %s Hybrid breakpoint at address 0x%8.8" PRIx32 " of length 0x%8.8x, (BPID: %" PRIu32 ")",
|
||||
"added %s Hybrid breakpoint at address " TARGET_ADDR_FMT " of length 0x%8.8x, (BPID: %" PRIu32 ")",
|
||||
breakpoint_type_strings[(*breakpoint_p)->type],
|
||||
(*breakpoint_p)->address,
|
||||
(*breakpoint_p)->length,
|
||||
@@ -218,7 +218,7 @@ int hybrid_breakpoint_add_internal(struct target *target,
|
||||
}
|
||||
|
||||
int breakpoint_add(struct target *target,
|
||||
uint32_t address,
|
||||
target_addr_t address,
|
||||
uint32_t length,
|
||||
enum breakpoint_type type)
|
||||
{
|
||||
@@ -263,7 +263,7 @@ int context_breakpoint_add(struct target *target,
|
||||
return context_breakpoint_add_internal(target, asid, length, type);
|
||||
}
|
||||
int hybrid_breakpoint_add(struct target *target,
|
||||
uint32_t address,
|
||||
target_addr_t address,
|
||||
uint32_t asid,
|
||||
uint32_t length,
|
||||
enum breakpoint_type type)
|
||||
@@ -310,7 +310,7 @@ static void breakpoint_free(struct target *target, struct breakpoint *breakpoint
|
||||
free(breakpoint);
|
||||
}
|
||||
|
||||
int breakpoint_remove_internal(struct target *target, uint32_t address)
|
||||
int breakpoint_remove_internal(struct target *target, target_addr_t address)
|
||||
{
|
||||
struct breakpoint *breakpoint = target->breakpoints;
|
||||
|
||||
@@ -329,11 +329,11 @@ int breakpoint_remove_internal(struct target *target, uint32_t address)
|
||||
return 1;
|
||||
} else {
|
||||
if (!target->smp)
|
||||
LOG_ERROR("no breakpoint at address 0x%8.8" PRIx32 " found", address);
|
||||
LOG_ERROR("no breakpoint at address " TARGET_ADDR_FMT " found", address);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
void breakpoint_remove(struct target *target, uint32_t address)
|
||||
void breakpoint_remove(struct target *target, target_addr_t address)
|
||||
{
|
||||
int found = 0;
|
||||
if (target->smp) {
|
||||
@@ -346,7 +346,7 @@ void breakpoint_remove(struct target *target, uint32_t address)
|
||||
head = head->next;
|
||||
}
|
||||
if (found == 0)
|
||||
LOG_ERROR("no breakpoint at address 0x%8.8" PRIx32 " found", address);
|
||||
LOG_ERROR("no breakpoint at address " TARGET_ADDR_FMT " found", address);
|
||||
} else
|
||||
breakpoint_remove_internal(target, address);
|
||||
}
|
||||
@@ -375,7 +375,7 @@ void breakpoint_clear_target(struct target *target)
|
||||
|
||||
}
|
||||
|
||||
struct breakpoint *breakpoint_find(struct target *target, uint32_t address)
|
||||
struct breakpoint *breakpoint_find(struct target *target, target_addr_t address)
|
||||
{
|
||||
struct breakpoint *breakpoint = target->breakpoints;
|
||||
|
||||
@@ -388,7 +388,7 @@ struct breakpoint *breakpoint_find(struct target *target, uint32_t address)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int watchpoint_add(struct target *target, uint32_t address, uint32_t length,
|
||||
int watchpoint_add(struct target *target, target_addr_t address, uint32_t length,
|
||||
enum watchpoint_rw rw, uint32_t value, uint32_t mask)
|
||||
{
|
||||
struct watchpoint *watchpoint = target->watchpoints;
|
||||
@@ -402,7 +402,7 @@ int watchpoint_add(struct target *target, uint32_t address, uint32_t length,
|
||||
|| watchpoint->value != value
|
||||
|| watchpoint->mask != mask
|
||||
|| watchpoint->rw != rw) {
|
||||
LOG_ERROR("address 0x%8.8" PRIx32
|
||||
LOG_ERROR("address " TARGET_ADDR_FMT
|
||||
" already has watchpoint %d",
|
||||
address, watchpoint->unique_id);
|
||||
return ERROR_FAIL;
|
||||
@@ -436,7 +436,7 @@ int watchpoint_add(struct target *target, uint32_t address, uint32_t length,
|
||||
default:
|
||||
reason = "unrecognized error";
|
||||
bye:
|
||||
LOG_ERROR("can't add %s watchpoint at 0x%8.8" PRIx32 ", %s",
|
||||
LOG_ERROR("can't add %s watchpoint at " TARGET_ADDR_FMT ", %s",
|
||||
watchpoint_rw_strings[(*watchpoint_p)->rw],
|
||||
address, reason);
|
||||
free(*watchpoint_p);
|
||||
@@ -444,7 +444,7 @@ bye:
|
||||
return retval;
|
||||
}
|
||||
|
||||
LOG_DEBUG("added %s watchpoint at 0x%8.8" PRIx32
|
||||
LOG_DEBUG("added %s watchpoint at " TARGET_ADDR_FMT
|
||||
" of length 0x%8.8" PRIx32 " (WPID: %d)",
|
||||
watchpoint_rw_strings[(*watchpoint_p)->rw],
|
||||
(*watchpoint_p)->address,
|
||||
@@ -475,7 +475,7 @@ static void watchpoint_free(struct target *target, struct watchpoint *watchpoint
|
||||
free(watchpoint);
|
||||
}
|
||||
|
||||
void watchpoint_remove(struct target *target, uint32_t address)
|
||||
void watchpoint_remove(struct target *target, target_addr_t address)
|
||||
{
|
||||
struct watchpoint *watchpoint = target->watchpoints;
|
||||
|
||||
@@ -488,7 +488,7 @@ void watchpoint_remove(struct target *target, uint32_t address)
|
||||
if (watchpoint)
|
||||
watchpoint_free(target, watchpoint);
|
||||
else
|
||||
LOG_ERROR("no watchpoint at address 0x%8.8" PRIx32 " found", address);
|
||||
LOG_ERROR("no watchpoint at address " TARGET_ADDR_FMT " found", address);
|
||||
}
|
||||
|
||||
void watchpoint_clear_target(struct target *target)
|
||||
@@ -499,7 +499,8 @@ void watchpoint_clear_target(struct target *target)
|
||||
watchpoint_free(target, target->watchpoints);
|
||||
}
|
||||
|
||||
int watchpoint_hit(struct target *target, enum watchpoint_rw *rw, uint32_t *address)
|
||||
int watchpoint_hit(struct target *target, enum watchpoint_rw *rw,
|
||||
target_addr_t *address)
|
||||
{
|
||||
int retval;
|
||||
struct watchpoint *hit_watchpoint;
|
||||
@@ -511,7 +512,7 @@ int watchpoint_hit(struct target *target, enum watchpoint_rw *rw, uint32_t *addr
|
||||
*rw = hit_watchpoint->rw;
|
||||
*address = hit_watchpoint->address;
|
||||
|
||||
LOG_DEBUG("Found hit watchpoint at 0x%8.8" PRIx32 " (WPID: %d)",
|
||||
LOG_DEBUG("Found hit watchpoint at " TARGET_ADDR_FMT " (WPID: %d)",
|
||||
hit_watchpoint->address,
|
||||
hit_watchpoint->unique_id);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user