[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] xen/tools: Introduce QNX IFS loader
Add ability to load QNX IFS image. Based on IPL code (U-Boot for QNX). Signed-off-by: Oleksandr Tyshchenko <oleksandr.tyshchenko@xxxxxxxxxxxxxxx> --- tools/libxc/Makefile | 1 + tools/libxc/xc_dom_qnxifsloader.c | 189 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 190 insertions(+) create mode 100644 tools/libxc/xc_dom_qnxifsloader.c diff --git a/tools/libxc/Makefile b/tools/libxc/Makefile index 22eef8e..812cc7e 100644 --- a/tools/libxc/Makefile +++ b/tools/libxc/Makefile @@ -67,6 +67,7 @@ GUEST_SRCS-y += xc_dom_elfloader.c GUEST_SRCS-$(CONFIG_X86) += xc_dom_bzimageloader.c GUEST_SRCS-$(CONFIG_X86) += xc_dom_decompress_lz4.c GUEST_SRCS-$(CONFIG_ARM) += xc_dom_armzimageloader.c +GUEST_SRCS-$(CONFIG_ARM) += xc_dom_qnxifsloader.c GUEST_SRCS-y += xc_dom_binloader.c GUEST_SRCS-y += xc_dom_compat_linux.c diff --git a/tools/libxc/xc_dom_qnxifsloader.c b/tools/libxc/xc_dom_qnxifsloader.c new file mode 100644 index 0000000..45d007d --- /dev/null +++ b/tools/libxc/xc_dom_qnxifsloader.c @@ -0,0 +1,189 @@ +/* + * Xen domain builder -- QNX IFS bits + * + * Parse and load QNX IFS image. + * + * Copyright (C) 2014, Globallogic. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You + * may not reproduce, modify or distribute this software except in + * compliance with the License. You may obtain a copy of the License + * at: http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTIES OF ANY KIND, either express or implied. + * + * This file may contain contributions from others, either as + * contributors under the License or as licensors under other terms. + * Please review this entire file for other proprietary rights or license + * notices, as well as the QNX Development Suite License Guide at + * http://licensing.qnx.com/license-guide/ for other information. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <inttypes.h> + +#include "xg_private.h" +#include "xc_dom.h" + +struct startup_header { + uint32_t signature; /* Header sig */ + uint16_t version; /* Header vers */ + uint8_t flags1; /* Misc flags */ + uint8_t flags2; /* No flags defined yet */ + uint16_t header_size; /* sizeof(struct startup_header) */ + uint16_t machine; /* Machine type */ + uint32_t startup_vaddr; /* Virtual Address to transfer */ + /* to after IPL is done */ + uint32_t paddr_bias; /* Value to add to physical address */ + /* to get a value to put into a */ + /* pointer and indirected through */ + uint32_t image_paddr; /* Physical address of image */ + uint32_t ram_paddr; /* Physical address of RAM to copy */ + /* image to (startup_size bytes copied) */ + uint32_t ram_size; /* Amount of RAM used by the startup */ + /* program and executables contained */ + /* in the file system */ + uint32_t startup_size; /* Size of startup (never compressed) */ + uint32_t stored_size; /* Size of entire image */ + uint32_t imagefs_paddr; /* Set by IPL to where the imagefs is */ + /* when startup runs */ + uint32_t imagefs_size; /* Size of uncompressed imagefs */ + uint16_t preboot_size; /* Size of loaded before header */ + uint16_t zero0; /* Zeros */ + uint32_t zero[3]; /* Zeros */ + uint32_t info[48]; /* Array of startup_info* structures */ +}; + +#define STARTUP_HDR_SIGNATURE 0x00ff7eeb + +static uint32_t image_addr; + +static uint32_t image_scan(uint32_t start_addr, uint32_t end_addr) +{ + struct startup_header *startup_hdr; + uint32_t last_addr = 0xffffffff; + + for (; start_addr < end_addr; start_addr += 4) + { + startup_hdr = (struct startup_header *)start_addr; + if ( (startup_hdr->header_size == sizeof(struct startup_header)) && + (startup_hdr->signature == STARTUP_HDR_SIGNATURE) ) + { + last_addr = start_addr; + break; + } + } + + return last_addr; +} + +static int xc_dom_probe_qnx_ifs(struct xc_dom_image *dom) +{ + struct startup_header *startup_hdr; + + if ( dom->kernel_blob == NULL ) + { + xc_dom_panic(dom->xch, XC_INTERNAL_ERROR, + "%s: no QNX IFS loaded", __FUNCTION__); + return -EINVAL; + } + + image_addr = *(uint32_t *)&dom->kernel_blob; + image_addr = image_scan(image_addr, image_addr + 0x200); + if (image_addr == 0xffffffff) + { + xc_dom_printf(dom->xch, "%s: image is not a QNX IFS", __FUNCTION__); + return -EINVAL; + } + + startup_hdr = (struct startup_header *)image_addr; + if ( (startup_hdr->stored_size + startup_hdr->preboot_size) != dom->kernel_size ) + { + xc_dom_printf(dom->xch, "%s: QNX IFS has wrong size", __FUNCTION__); + return -EINVAL; + } + + return 0; +} + +static int xc_dom_parse_qnx_ifs(struct xc_dom_image *dom) +{ + struct startup_header *startup_hdr; + uint64_t v_start, v_end; + uint64_t rambase = GUEST_RAM_BASE; + + DOMPRINTF_CALLED(dom->xch); + + startup_hdr = (struct startup_header *)image_addr; + + dom->rambase_pfn = rambase >> XC_PAGE_SHIFT; + + /* Do not load kernel at the very first RAM address */ + v_start = rambase + 0x8000; + v_end = v_start + dom->kernel_size; + + /* find kernel segment */ + dom->kernel_seg.vstart = v_start; + dom->kernel_seg.vend = v_end; + + dom->parms.virt_entry = startup_hdr->startup_vaddr; + dom->parms.virt_base = rambase; + + dom->guest_type = "xen-3.0-armv7l"; + DOMPRINTF("%s: %s: RAM starts at %"PRI_xen_pfn, + __FUNCTION__, dom->guest_type, dom->rambase_pfn); + DOMPRINTF("%s: %s: 0x%" PRIx64 " -> 0x%" PRIx64 "", + __FUNCTION__, dom->guest_type, + dom->kernel_seg.vstart, dom->kernel_seg.vend); + + return 0; +} + +static int xc_dom_load_qnx_ifs(struct xc_dom_image *dom) +{ + void *dst; + + DOMPRINTF_CALLED(dom->xch); + + dst = xc_dom_seg_to_ptr(dom, &dom->kernel_seg); + if ( dst == NULL ) + { + DOMPRINTF("%s: xc_dom_seg_to_ptr(dom, &dom->kernel_seg) => NULL", + __func__); + return -1; + } + + DOMPRINTF("%s: kernel seg %#"PRIx64"-%#"PRIx64, + __func__, dom->kernel_seg.vstart, dom->kernel_seg.vend); + DOMPRINTF("%s: copy %zd bytes from blob %p to dst %p", + __func__, dom->kernel_size, dom->kernel_blob, dst); + + memcpy(dst, dom->kernel_blob, dom->kernel_size); + + return 0; +} + +static struct xc_dom_loader qnx_ifs_loader = { + .name = "QNX IFS", + .probe = xc_dom_probe_qnx_ifs, + .parser = xc_dom_parse_qnx_ifs, + .loader = xc_dom_load_qnx_ifs, +}; + +static void __init register_loader(void) +{ + xc_dom_register_loader(&qnx_ifs_loader); +} + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ -- 1.9.1 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |