if (retval != ERROR_OK)
return retval;
- 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)
+ if ((address >= MIPS32_PRACC_PARAM_OUT)
&& (address < MIPS32_PRACC_PARAM_OUT + ctx->num_oparam * 4)) {
offset = (address - MIPS32_PRACC_PARAM_OUT) / 4;
ctx->local_oparam[offset] = data;
/* start: */
MIPS32_MTC0(15, 31, 0), /* move $15 to COP0 DeSave */
MIPS32_LUI(15, PRACC_UPPER_BASE_ADDR), /* $15 = MIPS32_PRACC_BASE_ADDR */
- MIPS32_SW(8, PRACC_STACK_OFFSET, 15), /* sw $8,PRACC_STACK_OFFSET($15) */
MIPS32_LUI(8, UPPER16((addr + 0x8000))), /* load $8 with modified upper address */
MIPS32_LW(8, LOWER16(addr), 8), /* lw $8, LOWER16(addr)($8) */
MIPS32_SW(8, PRACC_OUT_OFFSET, 15), /* sw $8,PRACC_OUT_OFFSET($15) */
- MIPS32_LW(8, PRACC_STACK_OFFSET, 15), /* lw $8,PRACC_STACK_OFFSET($15) */
+ MIPS32_LUI(8, UPPER16(ejtag_info->reg8)), /* restore upper 16 bits of reg 8 */
+ MIPS32_ORI(8, 8, LOWER16(ejtag_info->reg8)), /* restore lower 16 bits of reg 8 */
MIPS32_B(NEG16(8)), /* b start */
MIPS32_MFC0(15, 31, 0), /* move COP0 DeSave to $15 */
};
*code_p++ = MIPS32_MTC0(15, 31, 0); /* save $15 in DeSave */
*code_p++ = MIPS32_LUI(15, PRACC_UPPER_BASE_ADDR); /* $15 = MIPS32_PRACC_BASE_ADDR */
- *code_p++ = MIPS32_SW(8, PRACC_STACK_OFFSET, 15); /* save $8 and $9 to pracc stack */
- *code_p++ = MIPS32_SW(9, PRACC_STACK_OFFSET, 15);
*code_p++ = MIPS32_LUI(9, last_upper_base_addr); /* load the upper memory address in $9*/
- code_len = 5;
+ code_len = 3;
for (i = 0; i != this_round_count; i++) { /* Main code loop */
upper_base_addr = UPPER16((addr + 0x8000));
addr += size;
}
- *code_p++ = MIPS32_LW(9, PRACC_STACK_OFFSET, 15); /* restore $8 and $9 from pracc stack */
- *code_p++ = MIPS32_LW(8, PRACC_STACK_OFFSET, 15);
+ *code_p++ = MIPS32_LUI(8, UPPER16(ejtag_info->reg8)); /* restore upper 16 bits of reg 8 */
+ *code_p++ = MIPS32_ORI(8, 8, LOWER16(ejtag_info->reg8)); /* restore lower 16 bits of reg 8 */
+ *code_p++ = MIPS32_LUI(9, UPPER16(ejtag_info->reg8)); /* restore upper 16 bits of reg 9 */
+ *code_p++ = MIPS32_ORI(9, 9, LOWER16(ejtag_info->reg8)); /* restore lower 16 bits of reg 9 */
- code_len += 4;
+ code_len += 6;
*code_p++ = MIPS32_B(NEG16(code_len - 1)); /* jump to start */
*code_p = MIPS32_MFC0(15, 31, 0); /* restore $15 from DeSave */
{
/**
* Do not make this code static, but regenerate it every time,
- * as 3th element has to be changed to add parameters
+ * as 2th element has to be changed to add parameters
*/
uint32_t code[] = {
/* start: */
MIPS32_MTC0(15, 31, 0), /* move $15 to COP0 DeSave */
MIPS32_LUI(15, PRACC_UPPER_BASE_ADDR), /* $15 = MIPS32_PRACC_BASE_ADDR */
- MIPS32_SW(8, PRACC_STACK_OFFSET, 15), /* sw $8,PRACC_STACK_OFFSET($15) */
- /* 3 */ MIPS32_MFC0(8, 0, 0), /* move COP0 [cp0_reg select] to $8 */
+ /* 2 */ MIPS32_MFC0(8, 0, 0), /* move COP0 [cp0_reg select] to $8 */
MIPS32_SW(8, PRACC_OUT_OFFSET, 15), /* sw $8,PRACC_OUT_OFFSET($15) */
- MIPS32_LW(8, PRACC_STACK_OFFSET, 15), /* lw $8,PRACC_STACK_OFFSET($15) */
+ MIPS32_LUI(8, UPPER16(ejtag_info->reg8)), /* restore upper 16 bits of reg 8 */
+ MIPS32_ORI(8, 8, LOWER16(ejtag_info->reg8)), /* restore lower 16 bits of reg 8 */
MIPS32_B(NEG16(7)), /* b start */
MIPS32_MFC0(15, 31, 0), /* move COP0 DeSave to $15 */
};
* MIPS32_MTC0 is implemented via MIPS32_R_INST macro.
* In order to insert our parameters, we must change rd and funct fields.
*/
- code[3] |= (cp0_reg << 11) | cp0_sel; /* change rd and funct of MIPS32_R_INST macro */
+ code[2] |= (cp0_reg << 11) | cp0_sel; /* change rd and funct of MIPS32_R_INST macro */
return mips32_pracc_exec(ejtag_info, ARRAY_SIZE(code), code, 0, NULL, 1, val, 1);
}
code_p = code;
*code_p++ = MIPS32_MTC0(15, 31, 0); /* save $15 in DeSave */
- *code_p++ = MIPS32_LUI(15, PRACC_UPPER_BASE_ADDR); /* $15 = MIPS32_PRACC_BASE_ADDR */
- *code_p++ = MIPS32_SW(8, PRACC_STACK_OFFSET, 15); /* save $8 to pracc stack */
- *code_p++ = MIPS32_LUI(15, last_upper_base_addr); /* reuse $15 as memory base address */
- code_len = 4;
+ *code_p++ = MIPS32_LUI(15, last_upper_base_addr); /* load $15 with memory base address */
+ code_len = 2;
for (i = 0; i != this_round_count; i++) {
upper_base_addr = UPPER16((addr + 0x8000));
addr += size;
}
- *code_p++ = MIPS32_LUI(15, PRACC_UPPER_BASE_ADDR); /* $15 = MIPS32_PRACC_BASE_ADDR */
- *code_p++ = MIPS32_LW(8, PRACC_STACK_OFFSET, 15); /* restore $8 from pracc stack */
+ *code_p++ = MIPS32_LUI(8, UPPER16(ejtag_info->reg8)), /* restore upper 16 bits of reg 8 */
+ *code_p++ = MIPS32_ORI(8, 8, LOWER16(ejtag_info->reg8)), /* restore lower 16 bits of reg 8 */
code_len += 4;
*code_p++ = MIPS32_B(NEG16(code_len - 1)); /* jump to start */
int retval = mips32_pracc_exec(ejtag_info, code_len, code, 0, NULL, 0, NULL, 1);
free(code);
+
+ ejtag_info->reg8 = regs[8];
+ ejtag_info->reg9 = regs[9];
return retval;
}
int mips32_pracc_read_regs(struct mips_ejtag *ejtag_info, uint32_t *regs)
{
- 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 */
- MIPS32_ORI(2, 2, LOWER16(MIPS32_PRACC_PARAM_OUT)),
- MIPS32_SW(0, 0*4, 2), /* sw $0,0*4($2) */
- MIPS32_SW(1, 1*4, 2), /* sw $1,1*4($2) */
- MIPS32_SW(15, 15*4, 2), /* sw $15,15*4($2) */
- MIPS32_MFC0(2, 31, 0), /* move COP0 DeSave to $2 */
- 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(1, 0, 15), /* sw $1,($15) */
- MIPS32_SW(2, 0, 15), /* sw $2,($15) */
- MIPS32_LUI(1, UPPER16(MIPS32_PRACC_PARAM_OUT)), /* $1 = MIPS32_PRACC_PARAM_OUT */
- MIPS32_ORI(1, 1, LOWER16(MIPS32_PRACC_PARAM_OUT)),
- MIPS32_SW(2, 2*4, 1), /* sw $2,2*4($1) */
- MIPS32_SW(3, 3*4, 1), /* sw $3,3*4($1) */
- MIPS32_SW(4, 4*4, 1), /* sw $4,4*4($1) */
- MIPS32_SW(5, 5*4, 1), /* sw $5,5*4($1) */
- MIPS32_SW(6, 6*4, 1), /* sw $6,6*4($1) */
- MIPS32_SW(7, 7*4, 1), /* sw $7,7*4($1) */
- MIPS32_SW(8, 8*4, 1), /* sw $8,8*4($1) */
- MIPS32_SW(9, 9*4, 1), /* sw $9,9*4($1) */
- MIPS32_SW(10, 10*4, 1), /* sw $10,10*4($1) */
- MIPS32_SW(11, 11*4, 1), /* sw $11,11*4($1) */
- MIPS32_SW(12, 12*4, 1), /* sw $12,12*4($1) */
- MIPS32_SW(13, 13*4, 1), /* sw $13,13*4($1) */
- MIPS32_SW(14, 14*4, 1), /* sw $14,14*4($1) */
- MIPS32_SW(16, 16*4, 1), /* sw $16,16*4($1) */
- MIPS32_SW(17, 17*4, 1), /* sw $17,17*4($1) */
- MIPS32_SW(18, 18*4, 1), /* sw $18,18*4($1) */
- MIPS32_SW(19, 19*4, 1), /* sw $19,19*4($1) */
- MIPS32_SW(20, 20*4, 1), /* sw $20,20*4($1) */
- MIPS32_SW(21, 21*4, 1), /* sw $21,21*4($1) */
- MIPS32_SW(22, 22*4, 1), /* sw $22,22*4($1) */
- MIPS32_SW(23, 23*4, 1), /* sw $23,23*4($1) */
- MIPS32_SW(24, 24*4, 1), /* sw $24,24*4($1) */
- MIPS32_SW(25, 25*4, 1), /* sw $25,25*4($1) */
- MIPS32_SW(26, 26*4, 1), /* sw $26,26*4($1) */
- MIPS32_SW(27, 27*4, 1), /* sw $27,27*4($1) */
- MIPS32_SW(28, 28*4, 1), /* sw $28,28*4($1) */
- 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) */
-
+ static int cp0_read_code[] = {
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 */
- MIPS32_SW(2, 33*4, 1), /* sw $2,33*4($1) */
MIPS32_MFHI(2), /* move hi to $2 */
- MIPS32_SW(2, 34*4, 1), /* sw $2,34*4($1) */
MIPS32_MFC0(2, 8, 0), /* move badvaddr to $2 */
- MIPS32_SW(2, 35*4, 1), /* sw $2,35*4($1) */
MIPS32_MFC0(2, 13, 0), /* move cause to $2 */
- MIPS32_SW(2, 36*4, 1), /* sw $2,36*4($1) */
MIPS32_MFC0(2, 24, 0), /* move depc (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_B(NEG16(58)), /* b start */
- MIPS32_MFC0(15, 31, 0), /* move COP0 DeSave to $15 */
};
- int retval;
+ uint32_t *code;
+ code = malloc(49 * sizeof(uint32_t));
+ if (code == NULL) {
+ LOG_ERROR("Out of memory");
+ return ERROR_FAIL;
+ }
- retval = mips32_pracc_exec(ejtag_info, ARRAY_SIZE(code), code,
- 0, NULL, MIPS32NUMCOREREGS, regs, 1);
+ uint32_t *code_p = code;
+
+ *code_p++ = MIPS32_MTC0(1, 31, 0), /* move $1 to COP0 DeSave */
+ *code_p++ = MIPS32_LUI(1, PRACC_UPPER_BASE_ADDR); /* $1 = MIP32_PRACC_BASE_ADDR */
+
+ for (int i = 2; i != 32; i++)
+ *code_p++ = MIPS32_SW(i, PRACC_OUT_OFFSET + (i * 4), 1); /* store GPR's 2 to 31 */
+
+ for (int i = 0; i != 6; i++) {
+ *code_p++ = cp0_read_code[i]; /* load COP0 needed registers to $2 */
+ *code_p++ = MIPS32_SW(2, PRACC_OUT_OFFSET + (i + 32) * 4, 1); /* store COP0 registers from $2 to param out */
+ }
+ *code_p++ = MIPS32_MFC0(2, 31, 0), /* move DeSave to $2, reg1 value */
+ *code_p++ = MIPS32_SW(2, PRACC_OUT_OFFSET + 4, 1); /* store reg1 value from $2 to param out */
+
+ *code_p++ = MIPS32_LW(2, PRACC_OUT_OFFSET + 8, 1); /* restore $2 from param out (singularity) */
+ *code_p++ = MIPS32_B(NEG16(48)); /* b start */
+ *code_p = MIPS32_MFC0(1, 31, 0); /* move COP0 DeSave to $1 */
+
+ int retval = mips32_pracc_exec(ejtag_info, 49, code, 0, NULL, MIPS32NUMCOREREGS, regs, 1);
+ free(code);
+
+ ejtag_info->reg8 = regs[8];
+ ejtag_info->reg9 = regs[9];
return retval;
}
mips_ejtag_drscan_32_out(ejtag_info, ejtag_ctrl);
}
+ /* wait PrAcc pending bit for FASTDATA write */
retval = wait_for_pracc_rw(ejtag_info, &ejtag_ctrl);
if (retval != ERROR_OK)
return retval;
if (address != MIPS32_PRACC_FASTDATA_AREA)
return ERROR_FAIL;
- /* wait PrAcc pending bit for FASTDATA write */
- retval = wait_for_pracc_rw(ejtag_info, &ejtag_ctrl);
- if (retval != ERROR_OK)
- return retval;
-
/* Send the load start address */
val = addr;
mips_ejtag_set_instr(ejtag_info, EJTAG_INST_FASTDATA);
mips_ejtag_fastdata_scan(ejtag_info, 1, &val);
+ retval = wait_for_pracc_rw(ejtag_info, &ejtag_ctrl);
+ if (retval != ERROR_OK)
+ return retval;
+
/* Send the load end address */
val = addr + (count - 1) * 4;
+ mips_ejtag_set_instr(ejtag_info, EJTAG_INST_FASTDATA);
mips_ejtag_fastdata_scan(ejtag_info, 1, &val);
for (i = 0; i < count; i++) {