📄 xc_ia64_hvm_build.c
字号:
#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 + -