From: Mark McLoughlin <markmc@redhat.com>
To: Glauber Costa <glommer@redhat.com>
Cc: aliguori@us.ibm.com, qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH] Make nic option rom loading less painful.
Date: Wed, 17 Jun 2009 09:21:48 +0100 [thread overview]
Message-ID: <1245226908.27028.23.camel@blaa> (raw)
In-Reply-To: <1245197338-22063-1-git-send-email-glommer@redhat.com>
Hi Glauber,
On Tue, 2009-06-16 at 20:08 -0400, Glauber Costa wrote:
> 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,
No it doesn't, you seem to have forgotten that part :-)
> 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.
We don't need to loose this, see below.
> Signed-off-by: Glauber Costa <glommer@redhat.com>
> ---
> 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);
Looks like this breaks -option-rom
> + for (i = 0; i < nb_nics; i++) {
> + char nic_oprom[1024];
> + const char *model = nd_table[i].model;
Is that a tab?
> +
> + 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;
> + }
Not every net client is a NIC - e.g. with '-net nic -net user -net nic
-net tap -boot m' the bootable flag will be set on nd_table[2] even
though that's not a valid NIC
Perhaps call something like this once the net_client_parse() loop is
complete?
int net_set_boot_mask(int net_boot_mask)
{
int i;
/* Only the first four NICs may be bootable */
net_boot_mask = net_boot_mask & 0xF;
for (i = 0; i < nb_nics; i++) {
if (net_boot_mask & (1 << i)) {
nd_table[i].bootable = 1;
net_boot_mask &= ~(1 << i);
}
}
if (net_boot_mask) {
fprintf(stderr, "Cannot boot from non-existent NIC\n");
return -1;
}
return 0;
}
> }
> - 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);
> - }
With the check I suggest above in net_set_boot_mask() and the fact that
load_option_rom() aborts if the rom isn't found, I don't think we're
losing any error handling.
Cheers,
Mark.
prev parent reply other threads:[~2009-06-17 8:21 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-06-17 0:08 [Qemu-devel] [PATCH] Make nic option rom loading less painful Glauber Costa
2009-06-17 8:21 ` Mark McLoughlin [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1245226908.27028.23.camel@blaa \
--to=markmc@redhat.com \
--cc=aliguori@us.ibm.com \
--cc=glommer@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.