|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v5 3/4] VMX: use proper instruction mnemonics if assembler supports them
At 16:31 +0100 on 26 Aug (1377534696), Jan Beulich wrote:
> With the hex byte emission we were taking away a good part of
> flexibility from the compiler, as for simplicity reasons these were
> built using fixed operands. All half way modern build environments
> would allow using the mnemonics (but we can't disable the hex variants
> yet, since the binutils around at the time gcc 4.1 got released didn't
> support these yet).
>
> I didn't convert __vmread() yet because that would, just like for
> __vmread_safe(), imply converting to a macro so that the output operand
> can be the caller supplied variable rather than an intermediate one. As
> that would require touching all invocation points of __vmread() (of
> which there are quite a few), I'd first like to be certain the approach
> is acceptable; the main question being whether the now conditional code
> might be considered to cause future maintenance issues, and the second
> being that of parameter/argument ordering (here I made __vmread_safe()
> match __vmwrite(), but one could also take the position that read and
> write should use the inverse order of one another, in line with the
> actual instruction operands).
>
> Additionally I was quite puzzled to find that all the asm()-s involved
> here have memory clobbers - what are they needed for? Or can they be
> dropped at least in some cases?
The vmread/write ones are, I think, red herrings. We're not allowed to
make assumptions about the memory state of a loaded VMCS anyway.
invept I think does, to make sure all EPT changes have been written.
invvpid too, for similar reasons.
vmptrld/clear I'm not sure about: if we were to (say) copy a VMCS or
move it we'd need that barrier. (AFAIK we don't do that but we might be
very surprised if we started).
> -static inline unsigned long __vmread_safe(unsigned long field, int *error)
> +static inline bool_t __vmread_safe(unsigned long field, unsigned long *value)
> {
> - unsigned long ecx;
> + bool_t okay;
>
> - asm volatile ( VMREAD_OPCODE
> - MODRM_EAX_ECX
> - /* CF==1 or ZF==1 --> rc = -1 */
> - "setna %b0 ; neg %0"
> - : "=q" (*error), "=c" (ecx)
> - : "0" (0), "a" (field)
> + asm volatile (
> +#ifdef HAVE_GAS_VMX
> + "vmread %2, %1\n\t"
> +#else
> + VMREAD_OPCODE MODRM_EAX_ECX
> +#endif
> + /* CF==1 or ZF==1 --> rc = 0 */
> + "setnbe %0"
This inversion of the (undocumented) return value could be a nasty
surprise for anyone backporting code that uses __vmread_safe(). Can you
please leave it as it was?
Cheers,
Tim.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |