|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 5/5] x86/mem_access: check for errors in p2m->set_entry().
On Thu, Mar 7, 2013 at 6:53 AM, Tim Deegan <tim@xxxxxxx> wrote:
> These calls ought always to succeed. Assert that they do rather than
> ignoring the return value.
>
> Signed-off-by: Tim Deegan <tim@xxxxxxx>
> Cc: Aravindh Puthiyaparambil <aravindh@xxxxxxxxxxxx>
> ---
> xen/arch/x86/mm/p2m.c | 25 ++++++++++++++++++-------
> 1 file changed, 18 insertions(+), 7 deletions(-)
>
> diff --git a/xen/arch/x86/mm/p2m.c b/xen/arch/x86/mm/p2m.c
> index 4837de3..f5ddd20 100644
> --- a/xen/arch/x86/mm/p2m.c
> +++ b/xen/arch/x86/mm/p2m.c
> @@ -1262,21 +1262,27 @@ bool_t p2m_mem_access_check(paddr_t gpa, bool_t
> gla_valid, unsigned long gla,
> p2m_type_t p2mt;
> p2m_access_t p2ma;
> mem_event_request_t *req;
> + int rc;
>
> - /* First, handle rx2rw conversion automatically */
> + /* First, handle rx2rw conversion automatically.
> + * These calls to p2m->set_entry() must succeed: we have the gfn
> + * locked and just did a successful get_entry(). */
> gfn_lock(p2m, gfn, 0);
> mfn = p2m->get_entry(p2m, gfn, &p2mt, &p2ma, 0, NULL);
>
> if ( access_w && p2ma == p2m_access_rx2rw )
> {
> - p2m->set_entry(p2m, gfn, mfn, PAGE_ORDER_4K, p2mt, p2m_access_rw);
> + rc = p2m->set_entry(p2m, gfn, mfn, PAGE_ORDER_4K, p2mt,
> p2m_access_rw);
> + ASSERT(rc);
> gfn_unlock(p2m, gfn, 0);
> return 1;
> }
> else if ( p2ma == p2m_access_n2rwx )
> {
> ASSERT(access_w || access_r || access_x);
> - p2m->set_entry(p2m, gfn, mfn, PAGE_ORDER_4K, p2mt, p2m_access_rwx);
> + rc = p2m->set_entry(p2m, gfn, mfn, PAGE_ORDER_4K,
> + p2mt, p2m_access_rwx);
> + ASSERT(rc);
> }
> gfn_unlock(p2m, gfn, 0);
>
> @@ -1294,13 +1300,18 @@ bool_t p2m_mem_access_check(paddr_t gpa, bool_t
> gla_valid, unsigned long gla,
> }
> else
> {
> + gfn_lock(p2m, gfn, 0);
> + mfn = p2m->get_entry(p2m, gfn, &p2mt, &p2ma, 0, NULL);
> if ( p2ma != p2m_access_n2rwx )
> {
> - /* A listener is not required, so clear the access
> restrictions */
> - gfn_lock(p2m, gfn, 0);
> - p2m->set_entry(p2m, gfn, mfn, PAGE_ORDER_4K, p2mt,
> p2m_access_rwx);
> - gfn_unlock(p2m, gfn, 0);
> + /* A listener is not required, so clear the access
> + * restrictions. This set must succeed: we have the
> + * gfn locked and just did a successful get_entry(). */
> + rc = p2m->set_entry(p2m, gfn, mfn, PAGE_ORDER_4K,
> + p2mt, p2m_access_rwx);
> + ASSERT(rc);
> }
> + gfn_unlock(p2m, gfn, 0);
> return 1;
> }
> }
> --
> 1.7.10.4
>
Acked-by: Aravindh Puthiyaparambil <aravindh@xxxxxxxxxxxx>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |