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
@@ -75,7 +75,7 @@ static int cortex_a_dap_write_coreregister_u32(struct target *target,
|
||||
static int cortex_a_mmu(struct target *target, int *enabled);
|
||||
static int cortex_a_mmu_modify(struct target *target, int enable);
|
||||
static int cortex_a_virt2phys(struct target *target,
|
||||
uint32_t virt, uint32_t *phys);
|
||||
target_addr_t virt, target_addr_t *phys);
|
||||
static int cortex_a_read_cpu_memory(struct target *target,
|
||||
uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer);
|
||||
|
||||
@@ -937,7 +937,7 @@ static int cortex_a_halt(struct target *target)
|
||||
}
|
||||
|
||||
static int cortex_a_internal_restore(struct target *target, int current,
|
||||
uint32_t *address, int handle_breakpoints, int debug_execution)
|
||||
target_addr_t *address, int handle_breakpoints, int debug_execution)
|
||||
{
|
||||
struct armv7a_common *armv7a = target_to_armv7a(target);
|
||||
struct arm *arm = &armv7a->arm;
|
||||
@@ -1092,7 +1092,7 @@ static int cortex_a_restore_smp(struct target *target, int handle_breakpoints)
|
||||
int retval = 0;
|
||||
struct target_list *head;
|
||||
struct target *curr;
|
||||
uint32_t address;
|
||||
target_addr_t address;
|
||||
head = target->head;
|
||||
while (head != (struct target_list *)NULL) {
|
||||
curr = head->target;
|
||||
@@ -1110,7 +1110,7 @@ static int cortex_a_restore_smp(struct target *target, int handle_breakpoints)
|
||||
}
|
||||
|
||||
static int cortex_a_resume(struct target *target, int current,
|
||||
uint32_t address, int handle_breakpoints, int debug_execution)
|
||||
target_addr_t address, int handle_breakpoints, int debug_execution)
|
||||
{
|
||||
int retval = 0;
|
||||
/* dummy resume for smp toggle in order to reduce gdb impact */
|
||||
@@ -1134,11 +1134,11 @@ static int cortex_a_resume(struct target *target, int current,
|
||||
if (!debug_execution) {
|
||||
target->state = TARGET_RUNNING;
|
||||
target_call_event_callbacks(target, TARGET_EVENT_RESUMED);
|
||||
LOG_DEBUG("target resumed at 0x%" PRIx32, address);
|
||||
LOG_DEBUG("target resumed at " TARGET_ADDR_FMT, address);
|
||||
} else {
|
||||
target->state = TARGET_DEBUG_RUNNING;
|
||||
target_call_event_callbacks(target, TARGET_EVENT_DEBUG_RESUMED);
|
||||
LOG_DEBUG("target debug resumed at 0x%" PRIx32, address);
|
||||
LOG_DEBUG("target debug resumed at " TARGET_ADDR_FMT, address);
|
||||
}
|
||||
|
||||
return ERROR_OK;
|
||||
@@ -1344,7 +1344,7 @@ int cortex_a_set_dscr_bits(struct target *target, unsigned long bit_mask, unsign
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int cortex_a_step(struct target *target, int current, uint32_t address,
|
||||
static int cortex_a_step(struct target *target, int current, target_addr_t address,
|
||||
int handle_breakpoints)
|
||||
{
|
||||
struct cortex_a_common *cortex_a = target_to_cortex_a(target);
|
||||
@@ -2639,7 +2639,7 @@ out:
|
||||
*/
|
||||
|
||||
static int cortex_a_read_phys_memory(struct target *target,
|
||||
uint32_t address, uint32_t size,
|
||||
target_addr_t address, uint32_t size,
|
||||
uint32_t count, uint8_t *buffer)
|
||||
{
|
||||
struct armv7a_common *armv7a = target_to_armv7a(target);
|
||||
@@ -2650,7 +2650,7 @@ static int cortex_a_read_phys_memory(struct target *target,
|
||||
if (!count || !buffer)
|
||||
return ERROR_COMMAND_SYNTAX_ERROR;
|
||||
|
||||
LOG_DEBUG("Reading memory at real address 0x%" PRIx32 "; size %" PRId32 "; count %" PRId32,
|
||||
LOG_DEBUG("Reading memory at real address " TARGET_ADDR_FMT "; size %" PRId32 "; count %" PRId32,
|
||||
address, size, count);
|
||||
|
||||
if (armv7a->memory_ap_available && (apsel == armv7a->memory_ap->ap_num))
|
||||
@@ -2664,14 +2664,14 @@ static int cortex_a_read_phys_memory(struct target *target,
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int cortex_a_read_memory(struct target *target, uint32_t address,
|
||||
static int cortex_a_read_memory(struct target *target, target_addr_t address,
|
||||
uint32_t size, uint32_t count, uint8_t *buffer)
|
||||
{
|
||||
int retval;
|
||||
|
||||
/* cortex_a handles unaligned memory access */
|
||||
LOG_DEBUG("Reading memory at address 0x%" PRIx32 "; size %" PRId32 "; count %" PRId32, address,
|
||||
size, count);
|
||||
LOG_DEBUG("Reading memory at address " TARGET_ADDR_FMT "; size %" PRId32 "; count %" PRId32,
|
||||
address, size, count);
|
||||
|
||||
cortex_a_prep_memaccess(target, 0);
|
||||
retval = cortex_a_read_cpu_memory(target, address, size, count, buffer);
|
||||
@@ -2680,11 +2680,11 @@ static int cortex_a_read_memory(struct target *target, uint32_t address,
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int cortex_a_read_memory_ahb(struct target *target, uint32_t address,
|
||||
static int cortex_a_read_memory_ahb(struct target *target, target_addr_t address,
|
||||
uint32_t size, uint32_t count, uint8_t *buffer)
|
||||
{
|
||||
int mmu_enabled = 0;
|
||||
uint32_t virt, phys;
|
||||
target_addr_t virt, phys;
|
||||
int retval;
|
||||
struct armv7a_common *armv7a = target_to_armv7a(target);
|
||||
struct adiv5_dap *swjdp = armv7a->arm.dap;
|
||||
@@ -2694,8 +2694,8 @@ static int cortex_a_read_memory_ahb(struct target *target, uint32_t address,
|
||||
return target_read_memory(target, address, size, count, buffer);
|
||||
|
||||
/* cortex_a handles unaligned memory access */
|
||||
LOG_DEBUG("Reading memory at address 0x%" PRIx32 "; size %" PRId32 "; count %" PRId32, address,
|
||||
size, count);
|
||||
LOG_DEBUG("Reading memory at address " TARGET_ADDR_FMT "; size %" PRId32 "; count %" PRId32,
|
||||
address, size, count);
|
||||
|
||||
/* determine if MMU was enabled on target stop */
|
||||
if (!armv7a->is_armv7r) {
|
||||
@@ -2710,7 +2710,8 @@ static int cortex_a_read_memory_ahb(struct target *target, uint32_t address,
|
||||
if (retval != ERROR_OK)
|
||||
return retval;
|
||||
|
||||
LOG_DEBUG("Reading at virtual address. Translating v:0x%" PRIx32 " to r:0x%" PRIx32,
|
||||
LOG_DEBUG("Reading at virtual address. "
|
||||
"Translating v:" TARGET_ADDR_FMT " to r:" TARGET_ADDR_FMT,
|
||||
virt, phys);
|
||||
address = phys;
|
||||
}
|
||||
@@ -2724,7 +2725,7 @@ static int cortex_a_read_memory_ahb(struct target *target, uint32_t address,
|
||||
}
|
||||
|
||||
static int cortex_a_write_phys_memory(struct target *target,
|
||||
uint32_t address, uint32_t size,
|
||||
target_addr_t address, uint32_t size,
|
||||
uint32_t count, const uint8_t *buffer)
|
||||
{
|
||||
struct armv7a_common *armv7a = target_to_armv7a(target);
|
||||
@@ -2735,8 +2736,8 @@ static int cortex_a_write_phys_memory(struct target *target,
|
||||
if (!count || !buffer)
|
||||
return ERROR_COMMAND_SYNTAX_ERROR;
|
||||
|
||||
LOG_DEBUG("Writing memory to real address 0x%" PRIx32 "; size %" PRId32 "; count %" PRId32, address,
|
||||
size, count);
|
||||
LOG_DEBUG("Writing memory to real address " TARGET_ADDR_FMT "; size %" PRId32 "; count %" PRId32,
|
||||
address, size, count);
|
||||
|
||||
if (armv7a->memory_ap_available && (apsel == armv7a->memory_ap->ap_num))
|
||||
return mem_ap_write_buf(armv7a->memory_ap, buffer, size, count, address);
|
||||
@@ -2749,14 +2750,14 @@ static int cortex_a_write_phys_memory(struct target *target,
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int cortex_a_write_memory(struct target *target, uint32_t address,
|
||||
static int cortex_a_write_memory(struct target *target, target_addr_t address,
|
||||
uint32_t size, uint32_t count, const uint8_t *buffer)
|
||||
{
|
||||
int retval;
|
||||
|
||||
/* cortex_a handles unaligned memory access */
|
||||
LOG_DEBUG("Writing memory at address 0x%" PRIx32 "; size %" PRId32 "; count %" PRId32, address,
|
||||
size, count);
|
||||
LOG_DEBUG("Writing memory at address " TARGET_ADDR_FMT "; size %" PRId32 "; count %" PRId32,
|
||||
address, size, count);
|
||||
|
||||
/* memory writes bypass the caches, must flush before writing */
|
||||
armv7a_cache_auto_flush_on_write(target, address, size * count);
|
||||
@@ -2767,11 +2768,11 @@ static int cortex_a_write_memory(struct target *target, uint32_t address,
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int cortex_a_write_memory_ahb(struct target *target, uint32_t address,
|
||||
static int cortex_a_write_memory_ahb(struct target *target, target_addr_t address,
|
||||
uint32_t size, uint32_t count, const uint8_t *buffer)
|
||||
{
|
||||
int mmu_enabled = 0;
|
||||
uint32_t virt, phys;
|
||||
target_addr_t virt, phys;
|
||||
int retval;
|
||||
struct armv7a_common *armv7a = target_to_armv7a(target);
|
||||
struct adiv5_dap *swjdp = armv7a->arm.dap;
|
||||
@@ -2781,8 +2782,8 @@ static int cortex_a_write_memory_ahb(struct target *target, uint32_t address,
|
||||
return target_write_memory(target, address, size, count, buffer);
|
||||
|
||||
/* cortex_a handles unaligned memory access */
|
||||
LOG_DEBUG("Writing memory at address 0x%" PRIx32 "; size %" PRId32 "; count %" PRId32, address,
|
||||
size, count);
|
||||
LOG_DEBUG("Writing memory at address " TARGET_ADDR_FMT "; size %" PRId32 "; count %" PRId32,
|
||||
address, size, count);
|
||||
|
||||
/* determine if MMU was enabled on target stop */
|
||||
if (!armv7a->is_armv7r) {
|
||||
@@ -2797,7 +2798,8 @@ static int cortex_a_write_memory_ahb(struct target *target, uint32_t address,
|
||||
if (retval != ERROR_OK)
|
||||
return retval;
|
||||
|
||||
LOG_DEBUG("Writing to virtual address. Translating v:0x%" PRIx32 " to r:0x%" PRIx32,
|
||||
LOG_DEBUG("Writing to virtual address. "
|
||||
"Translating v:" TARGET_ADDR_FMT " to r:" TARGET_ADDR_FMT,
|
||||
virt,
|
||||
phys);
|
||||
address = phys;
|
||||
@@ -2811,7 +2813,7 @@ static int cortex_a_write_memory_ahb(struct target *target, uint32_t address,
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int cortex_a_read_buffer(struct target *target, uint32_t address,
|
||||
static int cortex_a_read_buffer(struct target *target, target_addr_t address,
|
||||
uint32_t count, uint8_t *buffer)
|
||||
{
|
||||
uint32_t size;
|
||||
@@ -2845,7 +2847,7 @@ static int cortex_a_read_buffer(struct target *target, uint32_t address,
|
||||
return ERROR_OK;
|
||||
}
|
||||
|
||||
static int cortex_a_write_buffer(struct target *target, uint32_t address,
|
||||
static int cortex_a_write_buffer(struct target *target, target_addr_t address,
|
||||
uint32_t count, const uint8_t *buffer)
|
||||
{
|
||||
uint32_t size;
|
||||
@@ -3202,7 +3204,7 @@ static int cortex_a_mmu(struct target *target, int *enabled)
|
||||
}
|
||||
|
||||
static int cortex_a_virt2phys(struct target *target,
|
||||
uint32_t virt, uint32_t *phys)
|
||||
target_addr_t virt, target_addr_t *phys)
|
||||
{
|
||||
int retval = ERROR_FAIL;
|
||||
struct armv7a_common *armv7a = target_to_armv7a(target);
|
||||
@@ -3220,7 +3222,8 @@ static int cortex_a_virt2phys(struct target *target,
|
||||
retval = cortex_a_mmu_modify(target, 1);
|
||||
if (retval != ERROR_OK)
|
||||
goto done;
|
||||
retval = armv7a_mmu_translate_va_pa(target, virt, phys, 1);
|
||||
retval = armv7a_mmu_translate_va_pa(target, (uint32_t)virt,
|
||||
(uint32_t *)phys, 1);
|
||||
}
|
||||
done:
|
||||
return retval;
|
||||
|
||||
Reference in New Issue
Block a user