On 5/21/19 12:48 PM, Jan Bobek wrote:
> I get the same behavior, but it only occurs on 32bit builds of
> RISU. Specifically, in risu_reginfo_i386.c, lines 172--178:
> 
>     for (i = 0; i < nvecregs; ++i) {
> #ifdef __x86_64__
>         memcpy(&ri->vregs[i], &fp->xmm_space[i], 16);
> #else
>         memcpy(&ri->vregs[i], &fp->_xmm[i * 4], 16);
> #endif
>     }
> 
> In the #else branch, fp->_xmm has type _libc_xmmreg[16], and
> _libc_xmmreg itself is a struct with a 4-element array of uint32s. On
> my box, this gets fixed by dropping the multiplication from the index,
> i.e.
> 
>         memcpy(&ri->vregs[i], &fp->_xmm[i], 16);
> 
> I wonder why Richard wrote it like this in the first place; did
> fp->_xmm use to be an array of uint32s in previous versions of this
> API?

I dunno what happened, but these indexes are backward.

>From <asm/sigcontext.h>:

struct _fpstate_32 {
    ...
        struct _xmmreg _xmm[8];


struct _fpstate_64 {
    ...
        __u32 xmm_space[64];  /* 16x XMM registers, 16 bytes each */



r~

Reply via email to