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

Reply via email to