This is an automated email from Gerrit.

Kent Brinkley (jkbrinkley.img...@gmail.com) just uploaded a new patch set to 
Gerrit, which you can find at http://openocd.zylin.com/2416

-- gerrit

commit 95bf32d1d08c3739df68bda78882da2ad7c0c65d
Author: Kent Brinkley <jkbrinkley.img...@gmail.com>
Date:   Fri Nov 21 13:03:24 2014 -0700

    Consolidating commands
    
    Consolidating non core specific commands to allow support
    of more than a single core. Currently only the MIPS m4k
    core is supported, so change is done to allow additional cores
    (like microAptiv) to be supported.
    
    Change-Id: I5ff5905e0417c9e7b5b567c7ab46b10453d86eb3
    Signed-off-by: Kent Brinkley <jkbrinkley.img...@gmail.com>
    
    Consolidating commands
    
    Consolidating non core specific commands to allow support
    of more than a single core. Currently only the MIPS m4k
    core is supported, so change is done to allow additional cores
    (like microAptiv) to be supported.
    
    Change-Id: Ia3d2f859fb072428d38ea5a6930cad8f2a263a32
    Signed-off-by: Kent Brinkley <jkbrinkley.img...@gmail.com>
    
    Consolidating commands
    
    Consolidating non core specific commands to allow support
    of more than a single core. Currently only the MIPS m4k
    core is supported, so change is done to allow additional cores
    (like microAptiv) to be supported.
    
    Change-Id: I5bd0a898002ff087c637d663a62ce04bb874dc8b
    Signed-off-by: Kent Brinkley <jkbrinkley.img...@gmail.com>
    
    Consolidating commands
    
    Consolidating non core specific commands to allow support
    of more than a single core. Currently only the MIPS m4k
    core is supported, so change is done to allow additional cores
    (like microAptiv) to be supported.
    
    Change-Id: Idd80960e024c2e1c8330d8701d2381bd2340e712
    Signed-off-by: Kent Brinkley <jkbrinkley.img...@gmail.com>
    
    Added define
    
    Added define for CP0 registers
    
    Change-Id: I61400d47f41bfebfe7b156a54ec7995693f7684a
    Signed-off-by: Kent Brinkley <jkbrinkley.img...@gmail.com>
    
    Fixed build issue
    
    fixed build issue
    
    Change-Id: I613f44712d8dda9c07fca908017f2a09464a96d8
    Signed-off-by: Kent Brinkley <jkbrinkley.img...@gmail.com>

diff --git a/src/target/mips32.c b/src/target/mips32.c
index 1931ad1..d12368e 100644
--- a/src/target/mips32.c
+++ b/src/target/mips32.c
@@ -753,18 +753,13 @@ static int mips32_verify_pointer(struct command_context 
*cmd_ctx,
        return ERROR_OK;
 }
 
-/**
- * MIPS32 targets expose command interface
- * to manipulate CP0 registers
- */
-COMMAND_HANDLER(mips32_handle_cp0_command)
+int mips32_cp0_command(struct command_invocation *cmd)
 {
        int retval;
        struct target *target = get_current_target(CMD_CTX);
        struct mips32_common *mips32 = target_to_mips32(target);
        struct mips_ejtag *ejtag_info = &mips32->ejtag_info;
 
-
        retval = mips32_verify_pointer(CMD_CTX, mips32);
        if (retval != ERROR_OK)
                return retval;
@@ -775,28 +770,71 @@ COMMAND_HANDLER(mips32_handle_cp0_command)
        }
 
        /* two or more argument, access a single register/select (write if 
third argument is given) */
-       if (CMD_ARGC < 2)
-               return ERROR_COMMAND_SYNTAX_ERROR;
-       else {
-               uint32_t cp0_reg, cp0_sel;
-               COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], cp0_reg);
-               COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], cp0_sel);
+       if (CMD_ARGC < 2) {
+               uint32_t value;
+
+               if (CMD_ARGC == 0) {
+                       for (int i = 0; i < MIPS32NUMCP0REGS; i++) {
+                               retval = mips32_cp0_read(ejtag_info, &value, 
mips32_cp0_regs[i].reg, mips32_cp0_regs[i].sel);
+                               if (retval != ERROR_OK) {
+                                       command_print(CMD_CTX, "couldn't access 
reg %s", mips32_cp0_regs[i].name);
+                                       return ERROR_OK;
+                               }
+
+                               command_print(CMD_CTX, "%*s: 0x%8.8x", 14, 
mips32_cp0_regs[i].name, value);
+                       }
+               } else {
+                       for (int i = 0; i < MIPS32NUMCP0REGS; i++) {
+                               /* find register name */
+                               if (strcmp(mips32_cp0_regs[i].name, 
CMD_ARGV[0]) == 0) {
+                                       retval = mips32_cp0_read(ejtag_info, 
&value, mips32_cp0_regs[i].reg, mips32_cp0_regs[i].sel);
+                                       command_print(CMD_CTX, "0x%8.8x", 
value);
+                                       return ERROR_OK;
+                               }
+                       }
 
+                       LOG_ERROR("BUG: register '%s' not found", CMD_ARGV[0]);
+                       return ERROR_COMMAND_SYNTAX_ERROR;
+               }
+       } else {
                if (CMD_ARGC == 2) {
                        uint32_t value;
-
-                       retval = mips32_cp0_read(ejtag_info, &value, cp0_reg, 
cp0_sel);
-                       if (retval != ERROR_OK) {
-                               command_print(CMD_CTX,
-                                               "couldn't access reg %" PRIi32,
-                                               cp0_reg);
-                               return ERROR_OK;
+                       char tmp = *CMD_ARGV[0];
+
+                       if (isdigit(tmp) == false) {
+                               for (int i = 0; i < MIPS32NUMCP0REGS; i++) {
+                                       /* find register name */
+                                       if (strcmp(mips32_cp0_regs[i].name, 
CMD_ARGV[0]) == 0) {
+                                               COMMAND_PARSE_NUMBER(u32, 
CMD_ARGV[1], value);
+                                               retval = 
mips32_cp0_write(ejtag_info, value, mips32_cp0_regs[i].reg, 
mips32_cp0_regs[i].sel);
+                                               return ERROR_OK;
+                                       }
+                               }
+
+                               LOG_ERROR("BUG: register '%s' not found", 
CMD_ARGV[0]);
+                               return ERROR_COMMAND_SYNTAX_ERROR;
+                       } else {
+                               uint32_t cp0_reg, cp0_sel;
+                               COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], cp0_reg);
+                               COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], cp0_sel);
+
+                               retval = mips32_cp0_read(ejtag_info, &value, 
cp0_reg, cp0_sel);
+                               if (retval != ERROR_OK) {
+                                       command_print(CMD_CTX,
+                                                                 "couldn't 
access reg %" PRIi32,
+                                                                 cp0_reg);
+                                       return ERROR_OK;
+                               }
+
+                               command_print(CMD_CTX, "cp0 reg %" PRIi32 ", 
select %" PRIi32 ": %8.8" PRIx32,
+                                                         cp0_reg, cp0_sel, 
value);
                        }
-                       command_print(CMD_CTX, "cp0 reg %" PRIi32 ", select %" 
PRIi32 ": %8.8" PRIx32,
-                                       cp0_reg, cp0_sel, value);
-
                } else if (CMD_ARGC == 3) {
+                       uint32_t cp0_reg, cp0_sel;
                        uint32_t value;
+
+                       COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], cp0_reg);
+                       COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], cp0_sel);
                        COMMAND_PARSE_NUMBER(u32, CMD_ARGV[2], value);
                        retval = mips32_cp0_write(ejtag_info, value, cp0_reg, 
cp0_sel);
                        if (retval != ERROR_OK) {
@@ -806,13 +844,46 @@ COMMAND_HANDLER(mips32_handle_cp0_command)
                                return ERROR_OK;
                        }
                        command_print(CMD_CTX, "cp0 reg %" PRIi32 ", select %" 
PRIi32 ": %8.8" PRIx32,
-                                       cp0_reg, cp0_sel, value);
+                                                 cp0_reg, cp0_sel, value);
                }
        }
 
        return ERROR_OK;
 }
 
+int mips32_scan_delay_command(struct command_invocation *cmd)
+{
+       struct target *target = get_current_target(CMD_CTX);
+       struct mips32_common *mips32 = target_to_mips32(target);
+       struct mips_ejtag *ejtag_info = &mips32->ejtag_info;
+
+       int retval = mips32_verify_pointer(CMD_CTX, mips32);
+       if (retval != ERROR_OK)
+               return retval;
+
+       if (CMD_ARGC == 1)
+               COMMAND_PARSE_NUMBER(uint, CMD_ARGV[0], ejtag_info->scan_delay);
+       else if (CMD_ARGC > 1)
+               return ERROR_COMMAND_SYNTAX_ERROR;
+
+       command_print(CMD_CTX, "scan delay: %d nsec", ejtag_info->scan_delay);
+       if (ejtag_info->scan_delay >= MIPS32_SCAN_DELAY_LEGACY_MODE) {
+               ejtag_info->mode = 0;
+               command_print(CMD_CTX, "running in legacy mode");
+       } else {
+               ejtag_info->mode = 1;
+               command_print(CMD_CTX, "running in fast queued mode");
+       }
+
+       return ERROR_OK;
+}
+
+COMMAND_HANDLER(mips32_handle_cp0_command)
+{
+       /* Call common code */
+       return mips32_cp0_command(cmd);
+}
+
 COMMAND_HANDLER(mips32_handle_scan_delay_command)
 {
        struct target *target = get_current_target(CMD_CTX);
@@ -841,8 +912,8 @@ static const struct command_registration 
mips32_exec_command_handlers[] = {
                .name = "cp0",
                .handler = mips32_handle_cp0_command,
                .mode = COMMAND_EXEC,
-               .usage = "regnum select [value]",
-               .help = "display/modify cp0 register",
+               .help = "display/modify cp0 register(s)",
+               .usage = "[[reg_name|regnum select] [value]]",
        },
                {
                .name = "scan_delay",
diff --git a/src/target/mips32.h b/src/target/mips32.h
index 4f44384..ff95bba 100644
--- a/src/target/mips32.h
+++ b/src/target/mips32.h
@@ -63,12 +63,61 @@
 #define MIPS32_ARCH_REL1 0x0
 #define MIPS32_ARCH_REL2 0x1
 
+#define MIPS32_SCAN_DELAY_LEGACY_MODE 2000000
+
 /* offsets into mips32 core register cache */
 enum {
        MIPS32_PC = 37,
        MIPS32NUMCOREREGS
 };
 
+#define MIPS32NUMCP0REGS 38
+#define MIPS32NUMDSPREGS 7
+
+static const struct {
+       unsigned reg;
+       unsigned sel;
+       const char *name;
+} mips32_cp0_regs[MIPS32NUMCP0REGS] = {
+       { 4, 2, "userlocal"},
+       { 7, 0, "hwrena"},
+       { 8, 0, "badvaddr"},
+       { 9, 0, "count"},
+       {11, 0, "compare"},
+       {12, 0, "status"},
+       {12, 1, "intctl"},
+       {12, 2, "srsctl"},
+       {12, 4, "view_ipl"},
+       {13, 0, "cause"},
+       {13, 5, "nestedexc"},
+       {14, 0, "epc"},
+       {14, 2, "nestedepc"},
+       {15, 0, "prid"},
+       {15, 1, "ebase"},
+       {15, 2, "cdmmbase"},
+       {16, 0, "config"},
+       {16, 1, "config1"},
+       {16, 2, "config2"},
+       {16, 3, "config3"},
+       {16, 4, "config4"},
+       {16, 5, "config5"},
+       {16, 7, "config7"},
+       {17, 0, "lladdr"},
+       {23, 0, "debug"},
+       {23, 1, "tracecontrol"},
+       {23, 2, "tracecontrol2"},
+       {23, 3, "usertracedata1"},
+       {23, 4, "tracebpc"},
+       {24, 0, "depc"},
+       {24, 3, "usertracedata2"},
+       {25, 0, "perfctl0"},
+       {25, 1, "perfcnt0"},
+       {25, 2, "perfctl1"},
+       {25, 3, "perfcnt1"},
+       {26, 0, "errctl"},
+       {30, 0, "errorepc"},
+       {31, 0, "desave"},
+};
 enum mips32_isa_mode {
        MIPS32_ISA_MIPS32 = 0,
        MIPS32_ISA_MIPS16E = 1,
@@ -250,4 +299,6 @@ int mips32_checksum_memory(struct target *target, uint32_t 
address,
 int mips32_blank_check_memory(struct target *target,
                uint32_t address, uint32_t count, uint32_t *blank);
 
+int mips32_cp0_command(struct command_invocation *cmd);
+int mips32_scan_delay_command(struct command_invocation *cmd);
 #endif /*MIPS32_H*/
diff --git a/src/target/mips_m4k.c b/src/target/mips_m4k.c
index 5b740cc..ee35023 100644
--- a/src/target/mips_m4k.c
+++ b/src/target/mips_m4k.c
@@ -1212,56 +1212,8 @@ static int mips_m4k_verify_pointer(struct 
command_context *cmd_ctx,
 
 COMMAND_HANDLER(mips_m4k_handle_cp0_command)
 {
-       int retval;
-       struct target *target = get_current_target(CMD_CTX);
-       struct mips_m4k_common *mips_m4k = target_to_m4k(target);
-       struct mips_ejtag *ejtag_info = &mips_m4k->mips32.ejtag_info;
-
-       retval = mips_m4k_verify_pointer(CMD_CTX, mips_m4k);
-       if (retval != ERROR_OK)
-               return retval;
-
-       if (target->state != TARGET_HALTED) {
-               command_print(CMD_CTX, "target must be stopped for \"%s\" 
command", CMD_NAME);
-               return ERROR_OK;
-       }
-
-       /* two or more argument, access a single register/select (write if 
third argument is given) */
-       if (CMD_ARGC < 2)
-               return ERROR_COMMAND_SYNTAX_ERROR;
-       else {
-               uint32_t cp0_reg, cp0_sel;
-               COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], cp0_reg);
-               COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], cp0_sel);
-
-               if (CMD_ARGC == 2) {
-                       uint32_t value;
-                       retval = mips32_cp0_read(ejtag_info, &value, cp0_reg, 
cp0_sel);
-                       if (retval != ERROR_OK) {
-                               command_print(CMD_CTX,
-                                               "couldn't access reg %" PRIi32,
-                                               cp0_reg);
-                               return ERROR_OK;
-                       }
-                       command_print(CMD_CTX, "cp0 reg %" PRIi32 ", select %" 
PRIi32 ": %8.8" PRIx32,
-                                       cp0_reg, cp0_sel, value);
-
-               } else if (CMD_ARGC == 3) {
-                       uint32_t value;
-                       COMMAND_PARSE_NUMBER(u32, CMD_ARGV[2], value);
-                       retval = mips32_cp0_write(ejtag_info, value, cp0_reg, 
cp0_sel);
-                       if (retval != ERROR_OK) {
-                               command_print(CMD_CTX,
-                                               "couldn't access cp0 reg %" 
PRIi32 ", select %" PRIi32,
-                                               cp0_reg,  cp0_sel);
-                               return ERROR_OK;
-                       }
-                       command_print(CMD_CTX, "cp0 reg %" PRIi32 ", select %" 
PRIi32 ": %8.8" PRIx32,
-                                       cp0_reg, cp0_sel, value);
-               }
-       }
-
-       return ERROR_OK;
+       /* Call common code - maintaining backward compatibility */
+       return mips32_cp0_command(cmd);
 }
 
 COMMAND_HANDLER(mips_m4k_handle_smp_off_command)
@@ -1324,25 +1276,8 @@ COMMAND_HANDLER(mips_m4k_handle_smp_gdb_command)
 
 COMMAND_HANDLER(mips_m4k_handle_scan_delay_command)
 {
-       struct target *target = get_current_target(CMD_CTX);
-       struct mips_m4k_common *mips_m4k = target_to_m4k(target);
-       struct mips_ejtag *ejtag_info = &mips_m4k->mips32.ejtag_info;
-
-       if (CMD_ARGC == 1)
-               COMMAND_PARSE_NUMBER(uint, CMD_ARGV[0], ejtag_info->scan_delay);
-       else if (CMD_ARGC > 1)
-                       return ERROR_COMMAND_SYNTAX_ERROR;
-
-       command_print(CMD_CTX, "scan delay: %d nsec", ejtag_info->scan_delay);
-       if (ejtag_info->scan_delay >= 20000000) {
-               ejtag_info->mode = 0;
-               command_print(CMD_CTX, "running in legacy mode");
-       } else {
-               ejtag_info->mode = 1;
-               command_print(CMD_CTX, "running in fast queued mode");
-       }
-
-       return ERROR_OK;
+       /* Call common code - maintaining backward compatibility */
+       return mips32_scan_delay_command(cmd);
 }
 
 static const struct command_registration mips_m4k_exec_command_handlers[] = {
@@ -1350,8 +1285,8 @@ static const struct command_registration 
mips_m4k_exec_command_handlers[] = {
                .name = "cp0",
                .handler = mips_m4k_handle_cp0_command,
                .mode = COMMAND_EXEC,
-               .usage = "regnum [value]",
                .help = "display/modify cp0 register",
+               .usage = "[[reg_name|regnum select] [value]]",
        },
        {
                .name = "smp_off",

-- 

------------------------------------------------------------------------------
Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server
from Actuate! Instantly Supercharge Your Business Reports and Dashboards
with Interactivity, Sharing, Native Excel Exports, App Integration & more
Get technology previously reserved for billion-dollar corporations, FREE
http://pubads.g.doubleclick.net/gampad/clk?id=157005751&iu=/4140/ostg.clktrk
_______________________________________________
OpenOCD-devel mailing list
OpenOCD-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openocd-devel

Reply via email to