[Pdbg] [PATCH v2 29/39] gdbserver: add multi-threaded start/stop helper functions

Joel Stanley joel at jms.id.au
Tue May 3 17:31:23 AEST 2022


On Wed, 20 Apr 2022 at 06:51, Nicholas Piggin <npiggin at gmail.com> wrote:
>
> Prepare for multi threaded debugging (in gdb's "all-stop" mode) by
> providing helpers that stop and start all target threads.
>
> Signed-off-by: Nicholas Piggin <npiggin at gmail.com>

Reviewed-by: Joel Stanley <joel at jms.id.au>

> ---
>  src/pdbgproxy.c | 87 +++++++++++++++++++++++++++++++++++++++++++++++--
>  1 file changed, 85 insertions(+), 2 deletions(-)
>
> diff --git a/src/pdbgproxy.c b/src/pdbgproxy.c
> index 4f30ede2..01419108 100644
> --- a/src/pdbgproxy.c
> +++ b/src/pdbgproxy.c
> @@ -43,6 +43,7 @@
>
>  #define TEST_SKIBOOT_ADDR 0x40000000
>
> +static bool all_stopped = true; /* must be started with targets stopped */
>  static struct pdbg_target *thread_target = NULL;
>  static struct pdbg_target *adu_target;
>  static struct timeval timeout;
> @@ -542,10 +543,50 @@ static void v_conts(uint64_t *stack, void *priv)
>         send_response(fd, TRAP);
>  }
>
> +static void __start_all(void)
> +{
> +       struct pdbg_target *target;
> +
> +       if (!all_stopped)
> +               PR_ERROR("starting while not all stopped\n");
> +
> +       for_each_path_target_class("thread", target) {
> +               if (pdbg_target_status(target) != PDBG_TARGET_ENABLED)
> +                       continue;
> +
> +               if (thread_start(target)) {
> +                       PR_ERROR("Could not start thread %s\n",
> +                                pdbg_target_path(target));
> +               }
> +       }
> +
> +       all_stopped = false;
> +}
> +
> +static void start_all(void)
> +{
> +       struct pdbg_target *target;
> +
> +       for_each_path_target_class("thread", target) {
> +               struct thread_state status;
> +
> +               if (pdbg_target_status(target) != PDBG_TARGET_ENABLED)
> +                       continue;
> +
> +               target->probe(target);
> +               status = thread_status(target);
> +               if (!status.quiesced)
> +                       PR_ERROR("starting thread not quiesced\n");
> +       }
> +
> +       __start_all();
> +}
> +
>  #define VCONT_POLL_DELAY 100000
>  static void v_contc(uint64_t *stack, void *priv)
>  {
> -       thread_start(thread_target);
> +       start_all();
> +
>         state = SIGNAL_WAIT;
>         poll_interval = 1;
>  }
> @@ -603,13 +644,55 @@ static bool thread_check_attn(struct pdbg_target *target)
>         return false;
>  }
>
> +static void __stop_all(void)
> +{
> +       struct pdbg_target *target;
> +
> +       if (all_stopped)
> +               PR_ERROR("stopping while all stopped\n");
> +
> +       for_each_path_target_class("thread", target) {
> +               if (pdbg_target_status(target) != PDBG_TARGET_ENABLED)
> +                       continue;
> +
> +               if (thread_stop(target)) {
> +                       PR_ERROR("Could not stop thread %s\n",
> +                                pdbg_target_path(target));
> +                       /* How to fix? */
> +               }
> +       }
> +
> +       all_stopped = true;
> +}
> +
> +static void stop_all(void)
> +{
> +       struct pdbg_target *target;
> +
> +       __stop_all();
> +
> +       for_each_path_target_class("thread", target) {
> +               struct thread_state status;
> +
> +               if (pdbg_target_status(target) != PDBG_TARGET_ENABLED)
> +                       continue;
> +
> +               target->probe(target);
> +               status = thread_status(target);
> +               if (!status.quiesced) {
> +                       PR_ERROR("Could not quiesce thread\n");
> +                       /* How to fix? */
> +               }
> +       }
> +}
> +
>  static void interrupt(uint64_t *stack, void *priv)
>  {
>         struct thread_state status;
>
>         PR_INFO("Interrupt from gdb client\n");
>
> -       thread_stop(thread_target);
> +       stop_all();
>
>         status = thread_status(thread_target);
>         if (!(status.quiesced)) {
> --
> 2.35.1
>
> --
> Pdbg mailing list
> Pdbg at lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/pdbg


More information about the Pdbg mailing list