[Pdbg] [PATCH v2 25/39] gdbserver: return more registers

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


On Wed, 20 Apr 2022 at 06:51, Nicholas Piggin <npiggin at gmail.com> wrote:
>
> Returning all default registers prevents the client from re-requesting
> them every time you run `info r`.
>
> Signed-off-by: Nicholas Piggin <npiggin at gmail.com>
> ---
>  src/pdbgproxy.c | 46 ++++++++++++++++++++++++++++++++--------------
>  1 file changed, 32 insertions(+), 14 deletions(-)
>
> diff --git a/src/pdbgproxy.c b/src/pdbgproxy.c
> index ef8aa479..393b37bf 100644
> --- a/src/pdbgproxy.c
> +++ b/src/pdbgproxy.c
> @@ -183,10 +183,10 @@ static void get_spr(uint64_t *stack, void *priv)
>  {
>         char data[REG_DATA_SIZE];
>         uint64_t value;
> +       uint32_t value32;
>
>         switch (stack[0]) {
>         case 0x40:
> -               /* Get PC/NIA */

These are removed as they are redundant I assume.

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

>                 if (thread_getnia(thread_target, &value))
>                         PR_ERROR("Error reading NIA\n");
>                 snprintf(data, REG_DATA_SIZE, "%016" PRIx64 , be64toh(value));
> @@ -194,7 +194,6 @@ static void get_spr(uint64_t *stack, void *priv)
>                 break;
>
>         case 0x41:
> -               /* Get MSR */
>                 if (thread_getmsr(thread_target, &value))
>                         PR_ERROR("Error reading MSR\n");
>                 snprintf(data, REG_DATA_SIZE, "%016" PRIx64 , be64toh(value));
> @@ -202,35 +201,54 @@ static void get_spr(uint64_t *stack, void *priv)
>                 break;
>
>         case 0x42:
> -               /* Get CR */
> -               if (thread_getcr(thread_target, (uint32_t *)&value))
> +               if (thread_getcr(thread_target, &value32))
>                         PR_ERROR("Error reading CR \n");
> -               snprintf(data, REG_DATA_SIZE, "%016" PRIx64 , be64toh(value));
> +               snprintf(data, REG_DATA_SIZE, "%016" PRIx64 , be64toh((uint64_t)value32));
>                 send_response(fd, data);
>                 break;
>
>         case 0x43:
> -               /* Get LR */
> -               if (thread_getspr(thread_target, 8, &value))
> +               if (thread_getspr(thread_target, SPR_LR, &value))
>                         PR_ERROR("Error reading LR\n");
>                 snprintf(data, REG_DATA_SIZE, "%016" PRIx64 , be64toh(value));
>                 send_response(fd, data);
>                 break;
>
>         case 0x44:
> -               /* Get CTR */
> -               if (thread_getspr(thread_target, 9, &value))
> +               if (thread_getspr(thread_target, SPR_CTR, &value))
>                         PR_ERROR("Error reading CTR\n");
>                 snprintf(data, REG_DATA_SIZE, "%016" PRIx64 , be64toh(value));
>                 send_response(fd, data);
>                 break;
>
>         case 0x45:
> -               /* We can't get the whole XER register in RAM mode as part of it
> -                * is in latches that we need to stop the clocks to get. Probably
> -                * not helpful to only return part of a register in a debugger so
> -                * return unavailable. */
> -               send_response(fd, "xxxxxxxxxxxxxxxx");
> +               /*
> +                * Not all XER register bits may be recoverable with RAM
> +                * mode accesses, so this may be not entirely accurate.
> +                */
> +               if (thread_getspr(thread_target, SPR_XER, &value))
> +                       PR_ERROR("Error reading XER\n");
> +               snprintf(data, REG_DATA_SIZE, "%016" PRIx64 , be64toh(value));
> +               send_response(fd, data);
> +               break;
> +
> +       case 0x46:
> +               if (thread_getspr(thread_target, SPR_FPSCR, &value))
> +                       PR_ERROR("Error reading FPSCR\n");
> +               snprintf(data, REG_DATA_SIZE, "%016" PRIx64 , be64toh(value));
> +               send_response(fd, data);
> +               break;
> +       case 0x67:
> +               if (thread_getspr(thread_target, SPR_VSCR, &value))
> +                       PR_ERROR("Error reading VSCR\n");
> +               snprintf(data, REG_DATA_SIZE, "%016" PRIx64 , be64toh(value));
> +               send_response(fd, data);
> +               break;
> +       case 0x68:
> +               if (thread_getspr(thread_target, SPR_VRSAVE, &value))
> +                       PR_ERROR("Error reading VRSAVE\n");
> +               snprintf(data, REG_DATA_SIZE, "%016" PRIx64 , be64toh(value));
> +               send_response(fd, data);
>                 break;
>
>         default:
> --
> 2.35.1
>
> --
> Pdbg mailing list
> Pdbg at lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/pdbg


More information about the Pdbg mailing list