From mboxrd@z Thu Jan 1 00:00:00 1970 From: Julien Grall Subject: Re: [PATCH v3 13/14] libxc: arm64 vcpu initialisation Date: Mon, 11 Nov 2013 15:03:38 +0000 Message-ID: <5280F1CA.5090305@linaro.org> References: <1383842678.3189.15.camel@kazak.uk.xensource.com> <1383842696-8598-13-git-send-email-ian.campbell@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1383842696-8598-13-git-send-email-ian.campbell@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Ian Campbell Cc: ian.jackson@eu.citrix.com, stefano.stabellini@eu.citrix.com, tim@xen.org, xen-devel@lists.xen.org List-Id: xen-devel@lists.xenproject.org On 11/07/2013 04:44 PM, Ian Campbell wrote: > Signed-off-by: Ian Campbell Acked-by: Julien Grall > --- > 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