From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LnNp3-0001hf-Nl for qemu-devel@nongnu.org; Fri, 27 Mar 2009 21:58:57 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LnNox-0001WV-VG for qemu-devel@nongnu.org; Fri, 27 Mar 2009 21:58:57 -0400 Received: from [199.232.76.173] (port=46309 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LnNox-0001WJ-RY for qemu-devel@nongnu.org; Fri, 27 Mar 2009 21:58:51 -0400 Received: from mail.gmx.net ([213.165.64.20]:35353) by monty-python.gnu.org with smtp (Exim 4.60) (envelope-from ) id 1LnNox-0003V1-6g for qemu-devel@nongnu.org; Fri, 27 Mar 2009 21:58:51 -0400 Message-ID: <49CD8458.3080405@gmx.net> Date: Sat, 28 Mar 2009 02:58:48 +0100 From: Carl-Daniel Hailfinger MIME-Version: 1.0 Subject: Re: [Qemu-devel] [PATCH] get roms more room. References: <1238197702-2765-1-git-send-email-glommer@redhat.com> In-Reply-To: <1238197702-2765-1-git-send-email-glommer@redhat.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: aliguori@us.ibm.com On 28.03.2009 00:48, Glauber Costa wrote: > This patch increases by 50 % the size available for option roms. > The main motivator is that some roms grew bigger than the 64k we > currently allocate for them (Hey, it's 2009!) > > One example is the gpxe project, that produces some roms with 69k, > 70k, etc. The space proposed by this patch actually makes it as > big as 84k. Probably still a fit for some time. > > But there is no free lunch. This space must come from somewhere, > and we take it from vga rom space. Currently, our vga roms are > around 35k in size. With this patch, option rom space will begin > just after vga ends, aligned to the next 2k boundary. > > Technicaly, we could do the same with the uper space (the bios itself), > but since bochs bios is already 128 k in size, I don't see an > urgent need to do it. > > Signed-off-by: Glauber Costa > I really like the patch, but I have one questions I can't answer because I'm not familiar enough with the Qemu and Bochs BIOS codebase. You can find it as inline comment. Since the patch seems to do what I want, it is Acked-by: Carl-Daniel Hailfinger If a Signed-off-by line is preferred, I can send that instead. > --- > hw/pc.c | 27 +++++++++++++++++---------- > 1 files changed, 17 insertions(+), 10 deletions(-) > > diff --git a/hw/pc.c b/hw/pc.c > index 69f25f3..07a9791 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; > 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,11 @@ static void pc_init1(ram_addr_t ram_size, int vga_ram_size, > exit(1); > } > > - if (cirrus_vga_enabled || std_vga_enabled || vmsvga_enabled) { > + /* No point in placing option roms before this address, since bochs bios > + * will only start looking for it at 0xc8000 */ > + option_rom_start = 0xc8000; > + > + if (using_vga) { > /* VGA BIOS load */ > if (cirrus_vga_enabled) { > snprintf(buf, sizeof(buf), "%s/%s", bios_dir, VGABIOS_CIRRUS_FILENAME); > @@ -874,9 +879,12 @@ 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; > If vga_bios_size ever shrinks below 30k, the option ROMs will start below 0xc8000 and the Bochs BIOS won't find them. Is that right? > + 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); > } > > @@ -892,14 +900,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 +917,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; > } > } > Regards, Carl-Daniel -- http://www.hailfinger.org/