summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--hw/pc.c29
1 files changed, 19 insertions, 10 deletions
diff --git a/hw/pc.c b/hw/pc.c
index 69f25f39aa..f9cfd1f562 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -763,7 +763,7 @@ static void pc_init1(ram_addr_t ram_size, int vga_ram_size,
 {
     char buf[1024];
     int ret, linux_boot, i;
-    ram_addr_t ram_addr, vga_ram_addr, bios_offset, vga_bios_offset;
+    ram_addr_t ram_addr, vga_ram_addr, bios_offset, vga_bios_offset, option_rom_start = 0;
     ram_addr_t below_4g_mem_size, above_4g_mem_size = 0;
     int bios_size, isa_bios_size, vga_bios_size;
     PCIBus *pci_bus;
@@ -774,6 +774,7 @@ static void pc_init1(ram_addr_t ram_size, int vga_ram_size,
     int index;
     BlockDriverState *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
     BlockDriverState *fd[MAX_FD];
+    int using_vga = cirrus_vga_enabled || std_vga_enabled || vmsvga_enabled;
 
     if (ram_size >= 0xe0000000 ) {
         above_4g_mem_size = ram_size - 0xe0000000;
@@ -856,7 +857,7 @@ static void pc_init1(ram_addr_t ram_size, int vga_ram_size,
         exit(1);
     }
 
-    if (cirrus_vga_enabled || std_vga_enabled || vmsvga_enabled) {
+    if (using_vga) {
         /* VGA BIOS load */
         if (cirrus_vga_enabled) {
             snprintf(buf, sizeof(buf), "%s/%s", bios_dir, VGABIOS_CIRRUS_FILENAME);
@@ -874,12 +875,21 @@ vga_bios_error:
             fprintf(stderr, "qemu: could not load VGA BIOS '%s'\n", buf);
             exit(1);
         }
+	/* Round up vga bios size to the next 2k boundary */
+	vga_bios_size = (vga_bios_size + 2047) & ~2047;
+	option_rom_start = 0xc0000 + vga_bios_size;
 
         /* setup basic memory access */
-        cpu_register_physical_memory(0xc0000, 0x10000,
+        cpu_register_physical_memory(0xc0000, vga_bios_size,
                                      vga_bios_offset | IO_MEM_ROM);
     }
 
+    /* No point in placing option roms before this address, since bochs bios
+     * will only start looking for it at 0xc8000 */
+    if (option_rom_start < 0xc8000)
+	    option_rom_start = 0xc8000;
+
+
     /* map the last 128KB of the BIOS in ISA space */
     isa_bios_size = bios_size;
     if (isa_bios_size > (128 * 1024))
@@ -892,14 +902,14 @@ vga_bios_error:
         ram_addr_t option_rom_offset;
         int size, offset;
 
-        offset = 0;
+        offset = option_rom_start;
         if (linux_boot) {
             option_rom_offset = qemu_ram_alloc(TARGET_PAGE_SIZE);
             load_linux(phys_ram_base + option_rom_offset,
                        kernel_filename, initrd_filename, kernel_cmdline);
-            cpu_register_physical_memory(0xd0000, TARGET_PAGE_SIZE,
+            cpu_register_physical_memory(option_rom_start, TARGET_PAGE_SIZE,
                                          option_rom_offset | IO_MEM_ROM);
-            offset = TARGET_PAGE_SIZE;
+            offset += TARGET_PAGE_SIZE;
         }
 
         for (i = 0; i < nb_option_roms; i++) {
@@ -909,18 +919,17 @@ vga_bios_error:
                         option_rom[i]);
                 exit(1);
             }
-            if (size > (0x10000 - offset))
+            if (size > (0xe0000  - offset))
                 goto option_rom_error;
             option_rom_offset = qemu_ram_alloc(size);
             ret = load_image(option_rom[i], phys_ram_base + option_rom_offset);
             if (ret != size) {
             option_rom_error:
-                fprintf(stderr, "Too many option ROMS\n");
+                fprintf(stderr, "Could not fit %soption roms in available space\n", using_vga ? "VGA bios and " : "");
                 exit(1);
             }
             size = (size + 4095) & ~4095;
-            cpu_register_physical_memory(0xd0000 + offset,
-                                         size, option_rom_offset | IO_MEM_ROM);
+            cpu_register_physical_memory(offset, size, option_rom_offset | IO_MEM_ROM);
             offset += size;
         }
     }