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

Nicholas Piggin npiggin at gmail.com
Tue May 10 19:55:39 AEST 2022


Excerpts from Joel Stanley's message of May 3, 2022 5:15 pm:
> 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.

Yeah should have called that out in the changelog. Since adding
defines for the SPRs it's now all self-documenting.

> 
> 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