aboutsummaryrefslogtreecommitdiffstats
path: root/tools/libxc/xc_dom_ia64.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/libxc/xc_dom_ia64.c')
-rw-r--r--tools/libxc/xc_dom_ia64.c334
1 files changed, 0 insertions, 334 deletions
diff --git a/tools/libxc/xc_dom_ia64.c b/tools/libxc/xc_dom_ia64.c
deleted file mode 100644
index dcd1523936..0000000000
--- a/tools/libxc/xc_dom_ia64.c
+++ /dev/null
@@ -1,334 +0,0 @@
-/*
- * Xen domain builder -- ia64 bits.
- *
- * Most architecture-specific code for ia64 goes here.
- * - fill architecture-specific structs.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * written 2006 by Gerd Hoffmann <kraxel@suse.de>.
- *
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <inttypes.h>
-#include <assert.h>
-#include <asm/kregs.h>
-
-#include <xen/xen.h>
-#include <xen/foreign/ia64.h>
-#include <xen/io/protocols.h>
-
-#include "xg_private.h"
-#include "xc_dom.h"
-#include "xenctrl.h"
-
-#include <asm/dom_fw_common.h>
-#include "ia64/xc_dom_ia64_util.h"
-
-/* ------------------------------------------------------------------------ */
-
-static int alloc_magic_pages(struct xc_dom_image *dom)
-{
- /* allocate special pages */
- dom->console_pfn = dom->total_pages -1;
- dom->xenstore_pfn = dom->total_pages -2;
- dom->start_info_pfn = dom->total_pages -3;
- return 0;
-}
-
-int start_info_ia64(struct xc_dom_image *dom)
-{
- start_info_ia64_t *start_info =
- xc_dom_pfn_to_ptr(dom, dom->start_info_pfn, 1);
- struct xen_ia64_boot_param_ia64 *bp =
- (struct xen_ia64_boot_param_ia64 *)(start_info + 1);
-
- DOMPRINTF_CALLED(dom->xch);
-
- memset(start_info, 0, sizeof(*start_info));
- sprintf(start_info->magic, dom->guest_type);
- start_info->flags = dom->flags;
- start_info->nr_pages = dom->total_pages;
- start_info->store_mfn = dom->xenstore_pfn;
- start_info->store_evtchn = dom->xenstore_evtchn;
- start_info->console.domU.mfn = dom->console_pfn;
- start_info->console.domU.evtchn = dom->console_evtchn;
-
- /*
- * domain_start and domain_size are abused for arch_setup hypercall
- * so that we need to clear them here.
- */
- XEN_IA64_MEMMAP_INFO_NUM_PAGES(bp) = 0;
- XEN_IA64_MEMMAP_INFO_PFN(bp) = 0;
-
- if ( dom->ramdisk_blob )
- {
- start_info->mod_start = dom->ramdisk_seg.vstart;
- start_info->mod_len = dom->ramdisk_seg.vend - dom->ramdisk_seg.vstart;
- bp->initrd_start = start_info->mod_start;
- bp->initrd_size = start_info->mod_len;
- }
- bp->command_line = (dom->start_info_pfn << PAGE_SHIFT_IA64)
- + offsetof(start_info_t, cmd_line);
- if ( dom->cmdline )
- {
- strncpy((char *)start_info->cmd_line, dom->cmdline, MAX_GUEST_CMDLINE);
- start_info->cmd_line[MAX_GUEST_CMDLINE - 1] = '\0';
- }
- return 0;
-}
-
-int shared_info_ia64(struct xc_dom_image *dom, void *ptr)
-{
- shared_info_ia64_t *shared_info = ptr;
- int i;
-
- DOMPRINTF_CALLED(dom->xch);
-
- memset(shared_info, 0, sizeof(*shared_info));
- for (i = 0; i < XEN_LEGACY_MAX_VCPUS; i++)
- shared_info->vcpu_info[i].evtchn_upcall_mask = 1;
- shared_info->arch.start_info_pfn = dom->start_info_pfn;
- shared_info->arch.memmap_info_num_pages = 1; //XXX
- shared_info->arch.memmap_info_pfn = dom->start_info_pfn - 1;
- return 0;
-}
-
-extern unsigned long xc_ia64_fpsr_default(void);
-
-static int vcpu_ia64(struct xc_dom_image *dom, void *ptr)
-{
- vcpu_guest_context_ia64_t *ctxt = ptr;
-
- DOMPRINTF_CALLED(dom->xch);
-
- /* clear everything */
- memset(ctxt, 0, sizeof(*ctxt));
-
- ctxt->flags = 0;
- /* PSR is set according to SAL 3.2.4: AC, IC and BN are set. */
- ctxt->regs.psr = IA64_PSR_AC | IA64_PSR_IC | IA64_PSR_BN;
- ctxt->regs.ip = dom->parms.virt_entry;
- ctxt->regs.cfm = 1UL << 63;
-#ifdef __ia64__ /* FIXME */
- ctxt->regs.ar.fpsr = xc_ia64_fpsr_default();
-#endif
- ctxt->regs.r[28] = (dom->start_info_pfn << PAGE_SHIFT_IA64)
- + sizeof(start_info_ia64_t);
- return 0;
-}
-
-/* ------------------------------------------------------------------------ */
-
-static struct xc_dom_arch xc_dom_arch = {
- .guest_type = "xen-3.0-ia64",
- .native_protocol = XEN_IO_PROTO_ABI_IA64,
- .page_shift = PAGE_SHIFT_IA64,
- .alloc_magic_pages = alloc_magic_pages,
- .start_info = start_info_ia64,
- .shared_info = shared_info_ia64,
- .vcpu = vcpu_ia64,
-};
-
-static struct xc_dom_arch xc_dom_arch_ia64be = {
- .guest_type = "xen-3.0-ia64be",
- .native_protocol = XEN_IO_PROTO_ABI_IA64,
- .page_shift = PAGE_SHIFT_IA64,
- .alloc_magic_pages = alloc_magic_pages,
- .start_info = start_info_ia64,
- .shared_info = shared_info_ia64,
- .vcpu = vcpu_ia64,
-};
-
-static void __init register_arch_hooks(void)
-{
- xc_dom_register_arch_hooks(&xc_dom_arch);
- xc_dom_register_arch_hooks(&xc_dom_arch_ia64be);
-}
-
-#include "xc_efi.h"
-
-int arch_setup_meminit(struct xc_dom_image *dom)
-{
- xen_pfn_t pfn;
- int rc;
- unsigned long start;
- unsigned long nbr;
-
- /* setup initial p2m */
- if (dom->guest_type && strcmp(dom->guest_type,
- "hvm-3.0-ia64-sioemu") == 0) {
- start = FW_MEM_BASE >> PAGE_SHIFT_IA64;
- nbr = FW_MEM_SIZE >> PAGE_SHIFT_IA64;
- } else {
- start = 0;
- nbr = dom->total_pages;
- }
-
- /* setup initial p2m */
- dom->p2m_host = xc_dom_malloc(dom, sizeof(xen_pfn_t) * nbr);
- for ( pfn = 0; pfn < nbr; pfn++ )
- dom->p2m_host[pfn] = start + pfn;
-
- /* allocate guest memory */
- rc = xc_domain_populate_physmap_exact(dom->xch, dom->guest_domid,
- nbr, 0, 0,
- dom->p2m_host);
- return rc;
-}
-
-static int ia64_setup_memmap(struct xc_dom_image *dom)
-{
- unsigned int page_size = XC_DOM_PAGE_SIZE(dom);
- unsigned long memmap_info_num_pages;
- unsigned long memmap_info_pfn;
- xen_ia64_memmap_info_t* memmap_info;
- unsigned int num_mds;
- efi_memory_desc_t *md;
-
- char* start_info;
- struct xen_ia64_boot_param* bp;
-
- /* setup memmap page */
- memmap_info_num_pages = 1;
- memmap_info_pfn = dom->start_info_pfn - 1;
- DOMPRINTF("%s: memmap: mfn 0x%" PRIpfn " pages 0x%lx",
- __FUNCTION__, memmap_info_pfn, memmap_info_num_pages);
- memmap_info = xc_map_foreign_range(dom->xch, dom->guest_domid,
- page_size * memmap_info_num_pages,
- PROT_READ | PROT_WRITE,
- memmap_info_pfn);
- if (NULL == memmap_info)
- return -1;
- /* [0, total_pages) */
- memmap_info->efi_memdesc_size = sizeof(md[0]);
- memmap_info->efi_memdesc_version = EFI_MEMORY_DESCRIPTOR_VERSION;
- num_mds = 0;
- md = (efi_memory_desc_t*)&memmap_info->memdesc;
- md[num_mds].type = EFI_CONVENTIONAL_MEMORY;
- md[num_mds].pad = 0;
- md[num_mds].phys_addr = 0;
- md[num_mds].virt_addr = 0;
- md[num_mds].num_pages = dom->total_pages << (PAGE_SHIFT - EFI_PAGE_SHIFT);
- md[num_mds].attribute = EFI_MEMORY_WB;
- num_mds++;
- memmap_info->efi_memmap_size = num_mds * sizeof(md[0]);
- munmap(memmap_info, page_size * memmap_info_num_pages);
- assert(num_mds <=
- (page_size * memmap_info_num_pages -
- offsetof(typeof(*memmap_info), memdesc))/sizeof(*md));
-
- /*
- * kludge: we need to pass memmap_info page's pfn and other magic pages
- * somehow.
- * we use xen_ia64_boot_param::efi_memmap::{efi_memmap, efi_memmap_size}
- * for this purpose
- */
- start_info = xc_map_foreign_range(dom->xch, dom->guest_domid,
- page_size,
- PROT_READ | PROT_WRITE,
- dom->start_info_pfn);
- if (NULL == start_info)
- return -1;
- bp = (struct xen_ia64_boot_param*)(start_info + sizeof(start_info_t));
- memset(bp, 0, sizeof(*bp));
- XEN_IA64_MEMMAP_INFO_NUM_PAGES(bp) = memmap_info_num_pages;
- XEN_IA64_MEMMAP_INFO_PFN(bp) = memmap_info_pfn;
- munmap(start_info, page_size);
- return 0;
-}
-
-int arch_setup_bootearly(struct xc_dom_image *dom)
-{
- DECLARE_DOMCTL;
- int rc;
-
- DOMPRINTF("%s: setup firmware for %s", __FUNCTION__, dom->guest_type);
-
- if (dom->guest_type && strcmp(dom->guest_type,
- "hvm-3.0-ia64-sioemu") == 0) {
- memset(&domctl, 0, sizeof(domctl));
- domctl.u.arch_setup.flags = XEN_DOMAINSETUP_sioemu_guest;
- domctl.u.arch_setup.bp = 0;
- domctl.u.arch_setup.maxmem = 0;
- domctl.cmd = XEN_DOMCTL_arch_setup;
- domctl.domain = dom->guest_domid;
- rc = xc_domctl(dom->xch, &domctl);
- DOMPRINTF("%s: hvm-3.0-ia64-sioemu: %d", __FUNCTION__, rc);
- return rc;
- }
-
- rc = ia64_setup_memmap(dom);
- if (rc)
- return rc;
-
- memset(&domctl, 0, sizeof(domctl));
- domctl.cmd = XEN_DOMCTL_arch_setup;
- domctl.domain = dom->guest_domid;
- domctl.u.arch_setup.flags = XEN_DOMAINSETUP_query;
- rc = do_domctl(dom->xch, &domctl);
- if (rc)
- return rc;
- rc = xen_ia64_dom_fw_setup(dom, domctl.u.arch_setup.hypercall_imm,
- (dom->start_info_pfn << PAGE_SHIFT) +
- sizeof(start_info_t),
- dom->total_pages << PAGE_SHIFT);
- if (rc)
- return rc;
-
- memset(&domctl, 0, sizeof(domctl));
- domctl.cmd = XEN_DOMCTL_arch_setup;
- domctl.domain = dom->guest_domid;
- domctl.u.arch_setup.flags = 0;
-
- domctl.u.arch_setup.bp = (dom->start_info_pfn << PAGE_SHIFT)
- + sizeof(start_info_t);
- domctl.u.arch_setup.maxmem = dom->total_pages << PAGE_SHIFT;
- domctl.u.arch_setup.vhpt_size_log2 = dom->vhpt_size_log2;
- rc = do_domctl(dom->xch, &domctl);
- return rc;
-}
-
-int arch_setup_bootlate(struct xc_dom_image *dom)
-{
- unsigned int page_size = XC_DOM_PAGE_SIZE(dom);
- shared_info_t *shared_info;
-
- /* setup shared_info page */
- DOMPRINTF("%s: shared_info: mfn 0x%" PRIpfn "",
- __FUNCTION__, dom->shared_info_mfn);
- shared_info = xc_map_foreign_range(dom->xch, dom->guest_domid,
- page_size,
- PROT_READ | PROT_WRITE,
- dom->shared_info_mfn);
- if ( shared_info == NULL )
- return -1;
- dom->arch_hooks->shared_info(dom, shared_info);
- munmap(shared_info, page_size);
- return 0;
-}
-
-/*
- * Local variables:
- * mode: C
- * c-set-style: "BSD"
- * c-basic-offset: 4
- * tab-width: 4
- * indent-tabs-mode: nil
- * End:
- */