|
[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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |