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

📄 xc_ia64_hvm_build.c

📁 xen虚拟机源代码安装包
💻 C
📖 第 1 页 / 共 3 页
字号:
#include <asm/kregs.h>#include "xg_private.h"#include "xenguest.h"#include "xc_private.h"#include "xc_elf.h"#include "xc_efi.h"#include <stdlib.h>#include <unistd.h>#include <assert.h>#include <zlib.h>#include "xen/arch-ia64.h"#include <xen/hvm/ioreq.h>#include <xen/hvm/params.h>static intxc_ia64_copy_to_domain_pages(int xc_handle, uint32_t domid, void* src_page,                             unsigned long dst_pfn, int nr_pages){    // N.B. gva should be page aligned    int i;    for (i = 0; i < nr_pages; i++) {        if (xc_copy_to_domain_page(xc_handle, domid, dst_pfn + i,                                   src_page + (i << PAGE_SHIFT)))            return -1;    }    return 0;}#define HOB_SIGNATURE         0x3436474953424f48        // "HOBSIG64"#define GFW_HOB_START         ((4UL<<30)-(14UL<<20))    // 4G - 14M#define GFW_HOB_SIZE          (1UL<<20)                 // 1Mtypedef struct {    unsigned long signature;    unsigned int  type;    unsigned int  length;} HOB_GENERIC_HEADER;/* * INFO HOB is the first data data in one HOB list * it contains the control information of the HOB list */typedef struct {    HOB_GENERIC_HEADER  header;    unsigned long       length;    // current length of hob    unsigned long       cur_pos;   // current poisiton of hob    unsigned long       buf_size;  // size of hob buffer} HOB_INFO;typedef struct{    unsigned long start;    unsigned long size;} hob_mem_t;typedef enum {    HOB_TYPE_INFO=0,    HOB_TYPE_TERMINAL,    HOB_TYPE_MEM,    HOB_TYPE_PAL_BUS_GET_FEATURES_DATA,    HOB_TYPE_PAL_CACHE_SUMMARY,    HOB_TYPE_PAL_MEM_ATTRIB,    HOB_TYPE_PAL_CACHE_INFO,    HOB_TYPE_PAL_CACHE_PROT_INFO,    HOB_TYPE_PAL_DEBUG_INFO,    HOB_TYPE_PAL_FIXED_ADDR,    HOB_TYPE_PAL_FREQ_BASE,    HOB_TYPE_PAL_FREQ_RATIOS,    HOB_TYPE_PAL_HALT_INFO,    HOB_TYPE_PAL_PERF_MON_INFO,    HOB_TYPE_PAL_PROC_GET_FEATURES,    HOB_TYPE_PAL_PTCE_INFO,    HOB_TYPE_PAL_REGISTER_INFO,    HOB_TYPE_PAL_RSE_INFO,    HOB_TYPE_PAL_TEST_INFO,    HOB_TYPE_PAL_VM_SUMMARY,    HOB_TYPE_PAL_VM_INFO,    HOB_TYPE_PAL_VM_PAGE_SIZE,    HOB_TYPE_NR_VCPU,    HOB_TYPE_NVRAM,    HOB_TYPE_MAX} hob_type_t;static int hob_init(void  *buffer ,unsigned long buf_size);static int add_pal_hob(void* hob_buf);static int add_mem_hob(void* hob_buf, unsigned long dom_mem_size);static int add_vcpus_hob(void* hob_buf, unsigned long nr_vcpu);static int add_nvram_hob(void* hob_buf, unsigned long nvram_addr);static int build_hob(void* hob_buf, unsigned long hob_buf_size,                     unsigned long dom_mem_size, unsigned long vcpus,                     unsigned long nvram_addr);static int load_hob(int xc_handle,uint32_t dom, void *hob_buf,                    unsigned long dom_mem_size);static intxc_ia64_build_hob(int xc_handle, uint32_t dom,                  unsigned long memsize, unsigned long vcpus,                  unsigned long nvram_addr){    char   *hob_buf;    hob_buf = malloc(GFW_HOB_SIZE);    if (hob_buf == NULL) {        PERROR("Could not allocate hob");        return -1;    }    if (build_hob(hob_buf, GFW_HOB_SIZE, memsize, vcpus, nvram_addr) < 0) {        free(hob_buf);        PERROR("Could not build hob");        return -1;    }    if (load_hob(xc_handle, dom, hob_buf, memsize) < 0) {        free(hob_buf);        PERROR("Could not load hob");        return -1;    }    free(hob_buf);    return 0;}static inthob_init(void *buffer, unsigned long buf_size){    HOB_INFO *phit;    HOB_GENERIC_HEADER *terminal;    if (sizeof(HOB_INFO) + sizeof(HOB_GENERIC_HEADER) > buf_size) {        // buffer too small        return -1;    }    phit = (HOB_INFO*)buffer;    phit->header.signature = HOB_SIGNATURE;    phit->header.type = HOB_TYPE_INFO;    phit->header.length = sizeof(HOB_INFO);    phit->length = sizeof(HOB_INFO) + sizeof(HOB_GENERIC_HEADER);    phit->cur_pos = 0;    phit->buf_size = buf_size;    terminal = (HOB_GENERIC_HEADER*)(buffer + sizeof(HOB_INFO));    terminal->signature = HOB_SIGNATURE;    terminal->type = HOB_TYPE_TERMINAL;    terminal->length = sizeof(HOB_GENERIC_HEADER);    return 0;}/* *  Add a new HOB to the HOB List. * *  hob_start  -  start address of hob buffer *  type       -  type of the hob to be added *  data       -  data of the hob to be added *  data_size  -  size of the data */static inthob_add(void* hob_start, int type, void* data, int data_size){    HOB_INFO *phit;    HOB_GENERIC_HEADER *newhob, *tail;    phit = (HOB_INFO*)hob_start;    if (phit->length + data_size > phit->buf_size) {        // no space for new hob        return -1;    }    //append new HOB    newhob = (HOB_GENERIC_HEADER*)(hob_start + phit->length -                                   sizeof(HOB_GENERIC_HEADER));    newhob->signature = HOB_SIGNATURE;    newhob->type = type;    newhob->length = data_size + sizeof(HOB_GENERIC_HEADER);    memcpy((void*)newhob + sizeof(HOB_GENERIC_HEADER), data, data_size);    // append terminal HOB    tail = (HOB_GENERIC_HEADER*)(hob_start + phit->length + data_size);    tail->signature = HOB_SIGNATURE;    tail->type = HOB_TYPE_TERMINAL;    tail->length = sizeof(HOB_GENERIC_HEADER);    // adjust HOB list length    phit->length += sizeof(HOB_GENERIC_HEADER) + data_size;    return 0;}static intget_hob_size(void* hob_buf){    HOB_INFO *phit = (HOB_INFO*)hob_buf;    if (phit->header.signature != HOB_SIGNATURE) {        PERROR("xc_get_hob_size:Incorrect signature");        return -1;    }    return phit->length;}static intbuild_hob(void* hob_buf, unsigned long hob_buf_size,          unsigned long dom_mem_size, unsigned long vcpus,          unsigned long nvram_addr){    //Init HOB List    if (hob_init(hob_buf, hob_buf_size) < 0) {        PERROR("buffer too small");        goto err_out;    }    if (add_mem_hob(hob_buf,dom_mem_size) < 0) {        PERROR("Add memory hob failed, buffer too small");        goto err_out;    }    if (add_vcpus_hob(hob_buf, vcpus) < 0) {        PERROR("Add NR_VCPU hob failed, buffer too small");        goto err_out;    }    if (add_pal_hob( hob_buf ) < 0) {        PERROR("Add PAL hob failed, buffer too small");        goto err_out;    }    if (add_nvram_hob( hob_buf, nvram_addr ) < 0) {        PERROR("Add nvram hob failed, buffer too small");        goto err_out;    }    return 0;err_out:    return -1;}static intload_hob(int xc_handle, uint32_t dom, void *hob_buf,         unsigned long dom_mem_size){    // hob_buf should be page aligned    int hob_size;    int nr_pages;    hob_size = get_hob_size(hob_buf);    if (hob_size < 0) {        PERROR("Invalid hob data");        return -1;    }    if (hob_size > GFW_HOB_SIZE) {        PERROR("No enough memory for hob data");        return -1;    }    nr_pages = (hob_size + PAGE_SIZE -1) >> PAGE_SHIFT;    return xc_ia64_copy_to_domain_pages(xc_handle, dom, hob_buf,                                        GFW_HOB_START >> PAGE_SHIFT, nr_pages);}#define MIN(x, y) ((x) < (y)) ? (x) : (y)static intadd_mem_hob(void* hob_buf, unsigned long dom_mem_size){    hob_mem_t memhob;    // less than 3G    memhob.start = 0;    memhob.size = MIN(dom_mem_size, 0xC0000000);    if (hob_add(hob_buf, HOB_TYPE_MEM, &memhob, sizeof(memhob)) < 0)        return -1;    if (dom_mem_size > 0xC0000000) {        // 4G ~ 4G+remain        memhob.start = 0x100000000; //4G        memhob.size = dom_mem_size - 0xC0000000;        if (hob_add(hob_buf, HOB_TYPE_MEM, &memhob, sizeof(memhob)) < 0)            return -1;    }    return 0;}static int add_vcpus_hob(void* hob_buf, unsigned long vcpus){    return hob_add(hob_buf, HOB_TYPE_NR_VCPU, &vcpus, sizeof(vcpus));}static intadd_nvram_hob(void *hob_buf, unsigned long nvram_addr){    return hob_add(hob_buf, HOB_TYPE_NVRAM, &nvram_addr, sizeof(nvram_addr));}static const unsigned char config_pal_bus_get_features_data[24] = {    0, 0, 0, 32, 0, 0, 240, 189, 0, 0, 0, 0, 0, 0,    0, 0, 0, 0, 0, 0, 0, 0, 0, 0};static const unsigned char config_pal_cache_summary[16] = {    3, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0};static const unsigned char config_pal_mem_attrib[8] = {    241, 0, 0, 0, 0, 0, 0, 0};static const unsigned char config_pal_cache_info[152] = {    3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,    6, 4, 6, 7, 255, 1, 0, 1, 0, 64, 0, 0, 12, 12,    49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 7, 0, 1,    0, 1, 0, 64, 0, 0, 12, 12, 49, 0, 0, 0, 0, 0, 0,    0, 0, 0, 6, 8, 7, 7, 255, 7, 0, 11, 0, 0, 16, 0,    12, 17, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 8, 7,    7, 7, 5, 9, 11, 0, 0, 4, 0, 12, 15, 49, 0, 254, 255,    255, 255, 255, 255, 255, 255, 2, 8, 7, 7, 7, 5, 9,    11, 0, 0, 4, 0, 12, 15, 49, 0, 0, 0, 0, 0, 0, 0, 0,    0, 3, 12, 7, 7, 7, 14, 1, 3, 0, 0, 192, 0, 12, 20, 49, 0};static const unsigned char config_pal_cache_prot_info[200] = {    3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,    45, 0, 16, 8, 0, 76, 12, 64, 0, 0, 0, 0, 0, 0, 0,    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,    8, 0, 16, 4, 0, 76, 44, 68, 0, 0, 0, 0, 0, 0, 0, 0,    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,    0, 16, 8, 0, 81, 44, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0,    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0,    112, 12, 0, 79, 124, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,    0, 0, 0, 0, 0, 0, 254, 255, 255, 255, 255, 255, 255, 255,    32, 0, 112, 12, 0, 79, 124, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0,    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 160,    12, 0, 84, 124, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,    0, 0, 0};static const unsigned char config_pal_debug_info[16] = {    2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0};static const unsigned char config_pal_fixed_addr[8] = {    0, 0, 0, 0, 0, 0, 0, 0};static const unsigned char config_pal_freq_base[8] = {    109, 219, 182, 13, 0, 0, 0, 0};static const unsigned char config_pal_freq_ratios[24] = {    11, 1, 0, 0, 77, 7, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 4,    0, 0, 0, 7, 0, 0, 0};static const unsigned char config_pal_halt_info[64] = {    0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0,    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};static const unsigned char config_pal_perf_mon_info[136] = {    12, 47, 18, 8, 0, 0, 0, 0, 241, 255, 0, 0, 255, 7, 0, 0,    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,    0, 0, 0, 0, 0, 0, 0, 0, 241, 255, 0, 0, 223, 0, 255, 255,    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,    0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 0, 0, 0, 0, 0, 0,    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,    0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 0, 0, 0, 0, 0, 0,    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,    0, 0, 0, 0, 0, 0, 0, 0};static const unsigned char config_pal_proc_get_features[104] = {    3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,    0, 0, 0, 0, 64, 6, 64, 49, 0, 0, 0, 0, 64, 6, 0, 0,    0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0,    231, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0,    0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,    63, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0,    0, 0, 0, 0, 0, 0, 0, 0};static const unsigned char config_pal_ptce_info[24] = {    0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,    0, 0, 0, 0, 0, 0, 0, 0};

⌨️ 快捷键说明

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