diff --git a/src/target/mips32_pracc.c b/src/target/mips32_pracc.c index 0cada4fa4..d657b987a 100644 --- a/src/target/mips32_pracc.c +++ b/src/target/mips32_pracc.c @@ -442,14 +442,17 @@ static int mips32_pracc_read_mem16(struct mips_ejtag *ejtag_info, uint32_t addr, /* TODO remove array */ uint32_t *param_out = malloc(count * sizeof(uint32_t)); - int i; + if (param_out == NULL) { + LOG_ERROR("Out of memory"); + return ERROR_FAIL; + } int retval = ERROR_OK; int blocksize; + int hwordsread = 0; uint32_t param_in[2]; - /*while (count > 0) */ - { + while (count > 0) { blocksize = count; if (count > 0x400) blocksize = 0x400; @@ -458,17 +461,21 @@ static int mips32_pracc_read_mem16(struct mips_ejtag *ejtag_info, uint32_t addr, param_in[1] = blocksize; retval = mips32_pracc_exec(ejtag_info, ARRAY_SIZE(code), code, - ARRAY_SIZE(param_in), param_in, count, param_out, 1); + ARRAY_SIZE(param_in), param_in, blocksize, ¶m_out[hwordsread], 1); -/* count -= blocksize; */ -/* addr += blocksize; */ + if (retval != ERROR_OK) + return retval; + + count -= blocksize; + addr += blocksize*sizeof(uint16_t); + hwordsread += blocksize; } - for (i = 0; i < count; i++) + int i; + for (i = 0; i < hwordsread; i++) buf[i] = param_out[i]; free(param_out); - return retval; } @@ -513,14 +520,17 @@ static int mips32_pracc_read_mem8(struct mips_ejtag *ejtag_info, uint32_t addr, /* TODO remove array */ uint32_t *param_out = malloc(count * sizeof(uint32_t)); - int i; + if (param_out == NULL) { + LOG_ERROR("Out of memory"); + return ERROR_FAIL; + } int retval = ERROR_OK; int blocksize; uint32_t param_in[2]; + int bytesread = 0; -/* while (count > 0) */ - { + while (count > 0) { blocksize = count; if (count > 0x400) blocksize = 0x400; @@ -529,17 +539,20 @@ static int mips32_pracc_read_mem8(struct mips_ejtag *ejtag_info, uint32_t addr, param_in[1] = blocksize; retval = mips32_pracc_exec(ejtag_info, ARRAY_SIZE(code), code, - ARRAY_SIZE(param_in), param_in, count, param_out, 1); + ARRAY_SIZE(param_in), param_in, count, ¶m_out[bytesread], 1); -/* count -= blocksize; */ -/* addr += blocksize; */ + if (retval != ERROR_OK) + return retval; + + count -= blocksize; + addr += blocksize; + bytesread += blocksize; } - - for (i = 0; i < count; i++) + int i; + for (i = 0; i < bytesread; i++) buf[i] = param_out[i]; free(param_out); - return retval; }