]> xenbits.xen.org Git - xenclient/xen.git/commitdiff
patch hvm_build_copy_bios
authorVincent Hanquez <vincent@snarc.org>
Wed, 17 Dec 2008 17:32:01 +0000 (17:32 +0000)
committerVincent Hanquez <vincent@snarc.org>
Wed, 17 Dec 2008 17:32:01 +0000 (17:32 +0000)
tools/libxc/xc_hvm_build.c

index 752c4e76dcd2f3f4bdb209d73ce4a9af60dd49a4..983bfe5a06d63f261929c8c1550d420d17429a58 100644 (file)
@@ -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);