From 5e1f5f4731887288172b01754004bc8dc09d4cee Mon Sep 17 00:00:00 2001
From: Salvador Arroyo <sarroyofdez@yahoo.es>
Date: Thu, 7 Jun 2012 16:44:34 +0200
Subject: [PATCH] Bugfixes in mips32_pracc.c

When testing a pic32mx220f032b with different values
for adapter_khz and cpu clocks i was getting a lot of
corrupted data from the chip. From time to time
openocd fails with segmentation faults or is aborted
due to memory corruption.

Change-Id: I134743f75c477b3d55dc74ae4474598e153b4a4a
Signed-off-by: Salvador Arroyo <sarroyofdez@yahoo.es>
Reviewed-on: http://openocd.zylin.com/690
Tested-by: jenkins
Reviewed-by: Andreas Fritiofson <andreas.fritiofson@gmail.com>
Reviewed-by: Freddie Chopin <freddie.chopin@gmail.com>
---
 src/target/mips32_pracc.c | 22 +++++++++++++++-------
 1 file changed, 15 insertions(+), 7 deletions(-)

diff --git a/src/target/mips32_pracc.c b/src/target/mips32_pracc.c
index abf12e022..92b8699e0 100644
--- a/src/target/mips32_pracc.c
+++ b/src/target/mips32_pracc.c
@@ -153,18 +153,22 @@ static int mips32_pracc_exec_read(struct mips32_pracc_context *ctx, uint32_t add
 	uint32_t ejtag_ctrl, data;
 
 	if ((address >= MIPS32_PRACC_PARAM_IN)
-		&& (address <= MIPS32_PRACC_PARAM_IN + ctx->num_iparam * 4)) {
+		&& (address < MIPS32_PRACC_PARAM_IN + ctx->num_iparam * 4)) {
 		offset = (address - MIPS32_PRACC_PARAM_IN) / 4;
 		data = ctx->local_iparam[offset];
 	} else if ((address >= MIPS32_PRACC_PARAM_OUT)
-		&& (address <= MIPS32_PRACC_PARAM_OUT + ctx->num_oparam * 4)) {
+		&& (address < MIPS32_PRACC_PARAM_OUT + ctx->num_oparam * 4)) {
 		offset = (address - MIPS32_PRACC_PARAM_OUT) / 4;
 		data = ctx->local_oparam[offset];
 	} else if ((address >= MIPS32_PRACC_TEXT)
-		&& (address <= MIPS32_PRACC_TEXT + ctx->code_len * 4)) {
+		&& (address < MIPS32_PRACC_TEXT + ctx->code_len * 4)) {
 		offset = (address - MIPS32_PRACC_TEXT) / 4;
 		data = ctx->code[offset];
 	} else if (address == MIPS32_PRACC_STACK) {
+		if (ctx->stack_offset <= 0) {
+			LOG_ERROR("Error: Pracc stack out of bounds");
+			return ERROR_JTAG_DEVICE_ERROR;
+		}
 		/* save to our debug stack */
 		data = ctx->stack[--ctx->stack_offset];
 	} else {
@@ -209,14 +213,18 @@ static int mips32_pracc_exec_write(struct mips32_pracc_context *ctx, uint32_t ad
 		return retval;
 
 	if ((address >= MIPS32_PRACC_PARAM_IN)
-		&& (address <= MIPS32_PRACC_PARAM_IN + ctx->num_iparam * 4)) {
+		&& (address < MIPS32_PRACC_PARAM_IN + ctx->num_iparam * 4)) {
 		offset = (address - MIPS32_PRACC_PARAM_IN) / 4;
 		ctx->local_iparam[offset] = data;
 	} else if ((address >= MIPS32_PRACC_PARAM_OUT)
-		&& (address <= MIPS32_PRACC_PARAM_OUT + ctx->num_oparam * 4)) {
+		&& (address < MIPS32_PRACC_PARAM_OUT + ctx->num_oparam * 4)) {
 		offset = (address - MIPS32_PRACC_PARAM_OUT) / 4;
 		ctx->local_oparam[offset] = data;
 	} else if (address == MIPS32_PRACC_STACK) {
+		if (ctx->stack_offset >= 32) {
+			LOG_ERROR("Error: Pracc stack out of bounds");
+			return ERROR_JTAG_DEVICE_ERROR;
+		}
 		/* save data onto our stack */
 		ctx->stack[ctx->stack_offset++] = data;
 	} else {
@@ -231,7 +239,7 @@ int mips32_pracc_exec(struct mips_ejtag *ejtag_info, int code_len, const uint32_
 		int num_param_in, uint32_t *param_in, int num_param_out, uint32_t *param_out, int cycle)
 {
 	uint32_t ejtag_ctrl;
-	uint32_t address, data;
+	uint32_t address;
 	struct mips32_pracc_context ctx;
 	int retval;
 	int pass = 0;
@@ -250,7 +258,7 @@ int mips32_pracc_exec(struct mips_ejtag *ejtag_info, int code_len, const uint32_
 		if (retval != ERROR_OK)
 			return retval;
 
-		address = data = 0;
+		address = 0;
 		mips_ejtag_set_instr(ejtag_info, EJTAG_INST_ADDRESS);
 		retval = mips_ejtag_drscan_32(ejtag_info, &address);
 		if (retval != ERROR_OK)
-- 
GitLab