cortex_a: fix FTBS on ARM due to alignment issues
Native compilation on RaspberryPi with gcc (Debian 4.6.3-1) 4.6.3 Target: arm-linux-gnueabi ends with error: cortex_a.c: In function 'cortex_a8_read_apb_ab_memory': cortex_a.c:2063:40: error: cast increases required alignment of target type [-Werror=cast-align] cc1: all warnings being treated as errors Also check for malloc failure. This patch is compile-tested only. Change-Id: I580c505424d03ac3a565de54182db22277c52ac1 Signed-off-by: Andreas Fritiofson <andreas.fritiofson@gmail.com> Reviewed-on: http://openocd.zylin.com/1369 Tested-by: jenkins Reviewed-by: Freddie Chopin <freddie.chopin@gmail.com> Reviewed-by: Paul Fertser <fercerpav@gmail.com> Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>
This commit is contained in:
parent
f43c23090e
commit
434eca2315
|
@ -1949,7 +1949,7 @@ static int cortex_a8_read_apb_ab_memory(struct target *target,
|
||||||
int start_byte = address & 0x3;
|
int start_byte = address & 0x3;
|
||||||
struct reg *reg;
|
struct reg *reg;
|
||||||
uint32_t dscr;
|
uint32_t dscr;
|
||||||
char *tmp_buff = NULL;
|
uint32_t *tmp_buff;
|
||||||
uint32_t buff32[2];
|
uint32_t buff32[2];
|
||||||
if (target->state != TARGET_HALTED) {
|
if (target->state != TARGET_HALTED) {
|
||||||
LOG_WARNING("target not halted");
|
LOG_WARNING("target not halted");
|
||||||
|
@ -1958,6 +1958,14 @@ static int cortex_a8_read_apb_ab_memory(struct target *target,
|
||||||
|
|
||||||
total_u32 = DIV_ROUND_UP((address & 3) + total_bytes, 4);
|
total_u32 = DIV_ROUND_UP((address & 3) + total_bytes, 4);
|
||||||
|
|
||||||
|
/* Due to offset word alignment, the buffer may not have space
|
||||||
|
* to read the full first and last int32 words,
|
||||||
|
* hence, malloc space to read into, then copy and align into the buffer.
|
||||||
|
*/
|
||||||
|
tmp_buff = malloc(total_u32 * 4);
|
||||||
|
if (tmp_buff == NULL)
|
||||||
|
return ERROR_FAIL;
|
||||||
|
|
||||||
/* Mark register R0 as dirty, as it will be used
|
/* Mark register R0 as dirty, as it will be used
|
||||||
* for transferring the data.
|
* for transferring the data.
|
||||||
* It will be restored automatically when exiting
|
* It will be restored automatically when exiting
|
||||||
|
@ -2009,12 +2017,6 @@ static int cortex_a8_read_apb_ab_memory(struct target *target,
|
||||||
goto error_unset_dtr_r;
|
goto error_unset_dtr_r;
|
||||||
|
|
||||||
|
|
||||||
/* Due to offset word alignment, the buffer may not have space
|
|
||||||
* to read the full first and last int32 words,
|
|
||||||
* hence, malloc space to read into, then copy and align into the buffer.
|
|
||||||
*/
|
|
||||||
tmp_buff = (char *) malloc(total_u32<<2);
|
|
||||||
|
|
||||||
/* The last word needs to be handled separately - read all other words in one go.
|
/* The last word needs to be handled separately - read all other words in one go.
|
||||||
*/
|
*/
|
||||||
if (total_u32 > 1) {
|
if (total_u32 > 1) {
|
||||||
|
@ -2023,7 +2025,7 @@ static int cortex_a8_read_apb_ab_memory(struct target *target,
|
||||||
*
|
*
|
||||||
* This data is read in aligned to 32 bit boundary, hence may need shifting later.
|
* This data is read in aligned to 32 bit boundary, hence may need shifting later.
|
||||||
*/
|
*/
|
||||||
retval = mem_ap_sel_read_buf_u32_noincr(swjdp, armv7a->debug_ap, (uint8_t *)tmp_buff, (total_u32-1)<<2,
|
retval = mem_ap_sel_read_buf_u32_noincr(swjdp, armv7a->debug_ap, (uint8_t *)tmp_buff, (total_u32-1) * 4,
|
||||||
armv7a->debug_base + CPUDBG_DTRTX);
|
armv7a->debug_base + CPUDBG_DTRTX);
|
||||||
if (retval != ERROR_OK)
|
if (retval != ERROR_OK)
|
||||||
goto error_unset_dtr_r;
|
goto error_unset_dtr_r;
|
||||||
|
@ -2060,12 +2062,12 @@ static int cortex_a8_read_apb_ab_memory(struct target *target,
|
||||||
|
|
||||||
/* Read the last word */
|
/* Read the last word */
|
||||||
retval = mem_ap_sel_read_atomic_u32(swjdp, armv7a->debug_ap,
|
retval = mem_ap_sel_read_atomic_u32(swjdp, armv7a->debug_ap,
|
||||||
armv7a->debug_base + CPUDBG_DTRTX, (uint32_t *)&tmp_buff[(total_u32-1)<<2]);
|
armv7a->debug_base + CPUDBG_DTRTX, &tmp_buff[total_u32 - 1]);
|
||||||
if (retval != ERROR_OK)
|
if (retval != ERROR_OK)
|
||||||
goto error_free_buff_r;
|
goto error_free_buff_r;
|
||||||
|
|
||||||
/* Copy and align the data into the output buffer */
|
/* Copy and align the data into the output buffer */
|
||||||
memcpy(buffer, &tmp_buff[start_byte], total_bytes);
|
memcpy(buffer, (uint8_t *)tmp_buff + start_byte, total_bytes);
|
||||||
|
|
||||||
free(tmp_buff);
|
free(tmp_buff);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue