From: Vitaly Kuznetsov <vkuznets@redhat.com>
To: Andy Lutomirski <luto@kernel.org>
Cc: devel@linuxdriverproject.org,
Stephen Hemminger <sthemmin@microsoft.com>,
Jork Loeser <Jork.Loeser@microsoft.com>,
Haiyang Zhang <haiyangz@microsoft.com>,
x86@kernel.org, linux-kernel@vger.kernel.org,
Steven Rostedt <rostedt@goodmis.org>,
Ingo Molnar <mingo@redhat.com>, "H. Peter Anvin" <hpa@zytor.com>,
Thomas Gleixner <tglx@linutronix.de>
Subject: Re: [PATCH v3 04/10] x86/hyper-v: fast hypercall implementation
Date: Mon, 22 May 2017 12:44:02 +0200 [thread overview]
Message-ID: <87y3tptbm5.fsf@vitty.brq.redhat.com> (raw)
In-Reply-To: <1fa6d42d-0f2d-2db6-47ad-d1ae06e13f02@kernel.org> (Andy Lutomirski's message of "Sat, 20 May 2017 20:18:15 -0700")
Andy Lutomirski <luto@kernel.org> 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@redhat.com>
>> Acked-by: K. Y. Srinivasan <kys@microsoft.com>
>> Tested-by: Simon Xiao <sixiao@microsoft.com>
>> Tested-by: Srikanth Myakam <v-srm@microsoft.com>
>> ---
>> 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);
control.code = code;
control.fast = 1;
@@ -228,8 +229,8 @@ static inline u64 hv_do_fast_hypercall8(u16 code, u64 input1)
{
u64 hv_status;
- __asm__ __volatile__("call *%3"
- : "=a" (hv_status),
+ __asm__ __volatile__("call *%4"
+ : "=a" (hv_status), "+r" (__sp),
"+c" (control.as_uint64), "+d" (input1)
: "m" (hv_hypercall_pg)
: "cc", "r8", "r9", "r10", "r11");
@@ -241,10 +242,11 @@ static inline u64 hv_do_fast_hypercall8(u16 code, u64 input1)
u32 input1_hi = (u32)(input1 >> 32);
u32 input1_lo = (u32)input1;
- __asm__ __volatile__ ("call *%6"
+ __asm__ __volatile__ ("call *%7"
: "=d"(hv_status_hi),
"=a"(hv_status_lo),
- "+c"(input1_lo)
+ "+c"(input1_lo),
+ "+r"(__sp)
: "d" (control.as_uint32_hi),
"a" (control.as_uint32_lo),
"b" (input1_hi),
(stollen from 0e8e2238)? hv_do_hypercall() will need this adjustment
too, I think.
--
Vitaly
next prev parent reply other threads:[~2017-05-22 10:44 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-05-19 14:09 [PATCH v3 00/10] Hyper-V: praravirtualized remote TLB flushing and hypercall improvements Vitaly Kuznetsov
2017-05-19 14:09 ` [PATCH v3 01/10] x86/hyper-v: include hyperv/ only when CONFIG_HYPERV is set Vitaly Kuznetsov
2017-05-19 14:09 ` [PATCH v3 02/10] x86/hyper-v: stash the max number of virtual/logical processor Vitaly Kuznetsov
2017-05-19 14:09 ` [PATCH v3 03/10] x86/hyper-v: make hv_do_hypercall() inline Vitaly Kuznetsov
2017-05-19 14:09 ` [PATCH v3 04/10] x86/hyper-v: fast hypercall implementation Vitaly Kuznetsov
2017-05-21 3:18 ` Andy Lutomirski
2017-05-22 10:44 ` Vitaly Kuznetsov [this message]
2017-05-22 22:04 ` Andy Lutomirski
2017-05-19 14:09 ` [PATCH v3 05/10] hyper-v: use fast hypercall for HVCALL_SIGNAL_EVENT Vitaly Kuznetsov
2017-05-19 14:09 ` [PATCH v3 06/10] x86/hyper-v: implement rep hypercalls Vitaly Kuznetsov
2017-05-19 14:09 ` [PATCH v3 07/10] hyper-v: globalize vp_index Vitaly Kuznetsov
2017-05-19 14:09 ` [PATCH v3 08/10] x86/hyper-v: use hypercall for remote TLB flush Vitaly Kuznetsov
2017-05-21 3:23 ` Andy Lutomirski
[not found] ` <87zie5tbmm.fsf@vitty.brq.redhat.com>
2017-05-22 14:39 ` KY Srinivasan
2017-05-22 18:28 ` Andy Lutomirski
2017-05-23 12:36 ` Vitaly Kuznetsov
2017-05-23 17:50 ` KY Srinivasan
2017-06-27 1:36 ` Andy Lutomirski
2017-07-13 12:46 ` Vitaly Kuznetsov
2017-07-14 22:26 ` Andy Lutomirski
2017-05-19 14:09 ` [PATCH v3 09/10] x86/hyper-v: support extended CPU ranges for TLB flush hypercalls Vitaly Kuznetsov
2017-05-19 14:09 ` [PATCH v3 10/10] tracing/hyper-v: trace hyperv_mmu_flush_tlb_others() Vitaly Kuznetsov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87y3tptbm5.fsf@vitty.brq.redhat.com \
--to=vkuznets@redhat.com \
--cc=Jork.Loeser@microsoft.com \
--cc=devel@linuxdriverproject.org \
--cc=haiyangz@microsoft.com \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=luto@kernel.org \
--cc=mingo@redhat.com \
--cc=rostedt@goodmis.org \
--cc=sthemmin@microsoft.com \
--cc=tglx@linutronix.de \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.