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

Re: [Xen-devel] [PATCH 28/38] arm: map GICV in all domains, not just dom0.



On Fri, 1 Jun 2012, Ian Campbell wrote:
> This requires that we allocate all p2m pages from domheap without a particular
> dom because max pages is not setup yet so there is no allocation available to
> us.
> 
> At some point we should create a separate p2m allocation (similar to x86's 
> shadow allocation) and use that.
> 
> Also we seem to have been calling p2m_alloc_table twice for dom0.
> 
> Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>


Acked-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>

>  xen/arch/arm/domain.c       |   10 +++++++---
>  xen/arch/arm/domain_build.c |    5 -----
>  xen/arch/arm/gic.c          |    9 ++++-----
>  xen/arch/arm/gic.h          |    2 +-
>  xen/arch/arm/p2m.c          |    3 ++-
>  5 files changed, 14 insertions(+), 15 deletions(-)
> 
> diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c
> index a7fb227..e15c1e8 100644
> --- a/xen/arch/arm/domain.c
> +++ b/xen/arch/arm/domain.c
> @@ -329,13 +329,17 @@ int arch_domain_create(struct domain *d, unsigned int 
> domcr_flags)
>  
>          if ( (rc = p2m_alloc_table(d)) != 0 )
>              goto fail;
> -    }
>  
> -    if ( (rc = domain_vgic_init(d)) != 0 )
> -        goto fail;
> +        if ( (rc = gicv_setup(d)) != 0 )
> +            goto fail;
> +
> +        if ( (rc = domain_vgic_init(d)) != 0 )
> +            goto fail;
> +    }
>  
>      rc = 0;
>  fail:
> +    /*XXX unwind allocations etc */
>      return rc;
>  }
>  
> diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
> index 72e775c..1b19e54 100644
> --- a/xen/arch/arm/domain_build.c
> +++ b/xen/arch/arm/domain_build.c
> @@ -270,9 +270,6 @@ int construct_dom0(struct domain *d)
>  
>      d->max_pages = ~0U;
>  
> -    if ( (rc = p2m_alloc_table(d)) != 0 )
> -        return rc;
> -
>      rc = prepare_dtb(d, &kinfo);
>      if ( rc < 0 )
>          return rc;
> @@ -288,8 +285,6 @@ int construct_dom0(struct domain *d)
>      printk("Map VGIC MMIO regions 1:1 in the P2M %#llx->%#llx\n", 
> 0x2C008000ULL, 0x2DFFFFFFULL);
>      map_mmio_regions(d, 0x2C008000, 0x2DFFFFFF, 0x2C008000);
>  
> -    gicv_setup(d);
> -
>      printk("Routing peripheral interrupts to guest\n");
>      /* TODO Get from device tree */
>      gic_route_irq_to_guest(d, 34, "timer0");
> diff --git a/xen/arch/arm/gic.c b/xen/arch/arm/gic.c
> index 339c327..a398f92 100644
> --- a/xen/arch/arm/gic.c
> +++ b/xen/arch/arm/gic.c
> @@ -541,14 +541,13 @@ void gic_interrupt(struct cpu_user_regs *regs, int 
> is_fiq)
>      do_IRQ(regs, irq, is_fiq);
>  }
>  
> -void gicv_setup(struct domain *d)
> +int gicv_setup(struct domain *d)
>  {
> +    printk("GICV setup for DOM%d\n", d->domain_id);
> +
>      /* map the gic virtual cpu interface in the gic cpu interface region of
>       * the guest */
> -    printk("mapping GICC at %#"PRIx32" to %#"PRIx32"\n",
> -           GIC_BASE_ADDRESS + GIC_CR_OFFSET,
> -           GIC_BASE_ADDRESS + GIC_VR_OFFSET);
> -    map_mmio_regions(d, GIC_BASE_ADDRESS + GIC_CR_OFFSET,
> +    return map_mmio_regions(d, GIC_BASE_ADDRESS + GIC_CR_OFFSET,
>                          GIC_BASE_ADDRESS + GIC_CR_OFFSET + (2 * PAGE_SIZE) - 
> 1,
>                          GIC_BASE_ADDRESS + GIC_VR_OFFSET);
>  }
> diff --git a/xen/arch/arm/gic.h b/xen/arch/arm/gic.h
> index ac9cf3a..018d820 100644
> --- a/xen/arch/arm/gic.h
> +++ b/xen/arch/arm/gic.h
> @@ -148,7 +148,7 @@ extern void gic_init_secondary_cpu(void);
>  /* Take down a CPU's per-CPU GIC interface */
>  extern void gic_disable_cpu(void);
>  /* setup the gic virtual interface for a guest */
> -extern void gicv_setup(struct domain *d);
> +extern int gicv_setup(struct domain *d);
>  
>  /* Context switch */
>  extern void gic_save_state(struct vcpu *v);
> diff --git a/xen/arch/arm/p2m.c b/xen/arch/arm/p2m.c
> index c4daf83..0665445 100644
> --- a/xen/arch/arm/p2m.c
> +++ b/xen/arch/arm/p2m.c
> @@ -4,6 +4,7 @@
>  #include <xen/errno.h>
>  #include <xen/domain_page.h>
>  #include <asm/flushtlb.h>
> +#include "gic.h"
>  
>  void dump_p2m_lookup(struct domain *d, paddr_t addr)
>  {
> @@ -138,7 +139,7 @@ static int p2m_create_entry(struct domain *d,
>  
>      BUG_ON(entry->p2m.valid);
>  
> -    page = alloc_domheap_page(d, 0);
> +    page = alloc_domheap_page(NULL, 0);
>      if ( page == NULL )
>          return -ENOMEM;
>  
> -- 
> 1.7.9.1
> 
> 
> _______________________________________________
> 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


 


Rackspace

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