split jim_jtag_command into multiple handlers
[openocd.git] / src / target / mips32_pracc.c
index 55755065149c8f9c1f0028ec8f896aa1b9907fff..604d34edbf2524d9183b69740fa6d85f00f1438e 100644 (file)
@@ -26,7 +26,7 @@ This version has optimized assembly routines for 32 bit operations:
 - write word
 - write array of words
 
-One thing to be aware of is that the MIPS32 cpu will execute the 
+One thing to be aware of is that the MIPS32 cpu will execute the
 instruction after a branch instruction (one delay slot).
 
 For example:
@@ -36,7 +36,7 @@ For example:
     B foo
     LW $1, ($2 +100)
 
-The LW $1, ($2 +100) instruction is also executed. If this is 
+The LW $1, ($2 +100) instruction is also executed. If this is
 not wanted a NOP can be inserted:
 
     LW $2, ($5 +10)
@@ -77,23 +77,24 @@ Nico Coesel
 #include "mips32.h"
 #include "mips32_pracc.h"
 
-typedef struct {
+struct mips32_pracc_context
+{
        uint32_t *local_iparam;
        int num_iparam;
        uint32_t *local_oparam;
        int num_oparam;
-       uint32_t *code;
+       const uint32_t *code;
        int code_len;
        uint32_t stack[32];
        int stack_offset;
-       mips_ejtag_t *ejtag_info;
-} mips32_pracc_context;
+       struct mips_ejtag *ejtag_info;
+};
 
-static int wait_for_pracc_rw(mips_ejtag_t *ejtag_info, uint32_t *ctrl)
+static int wait_for_pracc_rw(struct mips_ejtag *ejtag_info, uint32_t *ctrl)
 {
        uint32_t ejtag_ctrl;
-       
-       while (1) 
+
+       while (1)
        {
                mips_ejtag_set_instr(ejtag_info, EJTAG_INST_CONTROL, NULL);
                ejtag_ctrl = ejtag_info->ejtag_ctrl;
@@ -103,14 +104,14 @@ static int wait_for_pracc_rw(mips_ejtag_t *ejtag_info, uint32_t *ctrl)
                LOG_DEBUG("DEBUGMODULE: No memory access in progress!\n");
                return ERROR_JTAG_DEVICE_ERROR;
        }
-       
+
        *ctrl = ejtag_ctrl;
        return ERROR_OK;
 }
 
-static int mips32_pracc_exec_read(mips32_pracc_context *ctx, uint32_t address)
+static int mips32_pracc_exec_read(struct mips32_pracc_context *ctx, uint32_t address)
 {
-       mips_ejtag_t *ejtag_info = ctx->ejtag_info;
+       struct mips_ejtag *ejtag_info = ctx->ejtag_info;
        int offset;
        uint32_t ejtag_ctrl, data;
 
@@ -141,12 +142,12 @@ static int mips32_pracc_exec_read(mips32_pracc_context *ctx, uint32_t address)
        {
                /* TODO: send JMP 0xFF200000 instruction. Hopefully processor jump back
                 * to start of debug vector */
-               
+
                data = 0;
                LOG_ERROR("Error reading unexpected address %8.8" PRIx32 "", address);
                return ERROR_JTAG_DEVICE_ERROR;
        }
-       
+
        /* Send the data out */
        mips_ejtag_set_instr(ctx->ejtag_info, EJTAG_INST_DATA, NULL);
        mips_ejtag_drscan_32(ctx->ejtag_info, &data);
@@ -159,20 +160,20 @@ static int mips32_pracc_exec_read(mips32_pracc_context *ctx, uint32_t address)
 
        jtag_add_clocks(5);
        jtag_execute_queue();
-       
+
 
        return ERROR_OK;
 }
 
