On Thu, May 06, 2021, Jacob Xu wrote: > When compiled with clang, the following statement gets converted into a > movaps instructions. > mem->u[0] = 5; mem->u[1] = 6; mem->u[2] = 7; mem->u[3] = 8; > > Since mem is an unaligned pointer to a union of an sse, we get a GP when > running. > > All we want is to make the values between mem and v different for this > testcase, so let's just memset the pointer at mem, and convert to > uint32_t pointer. Then the compiler will not assume the pointer is > aligned to 128 bits. > > Fixes: e5e76263b5 ("x86: add additional test cases for sse exceptions to > emulator.c") > > Signed-off-by: Jacob Xu <jacobhxu@xxxxxxxxxx> > --- > x86/emulator.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/x86/emulator.c b/x86/emulator.c > index 9705073..a2c7e5b 100644 > --- a/x86/emulator.c > +++ b/x86/emulator.c > @@ -716,12 +716,12 @@ static __attribute__((target("sse2"))) void test_sse_exceptions(void *cross_mem) > > // test unaligned access for movups, movupd and movaps > v.u[0] = 1; v.u[1] = 2; v.u[2] = 3; v.u[3] = 4; > - mem->u[0] = 5; mem->u[1] = 6; mem->u[2] = 7; mem->u[3] = 8; > + memset((uint32_t *)mem, 0xdecafbad, sizeof(mem)); memset() takes a void *, which it casts to an char, i.e. it works on one byte at a time. Casting to a uint32_t won't make it write the full "0xdecafbad", it will just repease 0xad over and over. The size needs to be sizeof(*mem), i.e. the size of the object that mem points to, not the size of the pointer's storage. > asm("movups %1, %0" : "=m"(*mem) : "x"(v.sse)); > report(sseeq(&v, mem), "movups unaligned"); > > v.u[0] = 1; v.u[1] = 2; v.u[2] = 3; v.u[3] = 4; > - mem->u[0] = 5; mem->u[1] = 6; mem->u[2] = 7; mem->u[3] = 8; > + memset((uint32_t *)mem, 0xdecafbad, sizeof(mem)); > asm("movupd %1, %0" : "=m"(*mem) : "x"(v.sse)); > report(sseeq(&v, mem), "movupd unaligned"); > exceptions = 0; > @@ -734,7 +734,7 @@ static __attribute__((target("sse2"))) void test_sse_exceptions(void *cross_mem) > // setup memory for cross page access > mem = (sse_union *)(&bytes[4096-8]); > v.u[0] = 1; v.u[1] = 2; v.u[2] = 3; v.u[3] = 4; > - mem->u[0] = 5; mem->u[1] = 6; mem->u[2] = 7; mem->u[3] = 8; > + memset((uint32_t *)mem, 0xdecafbad, sizeof(mem)); > > asm("movups %1, %0" : "=m"(*mem) : "x"(v.sse)); > report(sseeq(&v, mem), "movups unaligned crosspage"); > -- > 2.31.1.607.g51e8a6a459-goog >