selftests: kvm: make syncregs more reliable on s390
authorChristian Borntraeger <borntraeger@de.ibm.com>
Thu, 10 Oct 2019 07:37:29 +0000 (09:37 +0200)
committerChristian Borntraeger <borntraeger@de.ibm.com>
Thu, 10 Oct 2019 11:18:35 +0000 (13:18 +0200)
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>
tools/testing/selftests/kvm/s390x/sync_regs_test.c

index d5290b4ad6360ce944c0e0f9023b68ff29784c89..b705637ca14b6da9a9cf69f0e9bb0eb79ff6e886 100644 (file)
 
 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) \