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

Re: [Xen-devel] [PATCH v3 13/14] libxc: arm64 vcpu initialisation



On 11/07/2013 04:44 PM, Ian Campbell wrote:
> Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
Acked-by: Julien Grall <julien.grall@xxxxxxxxxx>
> ---
>  tools/libxc/xc_dom_arm.c |   90 
> ++++++++++++++++++++++++++++++++++++++++++++--
>  1 file changed, 88 insertions(+), 2 deletions(-)
> 
> diff --git a/tools/libxc/xc_dom_arm.c b/tools/libxc/xc_dom_arm.c
> index ee2c9cc..03db256 100644
> --- a/tools/libxc/xc_dom_arm.c
> +++ b/tools/libxc/xc_dom_arm.c
> @@ -105,7 +105,7 @@ static int shared_info_arm(struct xc_dom_image *dom, void 
> *ptr)
>  
>  /* ------------------------------------------------------------------------ 
> */
>  
> -static int vcpu_arm(struct xc_dom_image *dom, void *ptr)
> +static int vcpu_arm32(struct xc_dom_image *dom, void *ptr)
>  {
>      vcpu_guest_context_t *ctxt = ptr;
>  
> @@ -143,6 +143,41 @@ static int vcpu_arm(struct xc_dom_image *dom, void *ptr)
>      return 0;
>  }
>  
> +static int vcpu_arm64(struct xc_dom_image *dom, void *ptr)
> +{
> +    vcpu_guest_context_t *ctxt = ptr;
> +
> +    DOMPRINTF_CALLED(dom->xch);
> +    /* clear everything */
> +    memset(ctxt, 0, sizeof(*ctxt));
> +
> +    ctxt->user_regs.pc64 = dom->parms.virt_entry;
> +
> +    /* Linux boot protocol. See linux.Documentation/arm/Booting. */
> +    ctxt->user_regs.x0 = dom->devicetree_blob ?
> +        dom->devicetree_seg.vstart : 0xffffffff;
> +    ctxt->user_regs.x1 = 0;
> +    ctxt->user_regs.x2 = 0;
> +    ctxt->user_regs.x3 = 0;
> +
> +    DOMPRINTF("DTB %"PRIx64, ctxt->user_regs.x0);
> +
> +    ctxt->sctlr = SCTLR_GUEST_INIT;
> +
> +    ctxt->ttbr0 = 0;
> +    ctxt->ttbr1 = 0;
> +    ctxt->ttbcr = 0; /* Defined Reset Value */
> +
> +    ctxt->user_regs.cpsr = PSR_GUEST64_INIT;
> +
> +    ctxt->flags = VGCF_online;
> +
> +    DOMPRINTF("Initial state CPSR %#"PRIx32" PC %#"PRIx64,
> +           ctxt->user_regs.cpsr, ctxt->user_regs.pc64);
> +
> +    return 0;
> +}
> +
>  /* ------------------------------------------------------------------------ 
> */
>  
>  static struct xc_dom_arch xc_dom_32 = {
> @@ -155,12 +190,59 @@ static struct xc_dom_arch xc_dom_32 = {
>      .setup_pgtables = setup_pgtables_arm,
>      .start_info = start_info_arm,
>      .shared_info = shared_info_arm,
> -    .vcpu = vcpu_arm,
> +    .vcpu = vcpu_arm32,
> +};
> +
> +static struct xc_dom_arch xc_dom_64 = {
> +    .guest_type = "xen-3.0-aarch64",
> +    .native_protocol = XEN_IO_PROTO_ABI_ARM,
> +    .page_shift = PAGE_SHIFT_ARM,
> +    .sizeof_pfn = 8,
> +    .alloc_magic_pages = alloc_magic_pages,
> +    .count_pgtables = count_pgtables_arm,
> +    .setup_pgtables = setup_pgtables_arm,
> +    .start_info = start_info_arm,
> +    .shared_info = shared_info_arm,
> +    .vcpu = vcpu_arm64,
>  };
>  
>  static void __init register_arch_hooks(void)
>  {
>      xc_dom_register_arch_hooks(&xc_dom_32);
> +    xc_dom_register_arch_hooks(&xc_dom_64);
> +}
> +
> +static int set_mode(xc_interface *xch, domid_t domid, char *guest_type)
> +{
> +    static const struct {
> +        char           *guest;
> +        uint32_t        size;
> +    } types[] = {
> +        { "xen-3.0-aarch64", 64 },
> +        { "xen-3.0-armv7l",  32 },
> +    };
> +    DECLARE_DOMCTL;
> +    int i,rc;
> +
> +    domctl.domain = domid;
> +    domctl.cmd    = XEN_DOMCTL_set_address_size;
> +    for ( i = 0; i < sizeof(types)/sizeof(types[0]); i++ )
> +        if ( !strcmp(types[i].guest, guest_type) )
> +            domctl.u.address_size.size = types[i].size;
> +    if ( domctl.u.address_size.size == 0 )
> +    {
> +        xc_dom_printf(xch, "%s: warning: unknown guest type %s",
> +                      __FUNCTION__, guest_type);
> +        return -EINVAL;
> +    }
> +
> +    xc_dom_printf(xch, "%s: guest %s, address size %" PRId32 "", 
> __FUNCTION__,
> +                  guest_type, domctl.u.address_size.size);
> +    rc = do_domctl(xch, &domctl);
> +    if ( rc != 0 )
> +        xc_dom_printf(xch, "%s: warning: failed (rc=%d)",
> +                      __FUNCTION__, rc);
> +    return rc;
>  }
>  
>  int arch_setup_meminit(struct xc_dom_image *dom)
> @@ -168,6 +250,10 @@ int arch_setup_meminit(struct xc_dom_image *dom)
>      int rc;
>      xen_pfn_t pfn, allocsz, i;
>  
> +    rc = set_mode(dom->xch, dom->guest_domid, dom->guest_type);
> +    if ( rc )
> +        return rc;
> +
>      dom->shadow_enabled = 1;
>  
>      dom->p2m_host = xc_dom_malloc(dom, sizeof(xen_pfn_t) * dom->total_pages);
> 


-- 
Julien Grall

_______________________________________________
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®.