aboutsummaryrefslogtreecommitdiffstats
path: root/tools/firmware
diff options
context:
space:
mode:
authorJulian Pidancet <julian.pidancet@gmail.com>2012-02-13 12:50:04 +0000
committerJulian Pidancet <julian.pidancet@gmail.com>2012-02-13 12:50:04 +0000
commitcf3ee71e8b083fe1227a8071890619cc14acbd0f (patch)
treeb8f568cde0f54911aa4178fb36355d5d29635d25 /tools/firmware
parent00849cb37af425f98811b261cc51d81e1618b16d (diff)
downloadxen-cf3ee71e8b083fe1227a8071890619cc14acbd0f.tar.gz
xen-cf3ee71e8b083fe1227a8071890619cc14acbd0f.tar.bz2
xen-cf3ee71e8b083fe1227a8071890619cc14acbd0f.zip
hvmloader: Move option ROM loading into a separate optionnal file
Make load_rom field in struct bios_config an optionnal callback rather than a boolean value. It allow BIOS specific code to implement it's own option ROM loading methods. Facilities to scan PCI devices, extract an deploy ROMs are moved into a separate file that can be compiled optionnaly. Signed-off-by: Julian Pidancet <julian.pidancet@gmail.com> Acked-by: Ian Campbell <ian.campbell@citrix.com>
Diffstat (limited to 'tools/firmware')
-rw-r--r--tools/firmware/hvmloader/Makefile2
-rw-r--r--tools/firmware/hvmloader/config.h3
-rw-r--r--tools/firmware/hvmloader/hvmloader.c218
-rw-r--r--tools/firmware/hvmloader/option_rom.h7
-rw-r--r--tools/firmware/hvmloader/optionroms.c189
-rw-r--r--tools/firmware/hvmloader/rombios.c63
-rw-r--r--tools/firmware/hvmloader/seabios.c5
7 files changed, 259 insertions, 228 deletions
diff --git a/tools/firmware/hvmloader/Makefile b/tools/firmware/hvmloader/Makefile
index 1ea32dbd27..5a5ee41e79 100644
--- a/tools/firmware/hvmloader/Makefile
+++ b/tools/firmware/hvmloader/Makefile
@@ -39,7 +39,7 @@ CIRRUSVGA_DEBUG ?= n
ROMBIOS_DIR := ../rombios
ifneq ($(ROMBIOS_DIR),)
-OBJS += 32bitbios_support.o rombios.o
+OBJS += optionroms.o 32bitbios_support.o rombios.o
CFLAGS += -DENABLE_ROMBIOS
ROMBIOS_ROM := $(ROMBIOS_DIR)/BIOS-bochs-latest
endif
diff --git a/tools/firmware/hvmloader/config.h b/tools/firmware/hvmloader/config.h
index 9cac9c1000..1f80263676 100644
--- a/tools/firmware/hvmloader/config.h
+++ b/tools/firmware/hvmloader/config.h
@@ -18,8 +18,7 @@ struct bios_config {
unsigned int bios_address;
/* ROMS */
- int load_roms;
- unsigned int optionrom_start, optionrom_end;
+ void (*load_roms)(void);
void (*bios_load)(const struct bios_config *config);
diff --git a/tools/firmware/hvmloader/hvmloader.c b/tools/firmware/hvmloader/hvmloader.c
index f120ffea1b..ad501893d5 100644
--- a/tools/firmware/hvmloader/hvmloader.c
+++ b/tools/firmware/hvmloader/hvmloader.c
@@ -24,16 +24,11 @@
#include "hypercall.h"
#include "config.h"
#include "pci_regs.h"
-#include "option_rom.h"
#include "apic_regs.h"
#include "acpi/acpi2_0.h"
#include <xen/version.h>
#include <xen/hvm/params.h>
-#define ROM_INCLUDE_VGABIOS
-#define ROM_INCLUDE_ETHERBOOT
-#include "roms.inc"
-
asm (
" .text \n"
" .globl _start \n"
@@ -147,169 +142,6 @@ static void init_hypercalls(void)
printf("Detected Xen v%u.%u%s\n", eax >> 16, eax & 0xffff, extraversion);
}
-/*
- * Scan the list of Option ROMs at @roms for one which supports
- * PCI (@vendor_id, @device_id) found at slot @devfn. If one is found,
- * copy it to @dest and return its size rounded up to a multiple 2kB. This
- * function will not copy ROMs beyond address option_rom_end.
- */
-#define round_option_rom(x) (((x) + 2047) & ~2047)
-static int scan_option_rom(
- unsigned int option_rom_end,
- uint8_t devfn, uint16_t vendor_id, uint16_t device_id,
- void *roms, uint32_t dest)
-{
- struct option_rom_header *rom;
- struct option_rom_pnp_header *pnph;
- struct option_rom_pci_header *pcih;
- uint8_t csum;
- int i;
-
- static uint32_t orom_ids[64];
- static int nr_roms;
-
- /* Avoid duplicate ROMs. */
- for ( i = 0; i < nr_roms; i++ )
- if ( orom_ids[i] == (vendor_id | ((uint32_t)device_id << 16)) )
- return 0;
-
- rom = roms;
- for ( ; ; )
- {
- /* Invalid signature means we're out of option ROMs. */
- if ( strncmp((char *)rom->signature, "\x55\xaa", 2) ||
- (rom->rom_size == 0) )
- break;
-
- /* Invalid checksum means we're out of option ROMs. */
- csum = 0;
- for ( i = 0; i < (rom->rom_size * 512); i++ )
- csum += ((uint8_t *)rom)[i];
- if ( csum != 0 )
- break;
-
- /* Check the PCI PnP header (if any) for a match. */
- pcih = (struct option_rom_pci_header *)
- ((char *)rom + rom->pci_header_offset);
- if ( (rom->pci_header_offset != 0) &&
- !strncmp((char *)pcih->signature, "PCIR", 4) &&
- (pcih->vendor_id == vendor_id) &&
- (pcih->device_id == device_id) )
- goto found;
-
- rom = (struct option_rom_header *)
- ((char *)rom + rom->rom_size * 512);
- }
-
- return 0;
-
- found:
- /* Find the PnP expansion header (if any). */
- pnph = ((rom->expansion_header_offset != 0)
- ? ((struct option_rom_pnp_header *)
- ((char *)rom + rom->expansion_header_offset))
- : ((struct option_rom_pnp_header *)NULL));
- while ( (pnph != NULL) && strncmp((char *)pnph->signature, "$PnP", 4) )
- pnph = ((pnph->next_header_offset != 0)
- ? ((struct option_rom_pnp_header *)
- ((char *)rom + pnph->next_header_offset))
- : ((struct option_rom_pnp_header *)NULL));
-
- printf("Loading PCI Option ROM ...\n");
- if ( (pnph != NULL) && (pnph->manufacturer_name_offset != 0) )
- printf(" - Manufacturer: %s\n",
- (char *)rom + pnph->manufacturer_name_offset);
- if ( (pnph != NULL) && (pnph->product_name_offset != 0) )
- printf(" - Product name: %s\n",
- (char *)rom + pnph->product_name_offset);
-
- if ( (dest + rom->rom_size * 512 + 1) > option_rom_end )
- {
- printf("Option ROM size %x exceeds available space\n",
- rom->rom_size * 512);
- return 0;
- }
-
- orom_ids[nr_roms++] = vendor_id | ((uint32_t)device_id << 16);
- memcpy((void *)dest, rom, rom->rom_size * 512);
- *(uint8_t *)(dest + rom->rom_size * 512) = devfn;
- return round_option_rom(rom->rom_size * 512 + 1);
-}
-
-/*
- * Scan the PCI bus for the first NIC supported by etherboot, and copy
- * the corresponding rom data to *copy_rom_dest. Returns the length of the
- * selected rom, or 0 if no NIC found.
- */
-static int scan_etherboot_nic(unsigned int option_rom_end,
- uint32_t copy_rom_dest)
-{
- uint16_t class, vendor_id, device_id, devfn;
- int rom_size = 0;
-
- for ( devfn = 0; (devfn < 256) && !rom_size; devfn++ )
- {
- class = pci_readw(devfn, PCI_CLASS_DEVICE);
- vendor_id = pci_readw(devfn, PCI_VENDOR_ID);
- device_id = pci_readw(devfn, PCI_DEVICE_ID);
-
- /* We're only interested in NICs. */
- if ( (vendor_id != 0xffff) &&
- (device_id != 0xffff) &&
- (class == 0x0200) )
- rom_size = scan_option_rom(
- option_rom_end,
- devfn, vendor_id, device_id, etherboot, copy_rom_dest);
- }
-
- return rom_size;
-}
-
-/*
- * Scan the PCI bus for the devices that have an option ROM, and copy
- * the corresponding rom data to rom_phys_addr.
- */
-static int pci_load_option_roms(unsigned int option_rom_end,
- uint32_t rom_base_addr)
-{
- uint32_t option_rom_addr, rom_phys_addr = rom_base_addr;
- uint16_t vendor_id, device_id, devfn, class;
-
- for ( devfn = 0; devfn < 256; devfn++ )
- {
- class = pci_readb(devfn, PCI_CLASS_DEVICE + 1);
- vendor_id = pci_readw(devfn, PCI_VENDOR_ID);
- device_id = pci_readw(devfn, PCI_DEVICE_ID);
-
- if ( (vendor_id == 0xffff) && (device_id == 0xffff) )
- continue;
-
- /*
- * Currently only scan options from mass storage devices and serial
- * bus controller (Fibre Channel included).
- */
- if ( (class != 0x1) && (class != 0xc) )
- continue;
-
- option_rom_addr = pci_readl(devfn, PCI_ROM_ADDRESS);
- if ( !option_rom_addr )
- continue;
-
- /* Ensure Expansion Bar is enabled before copying */
- pci_writel(devfn, PCI_ROM_ADDRESS, option_rom_addr | 0x1);
-
- rom_phys_addr += scan_option_rom(
- option_rom_end,
- devfn, vendor_id, device_id,
- (void *)(option_rom_addr & ~2047), rom_phys_addr);
-
- /* Restore the default original value of Expansion Bar */
- pci_writel(devfn, PCI_ROM_ADDRESS, option_rom_addr);
- }
-
- return rom_phys_addr - rom_base_addr;
-}
-
/* Replace possibly erroneous memory-size CMOS fields with correct values. */
static void cmos_write_memory_size(void)
{
@@ -421,8 +253,6 @@ static void acpi_enable_sci(void)
int main(void)
{
const struct bios_config *bios;
- int option_rom_sz = 0, vgabios_sz = 0, etherboot_sz = 0;
- uint32_t etherboot_phys_addr = 0, option_rom_phys_addr = 0;
int acpi_enabled;
/* Initialise hypercall stubs with RET, rendering them no-ops. */
@@ -471,41 +301,7 @@ int main(void)
}
if ( bios->load_roms )
- {
- switch ( virtual_vga )
- {
- case VGA_cirrus:
- printf("Loading Cirrus VGABIOS ...\n");
- memcpy((void *)VGABIOS_PHYSICAL_ADDRESS,
- vgabios_cirrusvga, sizeof(vgabios_cirrusvga));
- vgabios_sz = round_option_rom(sizeof(vgabios_cirrusvga));
- break;
- case VGA_std:
- printf("Loading Standard VGABIOS ...\n");
- memcpy((void *)VGABIOS_PHYSICAL_ADDRESS,
- vgabios_stdvga, sizeof(vgabios_stdvga));
- vgabios_sz = round_option_rom(sizeof(vgabios_stdvga));
- break;
- case VGA_pt:
- printf("Loading VGABIOS of passthroughed gfx ...\n");
- vgabios_sz = round_option_rom(
- (*(uint8_t *)(VGABIOS_PHYSICAL_ADDRESS+2)) * 512);
- break;
- default:
- printf("No emulated VGA adaptor ...\n");
- break;
- }
-
- etherboot_phys_addr = VGABIOS_PHYSICAL_ADDRESS + vgabios_sz;
- if ( etherboot_phys_addr < bios->optionrom_start )
- etherboot_phys_addr = bios->optionrom_start;
- etherboot_sz = scan_etherboot_nic(bios->optionrom_end,
- etherboot_phys_addr);
-
- option_rom_phys_addr = etherboot_phys_addr + etherboot_sz;
- option_rom_sz = pci_load_option_roms(bios->optionrom_end,
- option_rom_phys_addr);
- }
+ bios->load_roms();
acpi_enabled = !strncmp(xenstore_read("platform/acpi", "1"), "1", 1);
@@ -536,18 +332,6 @@ int main(void)
if ( SCRATCH_PHYSICAL_ADDRESS != scratch_start )
printf(" %05x-%05lx: Scratch space\n",
SCRATCH_PHYSICAL_ADDRESS, scratch_start);
- if ( vgabios_sz )
- printf(" %05x-%05x: VGA BIOS\n",
- VGABIOS_PHYSICAL_ADDRESS,
- VGABIOS_PHYSICAL_ADDRESS + vgabios_sz - 1);
- if ( etherboot_sz )
- printf(" %05x-%05x: Etherboot ROM\n",
- etherboot_phys_addr,
- etherboot_phys_addr + etherboot_sz - 1);
- if ( option_rom_sz )
- printf(" %05x-%05x: PCI Option ROMs\n",
- option_rom_phys_addr,
- option_rom_phys_addr + option_rom_sz - 1);
printf(" %05x-%05x: Main BIOS\n",
bios->bios_address,
bios->bios_address + bios->image_size - 1);
diff --git a/tools/firmware/hvmloader/option_rom.h b/tools/firmware/hvmloader/option_rom.h
index f0c7ec482f..1ada3e2209 100644
--- a/tools/firmware/hvmloader/option_rom.h
+++ b/tools/firmware/hvmloader/option_rom.h
@@ -47,6 +47,13 @@ struct option_rom_pci_header {
uint16_t reserved;
} __attribute__ ((packed));
+#define round_option_rom(x) (((x) + 2047) & ~2047)
+int scan_etherboot_nic(unsigned int option_rom_end,
+ uint32_t copy_rom_dest,
+ void *etherboot_rom);
+int pci_load_option_roms(unsigned int option_rom_end,
+ uint32_t rom_base_addr);
+
#endif /* __HVMLOADER_OPTION_ROM_H__ */
/*
diff --git a/tools/firmware/hvmloader/optionroms.c b/tools/firmware/hvmloader/optionroms.c
new file mode 100644
index 0000000000..e35aebc58e
--- /dev/null
+++ b/tools/firmware/hvmloader/optionroms.c
@@ -0,0 +1,189 @@
+/*
+ * optionroms.c: Option ROM loading support.
+ *
+ * Leendert van Doorn, leendert@watson.ibm.com
+ * Copyright (c) 2005, International Business Machines Corporation.
+ *
+ * Copyright (c) 2006, Keir Fraser, XenSource Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+ * Place - Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#include "config.h"
+#include "option_rom.h"
+#include "util.h"
+#include "pci_regs.h"
+
+/*
+ * Scan the list of Option ROMs at @roms for one which supports
+ * PCI (@vendor_id, @device_id) found at slot @devfn. If one is found,
+ * copy it to @dest and return its size rounded up to a multiple 2kB. This
+ * function will not copy ROMs beyond address option_rom_end.
+ */
+static int scan_option_rom(
+ unsigned int option_rom_end,
+ uint8_t devfn, uint16_t vendor_id, uint16_t device_id,
+ void *roms, uint32_t dest)
+{
+ struct option_rom_header *rom;
+ struct option_rom_pnp_header *pnph;
+ struct option_rom_pci_header *pcih;
+ uint8_t csum;
+ int i;
+
+ static uint32_t orom_ids[64];
+ static int nr_roms;
+
+ /* Avoid duplicate ROMs. */
+ for ( i = 0; i < nr_roms; i++ )
+ if ( orom_ids[i] == (vendor_id | ((uint32_t)device_id << 16)) )
+ return 0;
+
+ rom = roms;
+ for ( ; ; )
+ {
+ /* Invalid signature means we're out of option ROMs. */
+ if ( strncmp((char *)rom->signature, "\x55\xaa", 2) ||
+ (rom->rom_size == 0) )
+ break;
+
+ /* Invalid checksum means we're out of option ROMs. */
+ csum = 0;
+ for ( i = 0; i < (rom->rom_size * 512); i++ )
+ csum += ((uint8_t *)rom)[i];
+ if ( csum != 0 )
+ break;
+
+ /* Check the PCI PnP header (if any) for a match. */
+ pcih = (struct option_rom_pci_header *)
+ ((char *)rom + rom->pci_header_offset);
+ if ( (rom->pci_header_offset != 0) &&
+ !strncmp((char *)pcih->signature, "PCIR", 4) &&
+ (pcih->vendor_id == vendor_id) &&
+ (pcih->device_id == device_id) )
+ goto found;
+
+ rom = (struct option_rom_header *)
+ ((char *)rom + rom->rom_size * 512);
+ }
+
+ return 0;
+
+ found:
+ /* Find the PnP expansion header (if any). */
+ pnph = ((rom->expansion_header_offset != 0)
+ ? ((struct option_rom_pnp_header *)
+ ((char *)rom + rom->expansion_header_offset))
+ : ((struct option_rom_pnp_header *)NULL));
+ while ( (pnph != NULL) && strncmp((char *)pnph->signature, "$PnP", 4) )
+ pnph = ((pnph->next_header_offset != 0)
+ ? ((struct option_rom_pnp_header *)
+ ((char *)rom + pnph->next_header_offset))
+ : ((struct option_rom_pnp_header *)NULL));
+
+ printf("Loading PCI Option ROM ...\n");
+ if ( (pnph != NULL) && (pnph->manufacturer_name_offset != 0) )
+ printf(" - Manufacturer: %s\n",
+ (char *)rom + pnph->manufacturer_name_offset);
+ if ( (pnph != NULL) && (pnph->product_name_offset != 0) )
+ printf(" - Product name: %s\n",
+ (char *)rom + pnph->product_name_offset);
+
+ if ( (dest + rom->rom_size * 512 + 1) > option_rom_end )
+ {
+ printf("Option ROM size %x exceeds available space\n",
+ rom->rom_size * 512);
+ return 0;
+ }
+
+ orom_ids[nr_roms++] = vendor_id | ((uint32_t)device_id << 16);
+ memcpy((void *)dest, rom, rom->rom_size * 512);
+ *(uint8_t *)(dest + rom->rom_size * 512) = devfn;
+ return round_option_rom(rom->rom_size * 512 + 1);
+}
+
+/*
+ * Scan the PCI bus for the first NIC supported by etherboot, and copy
+ * the corresponding rom data to *copy_rom_dest. Returns the length of the
+ * selected rom, or 0 if no NIC found.
+ */
+int scan_etherboot_nic(unsigned int option_rom_end,
+ uint32_t copy_rom_dest,
+ void *etherboot_rom)
+{
+ uint16_t class, vendor_id, device_id, devfn;
+ int rom_size = 0;
+
+ for ( devfn = 0; (devfn < 256) && !rom_size; devfn++ )
+ {
+ class = pci_readw(devfn, PCI_CLASS_DEVICE);
+ vendor_id = pci_readw(devfn, PCI_VENDOR_ID);
+ device_id = pci_readw(devfn, PCI_DEVICE_ID);
+
+ /* We're only interested in NICs. */
+ if ( (vendor_id != 0xffff) &&
+ (device_id != 0xffff) &&
+ (class == 0x0200) )
+ rom_size = scan_option_rom(
+ option_rom_end,
+ devfn, vendor_id, device_id, etherboot_rom, copy_rom_dest);
+ }
+
+ return rom_size;
+}
+
+/*
+ * Scan the PCI bus for the devices that have an option ROM, and copy
+ * the corresponding rom data to rom_phys_addr.
+ */
+int pci_load_option_roms(unsigned int option_rom_end,
+ uint32_t rom_base_addr)
+{
+ uint32_t option_rom_addr, rom_phys_addr = rom_base_addr;
+ uint16_t vendor_id, device_id, devfn, class;
+
+ for ( devfn = 0; devfn < 256; devfn++ )
+ {
+ class = pci_readb(devfn, PCI_CLASS_DEVICE + 1);
+ vendor_id = pci_readw(devfn, PCI_VENDOR_ID);
+ device_id = pci_readw(devfn, PCI_DEVICE_ID);
+
+ if ( (vendor_id == 0xffff) && (device_id == 0xffff) )
+ continue;
+
+ /*
+ * Currently only scan options from mass storage devices and serial
+ * bus controller (Fibre Channel included).
+ */
+ if ( (class != 0x1) && (class != 0xc) )
+ continue;
+
+ option_rom_addr = pci_readl(devfn, PCI_ROM_ADDRESS);
+ if ( !option_rom_addr )
+ continue;
+
+ /* Ensure Expansion Bar is enabled before copying */
+ pci_writel(devfn, PCI_ROM_ADDRESS, option_rom_addr | 0x1);
+
+ rom_phys_addr += scan_option_rom(
+ option_rom_end,
+ devfn, vendor_id, device_id,
+ (void *)(option_rom_addr & ~2047), rom_phys_addr);
+
+ /* Restore the default original value of Expansion Bar */
+ pci_writel(devfn, PCI_ROM_ADDRESS, option_rom_addr);
+ }
+
+ return rom_phys_addr - rom_base_addr;
+}
diff --git a/tools/firmware/hvmloader/rombios.c b/tools/firmware/hvmloader/rombios.c
index d5831aa9cf..e0d418227f 100644
--- a/tools/firmware/hvmloader/rombios.c
+++ b/tools/firmware/hvmloader/rombios.c
@@ -29,10 +29,13 @@
#include "pci_regs.h"
#include "util.h"
#include "hypercall.h"
+#include "option_rom.h"
#include <xen/hvm/params.h>
#define ROM_INCLUDE_ROMBIOS
+#define ROM_INCLUDE_VGABIOS
+#define ROM_INCLUDE_ETHERBOOT
#include "roms.inc"
#define ROMBIOS_BEGIN 0x000F0000
@@ -64,6 +67,61 @@ static void rombios_setup_bios_info(void)
memset(info, 0, sizeof(*info));
}
+static void rombios_load_roms(void)
+{
+ int option_rom_sz = 0, vgabios_sz = 0, etherboot_sz = 0;
+ uint32_t etherboot_phys_addr = 0, option_rom_phys_addr = 0;
+
+ switch ( virtual_vga )
+ {
+ case VGA_cirrus:
+ printf("Loading Cirrus VGABIOS ...\n");
+ memcpy((void *)VGABIOS_PHYSICAL_ADDRESS,
+ vgabios_cirrusvga, sizeof(vgabios_cirrusvga));
+ vgabios_sz = round_option_rom(sizeof(vgabios_cirrusvga));
+ break;
+ case VGA_std:
+ printf("Loading Standard VGABIOS ...\n");
+ memcpy((void *)VGABIOS_PHYSICAL_ADDRESS,
+ vgabios_stdvga, sizeof(vgabios_stdvga));
+ vgabios_sz = round_option_rom(sizeof(vgabios_stdvga));
+ break;
+ case VGA_pt:
+ printf("Loading VGABIOS of passthroughed gfx ...\n");
+ vgabios_sz = round_option_rom(
+ (*(uint8_t *)(VGABIOS_PHYSICAL_ADDRESS+2)) * 512);
+ break;
+ default:
+ printf("No emulated VGA adaptor ...\n");
+ break;
+ }
+
+ etherboot_phys_addr = VGABIOS_PHYSICAL_ADDRESS + vgabios_sz;
+ if ( etherboot_phys_addr < OPTIONROM_PHYSICAL_ADDRESS )
+ etherboot_phys_addr = OPTIONROM_PHYSICAL_ADDRESS;
+ etherboot_sz = scan_etherboot_nic(OPTIONROM_PHYSICAL_END,
+ etherboot_phys_addr,
+ etherboot);
+
+ option_rom_phys_addr = etherboot_phys_addr + etherboot_sz;
+ option_rom_sz = pci_load_option_roms(OPTIONROM_PHYSICAL_END,
+ option_rom_phys_addr);
+
+ printf("Option ROMs:\n");
+ if ( vgabios_sz )
+ printf(" %05x-%05x: VGA BIOS\n",
+ VGABIOS_PHYSICAL_ADDRESS,
+ VGABIOS_PHYSICAL_ADDRESS + vgabios_sz - 1);
+ if ( etherboot_sz )
+ printf(" %05x-%05x: Etherboot ROM\n",
+ etherboot_phys_addr,
+ etherboot_phys_addr + etherboot_sz - 1);
+ if ( option_rom_sz )
+ printf(" %05x-%05x: PCI Option ROMs\n",
+ option_rom_phys_addr,
+ option_rom_phys_addr + option_rom_sz - 1);
+}
+
static void rombios_load(const struct bios_config *config)
{
uint32_t bioshigh;
@@ -158,10 +216,7 @@ struct bios_config rombios_config = {
.bios_address = ROMBIOS_PHYSICAL_ADDRESS,
- .load_roms = 1,
-
- .optionrom_start = OPTIONROM_PHYSICAL_ADDRESS,
- .optionrom_end = OPTIONROM_PHYSICAL_END,
+ .load_roms = rombios_load_roms,
.bios_load = rombios_load,
diff --git a/tools/firmware/hvmloader/seabios.c b/tools/firmware/hvmloader/seabios.c
index 3045157633..15ddf358a4 100644
--- a/tools/firmware/hvmloader/seabios.c
+++ b/tools/firmware/hvmloader/seabios.c
@@ -143,10 +143,7 @@ struct bios_config seabios_config = {
.bios_address = SEABIOS_PHYSICAL_ADDRESS,
- .load_roms = 0,
-
- .optionrom_start = 0,
- .optionrom_end = 0,
+ .load_roms = NULL,
.bios_load = NULL,