|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH for-4.7 3/4] x86/hvm: Correct the emulated interaction of invlpg with segments
>>> On 09.05.16 at 15:15, <andrew.cooper3@xxxxxxxxxx> wrote:
> The `invlpg` instruction is documented to take a memory address, and is not
> documented to suffer faults from segmentation violations.
>
> Experimentally, and subsequently confirmed by both Intel and AMD, the
> instruction does take into account segment bases, but will happily invalidate
> a TLB entry for a mapping beyond the segment limit.
How about non-canonical addresses? If those don't #GP (which is
what I assume), is such an INVLPG a NOP, or does it invalidate
something (e.g. the translation for the address truncated to 48
bits)? In that latter case we might need to also make our code
behave that way...
> The emulation logic will currently raise #GP/#SS faults for segment limit
> violations, or non-canonical addresses, which doesn't match hardware's
> behaviour. Instead, squash exceptions generated by
> hvmemul_virtual_to_linear() and proceed with invalidation.
>
> Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
albeit I think ...
> --- a/xen/arch/x86/hvm/emulate.c
> +++ b/xen/arch/x86/hvm/emulate.c
> @@ -1608,7 +1608,22 @@ static int hvmemul_invlpg(
> rc = hvmemul_virtual_to_linear(
> seg, offset, 1, &reps, hvm_access_none, hvmemul_ctxt, &addr);
>
> - if ( rc == X86EMUL_OKAY )
> + if ( rc == X86EMUL_EXCEPTION )
> + {
> + /*
> + * `invlpg` takes segment bases into account, but is not subject to
> + * faults from segment type/limit checks, and is specified as a NOP
> + * when issued on non-canonical addresses.
> + *
> + * hvmemul_virtual_to_linear() raises exceptions for type/limit
> + * violations, so squash them.
> + */
> + hvmemul_ctxt->exn_pending = 0;
> + hvmemul_ctxt->trap = (struct hvm_trap){};
... this does more work than is really needed.
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |