Glauber Costa 3afbf09
From 34b39c2ba6cc08239a707b52bfb2886df2aa8dec Mon Sep 17 00:00:00 2001
Glauber Costa 3afbf09
From: aliguori <aliguori@c046a42c-6fe2-441c-8c8c-71466251a162>
Glauber Costa 3afbf09
Date: Sat, 28 Mar 2009 17:28:45 +0000
Glauber Costa 3afbf09
Subject: [PATCH] get roms more room. (Glauber Costa)
Glauber Costa 3afbf09
Glauber Costa 3afbf09
This patch increases by 50 % the size available for option roms.
Glauber Costa 3afbf09
The main motivator is that some roms grew bigger than the 64k we
Glauber Costa 3afbf09
currently allocate for them (Hey, it's 2009!)
Glauber Costa 3afbf09
Glauber Costa 3afbf09
One example is the gpxe project, that produces some roms with 69k,
Glauber Costa 3afbf09
70k, etc. The space proposed by this patch actually makes it as
Glauber Costa 3afbf09
big as 84k. Probably still a fit for some time.
Glauber Costa 3afbf09
Glauber Costa 3afbf09
But there is no free lunch. This space must come from somewhere,
Glauber Costa 3afbf09
and we take it from vga rom space. Currently, our vga roms are
Glauber Costa 3afbf09
around 35k in size. With this patch, option rom space will begin
Glauber Costa 3afbf09
just after vga ends, aligned to the next 2k boundary.
Glauber Costa 3afbf09
Glauber Costa 3afbf09
Technicaly, we could do the same with the uper space (the bios itself),
Glauber Costa 3afbf09
but since bochs bios is already 128 k in size, I don't see an
Glauber Costa 3afbf09
urgent need to do it.
Glauber Costa 3afbf09
Glauber Costa 3afbf09
[ fix case for vgabioses smaller than 30k, by Carl-Daniel Hailfinger ]
Glauber Costa 3afbf09
Glauber Costa 3afbf09
Signed-off-by: Glauber Costa <glommer@redhat.com>
Glauber Costa 3afbf09
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Glauber Costa 3afbf09
Glauber Costa 3afbf09
Glauber Costa 3afbf09
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6896 c046a42c-6fe2-441c-8c8c-71466251a162
Glauber Costa 3afbf09
---
Glauber Costa 3afbf09
 hw/pc.c |   29 +++++++++++++++++++----------
Glauber Costa 3afbf09
 1 files changed, 19 insertions(+), 10 deletions(-)
Glauber Costa 3afbf09
Glauber Costa 3afbf09
Index: qemu-kvm-0.10/qemu/hw/pc.c
Glauber Costa 3afbf09
===================================================================
Glauber Costa 3afbf09
--- qemu-kvm-0.10.orig/qemu/hw/pc.c
Glauber Costa 3afbf09
+++ qemu-kvm-0.10/qemu/hw/pc.c
Glauber Costa 3afbf09
@@ -813,7 +813,7 @@ static void pc_init1(ram_addr_t ram_size
Glauber Costa 3afbf09
 {
Glauber Costa 3afbf09
     char buf[1024];
Glauber Costa 3afbf09
     int ret, linux_boot, i;
Glauber Costa 3afbf09
-    ram_addr_t ram_addr, vga_ram_addr, bios_offset, vga_bios_offset;
Glauber Costa 3afbf09
+    ram_addr_t ram_addr, vga_ram_addr, bios_offset, vga_bios_offset, option_rom_start = 0;
Glauber Costa 3afbf09
     ram_addr_t below_4g_mem_size, above_4g_mem_size = 0;
Glauber Costa 3afbf09
     int bios_size, isa_bios_size, vga_bios_size;
Glauber Costa 3afbf09
     int pci_option_rom_offset;
Glauber Costa 3afbf09
@@ -825,6 +825,7 @@ static void pc_init1(ram_addr_t ram_size
Glauber Costa 3afbf09
     int index;
Glauber Costa 3afbf09
     BlockDriverState *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
Glauber Costa 3afbf09
     BlockDriverState *fd[MAX_FD];
Glauber Costa 3afbf09
+    int using_vga = cirrus_vga_enabled || std_vga_enabled || vmsvga_enabled;
Glauber Costa 3afbf09
 
Glauber Costa 3afbf09
     if (ram_size >= 0xe0000000 ) {
Glauber Costa 3afbf09
         above_4g_mem_size = ram_size - 0xe0000000;
Glauber Costa 3afbf09
@@ -900,7 +901,7 @@ static void pc_init1(ram_addr_t ram_size
Glauber Costa 3afbf09
         exit(1);
Glauber Costa 3afbf09
     }
Glauber Costa 3afbf09
 
Glauber Costa 3afbf09
-    if (cirrus_vga_enabled || std_vga_enabled || vmsvga_enabled) {
Glauber Costa 3afbf09
+    if (using_vga) {
Glauber Costa 3afbf09
         /* VGA BIOS load */
Glauber Costa 3afbf09
         if (cirrus_vga_enabled) {
Glauber Costa 3afbf09
             snprintf(buf, sizeof(buf), "%s/%s", bios_dir, VGABIOS_CIRRUS_FILENAME);
Glauber Costa 3afbf09
@@ -918,12 +919,21 @@ vga_bios_error:
Glauber Costa 3afbf09
             fprintf(stderr, "qemu: could not load VGA BIOS '%s'\n", buf);
Glauber Costa 3afbf09
             exit(1);
Glauber Costa 3afbf09
         }
Glauber Costa 3afbf09
+	/* Round up vga bios size to the next 2k boundary */
Glauber Costa 3afbf09
+	vga_bios_size = (vga_bios_size + 2047) & ~2047;
Glauber Costa 3afbf09
+	option_rom_start = 0xc0000 + vga_bios_size;
Glauber Costa 3afbf09
 
Glauber Costa 3afbf09
         /* setup basic memory access */
Glauber Costa 3afbf09
-        cpu_register_physical_memory(0xc0000, 0x10000,
Glauber Costa 3afbf09
+        cpu_register_physical_memory(0xc0000, vga_bios_size,
Glauber Costa 3afbf09
                                      vga_bios_offset | IO_MEM_ROM);
Glauber Costa 3afbf09
     }
Glauber Costa 3afbf09
 
Glauber Costa 3afbf09
+    /* No point in placing option roms before this address, since bochs bios
Glauber Costa 3afbf09
+     * will only start looking for it at 0xc8000 */
Glauber Costa 3afbf09
+    if (option_rom_start < 0xc8000)
Glauber Costa 3afbf09
+	    option_rom_start = 0xc8000;
Glauber Costa 3afbf09
+
Glauber Costa 3afbf09
+
Glauber Costa 3afbf09
     /* map the last 128KB of the BIOS in ISA space */
Glauber Costa 3afbf09
     isa_bios_size = bios_size;
Glauber Costa 3afbf09
     if (isa_bios_size > (128 * 1024))
Glauber Costa 3afbf09
@@ -944,14 +954,14 @@ vga_bios_error:
Glauber Costa 3afbf09
         ram_addr_t option_rom_offset;
Glauber Costa 3afbf09
         int size, offset;
Glauber Costa 3afbf09
 
Glauber Costa 3afbf09
-        offset = 0;
Glauber Costa 3afbf09
+        offset = option_rom_start;
Glauber Costa 3afbf09
         if (linux_boot) {
Glauber Costa 3afbf09
             option_rom_offset = qemu_ram_alloc(TARGET_PAGE_SIZE);
Glauber Costa 3afbf09
             load_linux(phys_ram_base + option_rom_offset,
Glauber Costa 3afbf09
                        kernel_filename, initrd_filename, kernel_cmdline);
Glauber Costa 3afbf09
-            cpu_register_physical_memory(0xd0000, TARGET_PAGE_SIZE,
Glauber Costa 3afbf09
+            cpu_register_physical_memory(option_rom_start, TARGET_PAGE_SIZE,
Glauber Costa 3afbf09
                                          option_rom_offset | IO_MEM_ROM);
Glauber Costa 3afbf09
-            offset = TARGET_PAGE_SIZE;
Glauber Costa 3afbf09
+            offset += TARGET_PAGE_SIZE;
Glauber Costa 3afbf09
         }
Glauber Costa 3afbf09
 
Glauber Costa 3afbf09
         for (i = 0; i < nb_option_roms; i++) {
Glauber Costa 3afbf09
@@ -961,13 +971,13 @@ vga_bios_error:
Glauber Costa 3afbf09
                         option_rom[i]);
Glauber Costa 3afbf09
                 exit(1);
Glauber Costa 3afbf09
             }
Glauber Costa 3afbf09
-            if (size > (0x10000 - offset))
Glauber Costa 3afbf09
+            if (size > (0xe0000 - offset))
Glauber Costa 3afbf09
                 goto option_rom_error;
Glauber Costa 3afbf09
             option_rom_offset = qemu_ram_alloc(size);
Glauber Costa 3afbf09
             ret = load_image(option_rom[i], phys_ram_base + option_rom_offset);
Glauber Costa 3afbf09
             if (ret != size) {
Glauber Costa 3afbf09
             option_rom_error:
Glauber Costa 3afbf09
-                fprintf(stderr, "Too many option ROMS\n");
Glauber Costa 3afbf09
+                fprintf(stderr, "Could not fit %soption roms in available space\n", using_vga ? "VGA bios and " : "");
Glauber Costa 3afbf09
                 exit(1);
Glauber Costa 3afbf09
             }
Glauber Costa 3afbf09
             size = (size + 4095) & ~4095;
Glauber Costa 3afbf09
@@ -975,9 +985,8 @@ vga_bios_error:
Glauber Costa 3afbf09
        initialization, and (optionally) marked readonly by the BIOS
Glauber Costa 3afbf09
        before INT 19h.  See the PNPBIOS specification, appendix B.
Glauber Costa 3afbf09
        DDIM support is mandatory for proper PCI expansion ROM support. */
Glauber Costa 3afbf09
-            cpu_register_physical_memory(0xd0000 + offset,
Glauber Costa 3afbf09
-                                         size, option_rom_offset /* | IO_MEM_ROM */);
Glauber Costa 3afbf09
-            option_rom_setup_reset(0xd0000 + offset, size);
Glauber Costa 3afbf09
+            cpu_register_physical_memory(offset, size, option_rom_offset /* | IO_MEM_ROM */);
Glauber Costa 3afbf09
+            option_rom_setup_reset(offset, size);
Glauber Costa 3afbf09
             offset += size;
Glauber Costa 3afbf09
         }
Glauber Costa 3afbf09
         pci_option_rom_offset = offset;