]> xenbits.xensource.com Git - xenclient/xen-pq.git/commitdiff
Initialize vgabios and get the vgabios size at offset 2 from vgabios base.
authorKamala Narasimhan <kamala.narasimhan@citrix.com>
Wed, 8 Apr 2009 16:18:08 +0000 (12:18 -0400)
committerKamala Narasimhan <kamala.narasimhan@citrix.com>
Wed, 8 Apr 2009 16:18:08 +0000 (12:18 -0400)
This will help avoid any overlap between vgabios and etherboot base especially in pass-through case.

xen-3.4/init-vgabios-and-set-size [new file with mode: 0644]
xen-3.4/series

diff --git a/xen-3.4/init-vgabios-and-set-size b/xen-3.4/init-vgabios-and-set-size
new file mode 100644 (file)
index 0000000..bde9d6d
--- /dev/null
@@ -0,0 +1,91 @@
+diff --git a/tools/firmware/hvmloader/hvmloader.c b/tools/firmware/hvmloader/hvmloader.c
+index 39aa949..12ac806 100644
+--- a/tools/firmware/hvmloader/hvmloader.c
++++ b/tools/firmware/hvmloader/hvmloader.c
+@@ -672,6 +672,7 @@ int main(void)
+         break;
+     default:
+         printf("No emulated VGA adaptor ...\n");
++        vgabios_sz = round_option_rom((*(uint8_t *)(VGABIOS_PHYSICAL_ADDRESS+2)) * 512);
+         break;
+     }
+diff --git a/tools/libxc/xc_hvm_build.c b/tools/libxc/xc_hvm_build.c
+index 0ba8c44..787f4ec 100644
+--- a/tools/libxc/xc_hvm_build.c
++++ b/tools/libxc/xc_hvm_build.c
+@@ -66,14 +66,35 @@ static void build_hvm_info(void *hvm_info_page, uint64_t mem_size)
+     hvm_info->checksum = -sum;
+ }
++static int init_vgabios(int xc_handle, uint32_t dom, unsigned char *buffer, uint32_t bios_size)
++{
++    char *va_bios = NULL;
++    uint32_t va_size = 0;
++
++    va_size = bios_size + bios_size % XC_PAGE_SIZE; 
++    va_bios = xc_map_foreign_range(xc_handle, dom, va_size,
++                                   PROT_READ | PROT_WRITE, 0xC0);
++    if ( !va_bios )
++    {
++        IPRINTF("Unable to map vga bios!\n");
++        return -1;
++    }
++
++    if ( buffer != NULL )
++        memcpy(va_bios, buffer, bios_size);
++    else
++        memset(va_bios, 0, bios_size);
++
++    munmap(va_bios, va_size);
++    return 0;
++}
++
+ 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;
+@@ -87,16 +108,9 @@ static int  setup_vga_pt(int            xc_handle,
+     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)
+-    {
++        IPRINTF("vga bios size is 0!\n");
+         rc = -1;
+         goto error;
+     }
+@@ -107,8 +121,7 @@ static int  setup_vga_pt(int            xc_handle,
+     if (checksum)
+         bios[bios_size - 1] -= checksum;
+-    memcpy(va_bios, bios, bios_size);
+-    munmap(va_bios, va_size);
++    init_vgabios(xc_handle, dom, bios, bios_size);
+ error:
+     free(bios);
+     return rc;
+@@ -416,6 +429,8 @@ int xc_hvm_build(int xc_handle,
+     sts = xc_hvm_build_internal(xc_handle, domid, memsize, memsize, image, image_size);
+     if ( vga_pt_enabled )
+         sts |= setup_vga_pt(xc_handle, domid);
++    else
++        sts |= init_vgabios(xc_handle, domid, NULL, 0x800);
+     free(image);
index dfdb1c6da4477c8d188e79cb44e0ebad55b4d452..eb482fdfe0cd63da42236ee9421b07591c99f5c1 100644 (file)
@@ -5,3 +5,4 @@ acpi-slic
 oem-features
 thermal-management
 pt-load-vga-bios
+init-vgabios-and-set-size