Re: [PATCH] selftests: kvm: make syncregs more reliable on s390

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 10/10/2019 11.12, Christian Borntraeger wrote:
> 
> 
> On 10.10.19 10:20, Thomas Huth wrote:
>> On 10/10/2019 09.52, Christian Borntraeger wrote:
>>> 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@xxxxxxxxxx>
>>> Suggested-by: Paolo Bonzini <pbonzini@xxxxxxxxxx>
>>> ---
>>>  .../testing/selftests/kvm/s390x/sync_regs_test.c  | 15 +++++++++------
>>>  1 file 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..04d6abe68961 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 a ucall as the called function
>>> +	 * could mess with the content of r11 when doing the hypercall
>>
>> As far as I understood the issue on x86, it's not the called function
>> that is messing with the counter register (since r11 is not volatile
>> between function calls), but the compiler shuffled it around here
>> between the GUEST_SYNC and the inline assembler code. So I'd prefer a
>> comment like in the x86 version:
> 
> It is actually both.
> The called function is GUEST_SYNC  (which is ucall). 
> r11 is call-saved, so when we return from GUEST_SYNC r11 is as it is supposed
> to be. The problem is that this function (ucall) is allowed to use r11 for anything
> as long as it restores it before returning. As we do the guest exit in ucall
> then the test code could see some random value for r11.

Oh, right!

>>  /*
>>   * We embed diag 501 here instead of doing a ucall to avoid that
>>   * the compiler reshuffles registers before calling the function.
>>   */
>>
>> ?
> 
> What about
>>  /*
>>   * 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.
>>   */

Sounds good!

 Thanks,
  Thomas




[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux