This is an automated email from Gerrit.

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

-- gerrit

commit d88e612e67bc10d0dae455b1d47d6140ad1130d8
Author: Kent Brinkley <[email protected]>
Date:   Fri Sep 19 13:13:27 2014 -0700

    Added matching save of $15 reg with restore $15 reg.
    Streamlined code to call mips_pracc_exec instead of mips_pracc_queue_exec.
    
    Change-Id: Id12c6e07e0edad08efa7e422b65fec72a0d486e0
    Signed-off-by: Kent Brinkley <[email protected]>

diff --git a/src/target/mips32_pracc.c b/src/target/mips32_pracc.c
index 8c3b9f0..5bc4c74 100644
--- a/src/target/mips32_pracc.c
+++ b/src/target/mips32_pracc.c
@@ -474,11 +474,12 @@ exit:
 
 int mips32_pracc_read_u32(struct mips_ejtag *ejtag_info, uint32_t addr, 
uint32_t *buf)
 {
-       struct pracc_queue_info ctx = {.max_code = 8};
+       struct pracc_queue_info ctx = {.max_code = 9};
        pracc_queue_init(&ctx);
        if (ctx.retval != ERROR_OK)
                goto exit;
 
+       pracc_add(&ctx, 0, MIPS32_MTC0(15, 31, 0));                             
                /* move $15 to COP0 DeSave */
        pracc_add(&ctx, 0, MIPS32_LUI(15, PRACC_UPPER_BASE_ADDR));              
        /* $15 = MIPS32_PRACC_BASE_ADDR */
        pracc_add(&ctx, 0, MIPS32_LUI(8, UPPER16((addr + 0x8000))));            
/* load  $8 with modified upper address */
        pracc_add(&ctx, 0, MIPS32_LW(8, LOWER16(addr), 8));                     
        /* lw $8, LOWER16(addr)($8) */
@@ -489,7 +490,8 @@ int mips32_pracc_read_u32(struct mips_ejtag *ejtag_info, 
uint32_t addr, uint32_t
        pracc_add(&ctx, 0, MIPS32_B(NEG16(ctx.code_count + 1)));                
                        /* jump to start */
        pracc_add(&ctx, 0, MIPS32_MFC0(15, 31, 0));                             
        /* move COP0 DeSave to $15 */
 
-       ctx.retval = mips32_pracc_queue_exec(ejtag_info, &ctx, buf);
+       ctx.retval = mips32_pracc_exec(ejtag_info, &ctx, buf);
+
 exit:
        pracc_queue_free(&ctx);
        return ctx.retval;
@@ -501,7 +503,8 @@ int mips32_pracc_read_mem(struct mips_ejtag *ejtag_info, 
uint32_t addr, int size
                return mips32_pracc_read_u32(ejtag_info, addr, (uint32_t *)buf);
 
        uint32_t *data = NULL;
-       struct pracc_queue_info ctx = {.max_code = 256 * 3 + 8 + 1};    /* 
alloc memory for the worst case */
+       struct pracc_queue_info ctx = {.max_code = 256 * 3 + 9 + 1};    /* 
alloc memory for the worst case */
+
        pracc_queue_init(&ctx);
        if (ctx.retval != ERROR_OK)
                goto exit;
@@ -524,27 +527,29 @@ int mips32_pracc_read_mem(struct mips_ejtag *ejtag_info, 
uint32_t addr, int size
                int this_round_count = (count > 256) ? 256 : count;
                uint32_t last_upper_base_addr = UPPER16((addr + 0x8000));
 
+               pracc_add(&ctx, 0, MIPS32_MTC0(15, 31, 0));                     
                        /* save $15 in DeSave */
                pracc_add(&ctx, 0, MIPS32_LUI(15, PRACC_UPPER_BASE_ADDR));      
                /* $15 = MIPS32_PRACC_BASE_ADDR */
-               pracc_add(&ctx, 0, MIPS32_LUI(9, last_upper_base_addr));        
        /* load the upper memory address in $9 */
+               pracc_add(&ctx, 0, MIPS32_LUI(9, last_upper_base_addr));        
            /* load the upper memory address in $9 */
 
-               for (int i = 0; i != this_round_count; i++) {                   
/* Main code loop */
+               for (int i = 0; i != this_round_count; i++) {                   
            /* Main code loop */
                        uint32_t upper_base_addr = UPPER16((addr + 0x8000));
-                       if (last_upper_base_addr != upper_base_addr) {          
        /* if needed, change upper address in $9 */
+                       if (last_upper_base_addr != upper_base_addr) {          
                /* if needed, change upper address in $9 */
                                pracc_add(&ctx, 0, MIPS32_LUI(9, 
upper_base_addr));
                                last_upper_base_addr = upper_base_addr;
                        }
 
                        if (size == 4)
-                               pracc_add(&ctx, 0, MIPS32_LW(8, LOWER16(addr), 
9));             /* load from memory to $8 */
+                               pracc_add(&ctx, 0, MIPS32_LW(8, LOWER16(addr), 
9));             /* load from memory to $8 */
                        else if (size == 2)
                                pracc_add(&ctx, 0, MIPS32_LHU(8, LOWER16(addr), 
9));
                        else
                                pracc_add(&ctx, 0, MIPS32_LBU(8, LOWER16(addr), 
9));
 
                        pracc_add(&ctx, MIPS32_PRACC_PARAM_OUT + i * 4,
-                                         MIPS32_SW(8, PRACC_OUT_OFFSET + i * 
4, 15));          /* store $8 at param out */
+                                         MIPS32_SW(8, PRACC_OUT_OFFSET + i * 
4, 15));              /* store $8 at param out */
                        addr += size;
                }
+
                pracc_add(&ctx, 0, MIPS32_LUI(8, UPPER16(ejtag_info->reg8)));   
        /* restore upper 16 bits of reg 8 */
                pracc_add(&ctx, 0, MIPS32_ORI(8, 8, 
LOWER16(ejtag_info->reg8)));        /* restore lower 16 bits of reg 8 */
                pracc_add(&ctx, 0, MIPS32_LUI(9, UPPER16(ejtag_info->reg9)));   
        /* restore upper 16 bits of reg 9 */
@@ -554,12 +559,14 @@ int mips32_pracc_read_mem(struct mips_ejtag *ejtag_info, 
uint32_t addr, int size
                pracc_add(&ctx, 0, MIPS32_MFC0(15, 31, 0));                     
                /* restore $15 from DeSave */
 
                if (size == 4) {
-                       ctx.retval = mips32_pracc_queue_exec(ejtag_info, &ctx, 
buf32);
+                       ctx.retval = mips32_pracc_exec(ejtag_info, &ctx, buf32);
+
                        if (ctx.retval != ERROR_OK)
                                goto exit;
                        buf32 += this_round_count;
                } else {
-                       ctx.retval = mips32_pracc_queue_exec(ejtag_info, &ctx, 
data);
+                       ctx.retval = mips32_pracc_exec(ejtag_info, &ctx, data);
+
                        if (ctx.retval != ERROR_OK)
                                goto exit;
 
@@ -582,21 +589,23 @@ exit:
 
 int mips32_cp0_read(struct mips_ejtag *ejtag_info, uint32_t *val, uint32_t 
cp0_reg, uint32_t cp0_sel)
 {
-       struct pracc_queue_info ctx = {.max_code = 7};
+       struct pracc_queue_info ctx = {.max_code = 8};
        pracc_queue_init(&ctx);
        if (ctx.retval != ERROR_OK)
                goto exit;
 
+       pracc_add(&ctx, 0, MIPS32_MTC0(15, 31, 0));                             
        /* move $15 to COP0 DeSave */
        pracc_add(&ctx, 0, MIPS32_LUI(15, PRACC_UPPER_BASE_ADDR));              
        /* $15 = MIPS32_PRACC_BASE_ADDR */
        pracc_add(&ctx, 0, MIPS32_MFC0(8, 0, 0) | (cp0_reg << 11) | cp0_sel);   
/* move COP0 [cp0_reg select] to $8 */
        pracc_add(&ctx, MIPS32_PRACC_PARAM_OUT,
-                               MIPS32_SW(8, PRACC_OUT_OFFSET, 15));            
        /* store $8 to pracc_out */
+                 MIPS32_SW(8, PRACC_OUT_OFFSET, 15));                  /* 
store $8 to pracc_out */
        pracc_add(&ctx, 0, MIPS32_MFC0(15, 31, 0));                             
        /* move COP0 DeSave to $15 */
        pracc_add(&ctx, 0, MIPS32_LUI(8, UPPER16(ejtag_info->reg8)));           
/* restore upper 16 bits  of $8 */
        pracc_add(&ctx, 0, MIPS32_B(NEG16(ctx.code_count + 1)));                
                        /* jump to start */
        pracc_add(&ctx, 0, MIPS32_ORI(8, 8, LOWER16(ejtag_info->reg8)));        
        /* restore lower 16 bits of $8 */
 
-       ctx.retval = mips32_pracc_queue_exec(ejtag_info, &ctx, val);
+       ctx.retval = mips32_pracc_exec(ejtag_info, &ctx, val);
+
 exit:
        pracc_queue_free(&ctx);
        return ctx.retval;
@@ -626,15 +635,17 @@ int mips32_cp0_write(struct mips_ejtag *ejtag_info, 
uint32_t val, uint32_t cp0_r
        if (ctx.retval != ERROR_OK)
                goto exit;
 
-       pracc_add(&ctx, 0, MIPS32_LUI(15, UPPER16(val)));                       
        /* Load val to $15 */
+       pracc_add(&ctx, 0, MIPS32_MTC0(15, 31, 0));                             
        /* move $15 to COP0 DeSave */
+       pracc_add(&ctx, 0, MIPS32_LUI(15, UPPER16(val)));                       
/* Load val to $15 */
        pracc_add(&ctx, 0, MIPS32_ORI(15, 15, LOWER16(val)));
 
        pracc_add(&ctx, 0, MIPS32_MTC0(15, 0, 0) | (cp0_reg << 11) | cp0_sel);  
/* write cp0 reg / sel */
 
-       pracc_add(&ctx, 0, MIPS32_B(NEG16(ctx.code_count + 1)));                
                        /* jump to start */
+       pracc_add(&ctx, 0, MIPS32_B(NEG16(ctx.code_count + 1)));        /* jump 
to start */
        pracc_add(&ctx, 0, MIPS32_MFC0(15, 31, 0));                             
        /* move COP0 DeSave to $15 */
 
-       ctx.retval = mips32_pracc_queue_exec(ejtag_info, &ctx, NULL);
+       ctx.retval = mips32_pracc_exec(ejtag_info, &ctx, NULL);
+
 exit:
        pracc_queue_free(&ctx);
        return ctx.retval;
@@ -792,24 +803,27 @@ static int mips32_pracc_write_mem_generic(struct 
mips_ejtag *ejtag_info,
                int this_round_count = (count > 128) ? 128 : count;
                uint32_t last_upper_base_addr = UPPER16((addr + 0x8000));
 
-               pracc_add(&ctx, 0, MIPS32_LUI(15, last_upper_base_addr));       
        /* load $15 with memory base address */
+               pracc_add(&ctx, 0, MIPS32_MTC0(15, 31, 0));                     
                     /* save $15 in DeSave */
+               pracc_add(&ctx, 0, MIPS32_LUI(15, last_upper_base_addr));       
             /* load $15 with memory base address */
 
                for (int i = 0; i != this_round_count; i++) {
                        uint32_t upper_base_addr = UPPER16((addr + 0x8000));
+
                        if (last_upper_base_addr != upper_base_addr) {
                                pracc_add(&ctx, 0, MIPS32_LUI(15, 
upper_base_addr));    /* if needed, change upper address in $15*/
                                last_upper_base_addr = upper_base_addr;
                        }
 
-                       if (size == 4) {                        /* for word 
writes check if one half word is 0 and load it accordingly */
+                       if (size == 4) {   /* for word writes check if one half 
word is 0 and load it accordingly */
                                if (LOWER16(*buf32) == 0)
-                                       pracc_add(&ctx, 0, MIPS32_LUI(8, 
UPPER16(*buf32)));             /* load only upper value */
+                                       pracc_add(&ctx, 0, MIPS32_LUI(8, 
UPPER16(*buf32)));         /* load only upper value */
                                else if (UPPER16(*buf32) == 0)
-                                               pracc_add(&ctx, 0, 
MIPS32_ORI(8, 0, LOWER16(*buf32)));  /* load only lower */
+                                       pracc_add(&ctx, 0, MIPS32_ORI(8, 0, 
LOWER16(*buf32)));  /* load only lower */
                                else {
                                        pracc_add(&ctx, 0, MIPS32_LUI(8, 
UPPER16(*buf32)));             /* load upper and lower */
                                        pracc_add(&ctx, 0, MIPS32_ORI(8, 8, 
LOWER16(*buf32)));
                                }
+
                                pracc_add(&ctx, 0, MIPS32_SW(8, LOWER16(addr), 
15));            /* store word to memory */
                                buf32++;
 
@@ -832,11 +846,12 @@ static int mips32_pracc_write_mem_generic(struct 
mips_ejtag *ejtag_info,
                pracc_add(&ctx, 0, MIPS32_B(NEG16(ctx.code_count + 1)));        
                        /* jump to start */
                pracc_add(&ctx, 0, MIPS32_MFC0(15, 31, 0));                     
        /* restore $15 from DeSave */
 
-               ctx.retval = mips32_pracc_queue_exec(ejtag_info, &ctx, NULL);
+               ctx.retval = mips32_pracc_exec(ejtag_info, &ctx, NULL);
                if (ctx.retval != ERROR_OK) {
                        LOG_DEBUG("mips32_pracc_exec failed");
                        goto exit;
                }
+
                count -= this_round_count;
        }
 exit:
@@ -937,7 +952,7 @@ int mips32_pracc_write_regs(struct mips_ejtag *ejtag_info, 
uint32_t *regs)
        pracc_add(&ctx, 0, MIPS32_B(NEG16(ctx.code_count + 1)));                
                        /* jump to start */
        pracc_add(&ctx, 0, MIPS32_ORI(1, 1, LOWER16((regs[1]))));               
/* load lower half word in $1 */
 
-       ctx.retval = mips32_pracc_queue_exec(ejtag_info, &ctx, NULL);
+       ctx.retval = mips32_pracc_exec(ejtag_info, &ctx, NULL);
 
        ejtag_info->reg8 = regs[8];
        ejtag_info->reg9 = regs[9];
@@ -974,18 +989,19 @@ int mips32_pracc_read_regs(struct mips_ejtag *ejtag_info, 
uint32_t *regs)
                pracc_add(&ctx, MIPS32_PRACC_PARAM_OUT + (i + 32) * 4,          
        /* store $8 at PARAM OUT */
                                  MIPS32_SW(8, PRACC_OUT_OFFSET + (i + 32) * 4, 
1));
        }
-       pracc_add(&ctx, 0, MIPS32_MFC0(8, 31, 0));                              
        /* move DeSave to $8, reg1 value */
-       pracc_add(&ctx, MIPS32_PRACC_PARAM_OUT + 4,                             
        /* store reg1 value from $8 to param out */
-                         MIPS32_SW(8, PRACC_OUT_OFFSET + 4, 1));
+
+       pracc_add(&ctx, 0, MIPS32_MFC0(8, 31, 0));                              
/* move DeSave to $8, reg1 value */
+       pracc_add(&ctx, MIPS32_PRACC_PARAM_OUT + 4,                             
    /* store reg1 value from $8 to param out */
+                 MIPS32_SW(8, PRACC_OUT_OFFSET + 4, 1));
 
        pracc_add(&ctx, 0, MIPS32_MFC0(1, 31, 0));                              
        /* move COP0 DeSave to $1, restore reg1 */
-       pracc_add(&ctx, 0, MIPS32_B(NEG16(ctx.code_count + 1)));                
                        /* jump to start */
-       pracc_add(&ctx, 0, MIPS32_MTC0(15, 31, 0));                             
        /* load $15 in DeSave */
+       pracc_add(&ctx, 0, MIPS32_B(NEG16(ctx.code_count + 1)));        /* jump 
to start */
+       pracc_add(&ctx, 0, MIPS32_MTC0(1, 31, 0));                              
/* move COP0 DeSave to $1, restore reg1 */
 
-       if (ejtag_info->mode == 0)
+//  if (ejtag_info->mode == 0)
                ctx.store_count++;      /* Needed by legacy code, due to offset 
from reg0 */
 
-       ctx.retval = mips32_pracc_queue_exec(ejtag_info, &ctx, regs);
+       ctx.retval = mips32_pracc_exec(ejtag_info, &ctx, regs);
 
        ejtag_info->reg8 = regs[8];     /* reg8 is saved but not restored, next 
called function should restore it */
        ejtag_info->reg9 = regs[9];

-- 

------------------------------------------------------------------------------
Slashdot TV.  Video for Nerds.  Stuff that Matters.
http://pubads.g.doubleclick.net/gampad/clk?id=160591471&iu=/4140/ostg.clktrk
_______________________________________________
OpenOCD-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openocd-devel

Reply via email to