From c39af3413cc672b98d9d3e11289b50c3b6f1db2e Mon Sep 17 00:00:00 2001 From: Vincent Hanquez Date: Wed, 17 Dec 2008 17:32:01 +0000 Subject: [PATCH] patch hvm_build_copy_bios --- tools/libxc/xc_hvm_build.c | 64 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 61 insertions(+), 3 deletions(-) diff --git a/tools/libxc/xc_hvm_build.c b/tools/libxc/xc_hvm_build.c index 752c4e7..983bfe5 100644 --- a/tools/libxc/xc_hvm_build.c +++ b/tools/libxc/xc_hvm_build.c @@ -87,6 +87,12 @@ static void build_e820map(void *e820_page, unsigned long long mem_size) e820entry[nr_map].type = E820_RESERVED; nr_map++; + e820entry[nr_map].addr = 0x7D5AE000; + e820entry[nr_map].size = 0x2000; + e820entry[nr_map].type = E820_NVS; + nr_map++; + + /* Low RAM goes here. Reserve space for special pages. */ e820entry[nr_map].addr = 0x100000; e820entry[nr_map].size = (mem_size - 0x100000 - @@ -111,6 +117,55 @@ static void build_e820map(void *e820_page, unsigned long long mem_size) *(((unsigned char *)e820_page) + HVM_E820_NR_OFFSET) = nr_map; } +static int setup_vga_pt(int xc_handle, + uint32_t dom) +{ + int rc = 0; + unsigned char *bios = NULL; + int bios_size = 0; + char *va_bios = NULL; + uint32_t va_size = 0; + char *c = NULL; + char checksum = 0; + + /* Allocated 64K for the vga bios */ + if (!(bios = malloc(64 * 1024))) + return -1; + +#ifdef __linux__ + bios_size = xc_get_vgabios(bios, 64 * 1024); +#else + bios_size = 0; +#endif /* __linux__ */ + + va_size = bios_size + bios_size % XC_PAGE_SIZE; + if (bios_size == 0) + { + rc = -1; + goto error; + } + va_bios = xc_map_foreign_range(xc_handle, dom, va_size, + PROT_READ | PROT_WRITE, 0xC0); + if (!va_bios) + { + rc = -1; + goto error; + } + + /* Adjust the bios checksum */ + for ( c = (char*)bios; c < ((char*)bios + bios_size); c++ ) + checksum += *c; + if (checksum) + bios[bios_size - 1] -= checksum; + + memcpy(va_bios, bios, bios_size); + munmap(va_bios, va_size); +error: + free(bios); + return rc; +} + + static int loadelfimage( struct elf_binary *elf, int xch, uint32_t dom, unsigned long *parray) { @@ -378,17 +433,20 @@ static inline int is_loadable_phdr(Elf32_Phdr *phdr) int xc_hvm_build(int xc_handle, uint32_t domid, int memsize, - const char *image_name) + const char *image_name, + int vga_pt_enabled) { char *image; - int sts; + int sts = 0; unsigned long image_size; if ( (image_name == NULL) || ((image = xc_read_image(image_name, &image_size)) == NULL) ) return -1; - sts = xc_hvm_build_internal(xc_handle, domid, memsize, image, image_size); + sts |= xc_hvm_build_internal(xc_handle, domid, memsize, image, image_size); + if ( vga_pt_enabled ) + sts |= setup_vga_pt(xc_handle, domid); free(image); -- 2.39.5