[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v2 6/6] xen/arm: grant table



On Fri, 2012-07-20 at 16:05 +0100, Stefano Stabellini wrote:
> Implement XENMAPSPACE_grant_table and grant_table_op.
> 
> Introduce an HVM_PARAM to tell the guest where to map the grant table
> (HVM_PARAM_GRANT_START_PFN), similarly to what we do with
> HVM_PARAM_CONSOLE_PFN and HVM_PARAM_STORE_PFN.
> However HVM_PARAM_GRANT_START_PFN is also going to be used by dom0, so
> we set the parameter in Xen rather than libxc.
> Using HVM_PARAM_GRANT_START_PFN removes the need for a platform pci
> device.

In principal the guest can use whatever free (or not free) PFN space it
wants for this region, right?

I suspect hybrid on x86 has a similar requirement and if we are going to
add this sort of thing we should make sure that we can satisfy both
architectures.

Or would it be better to use existing per-arch mechanisms to describe
the memory map (E820 on x86 and DTB on ARM)? They already describe the
rest of the memory layout.

The foreign page mapping stuff also needs to find a similar PFN region
to use.

> 
> Statically set HVM_PARAM_GRANT_START_PFN to 0xb0000000 for now.
> 
> Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
> Acked-by: Tim Deegan <tim@xxxxxxx>
> ---
>  xen/arch/arm/domain.c           |    3 +++
>  xen/arch/arm/mm.c               |   29 ++++++++++++++++++++++++++++-
>  xen/arch/arm/traps.c            |    1 +
>  xen/include/public/hvm/params.h |    4 +++-
>  4 files changed, 35 insertions(+), 2 deletions(-)
> 
> diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c
> index 6e1e08a..7c56cf3 100644
> --- a/xen/arch/arm/domain.c
> +++ b/xen/arch/arm/domain.c
> @@ -345,6 +345,9 @@ int arch_domain_create(struct domain *d, unsigned int 
> domcr_flags)
>  
>          if ( (rc = p2m_alloc_table(d)) != 0 )
>              goto fail;
> +
> +        /* XXX: select this dynamically */
> +        d->arch.hvm_domain.params[HVM_PARAM_GRANT_START_PFN] = 0xb0000;
>      }
>  
>      if ( (rc = domain_vgic_init(d)) != 0 )
> diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c
> index 7033023..2f28a18 100644
> --- a/xen/arch/arm/mm.c
> +++ b/xen/arch/arm/mm.c
> @@ -25,6 +25,7 @@
>  #include <xen/mm.h>
>  #include <xen/preempt.h>
>  #include <xen/errno.h>
> +#include <xen/grant_table.h>
>  #include <xen/guest_access.h>
>  #include <asm/page.h>
>  #include <asm/current.h>
> @@ -477,7 +478,7 @@ static int xenmem_add_to_physmap_once(
>      struct domain *d,
>      const struct xen_add_to_physmap *xatp)
>  {
> -    unsigned long mfn = 0;
> +    unsigned long mfn = 0, idx = 0;
>      int rc;
>  
>      switch ( xatp->space )
> @@ -506,6 +507,32 @@ static int xenmem_add_to_physmap_once(
>          rcu_unlock_domain(od);
>          break;
>      }
> +    case XENMAPSPACE_grant_table:
> +        spin_lock(&d->grant_table->lock);
> +
> +        if ( d->grant_table->gt_version == 0 )
> +            d->grant_table->gt_version = 1;
> +
> +        idx = xatp->idx;
> +        if ( d->grant_table->gt_version == 2 &&
> +                (xatp->idx & XENMAPIDX_grant_table_status) )
> +        {
> +            idx &= ~XENMAPIDX_grant_table_status;
> +            if ( idx < nr_status_frames(d->grant_table) )
> +                mfn = virt_to_mfn(d->grant_table->status[idx]);
> +        }
> +        else
> +        {
> +            if ( (idx >= nr_grant_frames(d->grant_table)) &&
> +                    (idx < max_nr_grant_frames) )
> +                gnttab_grow_table(d, idx + 1);
> +
> +            if ( idx < nr_grant_frames(d->grant_table) )
> +                mfn = virt_to_mfn(d->grant_table->shared_raw[idx]);
> +        }
> +
> +        spin_unlock(&d->grant_table->lock);
> +        break;
>      default:
>          return -ENOSYS;
>      }
> diff --git a/xen/arch/arm/traps.c b/xen/arch/arm/traps.c
> index 3900545..cdbd11f 100644
> --- a/xen/arch/arm/traps.c
> +++ b/xen/arch/arm/traps.c
> @@ -431,6 +431,7 @@ static arm_hypercall_t *arm_hypercall_table[] = {
>      HYPERCALL(physdev_op),
>      HYPERCALL(sysctl),
>      HYPERCALL(hvm_op),
> +    HYPERCALL(grant_table_op),
>  };
>  
>  static void do_debug_trap(struct cpu_user_regs *regs, unsigned int code)
> diff --git a/xen/include/public/hvm/params.h b/xen/include/public/hvm/params.h
> index 55c1b57..a2da05d 100644
> --- a/xen/include/public/hvm/params.h
> +++ b/xen/include/public/hvm/params.h
> @@ -147,6 +147,8 @@
>  #define HVM_PARAM_ACCESS_RING_PFN   28
>  #define HVM_PARAM_SHARING_RING_PFN  29
>  
> -#define HVM_NR_PARAMS          30
> +#define HVM_PARAM_GRANT_START_PFN 30
> +
> +#define HVM_NR_PARAMS          31
>  
>  #endif /* __XEN_PUBLIC_HVM_PARAMS_H__ */



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.