|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH V3] x86/altp2m: clean up p2m_{get/set}_suppress_ve()
>>> On 25.09.18 at 13:02, <rcojocaru@xxxxxxxxxxxxxxx> wrote:
> Move p2m_{get/set}_suppress_ve() to p2m.c, replace incorrect
> ASSERT() in p2m-pt.c (since a guest can run in shadow mode even on
> a system with virt exceptions, which would trigger the ASSERT()),
> move the VMX-isms (cpu_has_vmx_virt_exceptions checks) to
> p2m_ept_{get/set}_entry(), and fix locking code in
> p2m_get_suppress_ve().
>
> Signed-off-by: Razvan Cojocaru <rcojocaru@xxxxxxxxxxxxxxx>
>
> ---
> Changes since V2:
> - Rebased on staging, double-checked the patch.
> ---
> xen/arch/x86/mm/mem_access.c | 102
> -------------------------------------------
> xen/arch/x86/mm/p2m-ept.c | 11 +++++
> xen/arch/x86/mm/p2m-pt.c | 3 +-
> xen/arch/x86/mm/p2m.c | 90 ++++++++++++++++++++++++++++++++++++++
> 4 files changed, 103 insertions(+), 103 deletions(-)
I still have this in my to-be-applied list, but I'm not sure whether it's
now stale, and it's still missing an ack from Tamas.
Jan
> diff --git a/xen/arch/x86/mm/mem_access.c b/xen/arch/x86/mm/mem_access.c
> index d9e64fc..3d50fe0 100644
> --- a/xen/arch/x86/mm/mem_access.c
> +++ b/xen/arch/x86/mm/mem_access.c
> @@ -514,108 +514,6 @@ void arch_p2m_set_access_required(struct domain *d,
> bool access_required)
> #endif
> }
>
> -#ifdef CONFIG_HVM
> -/*
> - * Set/clear the #VE suppress bit for a page. Only available on VMX.
> - */
> -int p2m_set_suppress_ve(struct domain *d, gfn_t gfn, bool suppress_ve,
> - unsigned int altp2m_idx)
> -{
> - struct p2m_domain *host_p2m = p2m_get_hostp2m(d);
> - struct p2m_domain *ap2m = NULL;
> - struct p2m_domain *p2m;
> - mfn_t mfn;
> - p2m_access_t a;
> - p2m_type_t t;
> - int rc;
> -
> - if ( !cpu_has_vmx_virt_exceptions )
> - return -EOPNOTSUPP;
> -
> - /* #VE should be enabled for this vcpu. */
> - if ( gfn_eq(vcpu_altp2m(current).veinfo_gfn, INVALID_GFN) )
> - return -ENXIO;
> -
> - if ( altp2m_idx > 0 )
> - {
> - if ( altp2m_idx >= MAX_ALTP2M ||
> - d->arch.altp2m_eptp[altp2m_idx] == mfn_x(INVALID_MFN) )
> - return -EINVAL;
> -
> - p2m = ap2m = d->arch.altp2m_p2m[altp2m_idx];
> - }
> - else
> - p2m = host_p2m;
> -
> - gfn_lock(host_p2m, gfn, 0);
> -
> - if ( ap2m )
> - p2m_lock(ap2m);
> -
> - mfn = p2m->get_entry(p2m, gfn, &t, &a, 0, NULL, NULL);
> - if ( !mfn_valid(mfn) )
> - {
> - rc = -ESRCH;
> - goto out;
> - }
> -
> - rc = p2m->set_entry(p2m, gfn, mfn, PAGE_ORDER_4K, t, a, suppress_ve);
> -
> -out:
> - if ( ap2m )
> - p2m_unlock(ap2m);
> -
> - gfn_unlock(host_p2m, gfn, 0);
> -
> - return rc;
> -}
> -
> -int p2m_get_suppress_ve(struct domain *d, gfn_t gfn, bool *suppress_ve,
> - unsigned int altp2m_idx)
> -{
> - struct p2m_domain *host_p2m = p2m_get_hostp2m(d);
> - struct p2m_domain *ap2m = NULL;
> - struct p2m_domain *p2m;
> - mfn_t mfn;
> - p2m_access_t a;
> - p2m_type_t t;
> -
> - if ( !cpu_has_vmx_virt_exceptions )
> - return -EOPNOTSUPP;
> -
> - /* #VE should be enabled for this vcpu. */
> - if ( gfn_eq(vcpu_altp2m(current).veinfo_gfn, INVALID_GFN) )
> - return -ENXIO;
> -
> - if ( altp2m_idx > 0 )
> - {
> - if ( altp2m_idx >= MAX_ALTP2M ||
> - d->arch.altp2m_eptp[altp2m_idx] == mfn_x(INVALID_MFN) )
> - return -EINVAL;
> -
> - p2m = ap2m = d->arch.altp2m_p2m[altp2m_idx];
> - }
> - else
> - p2m = host_p2m;
> -
> - gfn_lock(host_p2m, gfn, 0);
> -
> - if ( ap2m )
> - p2m_lock(ap2m);
> -
> - mfn = p2m->get_entry(p2m, gfn, &t, &a, 0, NULL, suppress_ve);
> - if ( !mfn_valid(mfn) )
> - return -ESRCH;
> -
> - if ( ap2m )
> - p2m_unlock(ap2m);
> -
> - gfn_unlock(host_p2m, gfn, 0);
> -
> - return 0;
> -}
> -#endif
> -
> /*
> * Local variables:
> * mode: C
> diff --git a/xen/arch/x86/mm/p2m-ept.c b/xen/arch/x86/mm/p2m-ept.c
> index 1ff4f14..d376966 100644
> --- a/xen/arch/x86/mm/p2m-ept.c
> +++ b/xen/arch/x86/mm/p2m-ept.c
> @@ -697,6 +697,17 @@ ept_set_entry(struct p2m_domain *p2m, gfn_t gfn_, mfn_t
> mfn,
> struct domain *d = p2m->domain;
>
> ASSERT(ept);
> +
> + if ( !sve )
> + {
> + if ( !cpu_has_vmx_virt_exceptions )
> + return -EOPNOTSUPP;
> +
> + /* #VE should be enabled for this vcpu. */
> + if ( gfn_eq(vcpu_altp2m(current).veinfo_gfn, INVALID_GFN) )
> + return -ENXIO;
> + }
> +
> /*
> * the caller must make sure:
> * 1. passing valid gfn and mfn at order boundary.
> diff --git a/xen/arch/x86/mm/p2m-pt.c b/xen/arch/x86/mm/p2m-pt.c
> index 40bfc76..33dd129 100644
> --- a/xen/arch/x86/mm/p2m-pt.c
> +++ b/xen/arch/x86/mm/p2m-pt.c
> @@ -501,7 +501,8 @@ p2m_pt_set_entry(struct p2m_domain *p2m, gfn_t gfn_,
> mfn_t mfn,
> unsigned int flags, iommu_old_flags = 0;
> unsigned long old_mfn = mfn_x(INVALID_MFN);
>
> - ASSERT(sve != 0);
> + if ( !sve )
> + return -EOPNOTSUPP;
>
> if ( tb_init_done )
> {
> diff --git a/xen/arch/x86/mm/p2m.c b/xen/arch/x86/mm/p2m.c
> index ed2e8da..d6a8810 100644
> --- a/xen/arch/x86/mm/p2m.c
> +++ b/xen/arch/x86/mm/p2m.c
> @@ -2764,6 +2764,96 @@ out:
> rcu_unlock_domain(fdom);
> return rc;
> }
> +
> +#ifdef CONFIG_HVM
> +/*
> + * Set/clear the #VE suppress bit for a page. Only available on VMX.
> + */
> +int p2m_set_suppress_ve(struct domain *d, gfn_t gfn, bool suppress_ve,
> + unsigned int altp2m_idx)
> +{
> + struct p2m_domain *host_p2m = p2m_get_hostp2m(d);
> + struct p2m_domain *ap2m = NULL;
> + struct p2m_domain *p2m;
> + mfn_t mfn;
> + p2m_access_t a;
> + p2m_type_t t;
> + int rc;
> +
> + if ( altp2m_idx > 0 )
> + {
> + if ( altp2m_idx >= MAX_ALTP2M ||
> + d->arch.altp2m_eptp[altp2m_idx] == mfn_x(INVALID_MFN) )
> + return -EINVAL;
> +
> + p2m = ap2m = d->arch.altp2m_p2m[altp2m_idx];
> + }
> + else
> + p2m = host_p2m;
> +
> + gfn_lock(host_p2m, gfn, 0);
> +
> + if ( ap2m )
> + p2m_lock(ap2m);
> +
> + mfn = p2m->get_entry(p2m, gfn, &t, &a, 0, NULL, NULL);
> + if ( !mfn_valid(mfn) )
> + {
> + rc = -ESRCH;
> + goto out;
> + }
> +
> + rc = p2m->set_entry(p2m, gfn, mfn, PAGE_ORDER_4K, t, a, suppress_ve);
> +
> +out:
> + if ( ap2m )
> + p2m_unlock(ap2m);
> +
> + gfn_unlock(host_p2m, gfn, 0);
> +
> + return rc;
> +}
> +
> +int p2m_get_suppress_ve(struct domain *d, gfn_t gfn, bool *suppress_ve,
> + unsigned int altp2m_idx)
> +{
> + struct p2m_domain *host_p2m = p2m_get_hostp2m(d);
> + struct p2m_domain *ap2m = NULL;
> + struct p2m_domain *p2m;
> + mfn_t mfn;
> + p2m_access_t a;
> + p2m_type_t t;
> + int rc = 0;
> +
> + if ( altp2m_idx > 0 )
> + {
> + if ( altp2m_idx >= MAX_ALTP2M ||
> + d->arch.altp2m_eptp[altp2m_idx] == mfn_x(INVALID_MFN) )
> + return -EINVAL;
> +
> + p2m = ap2m = d->arch.altp2m_p2m[altp2m_idx];
> + }
> + else
> + p2m = host_p2m;
> +
> + gfn_lock(host_p2m, gfn, 0);
> +
> + if ( ap2m )
> + p2m_lock(ap2m);
> +
> + mfn = p2m->get_entry(p2m, gfn, &t, &a, 0, NULL, suppress_ve);
> + if ( !mfn_valid(mfn) )
> + rc = -ESRCH;
> +
> + if ( ap2m )
> + p2m_unlock(ap2m);
> +
> + gfn_unlock(host_p2m, gfn, 0);
> +
> + return rc;
> +}
> +#endif
> +
> /*
> * Local variables:
> * mode: C
> --
> 2.7.4
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |