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; } }