[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v3 4/5] hvmloader: Move option ROM loading into a separate optionnal file



On Sat, 2012-02-11 at 20:39 +0000, Julian Pidancet wrote:
> 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@xxxxxxxxx>

Presuming this to be mostly code motion I didn't review in depth but:
Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx>

> ---
>  tools/firmware/hvmloader/Makefile     |    2 +-
>  tools/firmware/hvmloader/config.h     |    3 +-
>  tools/firmware/hvmloader/hvmloader.c  |  218 
> +--------------------------------
>  tools/firmware/hvmloader/option_rom.h |    7 +
>  tools/firmware/hvmloader/optionroms.c |  189 ++++++++++++++++++++++++++++
>  tools/firmware/hvmloader/rombios.c    |   63 +++++++++-
>  tools/firmware/hvmloader/seabios.c    |    5 +-
>  7 files changed, 259 insertions(+), 228 deletions(-)
>  create mode 100644 tools/firmware/hvmloader/optionroms.c
> 
> diff --git a/tools/firmware/hvmloader/Makefile 
> b/tools/firmware/hvmloader/Makefile
> index 1ea32db..5a5ee41 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 9cac9c1..1f80263 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 f120ffe..ad50189 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 f0c7ec4..1ada3e2 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 0000000..e35aebc
> --- /dev/null
> +++ b/tools/firmware/hvmloader/optionroms.c
> @@ -0,0 +1,189 @@
> +/*
> + * optionroms.c: Option ROM loading support.
> + *
> + * Leendert van Doorn, leendert@xxxxxxxxxxxxxx
> + * 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 d5831aa..e0d4182 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 3045157..15ddf35 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,
> 
> --
> Julian Pidancet
> 



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.