-static int mips32_pracc_exec_write(mips32_pracc_context *ctx, uint32_t address)
+static int mips32_pracc_exec_write(struct mips32_pracc_context *ctx, uint32_t address)
 {
        uint32_t ejtag_ctrl,data;
        int offset;
-       mips_ejtag_t *ejtag_info = ctx->ejtag_info;
+       struct mips_ejtag *ejtag_info = ctx->ejtag_info;
 
        mips_ejtag_set_instr(ctx->ejtag_info, EJTAG_INST_DATA, NULL);
        mips_ejtag_drscan_32(ctx->ejtag_info, &data);
-       
+
        /* Clear access pending bit */
        ejtag_ctrl = ejtag_info->ejtag_ctrl & ~EJTAG_CTRL_PRACC;
        mips_ejtag_set_instr(ctx->ejtag_info, EJTAG_INST_CONTROL, NULL);
@@ -180,14 +181,14 @@ static int mips32_pracc_exec_write(mips32_pracc_context *ctx, uint32_t address)
 
        jtag_add_clocks(5);
        jtag_execute_queue();
-       
+
        if ((address >= MIPS32_PRACC_PARAM_IN)
                && (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 )
+       else if ((address >= MIPS32_PRACC_PARAM_OUT)
                && (address <= MIPS32_PRACC_PARAM_OUT + ctx->num_oparam * 4))
        {
                offset = (address - MIPS32_PRACC_PARAM_OUT) / 4;
@@ -203,18 +204,18 @@ static int mips32_pracc_exec_write(mips32_pracc_context *ctx, uint32_t address)
                LOG_ERROR("Error writing unexpected address %8.8" PRIx32 "", address);
                return ERROR_JTAG_DEVICE_ERROR;
        }
-       
+
        return ERROR_OK;
 }
 
-int mips32_pracc_exec(mips_ejtag_t *ejtag_info, int code_len, uint32_t *code, int num_param_in, uint32_t *param_in, int num_param_out, uint32_t *param_out, int cycle)
+int mips32_pracc_exec(struct mips_ejtag *ejtag_info, int code_len, const uint32_t *code, 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;
-       mips32_pracc_context ctx;
+       struct mips32_pracc_context ctx;
        int retval;
        int pass = 0;
-       
+
        ctx.local_iparam = param_in;
        ctx.local_oparam = param_out;
        ctx.num_iparam = num_param_in;
@@ -223,18 +224,18 @@ int mips32_pracc_exec(mips_ejtag_t *ejtag_info, int code_len, uint32_t *code, in
        ctx.code_len = code_len;
        ctx.ejtag_info = ejtag_info;
        ctx.stack_offset = 0;
-       
+
        while (1)
        {
                if ((retval = wait_for_pracc_rw(ejtag_info, &ejtag_ctrl)) != ERROR_OK)
                        return retval;
-               
+
                address = data = 0;
                mips_ejtag_set_instr(ejtag_info, EJTAG_INST_ADDRESS, NULL);
                mips_ejtag_drscan_32(ejtag_info, &address);
 
 //             printf("Adres: %.8x\n", address);
-               
+
                /* Check for read or write */
                if (ejtag_ctrl & EJTAG_CTRL_PRNW)
                {
@@ -250,26 +251,26 @@ int mips32_pracc_exec(mips_ejtag_t *ejtag_info, int code_len, uint32_t *code, in
                        {
                                break;
                        }
-                       
+
                        if ((retval = mips32_pracc_exec_read(&ctx, address)) != ERROR_OK)
                                return retval;
 
                }
-               
+
                if (cycle == 0)
                        break;
        }
-       
+
        /* stack sanity check */
        if (ctx.stack_offset != 0)
        {
                LOG_DEBUG("Pracc Stack not zero");
        }
-       
+
        return ERROR_OK;
 }
 
-int mips32_pracc_read_mem(mips_ejtag_t *ejtag_info, uint32_t addr, int size, int count, void *buf)
+int mips32_pracc_read_mem(struct mips_ejtag *ejtag_info, uint32_t addr, int size, int count, void *buf)
 {
        switch (size)
        {
@@ -283,13 +284,13 @@ int mips32_pracc_read_mem(mips_ejtag_t *ejtag_info, uint32_t addr, int size, int
                        else
                                return mips32_pracc_read_mem32(ejtag_info, addr, count, (uint32_t*)buf);
        }
-       
+
        return ERROR_OK;
 }
 
-int mips32_pracc_read_mem32(mips_ejtag_t *ejtag_info, uint32_t addr, int count, uint32_t *buf)
-{      
-       uint32_t code[] = {
+int mips32_pracc_read_mem32(struct mips_ejtag *ejtag_info, uint32_t addr, int count, uint32_t *buf)
+{
+       static const uint32_t code[] = {
                                                                                                                        /* start: */
                MIPS32_MTC0(15,31,0),                                                           /* move $15 to COP0 DeSave */
                MIPS32_LUI(15,UPPER16(MIPS32_PRACC_STACK)),             /* $15 = MIPS32_PRACC_STACK */
@@ -298,7 +299,7 @@ int mips32_pracc_read_mem32(mips_ejtag_t *ejtag_info, uint32_t addr, int count,
                MIPS32_SW(9,0,15),                                                                      /* sw $9,($15) */
                MIPS32_SW(10,0,15),                                                             /* sw $10,($15) */
                MIPS32_SW(11,0,15),                                                             /* sw $11,($15) */
-                       
+
                MIPS32_LUI(8,UPPER16(MIPS32_PRACC_PARAM_IN)),           /* $8 = MIPS32_PRACC_PARAM_IN */
                MIPS32_ORI(8,8,LOWER16(MIPS32_PRACC_PARAM_IN)),
                MIPS32_LW(9,0,8),                                                                       /* $9 = mem[$8]; read addr */
@@ -309,14 +310,14 @@ int mips32_pracc_read_mem32(mips_ejtag_t *ejtag_info, uint32_t addr, int count,
                                                                                                                        /* loop: */
                MIPS32_BEQ(0,10,9),                                                                     /* beq 0, $10, end */
                MIPS32_NOP,
-               
+
                MIPS32_LW(8,0,9),                                                                       /* lw $8,0($9), Load $8 with the word @mem[$9] */
                MIPS32_SW(8,0,11),                                                                      /* sw $8,0($11) */
-               
+
                MIPS32_ADDI(10,10,NEG16(1)),                                            /* $10-- */
                MIPS32_ADDI(9,9,4),                                                             /* $1 += 4 */
                MIPS32_ADDI(11,11,4),                                                           /* $11 += 4 */
-               
+
                MIPS32_NOP,
                MIPS32_B(NEG16(9)),                                                                     /* b loop */
                MIPS32_NOP,
@@ -330,29 +331,29 @@ int mips32_pracc_read_mem32(mips_ejtag_t *ejtag_info, uint32_t addr, int count,
                MIPS32_B(NEG16(31)),                                                            /* b start */
                MIPS32_NOP,
        };
-       
+
        int retval = ERROR_OK;
        int blocksize;
        int bytesread;
        uint32_t param_in[2];
-       
+
        bytesread = 0;
-       
+
        while (count > 0)
-       {       
+       {
                blocksize = count;
                if (count > 0x400)
                        blocksize = 0x400;
-               
+
                param_in[0] = addr;
                param_in[1] = blocksize;
-               
-               if ((retval = mips32_pracc_exec(ejtag_info, sizeof(code)/sizeof(code[0]), code, 
-                       sizeof(param_in)/sizeof(param_in[0]), param_in, blocksize, &buf[bytesread], 1)) != ERROR_OK)
+
+               if ((retval = mips32_pracc_exec(ejtag_info, ARRAY_SIZE(code), code,
+                       ARRAY_SIZE(param_in), param_in, blocksize, &buf[bytesread], 1)) != ERROR_OK)
                {
                        return retval;
                }
-               
+
                count -= blocksize;
                addr += blocksize;
                bytesread += blocksize;
@@ -361,9 +362,9 @@ int mips32_pracc_read_mem32(mips_ejtag_t *ejtag_info, uint32_t addr, int count,
        return retval;
 }
 
-int mips32_pracc_read_u32(mips_ejtag_t *ejtag_info, uint32_t addr, uint32_t *buf)
+int mips32_pracc_read_u32(struct mips_ejtag *ejtag_info, uint32_t addr, uint32_t *buf)
 {
-       uint32_t code[] = {
+       static const uint32_t code[] = {
                                                                                                                        /* start: */
                MIPS32_MTC0(15,31,0),                                                           /* move $15 to COP0 DeSave */
                MIPS32_LUI(15,UPPER16(MIPS32_PRACC_STACK)),             /* $15 = MIPS32_PRACC_STACK */
@@ -386,8 +387,8 @@ int mips32_pracc_read_u32(mips_ejtag_t *ejtag_info, uint32_t addr, uint32_t *buf
 
        param_in[0] = addr;
 
-       if ((retval = mips32_pracc_exec(ejtag_info, sizeof(code)/sizeof(code[0]), code, 
-               sizeof(param_in)/sizeof(param_in[0]), param_in, sizeof(uint32_t), buf, 1)) != ERROR_OK)
+       if ((retval = mips32_pracc_exec(ejtag_info, ARRAY_SIZE(code), code,
+               ARRAY_SIZE(param_in), param_in, sizeof(uint32_t), buf, 1)) != ERROR_OK)
        {
                return retval;
        }
@@ -395,9 +396,9 @@ int mips32_pracc_read_u32(mips_ejtag_t *ejtag_info, uint32_t addr, uint32_t *buf
        return retval;
 }
 
-int mips32_pracc_read_mem16(mips_ejtag_t *ejtag_info, uint32_t addr, int count, uint16_t *buf)
+int mips32_pracc_read_mem16(struct mips_ejtag *ejtag_info, uint32_t addr, int count, uint16_t *buf)
 {
-       uint32_t code[] = {
+       static const uint32_t code[] = {
                                                                                                                        /* start: */
                MIPS32_MTC0(15,31,0),                                                           /* move $15 to COP0 DeSave */
                MIPS32_LUI(15,UPPER16(MIPS32_PRACC_STACK)),             /* $15 = MIPS32_PRACC_STACK */
@@ -406,7 +407,7 @@ int mips32_pracc_read_mem16(mips_ejtag_t *ejtag_info, uint32_t addr, int count,
                MIPS32_SW(9,0,15),                                                                      /* sw $9,($15) */
                MIPS32_SW(10,0,15),                                                             /* sw $10,($15) */
                MIPS32_SW(11,0,15),                                                             /* sw $11,($15) */
-                       
+
                MIPS32_LUI(8,UPPER16(MIPS32_PRACC_PARAM_IN)),           /* $8 = MIPS32_PRACC_PARAM_IN */
                MIPS32_ORI(8,8,LOWER16(MIPS32_PRACC_PARAM_IN)),
                MIPS32_LW(9,0,8),                                                                       /* $9 = mem[$8]; read addr */
@@ -417,10 +418,10 @@ int mips32_pracc_read_mem16(mips_ejtag_t *ejtag_info, uint32_t addr, int count,
                                                                                                                        /* loop: */
                MIPS32_BEQ(0,10,9),                                                             /* beq 0, $10, end */
                MIPS32_NOP,
-               
+
                MIPS32_LHU(8,0,9),                                                                      /* lw $8,0($9), Load $8 with the halfword @mem[$9] */
                MIPS32_SW(8,0,11),                                                                      /* sw $8,0($11) */
-               
+
                MIPS32_ADDI(10,10,NEG16(1)),                                            /* $10-- */
                MIPS32_ADDI(9,9,2),                                                             /* $9 += 2 */
                MIPS32_ADDI(11,11,4),                                                           /* $11 += 4 */
@@ -439,44 +440,46 @@ int mips32_pracc_read_mem16(mips_ejtag_t *ejtag_info, uint32_t addr, int count,
        };
 
 //     /* TODO remove array */
-       uint32_t param_out[count];
+       uint32_t *param_out = malloc(count * sizeof(uint32_t));
        int i;
-       
+
 //     int retval;
        int blocksize;
        int bytesread;
        uint32_t param_in[2];
-       
+
        bytesread = 0;
-       
+
        //while (count > 0)
-       {       
+       {
                blocksize = count;
                if (count > 0x400)
                        blocksize = 0x400;
-               
+
                param_in[0] = addr;
                param_in[1] = blocksize;
-               
-               mips32_pracc_exec(ejtag_info, sizeof(code)/sizeof(code[0]), code, \
-                       sizeof(param_in)/sizeof(param_in[0]), param_in, count, param_out, 1);
-               
+
+               mips32_pracc_exec(ejtag_info, ARRAY_SIZE(code), code, \
+                       ARRAY_SIZE(param_in), param_in, count, param_out, 1);
+
 //             count -= blocksize;
 //             addr += blocksize;
 //             bytesread += blocksize;
        }
-       
+
        for (i = 0; i < count; i++)
        {
                buf[i] = param_out[i];
        }
-       
+
+       free(param_out);
+
        return ERROR_OK;
 }
 
-int mips32_pracc_read_mem8(mips_ejtag_t *ejtag_info, uint32_t addr, int count, uint8_t *buf)
+int mips32_pracc_read_mem8(struct mips_ejtag *ejtag_info, uint32_t addr, int count, uint8_t *buf)
 {
-       uint32_t code[] = {
+       static const uint32_t code[] = {
                                                                                                                        /* start: */
                MIPS32_MTC0(15,31,0),                                                           /* move $15 to COP0 DeSave */
                MIPS32_LUI(15,UPPER16(MIPS32_PRACC_STACK)),             /* $15 = MIPS32_PRACC_STACK */
@@ -485,7 +488,7 @@ int mips32_pracc_read_mem8(mips_ejtag_t *ejtag_info, uint32_t addr, int count, u
                MIPS32_SW(9,0,15),                                                                      /* sw $9,($15) */
                MIPS32_SW(10,0,15),                                                             /* sw $10,($15) */
                MIPS32_SW(11,0,15),                                                             /* sw $11,($15) */
-                       
+
                MIPS32_LUI(8,UPPER16(MIPS32_PRACC_PARAM_IN)),           /* $8 = MIPS32_PRACC_PARAM_IN */
                MIPS32_ORI(8,8,LOWER16(MIPS32_PRACC_PARAM_IN)),
                MIPS32_LW(9,0,8),                                                                       /* $9 = mem[$8]; read addr */
@@ -496,10 +499,10 @@ int mips32_pracc_read_mem8(mips_ejtag_t *ejtag_info, uint32_t addr, int count, u
                                                                                                                        /* loop: */
                MIPS32_BEQ(0,10,9),                                                             /* beq 0, $10, end */
                MIPS32_NOP,
-               
+
                MIPS32_LBU(8,0,9),                                                                      /* lw $8,0($9), Load t4 with the byte @mem[t1] */
                MIPS32_SW(8,0,11),                                                                      /* sw $8,0($11) */
-               
+
                MIPS32_ADDI(10,10,NEG16(1)),                                            /* $10-- */
                MIPS32_ADDI(9,9,1),                                                             /* $9 += 1 */
                MIPS32_ADDI(11,11,4),                                                           /* $11 += 4 */
@@ -516,44 +519,46 @@ int mips32_pracc_read_mem8(mips_ejtag_t *ejtag_info, uint32_t addr, int count, u
                MIPS32_B(NEG16(31)),                                                            /* b start */
                MIPS32_NOP,
        };
-       
+
 //     /* TODO remove array */
-       uint32_t param_out[count];
+       uint32_t *param_out = malloc(count * sizeof(uint32_t));
        int i;
-       
+
 //     int retval;
        int blocksize;
        int bytesread;
        uint32_t param_in[2];
-       
+
        bytesread = 0;
-       
+
 //     while (count > 0)
-       {       
+       {
                blocksize = count;
                if (count > 0x400)
                        blocksize = 0x400;
-               
+
                param_in[0] = addr;
                param_in[1] = blocksize;
-               
-               mips32_pracc_exec(ejtag_info, sizeof(code)/sizeof(code[0]), code, \
-                       sizeof(param_in)/sizeof(param_in[0]), param_in, count, param_out, 1);
-               
+
+               mips32_pracc_exec(ejtag_info, ARRAY_SIZE(code), code, \
+                       ARRAY_SIZE(param_in), param_in, count, param_out, 1);
+
 //             count -= blocksize;
 //             addr += blocksize;
 //             bytesread += blocksize;
        }
-       
+
        for (i = 0; i < count; i++)
        {
                buf[i] = param_out[i];
        }
 
+       free(param_out);
+
        return ERROR_OK;
 }
 
-int mips32_pracc_write_mem(mips_ejtag_t *ejtag_info, uint32_t addr, int size, int count, void *buf)
+int mips32_pracc_write_mem(struct mips_ejtag *ejtag_info, uint32_t addr, int size, int count, void *buf)
 {
        switch (size)
        {
@@ -567,15 +572,15 @@ int mips32_pracc_write_mem(mips_ejtag_t *ejtag_info, uint32_t addr, int size, in
                        else
                                return mips32_pracc_write_mem32(ejtag_info, addr, count, (uint32_t*)buf);
        }
-       
+
        return ERROR_OK;
 }
 
-int mips32_pracc_write_mem32(mips_ejtag_t *ejtag_info, uint32_t addr, int count, uint32_t *buf)
+int mips32_pracc_write_mem32(struct mips_ejtag *ejtag_info, uint32_t addr, int count, uint32_t *buf)
 {
 
 //NC: use destination pointer as loop counter (last address is in $10)
-       uint32_t code[] = {
+       static const uint32_t code[] = {
                                                                                                                        /* start: */
                MIPS32_MTC0(15,31,0),                                                           /* move $15 to COP0 DeSave */
                MIPS32_LUI(15,UPPER16(MIPS32_PRACC_STACK)),             /* $15 = MIPS32_PRACC_STACK */
@@ -584,7 +589,7 @@ int mips32_pracc_write_mem32(mips_ejtag_t *ejtag_info, uint32_t addr, int count,
                MIPS32_SW(9,0,15),                                                                      /* sw $9,($15) */
                MIPS32_SW(10,0,15),                                                             /* sw $10,($15) */
                MIPS32_SW(11,0,15),                                                             /* sw $11,($15) */
-               
+
                MIPS32_ADDI(8,15,NEG16(MIPS32_PRACC_STACK-MIPS32_PRACC_PARAM_IN)),  //$8= MIPS32_PRACC_PARAM_IN
                MIPS32_LW(9,0,8),                                                                       /* Load write addr to $9 */
                MIPS32_LW(10,4,8),      //last address                                                                  /* Load write count to $10 */
@@ -593,7 +598,7 @@ int mips32_pracc_write_mem32(mips_ejtag_t *ejtag_info, uint32_t addr, int count,
 //loop:
                MIPS32_LW(11,0,8),                                                                      /* lw $11,0($8), Load $11 with the word @mem[$8] */
                MIPS32_SW(11,0,9),                                                                      /* sw $11,0($9) */
-               
+
                MIPS32_ADDI(9,9,4),                                                             /* $9 += 4 */
                MIPS32_BNE(10,9,NEG16(4)),  //was 9 BNE $10, 9, loop                                                                    /* b loop */
                MIPS32_ADDI(8,8,4),  //this instruction is part of the loop (one delay slot)!   /* $8 += 4 */
@@ -606,30 +611,32 @@ int mips32_pracc_write_mem32(mips_ejtag_t *ejtag_info, uint32_t addr, int count,
                MIPS32_MFC0(15,31,0),                                                           /* move COP0 DeSave to $15 */
                MIPS32_NOP, //this one will not be executed
        };
-       
+
        /* TODO remove array */
-       uint32_t param_in[count + 2];
+       uint32_t *param_in = malloc((count + 2) * sizeof(uint32_t));
        param_in[0] = addr;
        param_in[1] = addr + count * sizeof(uint32_t);  //last address
-    
+
        memcpy(&param_in[2], buf, count * sizeof(uint32_t));
-       
-       mips32_pracc_exec(ejtag_info, sizeof(code)/sizeof(code[0]), code, \
-               sizeof(param_in)/sizeof(param_in[0]),param_in, 0, NULL, 1);
+
+       mips32_pracc_exec(ejtag_info, ARRAY_SIZE(code), code, \
+               count + 2, param_in, 0, NULL, 1);
+
+       free(param_in);
 
        return ERROR_OK;
 }
 
-int mips32_pracc_write_u32(mips_ejtag_t *ejtag_info, uint32_t addr, uint32_t *buf)
+int mips32_pracc_write_u32(struct mips_ejtag *ejtag_info, uint32_t addr, uint32_t *buf)
 {
-       uint32_t code[] = {
+       static const uint32_t code[] = {
                                                                                                                        /* start: */
                MIPS32_MTC0(15,31,0),                                                           /* move $15 to COP0 DeSave */
                MIPS32_LUI(15,UPPER16(MIPS32_PRACC_STACK)),             /* $15 = MIPS32_PRACC_STACK */
                MIPS32_ORI(15,15,LOWER16(MIPS32_PRACC_STACK)),
                MIPS32_SW(8,0,15),                                                                      /* sw $8,($15) */
                MIPS32_SW(9,0,15),                                                                      /* sw $9,($15) */
-       
+
                MIPS32_LW(8,NEG16((MIPS32_PRACC_STACK-MIPS32_PRACC_PARAM_IN)-4), 15),  //load R8 @ param_in[1] = data
                MIPS32_LW(9,NEG16(MIPS32_PRACC_STACK-MIPS32_PRACC_PARAM_IN), 15),  //load R9 @ param_in[0] = address
 
@@ -647,15 +654,15 @@ int mips32_pracc_write_u32(mips_ejtag_t *ejtag_info, uint32_t addr, uint32_t *bu
        param_in[0] = addr;
        param_in[1] = *buf;
 
-       mips32_pracc_exec(ejtag_info, sizeof(code)/sizeof(code[0]), code, \
-               sizeof(param_in)/sizeof(param_in[0]),param_in, 0, NULL, 1);
+       mips32_pracc_exec(ejtag_info, ARRAY_SIZE(code), code, \
+               ARRAY_SIZE(param_in),param_in, 0, NULL, 1);
 
        return ERROR_OK;
 }
 
-int mips32_pracc_write_mem16(mips_ejtag_t *ejtag_info, uint32_t addr, int count, uint16_t *buf)
+int mips32_pracc_write_mem16(struct mips_ejtag *ejtag_info, uint32_t addr, int count, uint16_t *buf)
 {
-       uint32_t code[] = {
+       static const uint32_t code[] = {
                                                                                                                        /* start: */
                MIPS32_MTC0(15,31,0),                                                           /* move $15 to COP0 DeSave */
                MIPS32_LUI(15,UPPER16(MIPS32_PRACC_STACK)),             /* $15 = MIPS32_PRACC_STACK */
@@ -664,7 +671,7 @@ int mips32_pracc_write_mem16(mips_ejtag_t *ejtag_info, uint32_t addr, int count,
                MIPS32_SW(9,0,15),                                                                      /* sw $9,($15) */
                MIPS32_SW(10,0,15),                                                             /* sw $10,($15) */
                MIPS32_SW(11,0,15),                                                             /* sw $11,($15) */
-               
+
                MIPS32_LUI(8,UPPER16(MIPS32_PRACC_PARAM_IN)),           /* $8 = MIPS32_PRACC_PARAM_IN */
                MIPS32_ORI(8,8,LOWER16(MIPS32_PRACC_PARAM_IN)),
                MIPS32_LW(9,0,8),                                                                       /* Load write addr to $9 */
@@ -674,14 +681,14 @@ int mips32_pracc_write_mem16(mips_ejtag_t *ejtag_info, uint32_t addr, int count,
                                                                                                                        /* loop: */
                MIPS32_BEQ(0,10,9),                                                                     /* beq $0, $10, end */
                MIPS32_NOP,
-               
+
                MIPS32_LW(11,0,8),                                                                      /* lw $11,0($8), Load $11 with the word @mem[$8] */
                MIPS32_SH(11,0,9),                                                                      /* sh $11,0($9) */
-               
+
                MIPS32_ADDI(10,10,NEG16(1)),                                            /* $10-- */
                MIPS32_ADDI(9,9,2),                                                             /* $9 += 2 */
                MIPS32_ADDI(8,8,4),                                                             /* $8 += 4 */
-               
+
                MIPS32_NOP,
                MIPS32_B(NEG16(9)),                                                                     /* b loop */
                MIPS32_NOP,
@@ -695,27 +702,29 @@ int mips32_pracc_write_mem16(mips_ejtag_t *ejtag_info, uint32_t addr, int count,
                MIPS32_B(NEG16(30)),                                                            /* b start */
                MIPS32_NOP,
        };
-       
+
        /* TODO remove array */
-       uint32_t param_in[count + 2];
+       uint32_t *param_in = malloc((count + 2) * sizeof(uint32_t));
        int i;
        param_in[0] = addr;
        param_in[1] = count;
-       
+
        for (i = 0; i < count; i++)
        {
                param_in[i + 2] = buf[i];
        }
-       
-       mips32_pracc_exec(ejtag_info, sizeof(code)/sizeof(code[0]), code, \
-               sizeof(param_in)/sizeof(param_in[0]), param_in, 0, NULL, 1);
+
+       mips32_pracc_exec(ejtag_info, ARRAY_SIZE(code), code, \
+               count + 2, param_in, 0, NULL, 1);
+
+       free(param_in);
 
        return ERROR_OK;
 }
 
-int mips32_pracc_write_mem8(mips_ejtag_t *ejtag_info, uint32_t addr, int count, uint8_t *buf)
+int mips32_pracc_write_mem8(struct mips_ejtag *ejtag_info, uint32_t addr, int count, uint8_t *buf)
 {
-       uint32_t code[] = {
+       static const uint32_t code[] = {
                                                                                                                        /* start: */
                MIPS32_MTC0(15,31,0),                                                           /* move $15 to COP0 DeSave */
                MIPS32_LUI(15,UPPER16(MIPS32_PRACC_STACK)),             /* $15 = MIPS32_PRACC_STACK */
@@ -724,7 +733,7 @@ int mips32_pracc_write_mem8(mips_ejtag_t *ejtag_info, uint32_t addr, int count,
                MIPS32_SW(9,0,15),                                                                      /* sw $9,($15) */
                MIPS32_SW(10,0,15),                                                             /* sw $10,($15) */
                MIPS32_SW(11,0,15),                                                             /* sw $11,($15) */
-               
+
                MIPS32_LUI(8,UPPER16(MIPS32_PRACC_PARAM_IN)),           /* $8 = MIPS32_PRACC_PARAM_IN */
                MIPS32_ORI(8,8,LOWER16(MIPS32_PRACC_PARAM_IN)),
                MIPS32_LW(9,0,8),                                                                       /* Load write addr to $9 */
@@ -734,14 +743,14 @@ int mips32_pracc_write_mem8(mips_ejtag_t *ejtag_info, uint32_t addr, int count,
                                                                                                                        /* loop: */
                MIPS32_BEQ(0,10,9),                                                                     /* beq $0, $10, end */
                MIPS32_NOP,
-               
+
                MIPS32_LW(11,0,8),                                                                      /* lw $11,0($8), Load $11 with the word @mem[$8] */
                MIPS32_SB(11,0,9),                                                                      /* sb $11,0($9) */
-               
+
                MIPS32_ADDI(10,10,NEG16(1)),                                            /* $10-- */
                MIPS32_ADDI(9,9,1),                                                             /* $9 += 1 */
                MIPS32_ADDI(8,8,4),                                                             /* $8 += 4 */
-               
+
                MIPS32_NOP,
                MIPS32_B(NEG16(9)),                                                                     /* b loop */
                MIPS32_NOP,
@@ -755,28 +764,30 @@ int mips32_pracc_write_mem8(mips_ejtag_t *ejtag_info, uint32_t addr, int count,
                MIPS32_B(NEG16(30)),                                                            /* b start */
                MIPS32_NOP,
        };
-       
+
        /* TODO remove array */
-       uint32_t param_in[count + 2];
+       uint32_t *param_in = malloc((count + 2) * sizeof(uint32_t));
        int retval;
        int i;
        param_in[0] = addr;
        param_in[1] = count;
-       
+
        for (i = 0; i < count; i++)
        {
                param_in[i + 2] = buf[i];
        }
-       
-       retval = mips32_pracc_exec(ejtag_info, sizeof(code)/sizeof(code[0]), code, \
-               sizeof(param_in)/sizeof(param_in[0]), param_in, 0, NULL, 1);
+
+       retval = mips32_pracc_exec(ejtag_info, ARRAY_SIZE(code), code, \
+               count +2, param_in, 0, NULL, 1);
+
+       free(param_in);
 
        return retval;
 }
 
-int mips32_pracc_write_regs(mips_ejtag_t *ejtag_info, uint32_t *regs)
+int mips32_pracc_write_regs(struct mips_ejtag *ejtag_info, uint32_t *regs)
 {
-       uint32_t code[] = {
+       static const uint32_t code[] = {
                                                                                                                /* start: */
                MIPS32_LUI(2,UPPER16(MIPS32_PRACC_PARAM_IN)),   /* $2 = MIPS32_PRACC_PARAM_IN */
                MIPS32_ORI(2,2,LOWER16(MIPS32_PRACC_PARAM_IN)),
@@ -816,7 +827,7 @@ int mips32_pracc_write_regs(mips_ejtag_t *ejtag_info, uint32_t *regs)
                MIPS32_LW(29,29*4,1),                                                   /* lw $29,29*4($1) */
                MIPS32_LW(30,30*4,1),                                                   /* lw $30,30*4($1) */
                MIPS32_LW(31,31*4,1),                                                   /* lw $31,31*4($1) */
-               
+
                MIPS32_LW(2,32*4,1),                                                    /* lw $2,32*4($1) */
                MIPS32_MTC0(2,12,0),                                                    /* move $2 to status */
                MIPS32_LW(2,33*4,1),                                                    /* lw $2,33*4($1) */
@@ -829,7 +840,7 @@ int mips32_pracc_write_regs(mips_ejtag_t *ejtag_info, uint32_t *regs)
                MIPS32_MTC0(2,13,0),                                                    /* move $2 to cause*/
                MIPS32_LW(2,37*4,1),                                                    /* lw $2,37*4($1) */
                MIPS32_MTC0(2,24,0),                                                    /* move $2 to pc */
-               
+
                MIPS32_LW(2,2*4,1),                                                     /* lw $2,2*4($1) */
                MIPS32_LW(1,0,15),                                                              /* lw $1,($15) */
                MIPS32_MFC0(15,31,0),                                                   /* move COP0 DeSave to $15 */
@@ -837,18 +848,18 @@ int mips32_pracc_write_regs(mips_ejtag_t *ejtag_info, uint32_t *regs)
                MIPS32_B(NEG16(55)),                                                    /* b start */
                MIPS32_NOP,
        };
-       
+
        int retval;
-       
-       retval = mips32_pracc_exec(ejtag_info, sizeof(code)/sizeof(code[0]), code, \
+
+       retval = mips32_pracc_exec(ejtag_info, ARRAY_SIZE(code), code, \
                38, regs, 0, NULL, 1);
-       
+
        return retval;
 }
 
-int mips32_pracc_read_regs(mips_ejtag_t *ejtag_info, uint32_t *regs)
+int mips32_pracc_read_regs(struct mips_ejtag *ejtag_info, uint32_t *regs)
 {
-       uint32_t code[] = {
+       static const uint32_t code[] = {
                                                                                                                /* start: */
                MIPS32_MTC0(2,31,0),                                                    /* move $2 to COP0 DeSave */
                MIPS32_LUI(2,UPPER16(MIPS32_PRACC_PARAM_OUT)),  /* $2 = MIPS32_PRACC_PARAM_OUT */
@@ -893,7 +904,7 @@ int mips32_pracc_read_regs(mips_ejtag_t *ejtag_info, uint32_t *regs)
                MIPS32_SW(29,29*4,1),                                                   /* sw $29,29*4($1) */
                MIPS32_SW(30,30*4,1),                                                   /* sw $30,30*4($1) */
                MIPS32_SW(31,31*4,1),                                                   /* sw $31,31*4($1) */
-               
+
                MIPS32_MFC0(2,12,0),                                                    /* move status to $2 */
                MIPS32_SW(2,32*4,1),                                                    /* sw $2,32*4($1) */
                MIPS32_MFLO(2),                                                                 /* move lo to $2 */
@@ -906,7 +917,7 @@ int mips32_pracc_read_regs(mips_ejtag_t *ejtag_info, uint32_t *regs)
                MIPS32_SW(2,36*4,1),                                                    /* sw $2,36*4($1) */
                MIPS32_MFC0(2,24,0),                                                    /* move pc to $2 */
                MIPS32_SW(2,37*4,1),                                                    /* sw $2,37*4($1) */
-               
+
                MIPS32_LW(2,0,15),                                                              /* lw $2,($15) */
                MIPS32_LW(1,0,15),                                                              /* lw $1,($15) */
                MIPS32_MFC0(15,31,0),                                                   /* move COP0 DeSave to $15 */
@@ -914,11 +925,11 @@ int mips32_pracc_read_regs(mips_ejtag_t *ejtag_info, uint32_t *regs)
                MIPS32_B(NEG16(60)),                                                    /* b start */
                MIPS32_NOP,
        };
-       
+
        int retval;
-       
-       retval = mips32_pracc_exec(ejtag_info, sizeof(code)/sizeof(code[0]), code, \
+
+       retval = mips32_pracc_exec(ejtag_info, ARRAY_SIZE(code), code, \
                0, NULL, 38, regs, 1);
-       
+
        return retval;
 }

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)