This is an automated email from Gerrit.

Salvador Arroyo ([email protected]) just uploaded a new patch set to Gerrit, 
which you can find at http://openocd.zylin.com/690

-- gerrit

commit fa7c5f1af3560adb9779d22525e18afb0e94c40b
Author: Salvador Arroyo <[email protected]>
Date:   Thu Jun 7 16:44:34 2012 +0200

    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 <[email protected]>

diff --git a/src/target/mips32_pracc.c b/src/target/mips32_pracc.c
index d657b98..c2fccda 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)

-- 

------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
OpenOCD-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openocd-devel

Reply via email to