[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 5/8] x86/hyperv: provide Hyper-V hypercall functions
On Mon, Dec 30, 2019 at 01:04:33PM +0000, Andrew Cooper wrote: > On 29/12/2019 18:33, Wei Liu wrote: > > These functions will be used later to make hypercalls to Hyper-V. > > > > I couldn't find reference in TLFS that Hyper-V clobbers flags and > > r9-r11, but Linux's commit message says it does. Err on the safe side. > > > > Signed-off-by: Wei Liu <liuwe@xxxxxxxxxxxxx> > > --- > > xen/include/asm-x86/guest/hyperv-hypercall.h | 105 +++++++++++++++++++ > > 1 file changed, 105 insertions(+) > > create mode 100644 xen/include/asm-x86/guest/hyperv-hypercall.h > > > > diff --git a/xen/include/asm-x86/guest/hyperv-hypercall.h > > b/xen/include/asm-x86/guest/hyperv-hypercall.h > > new file mode 100644 > > index 0000000000..6017123be5 > > --- /dev/null > > +++ b/xen/include/asm-x86/guest/hyperv-hypercall.h > > @@ -0,0 +1,105 @@ > > +/****************************************************************************** > > + * asm-x86/guest/hyperv-hypercall.h > > + * > > + * This program is free software; you can redistribute it and/or > > + * modify it under the terms and conditions of the GNU General Public > > + * License, version 2, as published by the Free Software Foundation. > > + * > > + * This program is distributed in the hope that it will be useful, > > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > > + * General Public License for more details. > > + * > > + * You should have received a copy of the GNU General Public > > + * License along with this program; If not, see > > <http://www.gnu.org/licenses/>. > > + * > > + * Copyright (c) 2019 Microsoft. > > + */ > > + > > +#ifndef __X86_HYPERV_HYPERCALL_H__ > > +#define __X86_HYPERV_HYPERCALL_H__ > > + > > +#include <xen/types.h> > > + > > +#include <asm/asm_defns.h> > > +#include <asm/guest/hyperv-tlfs.h> > > +#include <asm/page.h> > > + > > +extern void *hv_hypercall; > > + > > +static inline uint64_t hv_do_hypercall(uint64_t control, paddr_t input, > > paddr_t output) > > +{ > > + uint64_t status; > > + > > + if ( !hv_hypercall ) > > + return ~0ULL; > > + > > + asm volatile ("mov %[output], %%r8\n" > > + "call *%[hypercall_page]" > > + : "=a" (status), "+c" (control), > > + "+d" (input) ASM_CALL_CONSTRAINT > > + : [output] "rm" (output), > > + [hypercall_page] "m" (hv_hypercall) > > + : "cc", "memory", "r8", "r9", "r10", "r11"); > > + > > + return status; > > +} > > Indirect calls are expensive these days due to retpoline/IBRS, and in > this case, unnecessary. > > You want something like: > > asm ( ".pushsection \".text.page_aligned\", \"ax\", @progbits\n\t" > ".align 4096\n\t" > ".globl hyperv_hypercall\n\t" > "hyperv_hypercall:\n\t" > "mov -1, %rax\n\t" > "ret\n\t" > ".align 4096;\n\t" ); > > Which will put one page worth of space in .text.page_aligned (so it gets > mapped executable), at a location the linker can evaluate (so you can > use a direct call, and the disassembly will be easier to follow), which > is initialised to the "not ready yet" code so you don't need a runtime > check in every hypercall that you didn't get the order of initialisation > wrong at boot. This works for me. Thanks. Wei. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |