⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xc_dom_ia64_util.c

📁 xen虚拟机源代码安装包
💻 C
字号:
/* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, 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 <assert.h>#include "xg_private.h"#include "xc_dom.h"#include "asm/dom_fw.h"#include "asm/dom_fw_common.h"#include "ia64/xc_dom_ia64_util.h"uint32_txen_ia64_version(struct xc_dom_image *dom){    return xc_version(dom->guest_xc, XENVER_version, NULL);   }intxen_ia64_fpswa_revision(struct xc_dom_image *dom, unsigned int *revision){    int ret;    DECLARE_HYPERCALL;    hypercall.op     = __HYPERVISOR_ia64_dom0vp_op;    hypercall.arg[0] = IA64_DOM0VP_fpswa_revision;    hypercall.arg[1] = (unsigned long)revision;    if (lock_pages(revision, sizeof(*revision)) != 0) {        PERROR("Could not lock memory for xen fpswa hypercall");        return -1;    }    ret = do_xen_hypercall(dom->guest_xc, &hypercall);        unlock_pages(revision, sizeof(*revision));    return ret;}int xen_ia64_is_running_on_sim(struct xc_dom_image *dom){    /*     * This is only used by dom_fw_init() as     * "!xen_ia64_is_dom0() || xen_ia64_is_running_on_sim()".     * So this doesn't affect the result.     */    return 0;}intxen_ia64_is_dom0(struct xc_dom_image *unused){    /* libxc is for non-dom0 domain builder */    return 0;}void*xen_ia64_dom_fw_map(struct xc_dom_image *dom, unsigned long mpaddr){    unsigned long page_size = XC_DOM_PAGE_SIZE(dom);    void* ret;        ret = xc_map_foreign_range(dom->guest_xc, dom->guest_domid,                               page_size, PROT_READ | PROT_WRITE,                               mpaddr / page_size);    if (ret != NULL)        ret = (void*)((unsigned long)ret | (mpaddr & (page_size - 1)));    return ret;}voidxen_ia64_dom_fw_unmap(struct xc_dom_image *dom, void *vaddr){    unsigned long page_size = XC_DOM_PAGE_SIZE(dom);    munmap((void*)((unsigned long)vaddr & ~(page_size - 1)), page_size);}intxen_ia64_is_vcpu_allocated(struct xc_dom_image *dom, uint32_t vcpu){    // return d->vcpu[vcpu] != NULL;    int rc;    xc_vcpuinfo_t info;    rc = xc_vcpu_getinfo(dom->guest_xc, dom->guest_domid,                         vcpu, &info);    if (rc == 0)        return 1;    if (errno != ESRCH)        PERROR("Could not get vcpu info");    return 0;}intxen_ia64_dom_fw_setup(struct xc_dom_image *d, uint64_t brkimm,                      unsigned long bp_mpa, unsigned long maxmem){    int rc = 0;    void *imva_hypercall_base = NULL;    struct fw_tables *fw_tables = NULL;    struct fake_acpi_tables *imva = NULL;    struct xen_ia64_boot_param *bp = NULL;    BUILD_BUG_ON(sizeof(struct fw_tables) >                 (FW_TABLES_END_PADDR_MIN - FW_TABLES_BASE_PADDR));    /* Create page for hypercalls.  */    imva_hypercall_base = xen_ia64_dom_fw_map(d, FW_HYPERCALL_BASE_PADDR);    if (imva_hypercall_base == NULL) {        rc = -errno;        goto out;    }    /* Create page for FW tables.  */    fw_tables = (struct fw_tables*)xen_ia64_dom_fw_map(d, FW_TABLES_BASE_PADDR);    if (fw_tables == NULL) {        rc = -errno;        goto out;    }    memset(fw_tables, 0, FW_TABLES_END_PADDR_MIN - FW_TABLES_BASE_PADDR);    BUILD_BUG_ON(FW_END_PADDR_MIN != FW_TABLES_END_PADDR_MIN);    fw_tables->fw_tables_size = FW_TABLES_END_PADDR_MIN - FW_TABLES_BASE_PADDR;    fw_tables->fw_end_paddr = FW_END_PADDR_MIN;    fw_tables->fw_tables_end_paddr = FW_TABLES_END_PADDR_MIN;    fw_tables->num_mds = 0;            /* Create page for acpi tables.  */    imva = (struct fake_acpi_tables *)        xen_ia64_dom_fw_map(d, FW_ACPI_BASE_PADDR);    if (imva == NULL) {        rc = -errno;        goto out;    }    dom_fw_fake_acpi(d, imva);    /* Create page for boot_param.  */    bp = xen_ia64_dom_fw_map(d, bp_mpa);    if (bp == NULL) {        rc = -errno;        goto out;    }    rc = dom_fw_init(d, brkimm, bp, fw_tables,                     (unsigned long)imva_hypercall_base, maxmem);    BUG_ON(fw_tables->fw_tables_size < sizeof(*fw_tables) +           sizeof(fw_tables->efi_memmap[0]) * fw_tables->num_mds);    /* clear domain builder internal use member */    fw_tables->fw_tables_size = 0;    fw_tables->fw_end_paddr = 0;    fw_tables->fw_tables_end_paddr = 0;    fw_tables->num_mds = 0;     out:    if (imva_hypercall_base != NULL)        xen_ia64_dom_fw_unmap(d, imva_hypercall_base);    if (fw_tables != NULL)        xen_ia64_dom_fw_unmap(d, fw_tables);    if (imva != NULL)        xen_ia64_dom_fw_unmap(d, imva);    if (bp != NULL)        xen_ia64_dom_fw_unmap(d, bp);    return rc;}/* * Local variables: * mode: C * c-set-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil * End: */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -