aboutsummaryrefslogtreecommitdiffstats
path: root/tools/libxc/xc_core_ia64.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/libxc/xc_core_ia64.c')
-rw-r--r--tools/libxc/xc_core_ia64.c380
1 files changed, 0 insertions, 380 deletions
diff --git a/tools/libxc/xc_core_ia64.c b/tools/libxc/xc_core_ia64.c
deleted file mode 100644
index 7411e3e22f..0000000000
--- a/tools/libxc/xc_core_ia64.c
+++ /dev/null
@@ -1,380 +0,0 @@
-/*
- * 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; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * 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
- *
- * Copyright (c) 2007 Isaku Yamahata <yamahata at valinux co jp>
- * VA Linux Systems Japan K.K.
- *
- */
-
-#include "xg_private.h"
-#include "xc_core.h"
-#include "xc_efi.h"
-#include "xc_dom.h"
-#include <inttypes.h>
-
-int
-xc_core_arch_gpfn_may_present(struct xc_core_arch_context *arch_ctxt,
- unsigned long pfn)
-{
- if (arch_ctxt->p2m_table.p2m == NULL)
- return 1; /* default to trying to map the page */
-
- return xc_ia64_p2m_present(&arch_ctxt->p2m_table, pfn);
-}
-
-static int
-xc_memory_map_cmp(const void *lhs__, const void *rhs__)
-{
- const struct xc_core_memory_map *lhs =
- (const struct xc_core_memory_map *)lhs__;
- const struct xc_core_memory_map *rhs =
- (const struct xc_core_memory_map *)rhs__;
-
- if (lhs->addr < rhs->addr)
- return -1;
- if (lhs->addr > rhs->addr)
- return 1;
-
- /* memory map overlap isn't allowed. complain */
-#ifdef DEBUG
- fprintf(stderr, "duplicated addresses are detected "
- "(0x%" PRIx64 ", 0x%" PRIx64 "), "
- "(0x%" PRIx64 ", 0x%" PRIx64 ")\n",
- lhs->addr, lhs->size, rhs->addr, rhs->size);
-#endif
- return 0;
-}
-
-int
-xc_core_arch_auto_translated_physmap(const xc_dominfo_t *info)
-{
- /*
- * on ia64, both paravirtualize domain and hvm domain are
- * auto_translated_physmap mode
- */
- return 1;
-}
-
-/* see setup_guest() @ xc_linux_build.c */
-static int
-memory_map_get_old_domu(xc_interface *xch, xc_dominfo_t *info,
- shared_info_any_t *live_shinfo,
- xc_core_memory_map_t **mapp, unsigned int *nr_entries)
-{
- xc_core_memory_map_t *map = NULL;
-
- map = malloc(sizeof(*map));
- if ( map == NULL )
- {
- PERROR("Could not allocate memory");
- goto out;
- }
-
- map->addr = 0;
- map->size = info->max_memkb * 1024;
-
- *mapp = map;
- *nr_entries = 1;
- return 0;
-
-out:
- if ( map != NULL )
- free(map);
- return -1;
-}
-
-/* see setup_guest() @ xc_ia64_hvm_build.c */
-static int
-memory_map_get_old_hvm(xc_interface *xch, xc_dominfo_t *info,
- shared_info_any_t *live_shinfo,
- xc_core_memory_map_t **mapp, unsigned int *nr_entries)
-{
- const xc_core_memory_map_t gfw_map[] = {
- {IO_PAGE_START, IO_PAGE_SIZE},
- {STORE_PAGE_START, STORE_PAGE_SIZE},
- {BUFFER_IO_PAGE_START, BUFFER_IO_PAGE_SIZE},
- {BUFFER_PIO_PAGE_START, BUFFER_PIO_PAGE_SIZE},
- {GFW_START, GFW_SIZE},
- };
- const unsigned int nr_gfw_map = sizeof(gfw_map)/sizeof(gfw_map[0]);
- xc_core_memory_map_t *map = NULL;
- unsigned int i;
-
-#define VGA_IO_END (VGA_IO_START + VGA_IO_SIZE)
- /* [0, VGA_IO_START) [VGA_IO_END, 3GB), [4GB, ...) + gfw_map */
- map = malloc((3 + nr_gfw_map) * sizeof(*map));
- if ( map == NULL )
- {
- PERROR("Could not allocate memory");
- goto out;
- }
-
- for ( i = 0; i < nr_gfw_map; i++ )
- map[i] = gfw_map[i];
- map[i].addr = 0;
- map[i].size = info->max_memkb * 1024;
- i++;
- if ( map[i - 1].size < VGA_IO_END )
- {
- map[i - 1].size = VGA_IO_START;
- }
- else
- {
- map[i].addr = VGA_IO_END;
- map[i].size = map[i - 1].size - VGA_IO_END;
- map[i - 1].size = VGA_IO_START;
- i++;
- if ( map[i - 1].addr + map[i - 1].size > MMIO_START )
- {
- map[i].addr = MMIO_START + 1 * MEM_G;
- map[i].size = map[i - 1].addr + map[i - 1].size - MMIO_START;
- map[i - 1].size = MMIO_START - map[i - 1].addr;
- i++;
- }
- }
- *mapp = map;
- *nr_entries = i;
- qsort(map, *nr_entries, sizeof(map[0]), &xc_memory_map_cmp);
- return 0;
-
-out:
- if ( map != NULL )
- free(map);
- return -1;
-}
-
-static int
-memory_map_get_old(xc_interface *xch, xc_dominfo_t *info,
- shared_info_any_t *live_shinfo,
- xc_core_memory_map_t **mapp, unsigned int *nr_entries)
-{
- if ( info->hvm )
- return memory_map_get_old_hvm(xch, info, live_shinfo,
- mapp, nr_entries);
- if ( live_shinfo == NULL )
- return -1;
- return memory_map_get_old_domu(xch, info, live_shinfo,
- mapp, nr_entries);
-}
-
-int
-xc_core_arch_memory_map_get(xc_interface *xch,
- struct xc_core_arch_context *arch_ctxt,
- xc_dominfo_t *info,
- shared_info_any_t *live_shinfo,
- xc_core_memory_map_t **mapp,
- unsigned int *nr_entries)
-{
- int ret = -1;
-
- xen_ia64_memmap_info_t *memmap_info = NULL;
- xc_core_memory_map_t *map;
- char *start;
- char *end;
- char *p;
- efi_memory_desc_t *md;
-
- if ( live_shinfo == NULL )
- {
- ERROR("can't access shared info");
- goto old;
- }
-
- /* copy before use in case someone updating them */
- if (xc_ia64_copy_memmap(xch, info->domid, &live_shinfo->s,
- &memmap_info, NULL)) {
- goto old;
- }
-
- *nr_entries = memmap_info->efi_memmap_size / memmap_info->efi_memdesc_size;
- map = malloc(*nr_entries * sizeof(*md));
- if ( map == NULL )
- {
- PERROR("Could not allocate memory for memmap.");
- free(memmap_info);
- return -1;
- }
- *mapp = map;
-
- *nr_entries = 0;
- start = (char*)&memmap_info->memdesc;
- end = start + memmap_info->efi_memmap_size;
- for ( p = start; p < end; p += memmap_info->efi_memdesc_size )
- {
- md = (efi_memory_desc_t*)p;
- if ( md->type != EFI_CONVENTIONAL_MEMORY ||
- md->attribute != EFI_MEMORY_WB ||
- md->num_pages == 0 )
- continue;
-
- map[*nr_entries].addr = md->phys_addr;
- map[*nr_entries].size = md->num_pages << EFI_PAGE_SHIFT;
- (*nr_entries)++;
- }
- ret = 0;
-
- xc_ia64_p2m_map(&arch_ctxt->p2m_table, xch, info->domid,
- memmap_info, 0);
- if ( memmap_info != NULL )
- free(memmap_info);
- qsort(map, *nr_entries, sizeof(map[0]), &xc_memory_map_cmp);
- return ret;
-
-old:
- DPRINTF("Falling back old method.\n");
- return memory_map_get_old(xch, info, live_shinfo, mapp, nr_entries);
-}
-
-int
-xc_core_arch_map_p2m(xc_interface *xch, unsigned int guest_width, xc_dominfo_t *info,
- shared_info_any_t *live_shinfo, xen_pfn_t **live_p2m,
- unsigned long *pfnp)
-{
- /*
- * on ia64, both paravirtualize domain and hvm domain are
- * auto_translated_physmap mode
- */
- errno = ENOSYS;
- return -1;
-}
-
-void
-xc_core_arch_context_init(struct xc_core_arch_context* arch_ctxt)
-{
- arch_ctxt->mapped_regs_size =
- (XMAPPEDREGS_SIZE < PAGE_SIZE) ? PAGE_SIZE: XMAPPEDREGS_SIZE;
- arch_ctxt->nr_vcpus = 0;
- arch_ctxt->mapped_regs = NULL;
-
- xc_ia64_p2m_init(&arch_ctxt->p2m_table);
-}
-
-void
-xc_core_arch_context_free(struct xc_core_arch_context* arch_ctxt)
-{
- int i;
- for ( i = 0; i < arch_ctxt->nr_vcpus; i++ )
- if ( arch_ctxt->mapped_regs[i] != NULL )
- munmap(arch_ctxt->mapped_regs[i], arch_ctxt->mapped_regs_size);
- free(arch_ctxt->mapped_regs);
- xc_ia64_p2m_unmap(&arch_ctxt->p2m_table);
-}
-
-int
-xc_core_arch_context_get(struct xc_core_arch_context* arch_ctxt,
- vcpu_guest_context_any_t* ctxt_any,
- xc_interface *xch, uint32_t domid)
-{
- vcpu_guest_context_t *ctxt = &ctxt_any->c;
- mapped_regs_t* mapped_regs;
-
- if ( ctxt->privregs_pfn == VGC_PRIVREGS_HVM )
- return 0; /* VTi domain case */
-
- if ( ctxt->privregs_pfn == INVALID_P2M_ENTRY )
- {
- PERROR("Could not get mmapped privregs gmfn");
- errno = ENOENT;
- return -1;
- }
- if ( !(arch_ctxt->nr_vcpus & (arch_ctxt->nr_vcpus - 1)) ) {
- unsigned int nr = arch_ctxt->nr_vcpus ? arch_ctxt->nr_vcpus << 1 : 1;
- mapped_regs_t** new = realloc(arch_ctxt->mapped_regs,
- nr * sizeof(*new));
-
- if ( !new )
- {
- PERROR("Could not alloc mapped regs pointer array");
- return -1;
- }
- memset(new + arch_ctxt->nr_vcpus, 0,
- (nr - arch_ctxt->nr_vcpus) * sizeof(*new));
- arch_ctxt->mapped_regs = new;
- }
-
- mapped_regs = xc_map_foreign_range(xch, domid,
- arch_ctxt->mapped_regs_size,
- PROT_READ, ctxt->privregs_pfn);
- if ( mapped_regs == NULL )
- {
- PERROR("Could not map mapped privregs");
- return -1;
- }
- arch_ctxt->mapped_regs[arch_ctxt->nr_vcpus] = mapped_regs;
- arch_ctxt->nr_vcpus++;
- return 0;
-}
-
-int
-xc_core_arch_context_get_shdr(xc_interface *xch,
- struct xc_core_arch_context *arch_ctxt,
- struct xc_core_section_headers *sheaders,
- struct xc_core_strtab *strtab,
- uint64_t *filesz, uint64_t offset)
-{
- int sts = -1;
- Elf64_Shdr *shdr;
-
- if ( arch_ctxt->nr_vcpus == 0 )
- {
- /* VTi domain case */
- *filesz = 0;
- return 0;
- }
-
- /* mmapped priv regs */
- shdr = xc_core_shdr_get(xch, sheaders);
- if ( shdr == NULL )
- {
- PERROR("Could not get section header for .xen_ia64_mapped_regs");
- return sts;
- }
- *filesz = arch_ctxt->mapped_regs_size * arch_ctxt->nr_vcpus;
- sts = xc_core_shdr_set(xch, shdr, strtab,
- XEN_DUMPCORE_SEC_IA64_MAPPED_REGS,
- SHT_PROGBITS, offset, *filesz,
- __alignof__(*arch_ctxt->mapped_regs[0]),
- arch_ctxt->mapped_regs_size);
- return sts;
-}
-
-int
-xc_core_arch_context_dump(xc_interface *xch,
- struct xc_core_arch_context* arch_ctxt,
- void* args, dumpcore_rtn_t dump_rtn)
-{
- int sts = 0;
- int i;
-
- /* ia64 mapped_regs: .xen_ia64_mapped_regs */
- for ( i = 0; i < arch_ctxt->nr_vcpus; i++ )
- {
- sts = dump_rtn(xch, args, (char*)arch_ctxt->mapped_regs[i],
- arch_ctxt->mapped_regs_size);
- if ( sts != 0 )
- break;
- }
- return sts;
-}
-
-/*
- * Local variables:
- * mode: C
- * c-set-style: "BSD"
- * c-basic-offset: 4
- * tab-width: 4
- * indent-tabs-mode: nil
- * End:
- */