smp: replace commands smp_on/smp_off with "smp [on|off]" 15/4615/3
authorAntonio Borneo <borneo.antonio@gmail.com>
Thu, 19 Jul 2018 09:50:56 +0000 (11:50 +0200)
committerMatthias Welwarsky <matthias@welwarsky.de>
Wed, 27 Mar 2019 08:55:03 +0000 (08:55 +0000)
Seams over-engineered having two separate commands to turn SMP
on/off. Plus it is missing the possibility to dump the current
status of SMP and would be weird adding an additional command
for it. Moreover, such commands are replicated in few targets so
it would make sense centralizing them.

- Deprecate the commands "smp_on" and "smp_off".
- Add a new command "smp" that accepts optional parameters
  "[on|off]" and prints the SMP status when run without
  parameters. This replaces the two commands above.
- Put the deprecated and the new command handlers in smp.c
- Update the documentation, except for mips_m4k, since it is not
  available yet.
- Promote the macro foreach_smp_target to global context and use
  it where possible.

Change-Id: Ia72841c1a3bd6edd4db4cc809046322f498617e6
Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com>
Reviewed-on: http://openocd.zylin.com/4615
Tested-by: jenkins
Reviewed-by: Graham Sanderson <graham.sanderson@gmail.com>
Reviewed-by: Matthias Welwarsky <matthias@welwarsky.de>
doc/openocd.texi
src/target/aarch64.c
src/target/cortex_a.c
src/target/mips_m4k.c
src/target/smp.c
src/target/smp.h
tcl/target/u8500.cfg

index a17173ce8838ea434ddd227c1be15f680140993b..027e6d2edbb9d915b7e41da99d989d0a1bb20872 100644 (file)
@@ -1802,10 +1802,11 @@ displayed by the GDB session @pxref{usingopenocdsmpwithgdb,,Using OpenOCD SMP wi
 The SMP behaviour can be disabled/enabled dynamically. On cortex_a following
 command have been implemented.
 @itemize @bullet
-@item cortex_a smp_on : enable SMP mode, behaviour is as described above.
-@item cortex_a smp_off : disable SMP mode, the current target is the one
+@item cortex_a smp on : enable SMP mode, behaviour is as described above.
+@item cortex_a smp off : disable SMP mode, the current target is the one
 displayed in the GDB session, only this target is now controlled by GDB
 session. This behaviour is useful during system boot up.
+@item cortex_a smp : display current SMP mode.
 @item cortex_a smp_gdb : display/fix the core id displayed in GDB session see
 following example.
 @end itemize
@@ -8940,12 +8941,8 @@ Initialize core debug
 Enables debug by unlocking the Software Lock and clearing sticky powerdown indications
 @end deffn
 
-@deffn Command {cortex_a smp_off}
-Disable SMP mode
-@end deffn
-
-@deffn Command {cortex_a smp_on}
-Enable SMP mode
+@deffn Command {cortex_a smp} [on|off]
+Display/set the current SMP mode
 @end deffn
 
 @deffn Command {cortex_a smp_gdb} [core_id]
@@ -9156,8 +9153,8 @@ target code relies on. In a configuration file, the command would typically be c
 However, normally it is not necessary to use the command at all.
 @end deffn
 
-@deffn Command {aarch64 smp_on|smp_off}
-Enable and disable SMP handling. The state of SMP handling influences the way targets in an SMP group
+@deffn Command {aarch64 smp} [on|off]
+Display, enable or disable SMP handling mode. The state of SMP handling influences the way targets in an SMP group
 are handled by the run control. With SMP handling enabled, issuing halt or resume to one core will trigger
 halting or resuming of all cores in the group. The command @code{target smp} defines which targets are in the SMP
 group. With SMP handling disabled, all targets need to be treated individually.
index 1fafcfd45de679e0b3bc067c3b4447a91f409540..ff68e3adb7ef08715094d02d77bce4c666af925c 100644 (file)
@@ -29,6 +29,7 @@
 #include "armv8_opcodes.h"
 #include "armv8_cache.h"
 #include "arm_semihosting.h"
+#include "smp.h"
 #include <helper/time_support.h>
 
 enum restart_mode {
@@ -63,9 +64,6 @@ static int aarch64_virt2phys(struct target *target,
 static int aarch64_read_cpu_memory(struct target *target,
        uint64_t address, uint32_t size, uint32_t count, uint8_t *buffer);
 
-#define foreach_smp_target(pos, head) \
-       for (pos = head; (pos != NULL); pos = pos->next)
-
 static int aarch64_restore_system_control_reg(struct target *target)
 {
        enum arm_mode target_mode = ARM_MODE_ANY;
@@ -2550,42 +2548,6 @@ COMMAND_HANDLER(aarch64_handle_dbginit_command)
 
        return aarch64_init_debug_access(target);
 }
-COMMAND_HANDLER(aarch64_handle_smp_off_command)
-{
-       struct target *target = get_current_target(CMD_CTX);
-       /* check target is an smp target */
-       struct target_list *head;
-       struct target *curr;
-       head = target->head;
-       target->smp = 0;
-       if (head != (struct target_list *)NULL) {
-               while (head != (struct target_list *)NULL) {
-                       curr = head->target;
-                       curr->smp = 0;
-                       head = head->next;
-               }
-               /*  fixes the target display to the debugger */
-               target->gdb_service->target = target;
-       }
-       return ERROR_OK;
-}
-
-COMMAND_HANDLER(aarch64_handle_smp_on_command)
-{
-       struct target *target = get_current_target(CMD_CTX);
-       struct target_list *head;
-       struct target *curr;
-       head = target->head;
-       if (head != (struct target_list *)NULL) {
-               target->smp = 1;
-               while (head != (struct target_list *)NULL) {
-                       curr = head->target;
-                       curr->smp = 1;
-                       head = head->next;
-               }
-       }
-       return ERROR_OK;
-}
 
 COMMAND_HANDLER(aarch64_mask_interrupts_command)
 {
@@ -2767,19 +2729,6 @@ static const struct command_registration aarch64_exec_command_handlers[] = {
                .help = "Initialize core debug",
                .usage = "",
        },
-       {       .name = "smp_off",
-               .handler = aarch64_handle_smp_off_command,
-               .mode = COMMAND_EXEC,
-               .help = "Stop smp handling",
-               .usage = "",
-       },
-       {
-               .name = "smp_on",
-               .handler = aarch64_handle_smp_on_command,
-               .mode = COMMAND_EXEC,
-               .help = "Restart smp handling",
-               .usage = "",
-       },
        {
                .name = "maskisr",
                .handler = aarch64_mask_interrupts_command,
@@ -2801,6 +2750,9 @@ static const struct command_registration aarch64_exec_command_handlers[] = {
                .help = "read coprocessor register",
                .usage = "cpnum op1 CRn CRm op2",
        },
+       {
+               .chain = smp_command_handlers,
+       },
 
 
        COMMAND_REGISTRATION_DONE
index e460f3b708e4a2100e4bf55aad2b9f3d611612f5..c9ef68c21a8956ea014f9adac024513116cbf603 100644 (file)
 #include "arm_opcodes.h"
 #include "arm_semihosting.h"
 #include "transport/transport.h"
+#include "smp.h"
 #include <helper/time_support.h>
 
-#define foreach_smp_target(pos, head) \
-       for (pos = head; (pos != NULL); pos = pos->next)
-
 static int cortex_a_poll(struct target *target);
 static int cortex_a_debug_entry(struct target *target);
 static int cortex_a_restore_context(struct target *target, bool bpwp);
@@ -2969,42 +2967,6 @@ COMMAND_HANDLER(cortex_a_handle_dbginit_command)
 
        return cortex_a_init_debug_access(target);
 }
-COMMAND_HANDLER(cortex_a_handle_smp_off_command)
-{
-       struct target *target = get_current_target(CMD_CTX);
-       /* check target is an smp target */
-       struct target_list *head;
-       struct target *curr;
-       head = target->head;
-       target->smp = 0;
-       if (head != (struct target_list *)NULL) {
-               while (head != (struct target_list *)NULL) {
-                       curr = head->target;
-                       curr->smp = 0;
-                       head = head->next;
-               }
-               /*  fixes the target display to the debugger */
-               target->gdb_service->target = target;
-       }
-       return ERROR_OK;
-}
-
-COMMAND_HANDLER(cortex_a_handle_smp_on_command)
-{
-       struct target *target = get_current_target(CMD_CTX);
-       struct target_list *head;
-       struct target *curr;
-       head = target->head;
-       if (head != (struct target_list *)NULL) {
-               target->smp = 1;
-               while (head != (struct target_list *)NULL) {
-                       curr = head->target;
-                       curr->smp = 1;
-                       head = head->next;
-               }
-       }
-       return ERROR_OK;
-}
 
 COMMAND_HANDLER(cortex_a_handle_smp_gdb_command)
 {
@@ -3096,18 +3058,6 @@ static const struct command_registration cortex_a_exec_command_handlers[] = {
                .help = "Initialize core debug",
                .usage = "",
        },
-       {   .name = "smp_off",
-           .handler = cortex_a_handle_smp_off_command,
-           .mode = COMMAND_EXEC,
-           .help = "Stop smp handling",
-           .usage = "",},
-       {
-               .name = "smp_on",
-               .handler = cortex_a_handle_smp_on_command,
-               .mode = COMMAND_EXEC,
-               .help = "Restart smp handling",
-               .usage = "",
-       },
        {
                .name = "smp_gdb",
                .handler = cortex_a_handle_smp_gdb_command,
@@ -3133,6 +3083,9 @@ static const struct command_registration cortex_a_exec_command_handlers[] = {
        {
                .chain = armv7a_mmu_command_handlers,
        },
+       {
+               .chain = smp_command_handlers,
+       },
 
        COMMAND_REGISTRATION_DONE
 };
index 6981c2ec87a9a387679d182587f1618e3f5f2e76..016b5a9c52d9338849965380030c2895a8504f0c 100644 (file)
@@ -33,6 +33,7 @@
 #include "mips32_dmaacc.h"
 #include "target_type.h"
 #include "register.h"
+#include "smp.h"
 
 static void mips_m4k_enable_breakpoints(struct target *target);
 static void mips_m4k_enable_watchpoints(struct target *target);
@@ -1333,43 +1334,6 @@ COMMAND_HANDLER(mips_m4k_handle_cp0_command)
        return ERROR_OK;
 }
 
-COMMAND_HANDLER(mips_m4k_handle_smp_off_command)
-{
-       struct target *target = get_current_target(CMD_CTX);
-       /* check target is an smp target */
-       struct target_list *head;
-       struct target *curr;
-       head = target->head;
-       target->smp = 0;
-       if (head != (struct target_list *)NULL) {
-               while (head != (struct target_list *)NULL) {
-                       curr = head->target;
-                       curr->smp = 0;
-                       head = head->next;
-               }
-               /*  fixes the target display to the debugger */
-               target->gdb_service->target = target;
-       }
-       return ERROR_OK;
-}
-
-COMMAND_HANDLER(mips_m4k_handle_smp_on_command)
-{
-       struct target *target = get_current_target(CMD_CTX);
-       struct target_list *head;
-       struct target *curr;
-       head = target->head;
-       if (head != (struct target_list *)NULL) {
-               target->smp = 1;
-               while (head != (struct target_list *)NULL) {
-                       curr = head->target;
-                       curr->smp = 1;
-                       head = head->next;
-               }
-       }
-       return ERROR_OK;
-}
-
 COMMAND_HANDLER(mips_m4k_handle_smp_gdb_command)
 {
        struct target *target = get_current_target(CMD_CTX);
@@ -1422,20 +1386,6 @@ static const struct command_registration mips_m4k_exec_command_handlers[] = {
                .usage = "regnum [value]",
                .help = "display/modify cp0 register",
        },
-       {
-               .name = "smp_off",
-               .handler = mips_m4k_handle_smp_off_command,
-               .mode = COMMAND_EXEC,
-               .help = "Stop smp handling",
-               .usage = "",},
-
-       {
-               .name = "smp_on",
-               .handler = mips_m4k_handle_smp_on_command,
-               .mode = COMMAND_EXEC,
-               .help = "Restart smp handling",
-               .usage = "",
-       },
        {
                .name = "smp_gdb",
                .handler = mips_m4k_handle_smp_gdb_command,
@@ -1450,6 +1400,9 @@ static const struct command_registration mips_m4k_exec_command_handlers[] = {
                .help = "display/set scan delay in nano seconds",
                .usage = "[value]",
        },
+       {
+               .chain = smp_command_handlers,
+       },
        COMMAND_REGISTRATION_DONE
 };
 
index bdf81a0eeb3df88069a1ef94aa7daf2dfeeba808..87944331e059aa3d865e094784e8ad7b23a5eecb 100644 (file)
@@ -96,3 +96,82 @@ int gdb_write_smp_packet(struct connection *connection,
 
        return retval;
 }
+
+COMMAND_HANDLER(default_handle_smp_command)
+{
+       struct target *target = get_current_target(CMD_CTX);
+       struct target_list *head;
+
+       if (CMD_ARGC > 1)
+               return ERROR_COMMAND_SYNTAX_ERROR;
+
+       if (!CMD_ARGC) {
+               command_print(CMD_CTX, "%s", target->smp ? "on" : "off");
+               return ERROR_OK;
+       }
+
+       if (!strcmp(CMD_ARGV[0], "on")) {
+               foreach_smp_target(head, target->head)
+                       head->target->smp = 1;
+
+               return ERROR_OK;
+       }
+
+       if (!strcmp(CMD_ARGV[0], "off")) {
+               foreach_smp_target(head, target->head)
+                       head->target->smp = 0;
+
+               /* fixes the target display to the debugger */
+               if (target->head)
+                       target->gdb_service->target = target;
+
+               return ERROR_OK;
+       }
+
+       return ERROR_COMMAND_SYNTAX_ERROR;
+}
+
+COMMAND_HANDLER(deprecated_handle_smp_on_command)
+{
+       const char *argv[] = {"on", NULL};
+
+       LOG_WARNING("\'smp_on\' is deprecated, please use \'smp on\' instead.");
+       CMD_ARGC = 1;
+       CMD_ARGV = argv;
+       return CALL_COMMAND_HANDLER(default_handle_smp_command);
+}
+
+COMMAND_HANDLER(deprecated_handle_smp_off_command)
+{
+       const char *argv[] = {"off", NULL};
+
+       LOG_WARNING("\'smp_off\' is deprecated, please use \'smp off\' instead.");
+       CMD_ARGC = 1;
+       CMD_ARGV = argv;
+       return CALL_COMMAND_HANDLER(default_handle_smp_command);
+}
+
+const struct command_registration smp_command_handlers[] = {
+       {
+               .name = "smp",
+               .handler = default_handle_smp_command,
+               .mode = COMMAND_EXEC,
+               .help = "smp handling",
+               .usage = "[on|off]",
+       },
+       {
+               .name = "smp_on",
+               .handler = deprecated_handle_smp_on_command,
+               .mode = COMMAND_EXEC,
+               .help = "Restart smp handling",
+               .usage = "",
+       },
+       {
+               .name = "smp_off",
+               .handler = deprecated_handle_smp_off_command,
+               .mode = COMMAND_EXEC,
+               .help = "Stop smp handling",
+               .usage = "",
+       },
+       COMMAND_REGISTRATION_DONE
+};
index c3e6c6ceae2c2177a461ecb44eb25f1d5f0b51f8..f024b402352629d06adbda2cda03aa599bfa58ff 100644 (file)
 
 #include "server/server.h"
 
+#define foreach_smp_target(pos, head) \
+       for (pos = head; (pos != NULL); pos = pos->next)
+
+extern const struct command_registration smp_command_handlers[];
+
 int gdb_read_smp_packet(struct connection *connection,
                char const *packet, int packet_size);
 int gdb_write_smp_packet(struct connection *connection,
index 1313efd3a22a7b00cf7951b7ed4558466a95984d..7ff39291bab86eee39d7b33943ab6d29c8856cf1 100644 (file)
@@ -19,12 +19,12 @@ proc ocd_gdb_restart {target_id} {
        global _SMP
     targets $_TARGETNAME_1
        if { [expr ($_SMP == 1)] } {
-       cortex_a smp_off
+       cortex_a smp off
        }
        rst_run
        halt
        if { [expr ($_SMP == 1)]} {
-       cortex_a smp_on
+       cortex_a smp on
        }
 }
 

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)