target: Add test bench for memory access functions
[fw/openocd] / src / target / mips32.c
index 55c197b77c6d93a25e63ee8379e6d1293bc221a7..188e88bfc22471b4dd8d0cd43a578327b237fd2d 100644 (file)
@@ -23,7 +23,7 @@
  *   You should have received a copy of the GNU General Public License     *
  *   along with this program; if not, write to the                         *
  *   Free Software Foundation, Inc.,                                       *
- *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ *   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.           *
  ***************************************************************************/
 
 #ifdef HAVE_CONFIG_H
@@ -173,7 +173,8 @@ static int mips32_write_core_reg(struct target *target, int num)
        return ERROR_OK;
 }
 
-int mips32_get_gdb_reg_list(struct target *target, struct reg **reg_list[], int *reg_list_size)
+int mips32_get_gdb_reg_list(struct target *target, struct reg **reg_list[],
+               int *reg_list_size, enum target_register_class reg_class)
 {
        /* get pointers to arch-specific information */
        struct mips32_common *mips32 = target_to_mips32(target);
@@ -469,13 +470,67 @@ int mips32_examine(struct target *target)
        return ERROR_OK;
 }
 
+static int mips32_configure_ibs(struct target *target)
+{
+       struct mips32_common *mips32 = target_to_mips32(target);
+       struct mips_ejtag *ejtag_info = &mips32->ejtag_info;
+       int retval, i;
+       uint32_t bpinfo;
+
+       /* get number of inst breakpoints */
+       retval = target_read_u32(target, ejtag_info->ejtag_ibs_addr, &bpinfo);
+       if (retval != ERROR_OK)
+               return retval;
+
+       mips32->num_inst_bpoints = (bpinfo >> 24) & 0x0F;
+       mips32->num_inst_bpoints_avail = mips32->num_inst_bpoints;
+       mips32->inst_break_list = calloc(mips32->num_inst_bpoints,
+               sizeof(struct mips32_comparator));
+
+       for (i = 0; i < mips32->num_inst_bpoints; i++)
+               mips32->inst_break_list[i].reg_address =
+                       ejtag_info->ejtag_iba0_addr +
+                       (ejtag_info->ejtag_iba_step_size * i);
+
+       /* clear IBIS reg */
+       retval = target_write_u32(target, ejtag_info->ejtag_ibs_addr, 0);
+       return retval;
+}
+
+static int mips32_configure_dbs(struct target *target)
+{
+       struct mips32_common *mips32 = target_to_mips32(target);
+       struct mips_ejtag *ejtag_info = &mips32->ejtag_info;
+       int retval, i;
+       uint32_t bpinfo;
+
+       /* get number of data breakpoints */
+       retval = target_read_u32(target, ejtag_info->ejtag_dbs_addr, &bpinfo);
+       if (retval != ERROR_OK)
+               return retval;
+
+       mips32->num_data_bpoints = (bpinfo >> 24) & 0x0F;
+       mips32->num_data_bpoints_avail = mips32->num_data_bpoints;
+       mips32->data_break_list = calloc(mips32->num_data_bpoints,
+               sizeof(struct mips32_comparator));
+
+       for (i = 0; i < mips32->num_data_bpoints; i++)
+               mips32->data_break_list[i].reg_address =
+                       ejtag_info->ejtag_dba0_addr +
+                       (ejtag_info->ejtag_dba_step_size * i);
+
+       /* clear DBIS reg */
+       retval = target_write_u32(target, ejtag_info->ejtag_dbs_addr, 0);
+       return retval;
+}
+
 int mips32_configure_break_unit(struct target *target)
 {
        /* get pointers to arch-specific information */
        struct mips32_common *mips32 = target_to_mips32(target);
+       struct mips_ejtag *ejtag_info = &mips32->ejtag_info;
        int retval;
-       uint32_t dcr, bpinfo;
-       int i;
+       uint32_t dcr;
 
        if (mips32->bp_scanned)
                return ERROR_OK;
@@ -485,38 +540,19 @@ int mips32_configure_break_unit(struct target *target)
        if (retval != ERROR_OK)
                return retval;
 
-       if (dcr & EJTAG_DCR_IB) {
-               /* get number of inst breakpoints */
-               retval = target_read_u32(target, EJTAG_IBS, &bpinfo);
-               if (retval != ERROR_OK)
-                       return retval;
+       /* EJTAG 2.0 does not specify EJTAG_DCR_IB and EJTAG_DCR_DB bits,
+        * assume IB and DB registers are always present. */
+       if (ejtag_info->ejtag_version == EJTAG_VERSION_20)
+               dcr |= EJTAG_DCR_IB | EJTAG_DCR_DB;
 
-               mips32->num_inst_bpoints = (bpinfo >> 24) & 0x0F;
-               mips32->num_inst_bpoints_avail = mips32->num_inst_bpoints;
-               mips32->inst_break_list = calloc(mips32->num_inst_bpoints, sizeof(struct mips32_comparator));
-               for (i = 0; i < mips32->num_inst_bpoints; i++)
-                       mips32->inst_break_list[i].reg_address = EJTAG_IBA1 + (0x100 * i);
-
-               /* clear IBIS reg */
-               retval = target_write_u32(target, EJTAG_IBS, 0);
+       if (dcr & EJTAG_DCR_IB) {
+               retval = mips32_configure_ibs(target);
                if (retval != ERROR_OK)
                        return retval;
        }
 
        if (dcr & EJTAG_DCR_DB) {
-               /* get number of data breakpoints */
-               retval = target_read_u32(target, EJTAG_DBS, &bpinfo);
-               if (retval != ERROR_OK)
-                       return retval;
-
-               mips32->num_data_bpoints = (bpinfo >> 24) & 0x0F;
-               mips32->num_data_bpoints_avail = mips32->num_data_bpoints;
-               mips32->data_break_list = calloc(mips32->num_data_bpoints, sizeof(struct mips32_comparator));
-               for (i = 0; i < mips32->num_data_bpoints; i++)
-                       mips32->data_break_list[i].reg_address = EJTAG_DBA1 + (0x100 * i);
-
-               /* clear DBIS reg */
-               retval = target_write_u32(target, EJTAG_DBS, 0);
+               retval = mips32_configure_dbs(target);
                if (retval != ERROR_OK)
                        return retval;
        }
@@ -789,7 +825,7 @@ COMMAND_HANDLER(mips32_handle_scan_delay_command)
        struct mips_ejtag *ejtag_info = &mips32->ejtag_info;
 
        if (CMD_ARGC == 1)
-               COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], ejtag_info->scan_delay);
+               COMMAND_PARSE_NUMBER(uint, CMD_ARGV[0], ejtag_info->scan_delay);
        else if (CMD_ARGC > 1)
                        return ERROR_COMMAND_SYNTAX_ERROR;