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 -
*(((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)
{
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);