[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 2/5] x86/hyperv: provide Hyper-V hypercall functions
On Sun, Jan 05, 2020 at 07:08:28PM +0000, Andrew Cooper wrote: > > > +static inline uint64_t hv_do_hypercall(uint64_t control, paddr_t input, > > paddr_t output) > > +{ > > + uint64_t status; > > + > > + asm volatile ("mov %[output], %%r8\n" > > + "call hv_hypercall_page" > > + : "=a" (status), "+c" (control), > > + "+d" (input) ASM_CALL_CONSTRAINT > > + : [output] "rm" (output) > > + : "cc", "memory", "r8", "r9", "r10", "r11"); > > I think you want: > > register unsigned long r8 asm("r8") = output; > > and "+r" (r8) as an output constraint. Although it is named `output`, it is really just an input parameter from Hyper-V's PoV. It contains the address of the page Hyper-V should write its output to. > > In particular, that doesn't force the compiler to put output into a > register other than r8 (or worse, spill it to the stack) to have the > opaque blob of asm move it back into r8. What it will do in practice is > cause the compiler to construct output directly in r8. > > As for the other clobbers, I can't find anything at all in the spec > which even mentions those registers. There will be a decent improvement > to code generation if we don't force them to be spilled around a hypercall. > Neither can I. But Linux's commit says that's needed, so I chose to err on the safe side. I'm fine with dropping r9-r11. > However, HyperV will(may?) modify %xmm{0..5} in some cases, and this > will corrupt the current vcpu's FPU context. Care will need to be taken > to spill these if necessary. > The hypercalls we care about (TLB, APIC etc) don't use that ABI as far as I can tell. At the very least Linux, which uses the same set of hypercalls, doesn't need to save / restore XMM registers around the calls. Wei. > ~Andrew _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |