aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Borntraeger <borntraeger@de.ibm.com>2019-10-10 09:37:29 +0200
committerChristian Borntraeger <borntraeger@de.ibm.com>2019-10-10 13:18:35 +0200
commitefec8d219fb1bc2d7ab4f1c582e7beed44e309f4 (patch)
treedb765bd5f3a4371ef8262b26c682319ed2c22828
parentKVM: s390: Cleanup kvm_arch_init error path (diff)
downloadlinux-dev-efec8d219fb1bc2d7ab4f1c582e7beed44e309f4.tar.xz
linux-dev-efec8d219fb1bc2d7ab4f1c582e7beed44e309f4.zip
selftests: kvm: make syncregs more reliable on s390
similar to commit 2c57da356800 ("selftests: kvm: fix sync_regs_test with newer gccs") and commit 204c91eff798a ("KVM: selftests: do not blindly clobber registers in guest asm") we better do not rely on gcc leaving r11 untouched. We can write the simple ucall inline and have the guest code completely as small assembler function. Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com> Suggested-by: Paolo Bonzini <pbonzini@redhat.com> Reviewed-by: Thomas Huth <thuth@redhat.com>
-rw-r--r--tools/testing/selftests/kvm/s390x/sync_regs_test.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/tools/testing/selftests/kvm/s390x/sync_regs_test.c b/tools/testing/selftests/kvm/s390x/sync_regs_test.c
index d5290b4ad636..b705637ca14b 100644
--- a/tools/testing/selftests/kvm/s390x/sync_regs_test.c
+++ b/tools/testing/selftests/kvm/s390x/sync_regs_test.c
@@ -25,12 +25,15 @@
static void guest_code(void)
{
- register u64 stage asm("11") = 0;
-
- for (;;) {
- GUEST_SYNC(0);
- asm volatile ("ahi %0,1" : : "r"(stage));
- }
+ /*
+ * We embed diag 501 here instead of doing a ucall to avoid that
+ * the compiler has messed with r11 at the time of the ucall.
+ */
+ asm volatile (
+ "0: diag 0,0,0x501\n"
+ " ahi 11,1\n"
+ " j 0b\n"
+ );
}
#define REG_COMPARE(reg) \