[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