|
Li Zhang |
28d1c0 |
From 23d9e85b195f99a1a3c913c8829350e3943f2e3f Mon Sep 17 00:00:00 2001
|
|
Li Zhang |
28d1c0 |
From: Oliver Upton <oupton@google.com>
|
|
Li Zhang |
28d1c0 |
Date: Fri, 24 Sep 2021 00:51:47 +0000
|
|
Li Zhang |
28d1c0 |
Subject: [PATCH 1/1] selftests: KVM: Explicitly use movq to read xmm registers
|
|
Li Zhang |
28d1c0 |
Git-commit: 386ca9d7fd189b641bc5a82871e38dea9f67af85
|
|
Li Zhang |
28d1c0 |
Patch-mainline: 5.15-rc4
|
|
Li Zhang |
28d1c0 |
References: git-fixes
|
|
Li Zhang |
28d1c0 |
|
|
Li Zhang |
28d1c0 |
Compiling the KVM selftests with clang emits the following warning:
|
|
Li Zhang |
28d1c0 |
|
|
Li Zhang |
28d1c0 |
>> include/x86_64/processor.h:297:25: error: variable 'xmm0' is uninitialized when used here [-Werror,-Wuninitialized]
|
|
Li Zhang |
28d1c0 |
>> return (unsigned long)xmm0;
|
|
Li Zhang |
28d1c0 |
|
|
Li Zhang |
28d1c0 |
where xmm0 is accessed via an uninitialized register variable.
|
|
Li Zhang |
28d1c0 |
|
|
Li Zhang |
28d1c0 |
Indeed, this is a misuse of register variables, which really should only
|
|
Li Zhang |
28d1c0 |
be used for specifying register constraints on variables passed to
|
|
Li Zhang |
28d1c0 |
inline assembly. Rather than attempting to read xmm registers via
|
|
Li Zhang |
28d1c0 |
register variables, just explicitly perform the movq from the desired
|
|
Li Zhang |
28d1c0 |
xmm register.
|
|
Li Zhang |
28d1c0 |
|
|
Li Zhang |
28d1c0 |
Fixes: 783e9e51266e ("kvm: selftests: add API testing infrastructure")
|
|
Li Zhang |
28d1c0 |
Signed-off-by: Oliver Upton <oupton@google.com>
|
|
Li Zhang |
28d1c0 |
Message-Id: <20210924005147.1122357-1-oupton@google.com>
|
|
Li Zhang |
28d1c0 |
Reviewed-by: Ricardo Koller <ricarkol@google.com>
|
|
Li Zhang |
28d1c0 |
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
|
Li Zhang |
28d1c0 |
Signed-off-by: Li Zhang <lizhang@suse.de>
|
|
Li Zhang |
28d1c0 |
---
|
|
Li Zhang |
28d1c0 |
.../selftests/kvm/include/x86_64/processor.h | 34 +++++++++----------
|
|
Li Zhang |
28d1c0 |
1 file changed, 17 insertions(+), 17 deletions(-)
|
|
Li Zhang |
28d1c0 |
|
|
Li Zhang |
28d1c0 |
diff --git a/tools/testing/selftests/kvm/include/x86_64/processor.h b/tools/testing/selftests/kvm/include/x86_64/processor.h
|
|
Li Zhang |
28d1c0 |
index 242ae8e09a65..eba8bd08293e 100644
|
|
Li Zhang |
28d1c0 |
--- a/tools/testing/selftests/kvm/include/x86_64/processor.h
|
|
Li Zhang |
28d1c0 |
+++ b/tools/testing/selftests/kvm/include/x86_64/processor.h
|
|
Li Zhang |
28d1c0 |
@@ -312,37 +312,37 @@ static inline void set_xmm(int n, unsigned long val)
|
|
Li Zhang |
28d1c0 |
}
|
|
Li Zhang |
28d1c0 |
}
|
|
Li Zhang |
28d1c0 |
|
|
Li Zhang |
28d1c0 |
-typedef unsigned long v1di __attribute__ ((vector_size (8)));
|
|
Li Zhang |
28d1c0 |
+#define GET_XMM(__xmm) \
|
|
Li Zhang |
28d1c0 |
+({ \
|
|
Li Zhang |
28d1c0 |
+ unsigned long __val; \
|
|
Li Zhang |
28d1c0 |
+ asm volatile("movq %%"#__xmm", %0" : "=r"(__val) : : #__xmm); \
|
|
Li Zhang |
28d1c0 |
+ __val; \
|
|
Li Zhang |
28d1c0 |
+})
|
|
Li Zhang |
28d1c0 |
+
|
|
Li Zhang |
28d1c0 |
static inline unsigned long get_xmm(int n)
|
|
Li Zhang |
28d1c0 |
{
|
|
Li Zhang |
28d1c0 |
assert(n >= 0 && n <= 7);
|
|
Li Zhang |
28d1c0 |
|
|
Li Zhang |
28d1c0 |
- register v1di xmm0 __asm__("%xmm0");
|
|
Li Zhang |
28d1c0 |
- register v1di xmm1 __asm__("%xmm1");
|
|
Li Zhang |
28d1c0 |
- register v1di xmm2 __asm__("%xmm2");
|
|
Li Zhang |
28d1c0 |
- register v1di xmm3 __asm__("%xmm3");
|
|
Li Zhang |
28d1c0 |
- register v1di xmm4 __asm__("%xmm4");
|
|
Li Zhang |
28d1c0 |
- register v1di xmm5 __asm__("%xmm5");
|
|
Li Zhang |
28d1c0 |
- register v1di xmm6 __asm__("%xmm6");
|
|
Li Zhang |
28d1c0 |
- register v1di xmm7 __asm__("%xmm7");
|
|
Li Zhang |
28d1c0 |
switch (n) {
|
|
Li Zhang |
28d1c0 |
case 0:
|
|
Li Zhang |
28d1c0 |
- return (unsigned long)xmm0;
|
|
Li Zhang |
28d1c0 |
+ return GET_XMM(xmm0);
|
|
Li Zhang |
28d1c0 |
case 1:
|
|
Li Zhang |
28d1c0 |
- return (unsigned long)xmm1;
|
|
Li Zhang |
28d1c0 |
+ return GET_XMM(xmm1);
|
|
Li Zhang |
28d1c0 |
case 2:
|
|
Li Zhang |
28d1c0 |
- return (unsigned long)xmm2;
|
|
Li Zhang |
28d1c0 |
+ return GET_XMM(xmm2);
|
|
Li Zhang |
28d1c0 |
case 3:
|
|
Li Zhang |
28d1c0 |
- return (unsigned long)xmm3;
|
|
Li Zhang |
28d1c0 |
+ return GET_XMM(xmm3);
|
|
Li Zhang |
28d1c0 |
case 4:
|
|
Li Zhang |
28d1c0 |
- return (unsigned long)xmm4;
|
|
Li Zhang |
28d1c0 |
+ return GET_XMM(xmm4);
|
|
Li Zhang |
28d1c0 |
case 5:
|
|
Li Zhang |
28d1c0 |
- return (unsigned long)xmm5;
|
|
Li Zhang |
28d1c0 |
+ return GET_XMM(xmm5);
|
|
Li Zhang |
28d1c0 |
case 6:
|
|
Li Zhang |
28d1c0 |
- return (unsigned long)xmm6;
|
|
Li Zhang |
28d1c0 |
+ return GET_XMM(xmm6);
|
|
Li Zhang |
28d1c0 |
case 7:
|
|
Li Zhang |
28d1c0 |
- return (unsigned long)xmm7;
|
|
Li Zhang |
28d1c0 |
+ return GET_XMM(xmm7);
|
|
Li Zhang |
28d1c0 |
}
|
|
Li Zhang |
28d1c0 |
+
|
|
Li Zhang |
28d1c0 |
+ /* never reached */
|
|
Li Zhang |
28d1c0 |
return 0;
|
|
Li Zhang |
28d1c0 |
}
|
|
Li Zhang |
28d1c0 |
|
|
Li Zhang |
28d1c0 |
--
|
|
Li Zhang |
28d1c0 |
2.31.1
|
|
Li Zhang |
28d1c0 |
|