> +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. 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. 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. ~Andrew _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel