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

Simon Marchi <[email protected]>
Newsgroups gmane.comp.gdb.devel
Message-ID <[email protected]>
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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.