|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 01/18] xen: reinstate previously unused XENMEM_remove_from_physmap hypercall
On Thu, 2012-01-12 at 23:35 +0000, Daniel De Graaf wrote:
> From: Alex Zeffertt <alex.zeffertt@xxxxxxxxxxxxx>
>
> This patch reinstates the XENMEM_remove_from_physmap hypercall
> which was removed in 19041:ee62aaafff46 because it was not used.
>
> However, is now needed in order to support xenstored stub domains.
> The xenstored stub domain is not priviliged like dom0 and so cannot
> unilaterally map the xenbus page of other guests into it's address
> space. Therefore, before creating a domU the domain builder needs to
> seed its grant table with a grant ref allowing the xenstored stub
> domain to access the new domU's xenbus page.
>
> At present domU's do not start with their grant table mapped.
> Instead it gets mapped when the guest requests a grant table from
> the hypervisor.
>
> In order to seed the grant table, the domain builder first needs to
> map it into dom0 address space. But the hypercall to do this
> requires a gpfn (guest pfn), which is an mfn for PV guest, but a pfn
> for HVM guests. Therfore, in order to seed the grant table of an
> HVM guest, dom0 needs to *temporarily* map it into the guest's
> "physical" address space.
>
> Hence the need to reinstate the XENMEM_remove_from_physmap hypercall.
>
> Signed-off-by: Alex Zeffertt <alex.zeffertt@xxxxxxxxxxxxx>
> Signed-off-by: Daniel De Graaf <dgdegra@xxxxxxxxxxxxx>
Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx> (modulo Jan's comment
about ordering in xlat.lst)
BTW, since Alex and Diego have subsequently left Citrix you could take
my Acked-by's in this series as Signed-of-by on behalf of Citrix. I've
no idea if that's necessary though, I expect not.
Ian.
> ---
> xen/arch/ia64/xen/mm.c | 34 ++++++++++++++++++++++++++++++++++
> xen/arch/x86/mm.c | 35 +++++++++++++++++++++++++++++++++++
> xen/arch/x86/x86_64/compat/mm.c | 14 ++++++++++++++
> xen/include/public/memory.h | 16 ++++++++++++++++
> xen/include/xlat.lst | 1 +
> xen/include/xsm/xsm.h | 6 ++++++
> xen/xsm/dummy.c | 6 ++++++
> xen/xsm/flask/hooks.c | 6 ++++++
> 8 files changed, 118 insertions(+), 0 deletions(-)
>
> diff --git a/xen/arch/ia64/xen/mm.c b/xen/arch/ia64/xen/mm.c
> index 84f6a61..a40f96a 100644
> --- a/xen/arch/ia64/xen/mm.c
> +++ b/xen/arch/ia64/xen/mm.c
> @@ -3448,6 +3448,40 @@ arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
> break;
> }
>
> + case XENMEM_remove_from_physmap:
> + {
> + struct xen_remove_from_physmap xrfp;
> + unsigned long mfn;
> + struct domain *d;
> +
> + if ( copy_from_guest(&xrfp, arg, 1) )
> + return -EFAULT;
> +
> + rc = rcu_lock_target_domain_by_id(xrfp.domid, &d);
> + if ( rc != 0 )
> + return rc;
> +
> + if ( xsm_remove_from_physmap(current->domain, d) )
> + {
> + rcu_unlock_domain(d);
> + return -EPERM;
> + }
> +
> + domain_lock(d);
> +
> + mfn = gmfn_to_mfn(d, xrfp.gpfn);
> +
> + if ( mfn_valid(mfn) )
> + guest_physmap_remove_page(d, xrfp.gpfn, mfn, 0);
> +
> + domain_unlock(d);
> +
> + rcu_unlock_domain(d);
> +
> + break;
> + }
> +
> +
> case XENMEM_machine_memory_map:
> {
> struct xen_memory_map memmap;
> diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
> index 1f996e0..39cc3c0 100644
> --- a/xen/arch/x86/mm.c
> +++ b/xen/arch/x86/mm.c
> @@ -4871,6 +4871,41 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
> return rc;
> }
>
> + case XENMEM_remove_from_physmap:
> + {
> + struct xen_remove_from_physmap xrfp;
> + unsigned long mfn;
> + struct domain *d;
> +
> + if ( copy_from_guest(&xrfp, arg, 1) )
> + return -EFAULT;
> +
> + rc = rcu_lock_target_domain_by_id(xrfp.domid, &d);
> + if ( rc != 0 )
> + return rc;
> +
> + if ( xsm_remove_from_physmap(current->domain, d) )
> + {
> + rcu_unlock_domain(d);
> + return -EPERM;
> + }
> +
> + domain_lock(d);
> +
> + mfn = get_gfn_untyped(d, xrfp.gpfn);
> +
> + if ( mfn_valid(mfn) )
> + guest_physmap_remove_page(d, xrfp.gpfn, mfn, PAGE_ORDER_4K);
> +
> + put_gfn(d, xrfp.gpfn);
> +
> + domain_unlock(d);
> +
> + rcu_unlock_domain(d);
> +
> + break;
> + }
> +
> case XENMEM_set_memory_map:
> {
> struct xen_foreign_memory_map fmap;
> diff --git a/xen/arch/x86/x86_64/compat/mm.c b/xen/arch/x86/x86_64/compat/mm.c
> index bea94fe..dde5430 100644
> --- a/xen/arch/x86/x86_64/compat/mm.c
> +++ b/xen/arch/x86/x86_64/compat/mm.c
> @@ -82,6 +82,20 @@ int compat_arch_memory_op(int op, XEN_GUEST_HANDLE(void)
> arg)
> break;
> }
>
> + case XENMEM_remove_from_physmap:
> + {
> + struct compat_remove_from_physmap cmp;
> + struct xen_remove_from_physmap *nat = (void
> *)COMPAT_ARG_XLAT_VIRT_BASE;
> +
> + if ( copy_from_guest(&cmp, arg, 1) )
> + return -EFAULT;
> +
> + XLAT_remove_from_physmap(nat, &cmp);
> + rc = arch_memory_op(op, guest_handle_from_ptr(nat, void));
> +
> + break;
> + }
> +
> case XENMEM_set_memory_map:
> {
> struct compat_foreign_memory_map cmp;
> diff --git a/xen/include/public/memory.h b/xen/include/public/memory.h
> index c5b78a8..308deff 100644
> --- a/xen/include/public/memory.h
> +++ b/xen/include/public/memory.h
> @@ -229,6 +229,22 @@ struct xen_add_to_physmap {
> typedef struct xen_add_to_physmap xen_add_to_physmap_t;
> DEFINE_XEN_GUEST_HANDLE(xen_add_to_physmap_t);
>
> +/*
> + * Unmaps the page appearing at a particular GPFN from the specified guest's
> + * pseudophysical address space.
> + * arg == addr of xen_remove_from_physmap_t.
> + */
> +#define XENMEM_remove_from_physmap 15
> +struct xen_remove_from_physmap {
> + /* Which domain to change the mapping for. */
> + domid_t domid;
> +
> + /* GPFN of the current mapping of the page. */
> + xen_pfn_t gpfn;
> +};
> +typedef struct xen_remove_from_physmap xen_remove_from_physmap_t;
> +DEFINE_XEN_GUEST_HANDLE(xen_remove_from_physmap_t);
> +
> /*** REMOVED ***/
> /*#define XENMEM_translate_gpfn_list 8*/
>
> diff --git a/xen/include/xlat.lst b/xen/include/xlat.lst
> index 3d92175..ee1772c 100644
> --- a/xen/include/xlat.lst
> +++ b/xen/include/xlat.lst
> @@ -81,6 +81,7 @@
> ! processor_power platform.h
> ? processor_px platform.h
> ! psd_package platform.h
> +! remove_from_physmap memory.h
> ? xenpf_pcpuinfo platform.h
> ? xenpf_pcpu_version platform.h
> ! sched_poll sched.h
> diff --git a/xen/include/xsm/xsm.h b/xen/include/xsm/xsm.h
> index df6cec2..566c808 100644
> --- a/xen/include/xsm/xsm.h
> +++ b/xen/include/xsm/xsm.h
> @@ -169,6 +169,7 @@ struct xsm_operations {
> int (*update_va_mapping) (struct domain *d, struct domain *f,
> l1_pgentry_t
> pte);
> int (*add_to_physmap) (struct domain *d1, struct domain *d2);
> + int (*remove_from_physmap) (struct domain *d1, struct domain *d2);
> int (*sendtrigger) (struct domain *d);
> int (*bind_pt_irq) (struct domain *d, struct xen_domctl_bind_pt_irq
> *bind);
> int (*unbind_pt_irq) (struct domain *d);
> @@ -738,6 +739,11 @@ static inline int xsm_add_to_physmap(struct domain *d1,
> struct domain *d2)
> return xsm_call(add_to_physmap(d1, d2));
> }
>
> +static inline int xsm_remove_from_physmap(struct domain *d1, struct domain
> *d2)
> +{
> + return xsm_call(remove_from_physmap(d1, d2));
> +}
> +
> static inline int xsm_sendtrigger(struct domain *d)
> {
> return xsm_call(sendtrigger(d));
> diff --git a/xen/xsm/dummy.c b/xen/xsm/dummy.c
> index 4bbfbff..65daa4e 100644
> --- a/xen/xsm/dummy.c
> +++ b/xen/xsm/dummy.c
> @@ -529,6 +529,11 @@ static int dummy_add_to_physmap (struct domain *d1,
> struct domain *d2)
> return 0;
> }
>
> +static int dummy_remove_from_physmap (struct domain *d1, struct domain *d2)
> +{
> + return 0;
> +}
> +
> static int dummy_sendtrigger (struct domain *d)
> {
> return 0;
> @@ -690,6 +695,7 @@ void xsm_fixup_ops (struct xsm_operations *ops)
> set_to_dummy_if_null(ops, mmu_machphys_update);
> set_to_dummy_if_null(ops, update_va_mapping);
> set_to_dummy_if_null(ops, add_to_physmap);
> + set_to_dummy_if_null(ops, remove_from_physmap);
> set_to_dummy_if_null(ops, sendtrigger);
> set_to_dummy_if_null(ops, bind_pt_irq);
> set_to_dummy_if_null(ops, pin_mem_cacheattr);
> diff --git a/xen/xsm/flask/hooks.c b/xen/xsm/flask/hooks.c
> index 0d35767..a2020a9 100644
> --- a/xen/xsm/flask/hooks.c
> +++ b/xen/xsm/flask/hooks.c
> @@ -1283,6 +1283,11 @@ static int flask_add_to_physmap(struct domain *d1,
> struct domain *d2)
> return domain_has_perm(d1, d2, SECCLASS_MMU, MMU__PHYSMAP);
> }
>
> +static int flask_remove_from_physmap(struct domain *d1, struct domain *d2)
> +{
> + return domain_has_perm(d1, d2, SECCLASS_MMU, MMU__PHYSMAP);
> +}
> +
> static int flask_sendtrigger(struct domain *d)
> {
> return domain_has_perm(current->domain, d, SECCLASS_DOMAIN,
> DOMAIN__TRIGGER);
> @@ -1550,6 +1555,7 @@ static struct xsm_operations flask_ops = {
> .mmu_machphys_update = flask_mmu_machphys_update,
> .update_va_mapping = flask_update_va_mapping,
> .add_to_physmap = flask_add_to_physmap,
> + .remove_from_physmap = flask_remove_from_physmap,
> .sendtrigger = flask_sendtrigger,
> .get_device_group = flask_get_device_group,
> .test_assign_device = flask_test_assign_device,
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |