This is an automated email from Gerrit. FengGao ([email protected]) just uploaded a new patch set to Gerrit, which you can find at http://openocd.zylin.com/1253
-- gerrit commit a336aae8e41b48705337533d02bd9bddb817a1a5 Author: Feng Gao <[email protected]> Date: Sun Mar 17 10:36:48 2013 +0800 target: Add mips64 ejtag commands. topic: target: Add mips64 ejtag commands. Add mips64 ejtag commands handling functions into mips_ejtag.c and mips_ejtag.h Add mips64 stubs into Makefile.am Change-Id: I7eca7566ea4de40fe26654b0b57bc6ff1d123414 Signed-off-by: Feng Gao <[email protected]> diff --git a/src/target/Makefile.am b/src/target/Makefile.am index fac1e09..c480ec0 100644 --- a/src/target/Makefile.am +++ b/src/target/Makefile.am @@ -30,7 +30,9 @@ libtarget_la_SOURCES = \ $(ARMV7_SRC) \ $(ARM_MISC_SRC) \ $(AVR32_SRC) \ + $(MIPS_COMMON_SRC) \ $(MIPS32_SRC) \ + $(MIPS64_SRC) \ avrt.c \ dsp563xx.c \ dsp563xx_once.c \ @@ -100,12 +102,18 @@ AVR32_SRC = \ avr32_mem.c \ avr32_regs.c +MIPS_COMMON_SRC = \ + mips_ejtag.c + MIPS32_SRC = \ mips32.c \ mips_m4k.c \ mips32_pracc.c \ - mips32_dmaacc.c \ - mips_ejtag.c + mips32_dmaacc.c + +MIPS64_SRC = \ + mips64.c \ + mips64_pracc.c noinst_HEADERS = \ diff --git a/src/target/mips_ejtag.c b/src/target/mips_ejtag.c index 286fa32..91c1cd9 100644 --- a/src/target/mips_ejtag.c +++ b/src/target/mips_ejtag.c @@ -27,8 +27,27 @@ #endif #include "mips32.h" +#include "mips64.h" #include "mips_ejtag.h" +void mips64_ejtag_set_instr(struct mips_ejtag *ejtag_info, int new_instr) +{ + struct jtag_tap *tap; + + tap = ejtag_info->tap; + assert(tap != NULL); + + struct scan_field field; + uint8_t t[4]; + + field.num_bits = tap->ir_length; + field.out_value = t; + buf_set_u32(t, 0, field.num_bits, new_instr); + field.in_value = NULL; + + jtag_add_ir_scan(tap, &field, TAP_IDLE); +} + void mips_ejtag_set_instr(struct mips_ejtag *ejtag_info, int new_instr) { struct jtag_tap *tap; @@ -99,6 +118,36 @@ static int mips_ejtag_get_impcode(struct mips_ejtag *ejtag_info, uint32_t *impco return ERROR_OK; } +int mips_ejtag_drscan_64(struct mips_ejtag *ejtag_info, uint64_t *data) +{ + struct jtag_tap *tap; + tap = ejtag_info->tap; + assert(tap != NULL); + + struct scan_field field; + uint8_t t[8], r[8]; + int retval; + + field.num_bits = 64; + field.out_value = t; + buf_set_u64(t, 0, field.num_bits, *data); + field.in_value = r; + + jtag_add_dr_scan(tap, 1, &field, TAP_IDLE); + + retval = jtag_execute_queue(); + if (retval != ERROR_OK) { + LOG_ERROR("register read failed"); + return retval; + } + + *data = buf_get_u64(field.in_value, 0, 64); + + keep_alive(); + + return ERROR_OK; +} + int mips_ejtag_drscan_32(struct mips_ejtag *ejtag_info, uint32_t *data) { struct jtag_tap *tap; @@ -129,6 +178,24 @@ int mips_ejtag_drscan_32(struct mips_ejtag *ejtag_info, uint32_t *data) return ERROR_OK; } +void mips_ejtag_drscan_64_out(struct mips_ejtag *ejtag_info, uint64_t data) +{ + uint8_t t[8]; + struct jtag_tap *tap; + tap = ejtag_info->tap; + assert(tap != NULL); + + struct scan_field field; + + field.num_bits = 64; + field.out_value = t; + buf_set_u64(t, 0, field.num_bits, data); + + field.in_value = NULL; + + jtag_add_dr_scan(tap, 1, &field, TAP_IDLE); +} + void mips_ejtag_drscan_32_out(struct mips_ejtag *ejtag_info, uint32_t data) { uint8_t t[4]; @@ -147,6 +214,34 @@ void mips_ejtag_drscan_32_out(struct mips_ejtag *ejtag_info, uint32_t data) jtag_add_dr_scan(tap, 1, &field, TAP_IDLE); } +int mips64_ejtag_drscan_8(struct mips_ejtag *ejtag_info, uint64_t *data) +{ + struct jtag_tap *tap; + tap = ejtag_info->tap; + assert(tap != NULL); + + struct scan_field field; + uint8_t t[8] = {0, 0, 0, 0, 0, 0, 0, 0}, r[8]; + int retval; + + field.num_bits = 8; + field.out_value = t; + buf_set_u64(t, 0, field.num_bits, *data); + field.in_value = r; + + jtag_add_dr_scan(tap, 1, &field, TAP_IDLE); + + retval = jtag_execute_queue(); + if (retval != ERROR_OK) { + LOG_ERROR("register read failed"); + return retval; + } + + *data = buf_get_u64(field.in_value, 0, 64); + + return ERROR_OK; +} + int mips_ejtag_drscan_8(struct mips_ejtag *ejtag_info, uint32_t *data) { struct jtag_tap *tap; @@ -191,6 +286,33 @@ void mips_ejtag_drscan_8_out(struct mips_ejtag *ejtag_info, uint8_t data) } /* Set (to enable) or clear (to disable stepping) the SSt bit (bit 8) in Cp0 Debug reg (reg 23, sel 0) */ +int mips64_ejtag_config_step(struct mips_ejtag *ejtag_info, int enable_step) +{ + int code_len = enable_step ? 6 : 7; + + uint32_t *code = malloc(code_len * sizeof(uint32_t)); + if (code == NULL) { + LOG_ERROR("Out of memory"); + return ERROR_FAIL; + } + uint32_t *code_p = code; + + *code_p++ = MIPS64_DMTC0(1, 31, 0); /* move $1 to COP0 DeSave */ + *code_p++ = MIPS64_DMFC0(1, 23, 0), /* move COP0 Debug to $1 */ + *code_p++ = MIPS64_ORI(1, 1, 0x0100); /* set SSt bit in debug reg */ + if (!enable_step) + *code_p++ = MIPS64_XORI(1, 1, 0x0100); /* clear SSt bit in debug reg */ + + *code_p++ = MIPS64_DMTC0(1, 23, 0); /* move $1 to COP0 Debug */ + *code_p++ = MIPS64_B(NEG16((code_len - 1))); /* jump to start */ + *code_p = MIPS64_DMFC0(1, 31, 0); /* move COP0 DeSave to $1 */ + int retval = mips64_pracc_exec(ejtag_info, code_len, code, 0, NULL, 0, NULL, 1); + + free(code); + return retval; +} + +/* Set (to enable) or clear (to disable stepping) the SSt bit (bit 8) in Cp0 Debug reg (reg 23, sel 0) */ int mips_ejtag_config_step(struct mips_ejtag *ejtag_info, int enable_step) { int code_len = enable_step ? 6 : 7; @@ -239,6 +361,21 @@ int mips_ejtag_enter_debug(struct mips_ejtag *ejtag_info) return ERROR_OK; } +int mips64_ejtag_exit_debug(struct mips_ejtag *ejtag_info) +{ + uint32_t inst; + uint32_t ejtag_ctrl; + inst = MIPS64_DRET; + + /* execute our dret instruction */ + mips64_pracc_exec(ejtag_info, 1, &inst, 0, NULL, 0, NULL, 0); + /* Clear access pending bit */ + ejtag_ctrl = ejtag_info->ejtag_ctrl & ~EJTAG_CTRL_PRACC; + mips64_ejtag_set_instr(ejtag_info, EJTAG_INST_CONTROL); + mips_ejtag_drscan_32_out(ejtag_info, ejtag_ctrl); + return 0; +} + int mips_ejtag_exit_debug(struct mips_ejtag *ejtag_info) { uint32_t inst; @@ -303,6 +440,43 @@ int mips_ejtag_init(struct mips_ejtag *ejtag_info) return ERROR_OK; } +int mips64_ejtag_fastdata_scan(struct mips_ejtag *ejtag_info, int write_t, uint64_t *data) +{ + struct jtag_tap *tap; + + tap = ejtag_info->tap; + assert(tap != NULL); + + struct scan_field fields[2]; + uint8_t spracc = 0; + uint8_t t[8] = {0, 0, 0, 0, 0, 0, 0, 0}; + + /* fastdata 1-bit register */ + fields[0].num_bits = 1; + fields[0].out_value = &spracc; + fields[0].in_value = NULL; + + /* processor access data register 32 bit */ + fields[1].num_bits = 64; + fields[1].out_value = t; + + if (write_t) { + fields[1].in_value = NULL; + buf_set_u64(t, 0, 64, *data); + } else + fields[1].in_value = (void *) data; + + jtag_add_dr_scan(tap, 2, fields, TAP_IDLE); + + if (!write_t && data) + jtag_add_callback(mips_le_to_h_u64, + (jtag_callback_data_t) data); + + keep_alive(); + + return ERROR_OK; +} + int mips_ejtag_fastdata_scan(struct mips_ejtag *ejtag_info, int write_t, uint32_t *data) { struct jtag_tap *tap; diff --git a/src/target/mips_ejtag.h b/src/target/mips_ejtag.h index 653103c..fd5664f 100644 --- a/src/target/mips_ejtag.h +++ b/src/target/mips_ejtag.h @@ -105,17 +105,28 @@ #define EJTAG_DCR_MIPS64 (1 << 0) /* Debug Control Register DCR */ +#if BUILD_TARGET64 == 1 +#define EJTAG_DCR 0xFFFFFFFFFF300000 +#else #define EJTAG_DCR 0xFF300000 +#endif #define EJTAG_DCR_ENM (1 << 29) #define EJTAG_DCR_DB (1 << 17) #define EJTAG_DCR_IB (1 << 16) #define EJTAG_DCR_INTE (1 << 4) /* breakpoint support */ +#if BUILD_TARGET64 == 1 +#define EJTAG_IBS 0xFFFFFFFFFF301000 +#define EJTAG_IBA1 0xFFFFFFFFFF301100 +#define EJTAG_DBS 0xFFFFFFFFFF302000 +#define EJTAG_DBA1 0xFFFFFFFFFF302100 +#else #define EJTAG_IBS 0xFF301000 #define EJTAG_IBA1 0xFF301100 #define EJTAG_DBS 0xFF302000 #define EJTAG_DBA1 0xFF302100 +#endif #define EJTAG_DBCn_NOSB (1 << 13) #define EJTAG_DBCn_NOLB (1 << 12) #define EJTAG_DBCn_BLM_MASK 0xff @@ -132,17 +143,26 @@ struct mips_ejtag { void mips_ejtag_set_instr(struct mips_ejtag *ejtag_info, int new_instr); +void mips64_ejtag_set_instr(struct mips_ejtag *ejtag_info, + int new_instr); int mips_ejtag_enter_debug(struct mips_ejtag *ejtag_info); int mips_ejtag_exit_debug(struct mips_ejtag *ejtag_info); +int mips64_ejtag_exit_debug(struct mips_ejtag *ejtag_info); int mips_ejtag_get_idcode(struct mips_ejtag *ejtag_info, uint32_t *idcode); void mips_ejtag_drscan_32_out(struct mips_ejtag *ejtag_info, uint32_t data); int mips_ejtag_drscan_32(struct mips_ejtag *ejtag_info, uint32_t *data); +void mips_ejtag_drscan_64_out(struct mips_ejtag *ejtag_info, uint64_t data); +int mips_ejtag_drscan_64(struct mips_ejtag *ejtag_info, uint64_t *data); void mips_ejtag_drscan_8_out(struct mips_ejtag *ejtag_info, uint8_t data); int mips_ejtag_drscan_8(struct mips_ejtag *ejtag_info, uint32_t *data); +int mips64_ejtag_drscan_8(struct mips_ejtag *ejtag_info, uint64_t *data); int mips_ejtag_fastdata_scan(struct mips_ejtag *ejtag_info, int write_t, uint32_t *data); +int mips64_ejtag_fastdata_scan(struct mips_ejtag *ejtag_info, int write_t, uint64_t *data); int mips_ejtag_init(struct mips_ejtag *ejtag_info); +int mips64_ejtag_init(struct mips_ejtag *ejtag_info); int mips_ejtag_config_step(struct mips_ejtag *ejtag_info, int enable_step); +int mips64_ejtag_config_step(struct mips_ejtag *ejtag_info, int enable_step); static inline void mips_le_to_h_u32(jtag_callback_data_t arg) { @@ -150,4 +170,10 @@ static inline void mips_le_to_h_u32(jtag_callback_data_t arg) *((uint32_t *)arg) = le_to_h_u32(in); } +static inline void mips_le_to_h_u64(jtag_callback_data_t arg) +{ + uint8_t *in = (uint8_t *)arg; + *((uint64_t *)arg) = le_to_h_u64(in); +} + #endif /* MIPS_EJTAG */ -- ------------------------------------------------------------------------------ Everyone hates slow websites. So do we. Make your web apps faster with AppDynamics Download AppDynamics Lite for free today: http://p.sf.net/sfu/appdyn_d2d_mar _______________________________________________ OpenOCD-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/openocd-devel
