On Mon, May 22, 2017 at 3:44 AM, Vitaly Kuznetsov <vkuznets@xxxxxxxxxx> wrote: > Andy Lutomirski <luto@xxxxxxxxxx> writes: > >> On 05/19/2017 07:09 AM, Vitaly Kuznetsov wrote: >>> Hyper-V supports 'fast' hypercalls when all parameters are passed through >>> registers. Implement an inline version of a simpliest of these calls: >>> hypercall with one 8-byte input and no output. >>> >>> Proper hypercall input interface (struct hv_hypercall_input) definition is >>> added as well. >>> >>> Signed-off-by: Vitaly Kuznetsov <vkuznets@xxxxxxxxxx> >>> Acked-by: K. Y. Srinivasan <kys@xxxxxxxxxxxxx> >>> Tested-by: Simon Xiao <sixiao@xxxxxxxxxxxxx> >>> Tested-by: Srikanth Myakam <v-srm@xxxxxxxxxxxxx> >>> --- >>> arch/x86/include/asm/mshyperv.h | 39 ++++++++++++++++++++++++++++++++++++++ >>> arch/x86/include/uapi/asm/hyperv.h | 19 +++++++++++++++++++ >>> 2 files changed, 58 insertions(+) >>> >>> diff --git a/arch/x86/include/asm/mshyperv.h b/arch/x86/include/asm/mshyperv.h >>> index e293937..028e29b 100644 >>> --- a/arch/x86/include/asm/mshyperv.h >>> +++ b/arch/x86/include/asm/mshyperv.h >>> @@ -216,6 +216,45 @@ 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; >>> + } >>> +#else >>> + { >>> + u32 hv_status_hi, hv_status_lo; >>> + u32 input1_hi = (u32)(input1 >> 32); >>> + u32 input1_lo = (u32)input1; >>> + >>> + __asm__ __volatile__ ("call *%6" >>> + : "=d"(hv_status_hi), >>> + "=a"(hv_status_lo), >>> + "+c"(input1_lo) >>> + : "d" (control.as_uint32_hi), >>> + "a" (control.as_uint32_lo), >>> + "b" (input1_hi), >>> + "m" (hv_hypercall_pg) >>> + : "cc", "edi", "esi"); >>> + >>> + return hv_status_lo | ((u64)hv_status_hi << 32); >>> + } >>> +#endif >> >> This is going to need an explicit "sp" annotation to force a stack >> frame, I think. Otherwise objtool is likely to get mad in a >> frame-pointer-omitted build. >> > > You mean I should do something like > > diff --git a/arch/x86/include/asm/mshyperv.h b/arch/x86/include/asm/mshyperv.h > index 359967f..f86c4ae 100644 > --- a/arch/x86/include/asm/mshyperv.h > +++ b/arch/x86/include/asm/mshyperv.h > @@ -221,6 +221,7 @@ static inline u64 hv_do_hypercall(u64 control, void *input, void *output) > static inline u64 hv_do_fast_hypercall8(u16 code, u64 input1) > { > union hv_hypercall_input control = {0}; > + register void *__sp asm(_ASM_SP); Exactly. _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel