|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 3 of 3] x86/emulation: No need to get_gfn on zero ram_gpa
At 15:34 -0400 on 24 Apr (1335281653), Andres Lagar-Cavilla wrote:
> xen/arch/x86/hvm/emulate.c | 48
> ++++++++++++++++++++++++---------------------
> 1 files changed, 26 insertions(+), 22 deletions(-)
>
>
> Signed-off-by: Andres Lagar-Cavilla <andres@xxxxxxxxxxxxxxxx>
>
> diff -r 2ffc676120b8 -r 7a7443e80b99 xen/arch/x86/hvm/emulate.c
> --- a/xen/arch/x86/hvm/emulate.c
> +++ b/xen/arch/x86/hvm/emulate.c
> @@ -60,33 +60,37 @@ static int hvmemul_do_io(
> ioreq_t *p = get_ioreq(curr);
> unsigned long ram_gfn = paddr_to_pfn(ram_gpa);
> p2m_type_t p2mt;
> - mfn_t ram_mfn;
> + mfn_t ram_mfn = _mfn(INVALID_MFN);
> int rc;
>
> - /* Check for paged out page */
> - ram_mfn = get_gfn_unshare(curr->domain, ram_gfn, &p2mt);
> - if ( p2m_is_paging(p2mt) )
> - {
> - put_gfn(curr->domain, ram_gfn);
> - p2m_mem_paging_populate(curr->domain, ram_gfn);
> - return X86EMUL_RETRY;
> - }
> - if ( p2m_is_shared(p2mt) )
> - {
> - put_gfn(curr->domain, ram_gfn);
> - return X86EMUL_RETRY;
> - }
> -
> - /* Maintain a ref on the mfn to ensure liveness. Put the gfn
> - * to avoid potential deadlock wrt event channel lock, later. */
> - if ( mfn_valid(mfn_x(ram_mfn)) )
> - if ( !get_page(mfn_to_page(mfn_x(ram_mfn)),
> - curr->domain) )
> + /* Many callers pass a stub zero ram_gpa address. */
> + if ( ram_gfn != 0 )
To safely gate on this, the 'stub' value needs to be made into something
that can't be confused with a real paddr, say, ragm_gpa == -1.
Otherwise we lose protection for IO where the target is in page zero.
> + {
> + /* Check for paged out page */
> + ram_mfn = get_gfn_unshare(curr->domain, ram_gfn, &p2mt);
> + if ( p2m_is_paging(p2mt) )
> {
> - put_gfn(curr->domain, ram_gfn);
> + put_gfn(curr->domain, ram_gfn);
> + p2m_mem_paging_populate(curr->domain, ram_gfn);
> return X86EMUL_RETRY;
> }
> - put_gfn(curr->domain, ram_gfn);
> + if ( p2m_is_shared(p2mt) )
> + {
> + put_gfn(curr->domain, ram_gfn);
> + return X86EMUL_RETRY;
> + }
> +
> + /* Maintain a ref on the mfn to ensure liveness. Put the gfn
> + * to avoid potential deadlock wrt event channel lock, later. */
> + if ( mfn_valid(mfn_x(ram_mfn)) )
> + if ( !get_page(mfn_to_page(mfn_x(ram_mfn)),
> + curr->domain) )
> + {
> + put_gfn(curr->domain, ram_gfn);
> + return X86EMUL_RETRY;
> + }
> + put_gfn(curr->domain, ram_gfn);
> + }
>
> /*
> * Weird-sized accesses have undefined behaviour: we discard writes
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxx
> http://lists.xen.org/xen-devel
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |