win32-arm-low.c regptr 96 bits stored in 32 bit variable

Simon Marchi simon.marchi@polymtl.ca
Sun Oct 28 16:47:00 GMT 2018


On 2018-10-26 18:40, Bill Morgan wrote:
> Should this static variable ULONG zero be at least 96 bits?
> 
> static char *
> regptr (CONTEXT* c, int r)
> {
>   if (mappings[r] < 0)
>   {
>     static ULONG zero;
>     /* Always force value to zero, in case the user tried to write
>        to this register before.  */
>     zero = 0;
>     return (char *) &zero;
>   }
>   else
>     return (char *) c + mappings[r];
> }
> 
> reg-arm.dat shows 96 bits for the ones that have mappings[r] == -1
> 
> name:arm
> xmlarch:arm
> expedite:r11,sp,pc
> 32:r0
> 32:r1
> 32:r2
> 32:r3
> 32:r4
> 32:r5
> 32:r6
> 32:r7
> 32:r8
> 32:r9
> 32:r10
> 32:r11
> 32:r12
> 32:sp
> 32:lr
> 32:pc
> 96:f0
> 96:f1
> 96:f2
> 96:f3
> 96:f4
> 96:f5
> 96:f6
> 96:f7
> 32:fps
> 32:cpsr

Hi Bill,

By inspection, it does seem like a mistake, and that we would need to 
return a pointer to a buffer at least as big as register r.  But I have 
no idea how to build/run/test gdbserver on win32/arm.  If you are able 
to confirm that there is a problem and test a fix, could you please 
provide a patch?

To avoid this kind of problem again, we could return a pointer to a 
dynamically-sized buffer adjusted to the size of the register.  
Something like this:

static char *
regptr (CONTEXT* c, struct regcache *regcache, int r)
{
   if (mappings[r] < 0)
   {
     static gdb::byte_vector zero;
     /* Always force value to zero, in case the user tried to write
        to this register before.  */
     zero.assign (regcache_register_size (regcache, r), 0);
     return (char *) zero.data ();
   }
   else
     return (char *) c + mappings[r];
}

Simon



More information about the Gdb mailing list