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~