[PATCH 2/7] x86/hyper-v: fast hypercall implementation

Vitaly Kuznetsov vkuznets at redhat.com
Mon Apr 10 09:07:34 UTC 2017


Jork Loeser <Jork.Loeser at microsoft.com> writes:

>> -----Original Message-----
>> From: Vitaly Kuznetsov [mailto:vkuznets at redhat.com]
>> Sent: Friday, April 7, 2017 04:27
>> To: devel at linuxdriverproject.org; x86 at kernel.org
>> Cc: linux-kernel at vger.kernel.org; KY Srinivasan <kys at microsoft.com>;
>> Haiyang Zhang <haiyangz at microsoft.com>; Stephen Hemminger
>> <sthemmin at microsoft.com>; Thomas Gleixner <tglx at linutronix.de>; Ingo
>> Molnar <mingo at redhat.com>; H. Peter Anvin <hpa at zytor.com>; Steven
>> Rostedt <rostedt at goodmis.org>; Jork Loeser <Jork.Loeser at microsoft.com>
>> Subject: [PATCH 2/7] x86/hyper-v: fast hypercall implementation
>
>> diff --git a/arch/x86/include/asm/mshyperv.h
>> b/arch/x86/include/asm/mshyperv.h index 331e834..9a5f58b 100644
>> --- a/arch/x86/include/asm/mshyperv.h
>> +++ b/arch/x86/include/asm/mshyperv.h
>> @@ -216,6 +216,43 @@ static inline u64 hv_do_hypercall(u64 control, void
>> *input, void *output)  #endif /* !x86_64 */  }
>> 
>> +/* Fast hypercall with 8 bytes of input and no output */ static inline
>> +u64 hv_do_fast_hypercall8(u16 code, u64 input1) {
>> +	union hv_hypercall_input control = {0};
>> +
>> +	control.code = code;
>> +	control.fast = 1;
>> +#ifdef CONFIG_X86_64
>> +	{
>> +		u64 hv_status;
>> +
>> +		__asm__ __volatile__("call *%3"
>> +				     : "=a" (hv_status)
>> +				     : "c" (control.as_uint64), "d" (input1),
>> +				       "m" (hv_hypercall_pg)
>> +				     : "cc", "r8", "%r9", "%r10", "%r11");
>> +		return hv_status;
> Clobber memory (are there such fast hypercalls)?
>

Hm, I was under an impression fast hypercalls have no output or put the
output in XMM* registers and we don't use them for now. Why clobbering
memory?

>> +	}
>> +#else
>> +	{
>> +		u32 hv_status_hi, hv_status_lo;
>> +
>> +		__asm__ __volatile__ ("call *%6"
>> +				      : "=d"(hv_status_hi),
>> +					"=a"(hv_status_lo) :
>> +					"d" (control.as_uint32_hi),
>> +					"a" (control.as_uint32_lo),
>> +					"c" ((u32)input1),
>> +					"b" ((u32)(input1 >> 32)),
>> +					"m" (hv_hypercall_pg)
>> +				      : "cc");
>> +
>> +		return hv_status_lo | ((u64)hv_status_hi << 32);
>> +	}
>> +#endif
> Please clobber ECX, EDI and ESI for x86. Clobber memory as well?

ECX is already in listed in inputs (lower part of input1) so it's
automatically clobbered. I'll add EDI and ESI to clobbers here, thanks!

-- 
  Vitaly


More information about the devel mailing list