Message ID | 20210506004847.210466-1-jacobhxu@google.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | x86: Do not assign values to unaligned pointer to 128 bits | expand |
Please use [kvm-unit-tests PATCH ...] for the subject, it took me a depressingly long time to figure out which code base this applied to (though admittedly there was a non-zero amount of PEBKAC going on). On Wed, May 05, 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 > uint8_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@google.com> > --- > x86/emulator.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/x86/emulator.c b/x86/emulator.c > index 9705073..672bfda 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((uint8_t *)mem, 0, 128); Shouldn't this be '16', as in 16 bytes / 128 bits? And would it makes sense to use a pattern other than '0', if only for giggles? > 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((uint8_t *)mem, 0, 128); > 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((uint8_t *)mem, 0, 128); > > asm("movups %1, %0" : "=m"(*mem) : "x"(v.sse)); > report(sseeq(&v, mem), "movups unaligned crosspage"); > -- > 2.31.1.527.g47e6f16901-goog >
On Thu, May 6, 2021 at 9:01 AM Sean Christopherson <seanjc@google.com> wrote: > > Please use [kvm-unit-tests PATCH ...] for the subject, it took me a depressingly > long time to figure out which code base this applied to (though admittedly there > was a non-zero amount of PEBKAC going on). > > On Wed, May 05, 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 > > uint8_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@google.com> > > --- > > x86/emulator.c | 6 +++--- > > 1 file changed, 3 insertions(+), 3 deletions(-) > > > > diff --git a/x86/emulator.c b/x86/emulator.c > > index 9705073..672bfda 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((uint8_t *)mem, 0, 128); > > Shouldn't this be '16', as in 16 bytes / 128 bits? And would it makes sense to > use a pattern other than '0', if only for giggles? Or possibly sizeof(*mem)?
> Please use [kvm-unit-tests PATCH ...] for the subject Oops, I'll resend v2 with the correct prefix. > Shouldn't this be '16', as in 16 bytes / 128 bits? > Or possibly sizeof(*mem)? Replaced with sizeof below. > use a pattern other than '0', if only for giggles? replaced uint8_t with uint32_t for more giggles and selected 0xdecafbad from the wikipedia page for Hexspeak. > And would it makes sense to use a pattern other than '0', if only for giggles? > Or possibly sizeof(*mem)?
diff --git a/x86/emulator.c b/x86/emulator.c index 9705073..672bfda 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((uint8_t *)mem, 0, 128); 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((uint8_t *)mem, 0, 128); 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((uint8_t *)mem, 0, 128); asm("movups %1, %0" : "=m"(*mem) : "x"(v.sse)); report(sseeq(&v, mem), "movups unaligned crosspage");
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 uint8_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@google.com> --- x86/emulator.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)