From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1MGiiH-0006am-Ll for qemu-devel@nongnu.org; Tue, 16 Jun 2009 20:09:13 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1MGiiD-0006ZY-Mq for qemu-devel@nongnu.org; Tue, 16 Jun 2009 20:09:13 -0400 Received: from [199.232.76.173] (port=38413 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MGiiD-0006ZV-Jr for qemu-devel@nongnu.org; Tue, 16 Jun 2009 20:09:09 -0400 Received: from mx2.redhat.com ([66.187.237.31]:36634) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1MGiiC-0007lV-Tw for qemu-devel@nongnu.org; Tue, 16 Jun 2009 20:09:09 -0400 From: Glauber Costa Date: Tue, 16 Jun 2009 20:08:58 -0400 Message-Id: <1245197338-22063-1-git-send-email-glommer@redhat.com> Subject: [Qemu-devel] [PATCH] Make nic option rom loading less painful. 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 The code how it is today, is totally painful to read and keep. To begin with, the code is duplicated with the option rom loading code that linux_boot and vga are already using. This patch introduces a "bootable" state in NICInfo structure, that we can use to keep track of whether or not a given nic should be bootable, avoiding the introduction of yet another global state. With that in hands, we move the code in vl.c to hw/pc.c, and use the already existing infra structure to load those option roms. We lose the checking that currently exists qemu if no optiom roms are found, but I don't think it is a big deal. It is not consistent with the behaviour of any other option rom that fails to load. Furthermore, we can add it around pc.c if anyone really cares. Signed-off-by: Glauber Costa --- hw/pc.c | 16 +++++++++++++--- vl.c | 40 +++++----------------------------------- 2 files changed, 18 insertions(+), 38 deletions(-) diff --git a/hw/pc.c b/hw/pc.c index 0934778..c458ebb 100644 --- a/hw/pc.c +++ b/hw/pc.c @@ -976,9 +976,19 @@ static void pc_init1(ram_addr_t ram_size, oprom_area_size += 2048; } - for (i = 0; i < nb_option_roms; i++) { - oprom_area_size += load_option_rom(option_rom[i], - 0xc0000 + oprom_area_size, 0xe0000); + for (i = 0; i < nb_nics; i++) { + char nic_oprom[1024]; + const char *model = nd_table[i].model; + + if (!nd_table[i].bootable) + continue; + + if (model == NULL) + model = "ne2k_pci"; + snprintf(nic_oprom, sizeof(nic_oprom), "pxe-%s.bin", model); + + oprom_area_size += load_option_rom(nic_oprom, 0xc0000 + oprom_area_size, + 0xe0000); } /* map all the bios at the top of memory */ diff --git a/vl.c b/vl.c index fcf8532..5a063a0 100644 --- a/vl.c +++ b/vl.c @@ -5781,7 +5781,6 @@ int main(int argc, char **argv, char **envp) exit(1); } linux_boot = (kernel_filename != NULL); - net_boot = (boot_devices_bitmap >> ('n' - 'a')) & 0xF; if (!linux_boot && *kernel_cmdline != '\0') { fprintf(stderr, "-append only allowed with -kernel option\n"); @@ -5825,45 +5824,16 @@ int main(int argc, char **argv, char **envp) #endif } + net_boot = (boot_devices_bitmap >> ('n' - 'a')) & 0xF; for(i = 0;i < nb_net_clients; i++) { if (net_client_parse(net_clients[i]) < 0) exit(1); + if (net_boot & (1 << i)) { + nd_table[i].bootable = 1; + } } - net_client_check(); -#ifdef TARGET_I386 - /* XXX: this should be moved in the PC machine instantiation code */ - if (net_boot != 0) { - int netroms = 0; - for (i = 0; i < nb_nics && i < 4; i++) { - const char *model = nd_table[i].model; - char buf[1024]; - char *filename; - if (net_boot & (1 << i)) { - if (model == NULL) - model = "ne2k_pci"; - snprintf(buf, sizeof(buf), "pxe-%s.bin", model); - filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, buf); - if (filename && get_image_size(filename) > 0) { - if (nb_option_roms >= MAX_OPTION_ROMS) { - fprintf(stderr, "Too many option ROMs\n"); - exit(1); - } - option_rom[nb_option_roms] = qemu_strdup(buf); - nb_option_roms++; - netroms++; - } - if (filename) { - qemu_free(filename); - } - } - } - if (netroms == 0) { - fprintf(stderr, "No valid PXE rom found for network device\n"); - exit(1); - } - } -#endif + net_client_check(); /* init the bluetooth world */ for (i = 0; i < nb_bt_opts; i++) -- 1.6.2.2