[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v4 3/7] x86/hyperv: provide Hyper-V hypercall functions
On 22.01.2020 21:23, Wei Liu wrote: > --- /dev/null > +++ b/xen/include/asm-x86/guest/hyperv-hcall.h > @@ -0,0 +1,98 @@ > +/****************************************************************************** > + * 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 ("INDIRECT_CALL %P[hcall_page]" > + : "=a" (status), "+c" (control), > + "+d" (input_addr) ASM_CALL_CONSTRAINT > + : "r" (r8), > + [hcall_page] "p" (fix_x_to_virt(FIX_X_HYPERV_HCALL)) > + : "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 ("INDIRECT_CALL %P[hcall_page]" > + : "=a" (status), "+c" (control), > + "+d" (input1) ASM_CALL_CONSTRAINT > + : "r" (r8), > + [hcall_page] "p" (fix_x_to_virt(FIX_X_HYPERV_HCALL)) > + :); This comes through as a smiley in my mail viewer, because of the missing blanks immediately inside the outermost parentheses. > + > + 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; What about the upper bit(s) spilling into the next field? Perhaps better use MASK_INSR() here too? Also, this leaves the START field zero, which makes me think you mean ... > + 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_COMP_MASK); ... REP_START_MASK here. Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |