|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] x86/HVM: correct repeat count update in linear->phys translation
On 07/09/17 11:41, Jan Beulich wrote:
> For the insn emulator's fallback logic in REP MOVS/STOS/INS/OUTS
> handling to work correctly, *reps must not be set to zero when
> returning X86EMUL_UNHANDLEABLE.
>
> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
Why is this? In the case that X86EMUL_UNHANDLEABLE is returned, the
emulator appears to override nr_reps to 1.
I'm clearly missing something.
>
> --- a/xen/arch/x86/hvm/emulate.c
> +++ b/xen/arch/x86/hvm/emulate.c
> @@ -566,15 +566,16 @@ static int hvmemul_linear_to_phys(
> if ( pfec & (PFEC_page_paged | PFEC_page_shared) )
> return X86EMUL_RETRY;
> done /= bytes_per_rep;
> - *reps = done;
> if ( done == 0 )
> {
> ASSERT(!reverse);
> if ( npfn != gfn_x(INVALID_GFN) )
> return X86EMUL_UNHANDLEABLE;
> + *reps = 0;
> x86_emul_pagefault(pfec, addr & PAGE_MASK,
> &hvmemul_ctxt->ctxt);
Independently to the issue at hand, this looks suspicious for the
reverse direction.
Hardware will issue a walk for the first byte of access, and optionally
a second at the start of the subsequent page for a straddled access.
For the reverse case, this looks like it will truncate down to the start
of the lower linear address, which I bet isn't how hardware actually
behaves.
(In some copious free time, I should really put together a discontinuous
rep insn XTF test).
~Andrew
> return X86EMUL_EXCEPTION;
> }
> + *reps = done;
> break;
> }
>
>
>
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |