[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v5 08/12] x86/hyperv: provide Hyper-V hypercall functions
> -----Original Message----- > From: Xen-devel <xen-devel-bounces@xxxxxxxxxxxxxxxxxxxx> On Behalf Of Wei > Liu > Sent: 29 January 2020 20:21 > To: Xen Development List <xen-devel@xxxxxxxxxxxxxxxxxxxx> > Cc: Stefano Stabellini <sstabellini@xxxxxxxxxx>; Wei Liu > <liuwe@xxxxxxxxxxxxx>; Wei Liu <wl@xxxxxxx>; Konrad Rzeszutek Wilk > <konrad.wilk@xxxxxxxxxx>; George Dunlap <George.Dunlap@xxxxxxxxxxxxx>; > Andrew Cooper <andrew.cooper3@xxxxxxxxxx>; Durrant, Paul > <pdurrant@xxxxxxxxxxxx>; Ian Jackson <ian.jackson@xxxxxxxxxxxxx>; Michael > Kelley <mikelley@xxxxxxxxxxxxx>; Julien Grall <julien@xxxxxxx>; Roger Pau > Monné <roger.pau@xxxxxxxxxx> > Subject: [Xen-devel] [PATCH v5 08/12] x86/hyperv: provide Hyper-V > hypercall functions > > These functions will be used later to make hypercalls to Hyper-V. > > Signed-off-by: Wei Liu <liuwe@xxxxxxxxxxxxx> Reviewed-by: Paul Durrant <pdurrant@xxxxxxxxxx> > --- > v5: > 1. Switch back to direct call > 2. Fix some issues pointed out by Jan > > I tried using the asm(".equ ..") trick but hit a problem with %c again. > > mm.c:5736:5: error: invalid 'asm': operand is not a condition code, > invalid operand code 'c' > asm ( ".equ HV_HCALL_PAGE, %c0; .global HV_HCALL_PAGE" > --- > MAINTAINERS | 1 + > xen/arch/x86/guest/hyperv/hyperv.c | 6 ++ > xen/arch/x86/xen.lds.S | 4 + > xen/include/asm-x86/fixmap.h | 3 +- > xen/include/asm-x86/guest/hyperv-hcall.h | 96 ++++++++++++++++++++++++ > 5 files changed, 108 insertions(+), 2 deletions(-) > create mode 100644 xen/include/asm-x86/guest/hyperv-hcall.h > > diff --git a/MAINTAINERS b/MAINTAINERS > index 04d91482cd..d0a5ed635b 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -519,6 +519,7 @@ S: Supported > F: xen/arch/x86/guest/hyperv/ > F: xen/arch/x86/hvm/viridian/ > F: xen/include/asm-x86/guest/hyperv.h > +F: xen/include/asm-x86/guest/hyperv-hcall.h > F: xen/include/asm-x86/guest/hyperv-tlfs.h > F: xen/include/asm-x86/hvm/viridian.h > > diff --git a/xen/arch/x86/guest/hyperv/hyperv.c > b/xen/arch/x86/guest/hyperv/hyperv.c > index 2bedcc438c..932a648ff7 100644 > --- a/xen/arch/x86/guest/hyperv/hyperv.c > +++ b/xen/arch/x86/guest/hyperv/hyperv.c > @@ -123,6 +123,12 @@ static const struct hypervisor_ops ops = { > .setup = setup, > }; > > +static void __maybe_unused build_assertions(void) > +{ > + /* We use 1 in linker script */ > + BUILD_BUG_ON(FIX_X_HYPERV_HCALL != 1); > +} > + > /* > * Local variables: > * mode: C > diff --git a/xen/arch/x86/xen.lds.S b/xen/arch/x86/xen.lds.S > index 97f9c07891..8e02b4c648 100644 > --- a/xen/arch/x86/xen.lds.S > +++ b/xen/arch/x86/xen.lds.S > @@ -329,6 +329,10 @@ SECTIONS > efi = .; > #endif > > +#ifdef CONFIG_HYPERV_GUEST > + hv_hcall_page = ABSOLUTE(__fix_x_to_virt(1)); > +#endif > + > /* Sections to be discarded */ > /DISCARD/ : { > *(.exit.text) > diff --git a/xen/include/asm-x86/fixmap.h b/xen/include/asm-x86/fixmap.h > index 8094546b75..a9bcb068cb 100644 > --- a/xen/include/asm-x86/fixmap.h > +++ b/xen/include/asm-x86/fixmap.h > @@ -16,6 +16,7 @@ > > #define FIXADDR_TOP (VMAP_VIRT_END - PAGE_SIZE) > #define FIXADDR_X_TOP (XEN_VIRT_END - PAGE_SIZE) > +#define __fix_x_to_virt(x) (FIXADDR_X_TOP - ((x) << PAGE_SHIFT)) > > #ifndef __ASSEMBLY__ > > @@ -110,8 +111,6 @@ extern void __set_fixmap_x( > > #define clear_fixmap_x(idx) __set_fixmap_x(idx, 0, 0) > > -#define __fix_x_to_virt(x) (FIXADDR_X_TOP - ((x) << PAGE_SHIFT)) > - > #define fix_x_to_virt(x) ((void *)__fix_x_to_virt(x)) > > #endif /* __ASSEMBLY__ */ > diff --git a/xen/include/asm-x86/guest/hyperv-hcall.h b/xen/include/asm- > x86/guest/hyperv-hcall.h > new file mode 100644 > index 0000000000..5b7509b3b5 > --- /dev/null > +++ b/xen/include/asm-x86/guest/hyperv-hcall.h > @@ -0,0 +1,96 @@ > +/************************************************************************ > ****** > + * asm-x86/guest/hyperv-hcall.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_HCALL_H__ > +#define __X86_HYPERV_HCALL_H__ > + > +#include <xen/lib.h> > +#include <xen/types.h> > + > +#include <asm/asm_defns.h> > +#include <asm/fixmap.h> > +#include <asm/guest/hyperv-tlfs.h> > +#include <asm/page.h> > + > +static inline uint64_t hv_do_hypercall(uint64_t control, paddr_t > input_addr, > + paddr_t output_addr) > +{ > + uint64_t status; > + register unsigned long r8 asm("r8") = output_addr; > + > + asm volatile ( "call hv_hcall_page" > + : "=a" (status), "+c" (control), > + "+d" (input_addr) ASM_CALL_CONSTRAINT > + : "r" (r8) > + : "memory" ); > + > + return status; > +} > + > +static inline uint64_t hv_do_fast_hypercall(uint16_t code, > + uint64_t input1, uint64_t > input2) > +{ > + uint64_t status; > + uint64_t control = code | HV_HYPERCALL_FAST_BIT; > + register unsigned long r8 asm("r8") = input2; > + > + asm volatile ( "call hv_hcall_page" > + : "=a" (status), "+c" (control), > + "+d" (input1) ASM_CALL_CONSTRAINT > + : "r" (r8) > + : ); > + > + return status; > +} > + > +static inline uint64_t hv_do_rep_hypercall(uint16_t code, uint16_t > rep_count, > + uint16_t varhead_size, > + paddr_t input, paddr_t output) > +{ > + uint64_t control = code; > + uint64_t status; > + uint16_t rep_comp; > + > + control |= (uint64_t)varhead_size << HV_HYPERCALL_VARHEAD_OFFSET; > + control |= (uint64_t)rep_count << HV_HYPERCALL_REP_COMP_OFFSET; > + > + do { > + status = hv_do_hypercall(control, input, output); > + if ( (status & HV_HYPERCALL_RESULT_MASK) != HV_STATUS_SUCCESS ) > + break; > + > + rep_comp = MASK_EXTR(status, HV_HYPERCALL_REP_COMP_MASK); > + > + control &= ~HV_HYPERCALL_REP_START_MASK; > + control |= MASK_INSR(rep_comp, HV_HYPERCALL_REP_START_MASK); > + } while ( rep_comp < rep_count ); > + > + return status; > +} > + > +#endif /* __X86_HYPERV_HCALL_H__ */ > + > +/* > + * Local variables: > + * mode: C > + * c-file-style: "BSD" > + * c-basic-offset: 4 > + * tab-width: 4 > + * indent-tabs-mode: nil > + * End: > + */ > -- > 2.20.1 > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@xxxxxxxxxxxxxxxxxxxx > https://lists.xenproject.org/mailman/listinfo/xen-devel _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |