static 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 */ 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_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 */ MIPS32_LW(10, 4, 8), /* $10 = mem[$8 + 4]; read count */ MIPS32_LUI(11, UPPER16(MIPS32_PRACC_PARAM_OUT)), /* $11 = MIPS32_PRACC_PARAM_OUT */ MIPS32_ORI(11, 11, LOWER16(MIPS32_PRACC_PARAM_OUT)), /* loop: */ MIPS32_BEQ(0, 10, 8), /* 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_B(NEG16(8)), /* b loop */ MIPS32_NOP, /* end: */ MIPS32_LW(11, 0, 15), /* lw $11,($15) */ MIPS32_LW(10, 0, 15), /* lw $10,($15) */ MIPS32_LW(9, 0, 15), /* lw $9,($15) */ MIPS32_LW(8, 0, 15), /* lw $8,($15) */ MIPS32_B(NEG16(27)), /* b start */ MIPS32_MFC0(15, 31, 0), /* move COP0 DeSave to $15 */ }; int retval = ERROR_OK; int blocksize; int wordsread; uint32_t param_in[2]; wordsread = 0; while (count > 0) { blocksize = count; if (count > 0x400) blocksize = 0x400; param_in[0] = addr; param_in[1] = blocksize; retval = mips32_pracc_exec(ejtag_info, ARRAY_SIZE(code), code, ARRAY_SIZE(param_in), param_in, blocksize, &buf[wordsread], 1); if (retval != ERROR_OK) return retval; count -= blocksize; addr += blocksize*sizeof(uint32_t); wordsread += blocksize; } return retval; }
int mips32_pracc_read_mem8(struct mips_ejtag *ejtag_info, uint32_t addr, int count, uint8_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 */ 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_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 */ MIPS32_LW(10,4,8), /* $10 = mem[$8 + 4]; read count */ MIPS32_LUI(11,UPPER16(MIPS32_PRACC_PARAM_OUT)), /* $11 = MIPS32_PRACC_PARAM_OUT */ MIPS32_ORI(11,11,LOWER16(MIPS32_PRACC_PARAM_OUT)), /* loop: */ MIPS32_BEQ(0,10,8), /* 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 */ MIPS32_B(NEG16(8)), /* b loop */ MIPS32_NOP, /* end: */ MIPS32_LW(11,0,15), /* lw $11,($15) */ MIPS32_LW(10,0,15), /* lw $10,($15) */ MIPS32_LW(9,0,15), /* lw $9,($15) */ MIPS32_LW(8,0,15), /* lw $8,($15) */ MIPS32_B(NEG16(27)), /* b start */ MIPS32_MFC0(15,31,0), /* move COP0 DeSave to $15 */ }; /* TODO remove array */ 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, 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; }