Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

selftests: KVM: Explicitly use movq to read xmm registers

Compiling the KVM selftests with clang emits the following warning:

>> include/x86_64/processor.h:297:25: error: variable 'xmm0' is uninitialized when used here [-Werror,-Wuninitialized]
>> return (unsigned long)xmm0;

where xmm0 is accessed via an uninitialized register variable.

Indeed, this is a misuse of register variables, which really should only
be used for specifying register constraints on variables passed to
inline assembly. Rather than attempting to read xmm registers via
register variables, just explicitly perform the movq from the desired
xmm register.

Fixes: 783e9e51266e ("kvm: selftests: add API testing infrastructure")
Signed-off-by: Oliver Upton <oupton@google.com>
Message-Id: <20210924005147.1122357-1-oupton@google.com>
Reviewed-by: Ricardo Koller <ricarkol@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

authored by

Oliver Upton and committed by
Paolo Bonzini
386ca9d7 fbf094ce

+17 -17
+17 -17
tools/testing/selftests/kvm/include/x86_64/processor.h
··· 312 312 } 313 313 } 314 314 315 - typedef unsigned long v1di __attribute__ ((vector_size (8))); 315 + #define GET_XMM(__xmm) \ 316 + ({ \ 317 + unsigned long __val; \ 318 + asm volatile("movq %%"#__xmm", %0" : "=r"(__val) : : #__xmm); \ 319 + __val; \ 320 + }) 321 + 316 322 static inline unsigned long get_xmm(int n) 317 323 { 318 324 assert(n >= 0 && n <= 7); 319 325 320 - register v1di xmm0 __asm__("%xmm0"); 321 - register v1di xmm1 __asm__("%xmm1"); 322 - register v1di xmm2 __asm__("%xmm2"); 323 - register v1di xmm3 __asm__("%xmm3"); 324 - register v1di xmm4 __asm__("%xmm4"); 325 - register v1di xmm5 __asm__("%xmm5"); 326 - register v1di xmm6 __asm__("%xmm6"); 327 - register v1di xmm7 __asm__("%xmm7"); 328 326 switch (n) { 329 327 case 0: 330 - return (unsigned long)xmm0; 328 + return GET_XMM(xmm0); 331 329 case 1: 332 - return (unsigned long)xmm1; 330 + return GET_XMM(xmm1); 333 331 case 2: 334 - return (unsigned long)xmm2; 332 + return GET_XMM(xmm2); 335 333 case 3: 336 - return (unsigned long)xmm3; 334 + return GET_XMM(xmm3); 337 335 case 4: 338 - return (unsigned long)xmm4; 336 + return GET_XMM(xmm4); 339 337 case 5: 340 - return (unsigned long)xmm5; 338 + return GET_XMM(xmm5); 341 339 case 6: 342 - return (unsigned long)xmm6; 340 + return GET_XMM(xmm6); 343 341 case 7: 344 - return (unsigned long)xmm7; 342 + return GET_XMM(xmm7); 345 343 } 344 + 345 + /* never reached */ 346 346 return 0; 347 347 } 348 348